## General information [#general-information] The B2CONNECT FIX server provides all the functionality necessary for real-time trading and receiving up-to-date market information via the Financial Information eXchange protocol. In this document, you can find a detailed description of the B2CONNECT FIX API, including the information about how to connect to a demo FIX server. The B2CONNECT FIX API is based on the version 4.4 of the Financial Information eXchange protocol. It’s assumed that the reader of this document is already familiar with the FIX protocol. To learn more about the protocol specification, see the [FIX Trading Community website](https://www.fixtrading.org/). If your trading engine is powered by Go, take a minute to learn about [SimpleFix Go](https://github.com/b2broker/simplefix-go/). This open-source library is provided by the B2CONNECT team to help you quickly integrate FIX messaging into your environment. The library is entirely written in Go and supports any FIX API version. ### Supported message types [#supported-message-types] The following message types can be assigned to the `<35> MsgType` field of a [Standard header](fix-api#standard-header): * `0` — [Heartbeat](fix-api#heartbeat) (Client ↔ B2CONNECT) * `1` — [Test Request](fix-api#test-request) (Client ↔ B2CONNECT) * `2` — [Resend Request](fix-api#resend-request) (Client ↔ B2CONNECT) * `3` — [Reject](fix-api#reject) (Client ← B2CONNECT) * `4` — [Sequence Reset](fix-api#sequence-reset) (Client ↔ B2CONNECT) * `5` — [Logout](fix-api#logout) (Client ↔ B2CONNECT) * `8` — [Execution Report](fix-api#execution-report) (Client ← B2CONNECT) * `9` — [Order Cancel Reject](fix-api#order-cancel-reject) (Client ← B2CONNECT) * `A` — [Logon](fix-api#logon) (Client → B2CONNECT) * `D` — [New Order Single](fix-api#new-order-single) (Client → B2CONNECT) * `F` — [Order Cancel Request](fix-api#order-cancel-request) (Client → B2CONNECT) * `V` — [Market Data Request](fix-api#market-data-request) (Client → B2CONNECT) * `W` — [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) (Client ← B2CONNECT) * `Y` — [Market Data Request Reject](fix-api#market-data-request-reject) (Client ← B2CONNECT) ### Standard header [#standard-header] All FIX messages must start with a **Standard header**. The **Standard header** includes the following fields: ### Standard trailer [#standard-trailer] Along with a Standard header, all FIX messages must also contain a **Standard trailer**. The **Standard trailer** includes the following fields: ## Session messages [#session-messages] The messages listed in this section are used to maintain any live FIX session with the B2CONNECT FIX server, including both [quoting](fix-api#quoting) and [trading](fix-api#trading) sessions. ### Heartbeat [#heartbeat] This message is sent back and forth between the FIX server and the client to check the connection status and in response to [Test Request](fix-api#test-request) messages. The **Heartbeat** message includes the following fields: ### Test Request [#test-request] This message is sent back and forth between the FIX server and the client in response to [Heartbeat](fix-api#heartbeat) messages as a means of connectivity check. The **Test Request** message includes the following fields: ### Resend Request [#resend-request] This message is sent by the client or FIX server to initiate the retransmission of messages, which may be required upon detecting a gap in the sequence numbers or losing a particular message. The **Resend Request** message includes the following fields: ### Reject [#reject] This message is sent by the FIX server upon receiving a malformed message from the client. The possible reason for rejection is specified in the `<373> SessionRejectReason` field. This message is unrelated to a trade-level rejection ([Order Cancel Reject](fix-api#order-cancel-reject)) issued when a FIX server is unable to place a requested order. The **Reject** message includes the following fields: #### Possible reasons [#possible-reasons] When the FIX server sends a [Reject](fix-api#reject) notification informing the client that a session-level request has been rejected, the `<373> SessionRejectReason` field can be set to one of the following values specifying the reason for message rejection: * `0` — an invalid tag number * `1` — a required tag is missing * `2` — a tag isn’t defined for this message type * `3` — a tag is undefined * `4` — a tag has no value assigned * `5` — an assigned value is incorrect (out of range) for this tag * `6` — an incorrect value data format * `7` — an issue related to decryption * `9` — an issue related to `CompID` * `10` — an accuracy issue related to `<52> SendingTime` * `11` — an invalid `<35> MsgType` * `12` — an XML validation error * `13` — the same tag appears more than once * `14` — a tag is specified not in the required order * `15` — a wrong order of repeating group fields * `17` — a non-“Data” value includes a field delimiter (an SOH character) * `99` — other (unspecified) reason ### Sequence Reset [#sequence-reset] This message is sent by the client or FIX server to indicate to the recipient the sequence number of the next message from the sender, immediately following the Sequence Reset message. This may be necessary to recover from a disconnect, in case if some messages were lost or their resending is not desirable. The **Sequence Reset** message includes the following fields: ### Logon [#logon] This message is sent by the client to initiate a FIX session. The **Logon** message includes the following fields: ### Logout [#logout] This message is sent by the client or FIX server to terminate a session. When terminated, the possible reason is specified in the `<58> Text` field. The **Logout** message includes the following fields: ## Demo mode [#demo-mode] The B2CONNECT FIX server supports a Demo mode that allows clients to establish a test connection and simulate quoting and trading sessions. Contact your account manager to obtain a set of settings and credentials. ## Quoting [#quoting] After connecting to the FIX server and establishing a live quoting session, the client can send a [Market Data Request](fix-api#market-data-request) to subscribe to quote updates streamed by B2CONNECT. To subscribe to multiple symbols, the client should send a separate [Market Data Request](fix-api#market-data-request) for each symbol. Upon successful subscription to a selected symbol, the FIX server starts streaming market data updates by sending [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) messages each time the market data is updated. The quote updates are streamed continuously for the entire duration of a FIX session. If a subscription request can’t be executed for some reason (for example, when a requested symbol isn’t found), the FIX server responds with a [Market Data Request Reject](fix-api#market-data-request-reject) message providing detailed information about an error. To terminate a specific subscription and stop receiving the updates, the client can send a [Market Data Request](fix-api#market-data-request) with the `<263> SubscriptionRequestType` set to `2` (standing for “Unsubscribe”). Upon sending a [Logout](fix-api#logout) request, the current session is closed and subscriptions to all ticker symbols are terminated. ### Market Data Request [#market-data-request] This message is sent by the client to start receiving up-to-date quoting data for a specified ticker symbol. The **Market Data Request** message includes the following fields: ### Market Data Request Reject [#market-data-request-reject] This message is sent by the FIX server to reject a [Market Data Request](fix-api#market-data-request) with invalid values. The **Market Data Request Reject** message includes the following fields: #### Possible reasons [#possible-reasons-1] The `<281> MDReqRejReason` field can be set to one of the following values specifying the reason for request rejection: * `0` — the specified symbol isn’t recognized * `1` — a duplicate `<262> MDReqID` * `2` — insufficient bandwidth * `3` — insufficient permissions * `4` — the specified `<263> SubscriptionRequestType` isn’t supported * `5` — the specified `<264> MarketDepth` isn’t supported * `6` — the specified `<265> MDUpdateType` isn’t supported * `8` — the specified `<269> MDEntryType` isn’t supported ### Market Data — Snapshot/Full Refresh [#market-data--snapshotfull-refresh] Such messages are continuously sent by the FIX server after the client subscribes to a ticker symbol. A new message is sent with each market data update. The **Market Data — Snapshot/Full Refresh** message includes the following fields: ## Trading [#trading] **Place an order** After establishing a trading session with the FIX server, the client can place a new order by sending a [New Order Single](fix-api#new-order-single) message. In response to this, the FIX server sends back an [Execution Report](https://docs.b2connect.b2broker.com/en/fix-api.html#execution-report) with the `<150> ExecType` field set to `A`, indicating that the order is placed successfully. If the order can’t be placed (for example, due to lack of credit funds or other issues), the report is sent with `<150> ExecType` set to `8`. After placing the order, the FIX server sends a separate report with `<150> ExecType` set to `F` each the order status changes: * If the order is executed partially, `<39> OrdStatus` is set to `1`. * When the order is fully filled, `<39> OrdStatus` is set to `2`. **Cancel an order** To cancel an open order, the client can send an [Order Cancel Request](fix-api#order-cancel-request). If the order is canceled (either explicitly by a trader, or automatically due to timeout), the [Execution Report](fix-api#execution-report) is sent with `<150> ExecType` set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled, and `<151> LeavesQty` indicates the unfilled amount. If an order can’t be canceled for any reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. ### New Order Single [#new-order-single] This message is sent by the client to place a new order with specified parameters. The **New Order Single** message includes the following fields: ### Order Cancel Request [#order-cancel-request] This message is sent by the client to cancel an open order in its entire remaining amount. This request is assigned a unique `<11> ClOrdID` and is treated as a separate order. Upon successful cancellation of the order, an [Execution Report](fix-api#execution-report) is sent with the `<39> OrdStatus` field set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled. If the order can’t be canceled for some reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. The **Order Cancel Request** message includes the following fields: ### Order Cancel Reject [#order-cancel-reject] This message is sent by the FIX server upon receiving an [Order Cancel Request](fix-api#order-cancel-request) that can’t be fulfilled. The **Order Cancel Reject** message includes the following fields: ### Execution Report [#execution-report] This message is sent by the FIX server upon successfully placing or cancelling an order, or any change to the order status (such as a complete or partial execution). Among other data, the report indicates: * the current order status at the moment of report creation (`<39> OrdStatus`) * the most recent change in the order status, which is being reported (`<150> ExecType`) The **Execution Report** message includes the following fields: Explore the liquidity providers and FIX platforms supported by B2CONNECT Explore the liquidity providers and FIX platforms supported by B2CONNECT Find step-by-step instructions on most common user scenarios Find step-by-step instructions on most common user scenarios Explore the B2CONNECT FIX API reference Explore the B2CONNECT FIX API reference ## August 31, 2026 [#august-31-2026] ### New features [#new-features] #### Monthly traded volume reports [#monthly-traded-volume-reports] Following the daily turnover reports introduced in the previous release, **B2CONNECT** now also produces a monthly notional **Turnover Report** for each hub and delivers it to the Slack channels and email addresses of your choice, with the CSV and PDF attached to the message itself. The monthly report covers a full calendar month and uses the same breakdown as the daily one: traded volume per trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators set the monthly publication time per hub alongside the daily schedule, produce a report for any past month on demand with **Publish now**, and re-download earlier months from the report archive. Where the daily report keeps reporting teams current on activity, the monthly report gives management, finance, and account managers the period figures they reconcile and invoice against — replacing the month-end roundups these teams previously assembled by hand. If a month isn't yet fully covered by the platform's data, the report says so explicitly, so a partial period is never mistaken for a complete one. #### Multiple margin accounts on one FIX connector [#multiple-margin-accounts-on-one-fix-connector] A single FIX connector can now serve many margin accounts on a hub. The taker platform names the account on each order in the standard FIX **Account** field (Tag 1), **B2CONNECT** routes the order to the matching margin account, and returns the same value on every execution report. Previously, every margin account needed a FIX connector of its own. A platform running several White Labels, or serving a large number of end clients, can now keep them all on one connector, with each account's positions, margin, and commissions kept entirely separate. The client reference sent with an order (Tag 526) is now carried through to reporting as well. It is stored with the execution and appears in the **Trading Report** under **Hub Reports**, so back-office and reconciliation teams can trace any fill back to the end client that placed it. #### Pegged-price instruments [#pegged-price-instruments] **B2CONNECT** now supports instruments priced at a fixed rate against another instrument instead of from live venue quotes. The rate is configured once, and the platform publishes it continuously, refreshing the order book on a short cycle so connected platforms always receive a current price. This turns what previously called for a bespoke deployment into a standard configuration option — most commonly for stablecoins held at parity with their reference currency, and for any instrument a platform chooses to offer at an administered rate. *** ### Improvements [#improvements] #### Reporting built for the highest trading volumes [#reporting-built-for-the-highest-trading-volumes] The reporting layer's data intake has been reworked to keep up with the busiest hubs. Balance and completed-order data is collected in batches in the same way as execution data, so reports stay current even when a hub is at peak activity, and the highest-volume platforms no longer need to weigh reporting coverage against throughput. Order identifiers have also been unified across the platform: the identifier assigned when an order reaches the hub is now the same one that appears in **Hub Reports**. Back-office teams reconciling a report against their own records work from one identifier throughout, with no cross-referencing between two numbering schemes. #### Steadier operation through brief internal interruptions [#steadier-operation-through-brief-internal-interruptions] **B2CONNECT** services now ride out short interruptions to the platform's internal messaging and reconnect on their own, rather than restarting. Quoting, trading, and reporting services all behave this way, so a momentary infrastructure hiccup no longer turns into a visible restart on a live hub. #### Clearer feedback when uploading a configuration [#clearer-feedback-when-uploading-a-configuration] When an instance configuration file is uploaded in the **B2CONNECT** Web UI, validation errors are now reported in full, naming what in the file needs attention. Administrators previously saw only a generic server error and had to find the cause themselves. *** ### Resolved issues [#resolved-issues] * Resolved two issues affecting hedge accuracy in **Systematic Hedging**. In certain scenarios, a hedge amount was rounded to the instrument's decimal precision rather than to the increment the liquidity provider actually accepts, and a partially filled hedge on the external leg could be booked internally in full instead of proportionally. Hedge sizes now follow each provider's increment, and partial fills are booked in proportion to what was filled. * Resolved two issues that could occasionally cause a fill to be counted twice, or an already-applied fill to be reversed, when the platform re-processed an internal message. Every fill is now identified uniquely, so positions and profit and loss remain accurate. ## July 30, 2026 [#july-30-2026] ### New features [#new-features-1] #### Daily turnover reports delivered to Slack and email [#daily-turnover-reports-delivered-to-slack-and-email] B2CONNECT now produces a Turnover Report for each hub automatically, once a day, and delivers it to the Slack channels and email addresses of your choice. Both the CSV and the PDF arrive as ready-to-open attachments on the message itself, so recipients read the report without opening the Web UI or holding platform credentials. Daily volume becomes visible to management, account managers, and back-office teams alike. Each report covers the previous trading day and breaks traded volume down by trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators control delivery from the B2CONNECT Web UI: * Set the daily publication time for each hub, or switch the schedule off. * Produce a report on demand with **Publish now**. * Subscribe Slack channels and email recipients under **Business notifications**, alongside the platform's other notifications. * Re-download any past report from the report archive. This is the next step in the rollout of **TRAM** (Tracking, Reporting, Alerting, and Monitoring), the unified reporting and observability layer that brought **Hub Reports** to the Web UI in the April release. Where Hub Reports covers reports requested on demand for individual margin accounts, daily turnover reporting replaces the manual, spreadsheet-based volume roundups that reporting teams previously assembled by hand. #### HTX USDT-M Futures upgraded to API V5 [#htx-usdt-m-futures-upgraded-to-api-v5] B2CONNECT has been upgraded to HTX API V5 for USDT-M perpetual futures across the full path: market data, funding data, symbol information, and trading. HTX has retired the legacy API behind these instruments, so the upgrade keeps this liquidity available on a supported interface. Brokers sourcing HTX perpetual futures liquidity through B2CONNECT keep uninterrupted market data and order flow, with no action required on their side. B2CONNECT now also confirms the collateral mode on every HTX connection when it starts, so a change made to the account on the exchange side can no longer cause order placement to fail without an evident cause. *** ### Improvements [#improvements-1] #### More efficient liquidity provider connections [#more-efficient-liquidity-provider-connections] Liquidity provider connections on a hub now make more efficient use of its infrastructure, while each connection stays isolated from the others and is monitored independently. A new liquidity provider also goes live sooner. The change is being enabled progressively. #### Order recovery after an interruption [#order-recovery-after-an-interruption] After a connection to a liquidity venue is interrupted, B2CONNECT now sizes its recovery request to the length of the interruption instead of using a fixed window, so orders placed during a longer outage are still picked up and reconciled. *** ### Resolved issues [#resolved-issues-1] The issues below occurred infrequently and only under specific conditions. Some may have affected production environments; most were identified in testing before they could. * Resolved an issue where, in rare cases, the connection to a liquidity venue did not re-establish itself after a network drop, leaving the affected instruments without fresh quotes until the service was restarted. Connections now detect a silent drop on their own, reconnect, and restore every affected instrument. * Resolved two issues that could occasionally leave funding data for perpetual futures failing after an instrument's mapping changed. Quotes recovered on their own, but funding rate, mark price, and funding interval could remain affected. Funding data now follows mapping changes as quotes do. * Resolved two issues affecting connection setup and quote acceptance in certain scenarios: a liquidity provider credentials element was rejected as too long when configuring a connection, and quotes for certain FX instruments arriving from a liquidity aggregator hub were rejected because of a mismatch in how the quote's entry count was determined. ## June 29, 2026 [#june-29-2026] ### Improvements [#improvements-2] #### Systematic Hedging under high-frequency flow [#systematic-hedging-under-high-frequency-flow] Systematic Hedging, introduced in the previous release, has been hardened to stay reliable under high-frequency, high-volume flow such as copy-trading and HFT bursts. B2CONNECT shapes the incoming client flow so that only the residual net position is routed to each liquidity provider (LP), keeping order placement comfortably within venue API rate limits even during tick storms. In the B2CONNECT Web UI, the real-time Risk Status view and its cumulative order-accumulation status bar now update accurately at very high request rates, so risk teams keep a precise, live picture of how exposure is building and when it will hedge. #### More flexible symbol and instrument naming [#more-flexible-symbol-and-instrument-naming] The liquidity aggregator integration now supports independent taker-side and maker-side symbols. Previously both legs shared a single venue name, causing a platform to distribute the LP’s symbols to the FIX clients. B2CONNECT now resolves the incoming FIX symbol against a dedicated taker symbol and maps it to the liquidity aggregator catalog name separately — so brokers can keep their own client-facing symbology regardless of an LP’s naming. Asset and trading instrument names can now also include the ampersand (`&`) character. Such symbol names are accepted directly, removing the previous need to substitute `AND`. #### Reduced noise from stale-liquidity alerts [#reduced-noise-from-stale-liquidity-alerts] Stale-liquidity alerts triggered by delisted symbols now fire once instead of repeating, cutting alert noise for monitoring teams when a venue delists an instrument. *** ### Resolved issues [#resolved-issues-2] * Resolved an issue where a market-data subscription on WebSocket liquidity venues (such as Kraken, Huobi, and Binance) could remain silent after a connector reconnect, leaving the affected symbols without fresh quotes — and FIX clients receiving only invalidations — until the connector was restarted. Such subscriptions now recover automatically. * Resolved an issue in the liquidity aggregator integration where a transient quote-cancel message was treated as a permanent subscription rejection, silently stopping quote publishing for the symbol until a restart. Transient cancels no longer drop the subscription, so streaming resumes as soon as the venue sends the next quote. ## May 29, 2026 [#may-29-2026] ### New features [#new-features-2] #### Systematic Hedging [#systematic-hedging] **B2CONNECT** introduces **Systematic Hedging**, a new execution option that complements — and does not replace — standard straight-through processing (STP). When enabled for a symbol, **B2CONNECT** aggregates incoming client flow into a managed risk position, nets opposing buy and sell volume, and hedges only the net residual to the liquidity provider (LP). This gives risk teams tighter control over exposure and lower execution costs. And because only net positions are hedged, platforms send far fewer orders to their LPs — staying comfortably within API rate limits and easing the load on each provider, so every LP connection goes further. Hedging stays fully under the risk team's control and is set per symbol: trigger by accumulated volume, a timer, a schedule, or manually; tune the hedge ratio and lock-routing behavior; or keep routing large orders straight through. The **B2CONNECT** Web UI adds a **Symbol Hedging Configuration** page, a real-time **Risk Status** page, and a master toggle, and risk-position state is restored automatically after any restart — so exposure is never lost or double-counted. #### B2CORE integration [#b2core-integration] **B2CONNECT** now integrates with **B2CORE**, the **B2BROKER** ecosystem's CRM — the centralized control center for a brokerage's front-end client experience and back-end administrative operations. By connecting margin accounts on the **B2CONNECT** hub directly to **B2CORE**, the integration gives B2B clients who power their trading platforms with **B2CONNECT** seamless account onboarding and a streamlined day-to-day experience, with account creation, funding, and balance management all handled from one control center. It also puts the wider advantages of the **B2BROKER** ecosystem within reach on a single, connected stack. Administrators set up and manage the connection from a new **B2CORE Integration** page in the **B2CONNECT** Web UI. #### Tiered commission profiles [#tiered-commission-profiles] **B2CONNECT** now supports **tiered commission profiles**, which automatically lower the commission rate as an account's traded volume grows. Administrators define volume thresholds and the rate that applies beyond each one; **B2CONNECT** tracks cumulative volume over the chosen period — for example, a calendar month — and steps the rate down as each threshold is reached, including on liquidation orders. For brokers, this turns growing volume into lower costs: the more flow through the hub, the lower their own per-trade commission — rewarding scale and protecting margins as the business grows. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## April 30, 2026 [#april-30-2026] ### New features [#new-features-3] #### Tiered margin profiles [#tiered-margin-profiles] **B2CONNECT** now supports tiered margin profiles, allowing Administrators to apply different margin rates to different slices of an account's notional exposure. Each profile can define up to five threshold–rate pairs per symbol, so brokers can mirror the bracketed margin schedules used by major liquidity providers — without falling back on inflated blanket rates that deter retail traders or on manual, position-by-position adjustments. This delivers predictable, schedule-aligned leverage on every tranche of a client's position and removes a recurring source of operational overhead for risk and operations teams. #### Hub Reports under TRAM [#hub-reports-under-tram] A new **Hub Reports** section is now available under **TRAM** (Tracking, Reporting, Alerting, and Monitoring) in the **B2CONNECT** Web UI, bringing reporting for margin accounts together in a single place. Back-office operators can request, track, and download reports directly from the platform — an important milestone in the rollout of TRAM, the unified reporting and observability layer for B2CONNECT. The initial release of Hub Reports ships with three reports: * **Consolidation Statement** — a complete picture of an account's activity and exposure for any reporting period, including opening and closing balances, deposits, withdrawals, fees, opening and closing equity, unrealized PnL, used and free margin, margin utilization, and a dedicated **Open Positions** section listing each position's symbol, direction, average price, unrealized PnL, and margin. Account names are populated automatically, so each statement is clearly attributed. * **Trading Report** — per-trade execution details for one or more margin accounts over a chosen date range, delivered as a CSV. Each row includes the connection used, taker login and order identifiers, executed price and volume, and commission, giving back-office and reconciliation teams everything they need to audit individual fills. * **Turnover (Traded Volume) Report** — aggregated traded volume per account and per symbol for the selected period, supporting fee schedules, rebate calculations, and periodic client reviews. *** ### Improvements [#improvements-3] #### Binance Futures WebSocket endpoints [#binance-futures-websocket-endpoints] **B2CONNECT** has been migrated to **Binance**'s new WebSocket URL architecture for perpetual futures, which separates traffic into dedicated public, market, and private channels. Brokers connecting to Binance Futures via B2CONNECT will continue to receive uninterrupted market data and order updates after Binance retires the legacy WebSocket URLs on **2026-04-23**, with no action required on the broker's side. #### Stream update reliability for Incoming Connectors [#stream-update-reliability-for-incoming-connectors] Subscription updates on **Incoming Connectors** are now more resilient under load. The platform allows more time for new streams to take effect and automatically retries on transient failures, preventing the rare cases where a slow update could leave a maker's symbols without fresh quotes until the next resubscription cycle. *** ### Resolved issues [#resolved-issues-4] * Resolved a consistency issue in the oneZero quoting integration where unsubscribing and immediately resubscribing to a symbol could occasionally fail with a duplicate-request error, leaving the symbol without market data until the next resubscription cycle. Resubscriptions are now handled atomically. ## March 2, 2026 [#march-2-2026] ### New features [#new-features-4] #### Automatic account liquidation on stop-out [#automatic-account-liquidation-on-stop-out] **B2CONNECT** now automatically liquidates open positions when an account's equity falls to the stop-out level, eliminating the need for manual intervention during margin events. The liquidation process executes iteratively — the system sends liquidation orders for all active positions, waits for each to reach a final state, and then evaluates whether the account has recovered before scheduling the next iteration. If the account's margin recovers above the stop-out threshold at any point, liquidation halts immediately. The engine is designed for operational reliability: if a restart occurs mid-liquidation, the process resumes safely without duplicating or missing orders. Execution uses live market pricing to ensure liquidation orders reflect current conditions, preventing margin miscalculations during volatile periods. The waiting period before liquidation begins and the retry policy between iterations are configurable. *** ### Improvements [#improvements-4] #### Account cache reliability [#account-cache-reliability] The account management system now supports per-account cache reinitialization. When a cache error is detected, only the affected account's state is rebuilt rather than triggering a broader reset. This targeted recovery approach improves stability and reduces the potential for stale account data to affect margin calculations or order routing during error-recovery scenarios. *** ### Resolved issues [#resolved-issues-5] There have been no customer-facing issues reported in this release. ## February 27, 2026 [#february-27-2026] ### New features [#new-features-5] #### New B2CONNECT website and deep Insights [#new-b2connect-website-and-deep-insights] This February release is dedicated to documentation updates. Alongside the ongoing expansion of our integrations-related docs, we've launched the new **B2CONNECT** product website and introduced the **Insights** section— deep-dive articles aimed at brokers, exchanges, and liquidity providers building multi-asset liquidity infrastructure. *** ### Improvements [#improvements-5] #### Liquidity engine performance, stability, and security enhancements [#liquidity-engine-performance-stability-and-security-enhancements] We've delivered a set of improvements across the quoting and trading engine to increase overall performance and operational robustness. These updates include several security and stability hardening primarily related to the underlying technology stack and runtime components that support core execution workflows. *** ### Resolved issues [#resolved-issues-6] There have been no customer-facing issues reported in this release. ## January 30, 2026 [#january-30-2026] ### New features [#new-features-6] #### Incoming Connectors: Trading Settings tab [#incoming-connectors-trading-settings-tab] A new dedicated **Trading Settings** tab is now available for Incoming Connectors, allowing the Hub Administrators to configure symbols directly within the connector setup. This streamlines onboarding of new liquidity providers and simplifies ongoing symbol configuration and updates. *** ### Improvements [#improvements-6] #### Improved FIX credentials compatibility [#improved-fix-credentials-compatibility] FIX credential settings for supported liquidity aggregators are now more aligned with the standard FIX naming convention, ensuring more consistent configuration and reducing setup friction. #### More descriptive error messages [#more-descriptive-error-messages] Incoming Connector pages now display clearer, human-readable error messages in two common cases: when credential validation fails, and when the Administrator tries to enable trading for a symbol that’s disabled in Hub settings. These messages help identify the issues, so troubleshooting is more straightforward. *** ### Resolved issues [#resolved-issues-7] * Generated FIX credentials no longer start with an underscore in `SenderID` or `TargetID`, resolving compatibility issues with counterparties that reject such values. ## December 22, 2025 [#december-22-2025] ### New features [#new-features-7] #### Perpetuals data over FIX: funding rate, mark price & funding interval [#perpetuals-data-over-fix-funding-rate-mark-price--funding-interval] B2CONNECT now enriches FIX market‑data streams with `FundingRate`, `MarkPrice`, and `FundingInterval` fields, allowing any FIX‑compatible platform to price and offer perpetual futures out of the box. These parameters are delivered alongside standard quote updates in the FIX contract, eliminating the need for custom side channels or additional integrations to pass funding data. #### Interest on idle cash and unused margin (AMS) [#interest-on-idle-cash-and-unused-margin-ams] The **AMS** module now supports paying interest on idle cash and unused margin via dedicated **Interest rate profiles** in the Web UI. Administrators can configure per‑asset interest rates and a daily posting time in UTC; B2CONNECT then accrues interest automatically and posts it once per day as separate **Interest** transactions on client accounts. Brokers, exchanges, and other trading platforms are empowered to create a clear incentive for end-users (traders) to keep extra funds in their accounts, strengthening client retention and serving as a strong competitive differentiator. *** ### Improvements [#improvements-7] #### Maker credentials management inside Incoming Connectors [#maker-credentials-management-inside-incoming-connectors] Trading and quoting Maker credentials are now configured directly within each Incoming Connector. Administrators can add, revoke, and review credentials in the same place where they manage the connection, reducing context switching and keeping connectivity and access control aligned per connector. #### Target maker [#target-maker] A new **Target maker** control has been added to the Incoming Connectors page, making it straightforward to set or review which maker is currently used for routing. This improves transparency around active maker selection and simplifies switching and validating liquidity sources. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. ## October 30, 2025 [#october-30-2025] ### New features [#new-features-8] #### New docs section: Supported FIX platforms [#new-docs-section-supported-fix-platforms] With this release, we’ve added a new [FIX platforms](supported-venues/fix-platforms) section to our documentation, showcasing trading platforms compatible with B2CONNECT via the **FIX protocol**. This new catalog includes baseline configuration guides and is linked to our FIX API reference. Integration teams can now quickly verify FIX compatibility and access the appropriate configuration templates from a single location, streamlining the setup process. *** ### Improvements [#improvements-8] #### Deep order recovery on LP disconnects [#deep-order-recovery-on-lp-disconnects] We’ve moved from a conservative recent‑orders snapshot to a controlled step‑by‑step rebuild that thoroughly recovers pending orders after a disconnect. As before, requests respect each Liquidity Provider’s API limits; the updated pacing keeps us right at the safe edge, delivering a far higher recovery count without triggering rate‑limit bans. Expect more complete catch‑ups on high count bursts and during volatile periods. *** ### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. ## September 30, 2025 [#september-30-2025] ### New features [#new-features-9] #### Internal risk warehousing (formerly B-Book) [#internal-risk-warehousing-formerly-b-book] B2CONNECT clients can now execute selected symbols internally within the crypto-native liquidity hub, retaining spread and reducing external fees. This new execution model provides per-symbol control to enable internal execution where it’s commercially advantageous, empowering clients to optimize their risk-return profiles with unprecedented precision. The configuration can be managed via CSV. #### Partial risk internalization (formerly C-Book) [#partial-risk-internalization-formerly-c-book] B2CONNECT clients can now optimize risk management with configurable order splitting between external hedging and internal execution. Set hedge ratios per symbol (0-100%) to determine the split, where the internal portion mirrors external fill pricing and proportions exactly. This approach reduces commission costs while maintaining risk control and supports both market and limit order flows. #### Price invalidation for synthetic symbols [#price-invalidation-for-synthetic-symbols] Synthetic markets now support invalidation signals the same way as organic symbols, providing consistent invalidation behavior across all symbol types. This development unlocks safe production deployment of the invalidation feature, providing traders with more reliable price feeds and reducing the risk of stale quotes across the entire trading ecosystem. #### Liquidity acquisition configuration via incoming connectors [#liquidity-acquisition-configuration-via-incoming-connectors] The configuration of liquidity acquisition service has been migrated from a global CSV to a structured, connector‑based flow. The new approach includes bulk asset upload capabilities, automated symbol-to-maker listing matching, and quoting CSV configuring, reducing setup time and potential errors while enabling more granular control over individual service instances. *** ### Improvements [#improvements-9] #### WebUI modernization [#webui-modernization] The Admin panel interface has been enhanced delivering improved usability. The following upgrades land across the **AMS accounts**, **AMS profiles**, **Notifications**, **Incoming Connectors** and **Symbols** sections: * **Navigation enhancements**: * Streamlined menu structure with fewer clicks to access key data. * Relocated Notifications to Hub settings for better organization. * Expanded table layouts for improved data visibility. * **Single Sign-On**: * Centralized identity provider with standards-based SSO. * Unchanged sign-in experience for end users. * Continued user management capabilities for B2CONNECT administrators. Additionally, the sidebar has been redesigned, with rebuilt left navigation reflecting the new information architecture, making the **Liquidity**, **Symbols**, **Accounts**, and **Settings** sections easier to access. #### AMS profiles: CSV import/export [#ams-profiles-csv-importexport] The **Commission** and **Margin Requirements** profiles setup has been accelerated through an import wizard and one‑click CSV export. These enhancements optimize workflows particularly when working with large instrument lists. #### Asset management [#asset-management] B2CONNECT administrators are now provided with enhanced control over asset configurations with built-in safeguards to prevent deletion of referenced assets. This ensures system integrity while providing the flexibility to clean up obsolete or unused assets. *** ### Resolved issues [#resolved-issues-10] * Fixed an issue with trading parameter calculations for instruments with contract sizes. The system now correctly converts all trading parameters using contract size multipliers, ensuring accurate minimum order amounts, price steps, and notional values are communicated through the FIX SecurityList endpoint. This fix particularly benefits trading of derivative contracts where the underlying instrument differs from the quoted contract size. ## August 29, 2025 [#august-29-2025] ### New features [#new-features-10] #### New docs section: Supported exchanges [#new-docs-section-supported-exchanges] With this release, we've introduced a detailed [Supported exchanges](supported-venues/exchanges) section in our documentation, offering a comprehensive reference for each exchange our platform supports. This addition promotes clarity and easy access, allowing B2CONNECT users to quickly compare and reference available capabilities across exchanges at a glance. *** ### Improvements [#improvements-10] #### Explicit default STP setting [#explicit-default-stp-setting] To prevent unexpected behavior and reduce reliance on exchange policy defaults, we now explicitly set a fixed internal default STP (Self-Trade Prevention) mode in our API calls. This ensures consistent and predictable trade execution across all environments, regardless of future changes by liquidity providers. *** ### Resolved issues [#resolved-issues-11] There have been no customer-facing issues reported in this release. ## July 31, 2025 [#july-31-2025] ### New features [#new-features-11] #### Granular asset management via Web UI [#granular-asset-management-via-web-ui] B2CONNECT administrators now benefit from enhanced control and efficiency in asset management with new export/import options integrated into the B2CONNECT Web UI: * **Bulk asset export**: Efficiently export assets to CSV for reporting or backup purposes, streamlining administrative tasks and protecting essential configuration data. * **Bulk asset import**: Effortlessly import multiple assets from CSV files, reducing manual entry, minimizing errors, and ensuring asset uniqueness through built-in validation rules. #### Alerts system for swap charge issues [#alerts-system-for-swap-charge-issues] The system monitoring has been enhanced by implementing automated notifications for failed swap charges. These real-time notifications provide detailed explanations of failures, facilitating quick troubleshooting, and boosting system reliability. Common issues addressed include missing market rates, symbol data discrepancies, infrastructure issues, and internal errors. *** ### Improvements [#improvements-11] #### Enhanced compatibility with Binance [#enhanced-compatibility-with-binance] To ensure continued compatibility and accuracy, B2CONNECT services have been updated to align with recent changes in the Binance API. This enhancement makes certain that the minimum notional values provided through the B2CONNECT FIX API SecurityList endpoint are always accurate, preventing order rejections due to incorrect amounts. Additionally, the Binance Spot adapter has been updated to meet the latest WebSocket API requirements, ensuring smooth order updates and improved platform reliability. #### Advanced raw message logging [#advanced-raw-message-logging] A significant enhancement has been added to order placement and execution workflow. A key point is the implementation of advanced raw message logging. This enables B2CONNECT to log all raw incoming and outgoing messages during its communication with a supported liquidity provider, thus enabling precise troubleshooting and rapid issue resolution at the LPs end. #### Improved error handling [#improved-error-handling] Another improvement in the order placement and execution workflow includes the refined logic for handling timeout errors. An order is now considered placed if such an error occurs, providing a definitive status and preventing uncertainty during order execution. #### Rate limiting for reliable connectivity [#rate-limiting-for-reliable-connectivity] The reconnect algorithm for a supported liquidity provider has been improved by integrating a robust rate-limiting mechanism. This enhancement caps the number of reconnect attempts to an optimal value, reducing the chance of IP bans and maintaining stable, uninterrupted connectivity. #### Reduced trading service startup time [#reduced-trading-service-startup-time] With this release, the bulk-load order event recovery mechanism has been implemented. By efficiently processing large volumes of order events during system startup, this update significantly reduces the time required to restore services after a restart or unexpected outage. As a result, traders experience minimal downtime, ensuring continuous access to the trading platform and improving overall operational efficiency. *** ### Resolved issues [#resolved-issues-12] There have been no customer-facing issues reported in this release. ## June 30, 2025 [#june-30-2025] ### New features [#new-features-12] #### Advanced multi-provider liquidity orchestration [#advanced-multi-provider-liquidity-orchestration] This release introduces a groundbreaking update in liquidity infrastructure management: B2CONNECT now features liquidity orchestration across multiple liquidity providers and trading platform types. Key enhancements include: * Liquidity acquisition from multiple providers and its distribution to diverse trading platforms and market data consumer types. * Price feed across all asset classes, including forex, CFDs, indices, metals, and crypto (both spot and derivatives), accessible via both single or multiple connectors. * Uninterrupted liquidity with automated order routing based on symbol availability and robust failover policies. #### Advanced spread control [#advanced-spread-control] B2CONNECT administrators can now precisely control the maximum allowable spread in order books, significantly enhancing liquidity and boosting trader confidence. They can set and manage maximum spread limits to avoid sharp market data fluctuations, and track anomalies through detailed metrics. #### Symbol-based price invalidation [#symbol-based-price-invalidation] B2CONNECT introduces sophisticated symbol-based price invalidation to ensure price accuracy: * **Web interface management**: Configure, view, and manage price invalidation parameters directly through the Web UI. * **CSV import**: Import symbols via CSV files that include detailed price invalidation parameters. * **Real-time logic**: Implement comprehensive real-time price invalidation across all stages for consistent and precise quoting and trading. #### Aggregated execution reports [#aggregated-execution-reports] Execution reporting now supports fill aggregation, optimizing reports for platforms such as cTrader. This feature consolidates multiple fills into a single, coherent execution report. B2CONNECT administrators can enable or disable aggregation settings to tailor reporting to the trading platform preferences. Alerts for overfilled aggregation scenarios provide timely insights for effective risk management. #### Automated swap fee charging [#automated-swap-fee-charging] B2CONNECT now streamlines swap charge management. B2CONNECT administrators can easily set up Swap Profiles and apply them to trading accounts. The built-in Swap Charges Planner helps schedule and run swap charges efficiently. Migration to an optimized Account Configuration system provides superior performance and reliability. *** ### Improvements [#improvements-12] #### Enhanced precision handling for FOK orders [#enhanced-precision-handling-for-fok-orders] Handling of Fill-or-Kill (FOK) orders has been improved to guarantee compatibility across all liquidity providers, even when the order amount precision differs from trading platform specifications. #### Standardized order cancellation for Liquidity Takers [#standardized-order-cancellation-for-liquidity-takers] The order cancellation support has been improved for liquidity aggregators and other liquidity consumers, ensuring more responsive and reliable order lifecycle management. #### Symbol integration into account configuration [#symbol-integration-into-account-configuration] Symbol management is now seamlessly incorporated into account configuration to maintain consistency across liquidity settings and to simplify administrative tasks. #### Streamlined UX [#streamlined-ux] The B2CONNECT WebUI has been upgraded, focusing on user experience and performance enhancements. These improvements feature a more intuitive color scheme and streamlined design, offering a modern and visually appealing interface. The user flow has been optimized, making navigation more straightforward and efficient. Additionally, component performance has been boosted, reducing load times and enhancing overall responsiveness for a better user experience. *** ### Resolved issues [#resolved-issues-13] * Fixed an issue where an order cancellation request might be mishandled if received before the system processed the initial order confirmation from a liquidity provider. ## May 30, 2025 [#may-30-2025] ### Improvements [#improvements-13] #### Enhanced FIX API SecurityList endpoint [#enhanced-fix-api-securitylist-endpoint] Improved the liquidity metadata handling to ensure that order placements, based on the liquidity parameters provided via the SecurityList FIX endpoint, are compatible across multiple liquidity streams. This upgrade aggregates liquidity parameters for symbols across multiple providers, combining them into universally supported values. As a result, orders can be placed across several liquidity providers either simultaneously or in a failover mode, ensuring compatibility with all involved providers. #### Improved handling of negative spreads [#improved-handling-of-negative-spreads] Enhanced management of negative spreads has been achieved through more efficient filtering of Level 2 quotes and incremental updates. This improvement targets asset prices that could cause negative spreads in liquidity distributed to trading platforms and other consumers via the FIX protocol. The newly updated business logic effectively and efficiently filters out such quotes to prevent the negative spreads from appearing in the distributed liquidity. #### Enhanced resilience when processing fast subscribe/unsubscribe sequences [#enhanced-resilience-when-processing-fast-subscribeunsubscribe-sequences] B2CONNECT FIX server can robustly handle fast subscribe/unsubscribe sequences by liquidity aggregators, even when these aggregators do not strictly adhere to the FIX protocol standard, reusing the same request IDs. The newly implemented algorithm reliably handles such cases, eliminating even the intermittent subscription failures. *** ### Resolved issues [#resolved-issues-14] * Fixed an issue, where orders were re-sent (placed again) if one of the supported liquidity providers returned an unrecognized error message. Such messages are now categorized under a unified system, resulting in conserving the API rate limits on redundant order placements and reducing the risk of IP bans. * Fixed an issue where, after replacing the API credentials of a supported liquidity provider with new ones, the system continued subscribing to the execution reports stream using the old credentials until restarted. This fix ensures that the credentials can be replaced live, without the restart of services. ## March 31, 2025 [#march-31-2025] ### New features [#new-features-13] #### New integration with Bybit [#new-integration-with-bybit] B2CONNECT has launched a new adapter for **Bybit**, providing full support for perpetual futures contracts. This integration leverages B2CONNECT's robust infrastructure, allowing access to Bybit's market data and trading functionalities. It ensures seamless trading and quoting, enabling client platforms to offer advanced trading options and enhanced user experience. Benefit from efficient order execution and reliable price feeds — all within the B2CONNECT ecosystem! #### Advanced Trade API support for Coinbase integration [#advanced-trade-api-support-for-coinbase-integration] With this release, B2CONNECT introduces full support for **Coinbase Advanced Trade API**, replacing the deprecated Coinbase Pro API. This update ensures uninterrupted access to Coinbase’s liquidity, benefiting from the superior capabilities and performance of the Advanced Trade API. This upgrade affirms B2CONNECT commitment to delivering cutting-edge liquidity solutions, ensuring clients always have access to the best available liquidity infrastructure. *** ### Improvements [#improvements-14] #### Improved symbol specification management and real-time configuration [#improved-symbol-specification-management-and-real-time-configuration] The process for managing symbol specifications during bulk import has been significantly enhanced. Users can now interactively review and selectively edit symbol specifications directly within the import interface. This improvement enables on-the-fly adjustments, ensuring higher accuracy and flexibility when dealing with large sets of symbols. #### Binance Futures adapter enhancements [#binance-futures-adapter-enhancements] Several improvements have been implemented for the Binance Futures adapter, increasing its reliability and stability: * **Execution report deduplication**: Logic has been added to effectively deduplicate execution reports from Binance Futures. This resolves issues caused by occasional duplicate reports originating from the LP side, ensuring accurate order state tracking. * **Order state recovery rate limiting**: A rate limiter has been implemented for requests related to order state recovery. This proactive measure prevents potential rate limit violations on the Binance Futures platform, safeguarding against temporary bans or request throttling during high-activity periods. These updates contribute to a more robust and resilient integration with Binance Futures. *** ### Resolved issues [#resolved-issues-15] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December 24, 2024 🎄 [#december-24-2024-] #### New features [#new-features-14] ##### Taker orders routing to multiple LPs [#taker-orders-routing-to-multiple-lps] This newly released feature allows orders received through a single FIX connector to be routed to multiple liquidity providers. This functionality enables sophisticated order placement and execution strategies through: * **Failover mechanism**: Enables B2CONNECT to maintain each Taker connector linked to multiple liquidity sources and to dynamically reroute orders among them in case a provider becomes unavailable. * **Symbol-based order routing**: Caters to cases where a particular symbol may be unavailable with one liquidity provider, but listed on others. This feature allows for dynamic routing of orders to the most suitable liquidity source based on the specific trading symbol. This feature significantly enhances access to a wider range of trading instruments and improves fault tolerance for liquidity distribution at supported trading venues via both quoting and trading sessions. ##### Incoming connectors creation [#incoming-connectors-creation] B2CONNECT administrators can now create and configure connections to Makers via the Web UI. The solution supports a variety of protocols (WSS, REST, FIX), offering flexible and robust connectivity options. By streamlining the setup process, it enhances the user experience, making it easy to integrate incoming connectors. ##### Order status recovery at WebSocket disconnect [#order-status-recovery-at-websocket-disconnect] This feature ensures the recovery of pending order statuses in case a WebSocket connection is disrupted or unavailable. It's specifically designed for WSS+REST trading integration, allowing retrieval of a placed order status even if the execution report can't be extracted from a WebSocket data stream B2CONNECT subscribed to. This solution largely eliminates cases where an order is placed on the liquidity provider but is not correctly confirmed on the Taker platform due to WebSocket issues. The implementation significantly enhances execution quality and mitigates market risks. #### Improvements [#improvements-15] ##### Symbol creation interface [#symbol-creation-interface] The B2CONNECT Web UI now features a dedicated interface for adding symbols. This enhancement utilizes existing base and quote assets, building on the recent release of the Asset and Asset Classes management UI. This feature is in addition to the bulk settings import functionality, allowing for individual symbol creation and management. #### Resolved issues [#resolved-issues-16] There have been no customer-facing issues reported in this release. *** ### November 29, 2024 [#november-29-2024] #### New features [#new-features-15] ##### Taker FIX credentials management via the Web UI [#taker-fix-credentials-management-via-the-web-ui] The latest B2CONNECT release introduces a brand new Web UI Section in the Liquidity Hub administrative interface, designed for managing FIX protocol credentials. These authorization details are vital for B2CONNECT customers, including digital asset exchanges, brokerages, crypto payment gateways, and other liquidity consumers, to connect to the Liquidity Hub. Following the trend of previous improvements, such as the Maker API keys management interface, this update enables B2CONNECT administrators to efficiently generate and distribute FIX credentials. Once the credentials are generated and validated, B2CONNECT administrator can transfer them to a Taker platform so that their clients can authorize when connecting to the B2CONNECT FIX server. Credentials are automatically updated across B2CONNECT services, ensuring seamless client connectivity. This development marks a significant stride toward achieving comprehensive connectivity and streamlined liquidity distribution within B2CONNECT's growing infrastructure. #### Resolved issues [#resolved-issues-17] There have been no customer-facing issues reported in this release. *** ### October 31, 2024 [#october-31-2024] #### New features [#new-features-16] ##### Faster order placement and execution on the Binance spot platform [#faster-order-placement-and-execution-on-the-binance-spot-platform] B2CONNECT Liquidity Hub has implemented an advanced adapter to the WebSocket API for the Binance (spot) trading platform. This upgrade allows for faster order placement, thereby improving the trading experience and enhancing the liquidity distribution quality. By employing a high-end connectivity technology, trade-related messages are now transmitted through a bidirectional full-duplex protocol. When assessed against previous benchmarks, the order round-trip time on Binance (spot) has been shortened significantly. This advancement will be beneficial to any trading platform or liquidity taker client, substantially enhancing their user experience in order execution. #### Improvements [#improvements-16] ##### Enhanced Admin interface for configuring trading credentials [#enhanced-admin-interface-for-configuring-trading-credentials] B2CONNECT administrators can now independently configure trading credentials via the web interface, ensuring a faster and more secure process. This improvement simplifies the procedure of entering API keys using a dynamic, maker-specific form tailored with relevant fields, thereby streamlining operations. The system automatically validates the entered API keys to minimize errors. This is another addition to the rapidly expanding capabilities of the Liquidity Engine Web UI. #### Resolved issues [#resolved-issues-18] There have been no customer-facing issues reported in this or previous releases. *** ### September 30, 2024 [#september-30-2024] #### New features [#new-features-17] ##### Fully-featured liquidity adapter for Crypto.com [#fully-featured-liquidity-adapter-for-cryptocom] The full-blown liquidity acquisition adapter to **Crypto.com** is now available immediately to all B2CONNECT Liquidity Hub clients connecting via the FIX API. Crypto.com is a top-ranked cryptocurrency exchange platform that has recently been gaining traction among B2B clients as a direct market access enabler. With the introduction of the new connectivity option, B2CONNECT clients can now enhance their offerings with an expanded range of trading pairs. This feature also empowers them to diversify effectively, mitigating various risks such as counterparty, regulatory, and so on. The adapter enables access to price feeds (Level 2 quotes) on the trading platform and supports order placement, execution, and execution confirmation. Besides, its implementation ensures that these two main processes, getting quotes and trading, can be done in parallel, with the highest possible throughput and lowest network latency. This is the next step in B2CONNECT’s mission to enhance access to liquidity for its B2B clientele — digital asset exchanges and brokerages. We’re excited to provide trading platform operators with new opportunities to differentiate themselves by offering the trading community a wider range of trading options and better UX. ##### Liquidity configuration via CSV [#liquidity-configuration-via-csv] The B2CONNECT Web UI has been enhanced with the bulk import option of liquidity settings via a CSV file. This new feature enables B2CONNECT administrators to import an unlimited list of markets along with advanced liquidity parameters such as markups, volume modifiers, market depth, price and volume precision, and so on. Additional fields for defining synthetic instruments are provided to configure synthetic cross legs, quote sources, inversion, and more. The new interface validates the CSV file upon upload and also stores a history of imported settings. The latter empowers the B2CONNECT Hub operators to always have a fresh copy of the setup available for export as a CSV file, making it easier to enter adjustments, re-upload the configuration, and apply new liquidity settings. *** ### August 29, 2024 [#august-29-2024] #### New features [#new-features-18] ##### Faster Perpetual Futures trading via a high-end communication protocol [#faster-perpetual-futures-trading-via-a-high-end-communication-protocol] With this release, the B2CONNECT team has implemented a new integration with a fresh WebSocket API introduced by the Binance Futures platform earlier this year. This is a new option in addition to the time-tested REST API trading. The new connectivity technology uses a bidirectional, full-duplex protocol to transmit trade-related messages, which drastically increases execution quality. The average route time for trades shows an up to fourfold improvement over previously measured round-trip benchmarks. This is a true moonshot advancement in order execution quality that will allow any trading platform or other liquidity taker to offer exceptional trader UX improvements throughout their entire user base. ##### Concurrent connections to multiple API endpoints [#concurrent-connections-to-multiple-api-endpoints] This new feature allows B2CONNECT liquidity adapters to connect simultaneously to multiple endpoints associated with private and public APIs (where available). This enables access to digital resources on both types of endpoints at the same time. This advanced architecture improves resource availability and eliminates a single point of failure, giving B2CONNECT liquidity acquisition and distribution services the ability to simultaneously access market and trading data across various API clusters. The primary benefit of this new feature from a client perspective is much more reliable, fault-tolerant price feeds, order placements, and execution confirmations, improving UX while reducing market risks at the same time. #### Improvements [#improvements-17] * Trading log entries and error messages from both B2CONNECT internal services and external sources (such as supported liquidity providers) are now categorized and given a unified content and format before being transmitted to taker platforms. This ensures that messages are organized in a consistent manner and are better prepared for human consumption. This improvement is aimed at enhancing UX and reducing the load on a technical support team. * An improved B2CONNECT FIX server shutdown procedure has been implemented, which allows for graceful state saving and restoration, as well as prevents data loss due to interruptions of quoting and trading sessions. This enhancement ensures orderly logouts across all platforms connected via the FIX protocol, and availability of FIX messages after a restart. #### Resolved issues [#resolved-issues-19] * Fixed an issue where, in some scenarios, third-party FIX clients had issues reconnecting to the B2CONNECT FIX server after a logout. We have also ensured that a Logout message is consistently sent upon a client’s logout, which in rare cases may have been skipped prior to this release. * Fixed an issue that infrequently caused situations where after setting the order book depth to decrease, the number of levels would sometimes not increase back after reverting the settings. *** ### March 13, 2024 [#march-13-2024] #### New features [#new-features-19] ##### Liquidity distribution to the B2TRADER Brokerage Platform (BBP) [#liquidity-distribution-to-the-b2trader-brokerage-platform-bbp] With this release, the B2CONNECT team is excited to announce that the emerging B2TRADER Brokerage Platform has been added to our growing list of supported trading venues. This addition further advances our commitment to delivering top-notch connectivity to trading platforms and liquidity providers. The key updates encompass a bespoke order execution flow as well as custom FIX API endpoints that streamline the retrieval of available markets and contract specifications. With these enhancements, our industry-standard FIX protocol implementation enables a robust connection between the newly added platform and the liquidity providers supported by B2CONNECT. This integration empowers BBP’s clients to embrace flexible business models and adjustable execution strategies. And, as a result, further boost their success by providing exceptional user experiences to their end users — the members of the trading communities. ### November 10, 2023 [#november-10-2023] #### New features [#new-features-20] ##### Maker-integration with cTrader via the FIX protocol [#maker-integration-with-ctrader-via-the-fix-protocol] With this release, the B2CONNECT team is pleased to announce the achievement of a significant milestone in our ongoing quest to provide exceptional connectivity to both trading platforms and liquidity providers: we have successfully integrated B2CONNECT Liquidity Hub with **cTrader**. With this integration, B2CONNECT Liquidity Hub can now distribute the liquidity to cTrader, a complete trading platform solution for the forex and CFD brokers, via the FIX protocol. On one hand, this furnishes our clients running trading platforms with the ultimate access to liquidity. On the other hand, this empowers liquidity providers to implement comprehensive distribution solutions. This release marks the paradigm shift in the connectivity approach by including trading platform integrations alongside the liquidity providers and liquidity aggregators — our focus previously. This is a major step forward in expanding our ecosystem to include taker-venues, making our product a versatile liquidity distribution solution that meets the needs of a wide range of industry players in the dynamic world of trading. This new integration enables the provision of unique liquidity streams empowering our clients to differentiate themselves in a competitive and highly volatile market. Retail and institutional brokers, crypto exchanges, and liquidity providers can leverage our performant liquidity distribution solutions powered by industry-standard communication protocols and fast APIs built on scalable frameworks. *** ### October 20, 2023 [#october-20-2023] #### New features [#new-features-21] ##### Full support for Bitfinex Derivatives [#full-support-for-bitfinex-derivatives] Following the Bitfinex Spot support implemented earlier this year, we are pleased to announce full support for Bitfinex Derivatives with this release. It has been done per popular client request to support and improve diversification of perpetual futures liquidity flows, following the collapse of a global cryptocurrency derivatives player late last year. With this release, trading platforms powered by the B2BROKER technology receive additional benefits and opportunities, such as: * expand your offer with additional trading instruments * increase market depth due to additional liquidity source * improve liquidity, including faster and more flexible price feeds and better execution quality * diversify liquidity streams by the additional source of liquidity and avoid a single point of failure * differentiate yourself from competing platforms and, at the same time, delight your users by creating unique liquidity streams that have just become available from the newly supported platform. Among other features, the trading API and pre-execution model are fully supported and immediately available to client venues using the FIX protocol and relying upon the B2CONNECT’s signature FIX API (v1.2 and later). #### Improvements [#improvements-18] * A new tutorial has been added to the B2CONNECT Product guide, illustrating the process of setting up a connection to Coinbase. We took a special care to highlight the required credentials and help clients find them easily. *** ### September 29, 2023 [#september-29-2023] #### New features [#new-features-22] ##### FIX API 1.2 [#fix-api-12] With this release, B2CONNECT introduces a new version 1.2 of FIX API, which is an expanded and improved version of the previous implementation: * The Business Message Reject has been deleted. * The [Sequence Reset](fix-api#sequence-reset) message has been added. * The following tags have been added to the [Market Data Request](fix-api#market-data-request) message: `<267> NoMDEntryTypes` (required), `<269> MDEntryType` (required). * The following tag has been added to the [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) message: `<299> QuoteEntryID`. * The following tag has been added to the [New Order Single](fix-api#new-order-single) message: `<1> Account`. * The following tags have been added to the [Execution Report](fix-api#execution-report) message: `<64> SettlDate`, `<75> TradeDate`, `<103> OrdRejReason`. * The following tag has been added to the [Order Cancel Reject](fix-api#order-cancel-reject) message: `<39> OrdStatus` (required). The [FIX API specification](fix-api) has been updated to reflect the changes as well as to become more clear and consistent. *** ### May 12, 2023 [#may-12-2023] #### New features [#new-features-23] ##### A new form for entering API keys [#a-new-form-for-entering-api-keys] The B2CONNECT Web UI has been updated to display a customized form for entering API keys for each of the supported hedging platforms. As a result, the issues with entering the credentials have been eliminated. Since every platform features a different set of fields for entering the API keys, this form was updated to display the authorization fields as they are provided by each hedging platform and to prevent any ambiguity arising from the difference in the field names. #### Improvements [#improvements-19] * The contents of Web UI controls and field descriptions have been revised to afford a more intuitive interface. * The look and feel of the B2CONNECT Web UI has been enhanced by updating some of its most commonly used visual elements. #### Resolved issues [#resolved-issues-20] * Fixed an issue causing the API key editing window to hang when an entry for a hedging platform was absent in the configuration. Such exceptions are now handled, and the stability of the UI has increased as a result. * Fixed an issue due to which empty fields were erroneously assigned zero values after updating the hedging configuration. * Fixed an issue due to which duplicate entries could be displayed for clients on the Hedging Status tab. * Fixed an issue due to which incorrect values were submitted in certain scenarios when enabling or disabling hedging on the Hedging Status page of the Web UI. *** ### April 21, 2023 [#april-21-2023] #### Improvements [#improvements-20] ##### Liquidity provider validation before accepting incoming orders [#liquidity-provider-validation-before-accepting-incoming-orders] The order execution reliability has been greatly improved as a result of including a check for the actual availability of the supported liquidity providers before the B2CONNECT Liquidity Hub services can go forth and accept the incoming orders from a taker platform. Following the update of the B2CONNECT liquidity distribution services, they now always ensure that the connected liquidity providers are ready to execute a placed order, in which case the order is then accepted for execution on the connected trading venue serving as a liquidity consumer. ##### Type-agnostic execution of orders [#type-agnostic-execution-of-orders] If the order type that was set by a taker platform isn’t recognized as a valid execution option, the B2CONNECT liquidity distribution services can be configured to emulate the required order type by assigning a different type to the order. This way you can further ensure that the placed orders will be filled regardless of their types, and their execution quality will match the expectations of your end-users to the fullest possible extent. ##### Repeated requests for order placement [#repeated-requests-for-order-placement] The B2CONNECT order placement services have been revised to enable them to retry order placement if a target liquidity provider platform is unable to fill an order for a transient reason. If the dedicated B2CONNECT service recognizes the returned error as transient (as opposed to intrasient errors, such as those arising from connection failures), the service then works around this issue by automatically sending a repeated request for order placement, which increases the chances that the order will be eventually filled. This is especially useful in times of increased market volatility resulting in drastic increase in traders’ activity, which may overwhelm the liquidity provider services making it difficult to fulfill all the requests for orders execution. #### Resolved issues [#resolved-issues-21] * Fixed some issues affecting the B2CONNECT notification service. These include occasional service stability issues arising from an incorrect data format, as well as the issue due to which a user identifier defined in hedging configuration could not be resolved if this user’s trading platform was left unspecified. * Fixed an issue that affected the adapter used to connect to one of the supported liquidity providers and prevented restarting the service and restoring the connection after the liquidity provider has disconnected the communication protocol. * Fixed some minor issues with the B2CONNECT Web UI due to which it could be difficult for users to replace the API keys in certain scenarios. * Fixed an issue with the Hedging Reports section of the B2CONNECT Web UI due to which the Amount field in the Order Details section could be occasionally assigned incorrect data. *** ### March 10, 2023 [#march-10-2023] #### New features [#new-features-24] ##### Hedging on Bitfinex [#hedging-on-bitfinex] Bitfinex, a global cryptocurrency exchange and spot trading venue, is now supported as a new hedging platform. As is well known, diversification is the key to thriving, regardless of market conditions. This is why with the two most recent releases we specifically focused on providing the widest variety of connectivity options to our global-minded clients, while offering them the opportunity to hedge market risks on suitable platforms in as many regions and jurisdictions as possible with a view of achieving the maximum geographical and regulatory diversity. The newly released trading adaptor for the Bitfinex API is the next step on the B2CONNECT’s journey aimed at empowering its discerning B2B clients, which include cryptocurrency exchanges and crypto brokers. In the meantime, our main goal remains constant: we are eager to not only delight trader communities by ensuring a fantastic user experience, but also to offer trading platforms broad opportunities for spreading risks and allow them to take a savvy approach to exposure in a wide range of market situations. #### Improvements [#improvements-21] ##### Enhanced support for trading instruments engineered as contracts [#enhanced-support-for-trading-instruments-engineered-as-contracts] We have significantly expanded the contract specification capabilities for some of the supported crypto assets by encompassing all popular methods of defining trading instruments. With the enhanced contract sizes, the price and/or amount can be configured in any combinations while designing contracts for various symbols, with taking into consideration both the contracts that are priced by amount and those evaluated by face value regardless of their amount. #### Resolved issues [#resolved-issues-22] * Fixed an issue due to which the adaptor used for price discovery on one of the supported liquidity providers could hang in certain scenarios. * Fixed an issue which hampered the efficiency of the cloud resources utilization by making multiple subscriptions to quotes for the same asset if liquidity for this asset was used to maintain price feeds for several symbols. * Fixed an issue which caused intermittent disconnection of the FIX protocol after restarting one of the supported liquidity aggregators. * Fixed an issue related to number formats which occasionally appeared in hedging reports. As a result, the scientific EXP format used for some of the fields has been replaced with a more user-friendly financial format. *** ### February 17, 2023 [#february-17-2023] #### New features [#new-features-25] ##### Hedging on Kraken [#hedging-on-kraken] As part of our relentless pursuit of providing crypto asset exchanges and brokers seamless access to the widest possible choice of hedging platforms, we are pleased to announce full support for the Kraken trading API, which opens new horizons for trading venues relying on B2CONNECT Liquidity Hub in terms of risk transfer and supplying the price feed. This is a major landmark for B2CONNECT, made possible by enhancing the previously released adapter used for connecting to this well-established bitcoin trading platform and cryptocurrency exchange which is based in San Francisco. As a result, both Level 2 quotes and hedging for all symbols traded on Kraken are now available to B2CONNECT clients. #### Improvements [#improvements-22] ##### Extended documentation [#extended-documentation] [A new tutorial](how-to-articles/how-to-properly-configure-api-keys-on-kraken) has been added to B2CONNECT documentation, illustrating the process of obtaining the API keys required to enable hedging on Kraken using the newly introduced hedging adapter. Paying special attention to keeping our documentation up-to-date and complete, we invite you to learn more about B2CONNECT by exploring our Product Guide and encourage you to contact us if you have any suggestions or need further assistance. #### Resolved issues [#resolved-issues-23] * Fixed an issue which caused the hedging engine to hang up immediately after entering the API keys for connecting to some of the hedging platforms in certain scenarios. * Fixed an issue which prevented simultaneous placement of multiple hedging orders, causing instead their consecutive placements which resulted in slightly delayed execution. * Fixed an issue which caused recurrent switching between the main and backup liquidity providers in certain scenarios. *** ### January 27, 2023 [#january-27-2023] #### New features [#new-features-26] ##### Level 2 quotes supported for Bitfinex spot liquidity [#level-2-quotes-supported-for-bitfinex-spot-liquidity] Yet another major cryptocurrency exchange Bitfinex has been integrated, ensuring steady supply of spot asset liquidity from this global platform. This highly anticipated development opens exciting new opportunities for operators of crypto trading venues, since it is hard to overestimate the importance of being able to connect to unique liquidity sources. For those who are determined to survive the ongoing “crypto winter” and excel in a highly competitive environment, this is a great opportunity to appeal to extremely discerning trader communities with the best possible offering, which includes a wide array of trading instruments and guarantees tighter spreads and remarkable market depth. This is undoubtedly great news both for the exchanges powered by matching engines, such as B2TRADER, and for third-party crypto exchanges and brokers connected to B2CONNECT via the FIX protocol (either using the B2CONNECT proprietary FIX API or solutions relying on liquidity aggregators, such as oneZero and PrimXM). #### Improvements [#improvements-23] ##### Improved handling of Level 2 quotes [#improved-handling-of-level-2-quotes] The performance of locally maintained extended order books with a virtually unlimited number of price levels (up to 5,000 and beyond) has been enhanced, thanks to implementation of an improved solution, which enables combining multiple price feeds into a single data stream, as opposed to one-to-one channel subscriptions that were previously supported. This has resulted in a drastic performance boost for the price discovery engine, along with a notable increase in the frequency of Level 2 quote updates. #### Resolved issues [#resolved-issues-24] * Fixed an issue that caused occasional generation of empty reports due to incorrect logging of executed trades. * Fixed an issue that prevented subscription to more than a hundred trading instruments due to a bug in the adaptor used to connect to one of the supported liquidity providers. * Fixed an issue related to data exchange with message-oriented middleware, which caused occasional rejection of orders placed using the FIX protocol. * Fixed an issue due to which in certain scenarios the hedging engine attempted to place trades on one of the supported liquidity provider platforms despite the corresponding API keys being missing. * Fixed an issue due to which requests to place offset orders were occasionally sent to hedging platforms even when the order volume was zero after applying the trading rules governing decimal precision of order amounts on these platforms. ### December 16, 2022 [#december-16-2022] #### New features [#new-features-27] ##### Support for multiple accounts on a single hedging platform [#support-for-multiple-accounts-on-a-single-hedging-platform] Automated hedging can now be performed simultaneously on two or more accounts on the same hedging platform for routing offset trades with a purpose of hedging market risks. First and foremost, the B2CONNECT team is committed to empowering its user base — that is, operators of trading venues, such as spot crypto exchanges and brokerages — and putting their best efforts to implement as flexible and efficient hedging policies as possible. With that in mind, this newly added feature is aimed at supporting multiple accounts on a single hedging platform, while ensuring precise order placements, timely delivery of execution confirmations and in-depth reporting for each account used to make offset trades on a given liquidity provider platform. #### Improvements [#improvements-24] ##### Unmatched execution quality due to asynchronous placement of orders [#unmatched-execution-quality-due-to-asynchronous-placement-of-orders] The B2CONNECT order placement engine relying on trading sessions maintained using the FIX protocol has been vastly improved by adding support for asynchronous placement of large numbers of orders submitted for execution on liquidity provider platforms, which has resulted in unprecedented speed and unrivaled execution quality. ##### Extended infrastructure for engineering of synthetic instruments [#extended-infrastructure-for-engineering-of-synthetic-instruments] A new improvement to the B2CONNECT synthetics engine has significantly extended the range of available sources of quotes suitable for engineering synthetic trading instruments, such as synthetic crosses, fractional markets and inverted pairs. Accessible price feeds are not only received from a B2CONNECT instance hosting the synthetics engine itself, but also from any other instance within the Liquidity Hub ecosystem. #### Resolved issues [#resolved-issues-25] * Fixed an issue related to the reporting service: when a single order was filled by way of multiple executions on a particular hedging platform, only one of the executions was recorded. * Fixed a bug related to the [SimpleFIX Go library](https://github.com/b2broker/simplefix-go/) implementing the FIX protocol, which could have caused an issue with the logon sequence if a client used a different FIX protocol implementation. * Fixed an issue causing a resource leak in the synthetics engine that could have given rise to intermittent stability issues. In addition, another resource leak has been eliminated in an adapter used to connect to one of the supported spot cryptoasset liquidity providers, ensuring overall stability of the service, its reliability and uninterrupted uptime. ### November 25, 2022 [#november-25-2022] #### New features [#new-features-28] ##### Direct integration of the B2CONNECT FIX server with PrimeXM [#direct-integration-of-the-b2connect-fix-server-with-primexm] The B2CONNECT Liquidity Hub is now capable of distributing liquidity as a maker to PrimeXM. Client connections to this leading liquidity aggregation platform are powered by the industry-standard FIX protocol, and the liquidity bridged by B2CONNECT can now be distributed directly on PrimeXM for its subsequent distribution across other trading venues. Both the quoting and trading sessions are supported, providing immense benefits to trading venues participating in the B2CONNECT ecosystem and offering them new exciting opportunities to grow their business and differentiate from competitors in both the scope and performance of trading instruments available both to their users and the trading community as a whole. #### Improvements [#improvements-25] ##### Automatic validation of markups [#automatic-validation-of-markups] The price construction mechanism featured by B2CONNECT has been further improved by adding validation to the key parameters entered for price markups. If the markup values assigned to the BID and ASK sides are asymmetric, a warning is issued prompting a venue operator to correct the entered values so that unequal markup amounts are not placed on both sides of the order book. ##### More data for tracking orders and matching elements of the hedging flow [#more-data-for-tracking-orders-and-matching-elements-of-the-hedging-flow] The logging and reporting functionality provided by various B2CONNECT services has been enhanced by listing external execution identifiers assigned by connected liquidity providers along with their B2CONNECT-assigned equivalents. This way, order matching has become much quicker, also facilitating subsequent analysis of trades. Moreover, orders have also become easier to track thanks to newly introduced granular timestamps. #### Resolved issues [#resolved-issues-26] * Fixed an issue due to which the order book was reset upon receiving out-of-sequence incremental updates for Level 2 quotes from one of the supported liquidity providers. * Fixed an issue related to one of the supported liquidity providers: a command to subscribe to incremental updates was ignored for all trading instruments if it couldn’t be executed only for some of them. * Fixed an issue related to the B2CONNECT FIX protocol: non-sequential numbers were assigned to certain FIX messages. * Fixed a rarely occurring issue related to the B2CONNECT Web UI: toggling a certain switch when setting up one hedging platform could result in misconfiguration of another hedging platform. * Fixed an issue related to the reporting and alerting service used for sending messages to a Slack channel: in some cases, incorrect data was being reported. *** ### October 14, 2022 [#october-14-2022] #### New features [#new-features-29] ##### Liquidity from and hedging on FTX [#liquidity-from-and-hedging-on-ftx] We are happy to announce yet another major achievement in our quest for unrivaled connectivity for B2CONNECT across the spot crypto liquidity space: with this release, FTX, a top-rated global crypto exchange, has been supported, once again letting B2CONNECT assert itself as a flagship liquidity hub and price discovery engine. The liquidity for all markets represented on FTX is immediately available for any exchange powered by the B2TRADER matching engine as well as to any trading platform connected to B2CONNECT via the FIX API. Along with supplying the price feed for spot markets, the newly introduced connection adapter radically extends the range of price risk hedging options offered by the B2CONNECT hedging engine. #### Improvements [#improvements-26] ##### DB connectivity monitoring [#db-connectivity-monitoring] When it comes to the cloud infrastructure accommodating the B2CONNECT services, we put our best efforts to not only ensure its highest performance and extreme reliability, but also envision efficient ways to monitor and maintain connectivity. In keeping true to our principle — trust, but verify — we have implemented automated detection of connectivity issues related to managed cloud database services. ##### Optimal subscription management [#optimal-subscription-management] Superb performance is the cornerstone on which rests the success of the B2CONNECT liquidity platform, and it’s been proved time and again during its development that the key to achieving the highest degree of efficiency is constant optimization. This time, it has been ensured that the liquidity hub only subscribes to the symbols that take part in liquidity distribution. This saves the cloud resources due to removal of subscriptions which are not currently in demand and further improves the overall platform performance. #### Resolved issues [#resolved-issues-27] * Fixed an issue due to which one of services stopped after removing a subscription to a price feed. * Fixed an issue due to which a mandatory time-in-force parameter value wasn’t sent when placing hedging orders of a certain type on a particular hedging platform. *** ### September 23, 2022 [#september-23-2022] #### New features [#new-features-30] ##### Conversion of derivative contract lot sizes to smaller and larger tradable amounts [#conversion-of-derivative-contract-lot-sizes-to-smaller-and-larger-tradable-amounts] With this release, you can split derivative contracts and reform contract specifications with underlying digital assets to change the contract lot size and lot price. This is a major development, since it enables quoting and trading fractional and, inversely, consolidated crypto derivative contracts. For example, if an instrument is traded at a liquidity provider venue in lots of 1000, such derivatives can now be traded in lots of one to a million on a taker side, with the contract quotes readily adjusted to the new contract sizes. When the orders are placed for executions on liquidity provider venues, they are adjusted to meet the lot size requirements of each venue. #### Improvements [#improvements-27] ##### The order book state may be preserved indefinitely [#the-order-book-state-may-be-preserved-indefinitely] The adapter used to connect to liquidity providers has been further improved by adding the option to hold the last value of a quote indefinitely. A good case for this is dealing with acquisition of quotes when the asset price changes only intermittently even though the connection to the liquidity provider is alive. ##### The current state of Level 2 quotes is now reset upon disconnection [#the-current-state-of-level-2-quotes-is-now-reset-upon-disconnection] This improvement is related to the previous one: it has been ensured that even when the asset price is configured to handle infrequent refreshing of quotes, once connection to a liquidity provider goes down, the state of Level 2 quotes is reset until connection to the source of quotes is renewed. #### Resolved issues [#resolved-issues-28] * Fixed an issue due to which, when asset volume is denominated with high decimal precision, small order amounts could be truncated to zero and error messages may be sent by liquidity providers. It is now ensured that hedging is handled properly, and in cases when orders are so small that they would be rejected by liquidity provider venues, they are not sent there for execution. * Fixed an issue which caused race conditions. This has resulted in improved stability and performance of a hedging agent along with an adapter used to fetch asset quotes from a liquidity provider venue. * Fixed an issue related to recording of time values. It has been ensured that timing is now properly recorded and corrected for ongoing order execution requests. * Fixed an issue concerning a service responsible for handling the FIX protocol. The service is now capable of resuming the price feed after connection to the liquidity taker was reinstated. * Fixed an issue due to which upon entering a long numerical value on a Web UI form, its last digit was switched to zero. *** ### September 2, 2022 [#september-2-2022] #### New features [#new-features-31] ##### Updated documentation [#updated-documentation] A new section has been added to the B2CONNECT documentation providing a user interface overview and illustrating how to accomplish the most common tasks. Refer to the **Product guide** to learn about the hedging functionality provided by B2CONNECT. #### Improvements [#improvements-28] With this release, various changes have been introduced to B2CONNECT user interface, which include the following improvements: * A table header in the Hedging configuration section has become fixed, making it easier to see the field captions when scrolling down the page. * All buttons have been provided with tooltips describing their functionality. * The minimum screen resolution (960px) is now supported on all product pages. *** ### August 12, 2022 [#august-12-2022] #### New features [#new-features-32] ##### Full support for Huobi Futures [#full-support-for-huobi-futures] Huobi Futures, a top-rated derivative exchange platform, has been fully supported. As a result, robust supply of level 2 quotes has been ensured across the entire range of trading instruments, including but not limited to futures, swaps and perpetual swaps available on the newly supported platform. This new level of liquidity has been provided following a major update of a recently released Huobi Spot Adapter, which was greatly extended to allow B2CONNECT clients to explore all the advantages offered by Huobi-powered trading venues. The trading API is also supported, which opens new opportunities for best price execution and radically expands the range of options available to B2CONNECT Liquidity Hub clients in the realm of market risk mitigation while allowing them to offer their end users the tightest spreads and deepest order books across today’s markets. Among other features, pre-execution model is fully supported and immediately available to client venues utilizing the FIX protocol and relying upon the B2CONNECT signature FIX API. #### Improvements [#improvements-29] ##### Increased consistency of synthetic quotes [#increased-consistency-of-synthetic-quotes] The engine responsible for engineering synthetic cross pairs and fractional trading instruments has received yet another boost in functionality to increase the consistency of synthetic quotes by eliminating any outlying values when calculating spreads. ##### Extra validation ensuring decimal precision of asset prices [#extra-validation-ensuring-decimal-precision-of-asset-prices] Arguably, when it comes to cryptocurrencies and other types of digital assets, the issue of decimal precision may be challenging for some legacy trading platforms and liquidity aggregators that primarily deal with fiat instruments and traditional securities. In contrast, B2CONNECT ensures that liquidity is always ingested, handled and distributed with superb efficiency, regardless of decimal precision and numerical value range of asset prices. With an additional layer of validation added to its liquidity engine, B2CONNECT makes sure that decimal precision values are always handled in strict accordance with the client specification, throughout the entire liquidity processing pipeline. #### Resolved issues [#resolved-issues-29] * Fixed an issue due to which supported platforms could sometimes fail to subscribe to level 2 quotes provided by B2CONNECT. * Fixed an issue due to which the final status of an order execution could be recorded incorrectly in certain scenarios involving one of the supported hedging platforms. *** ### July 1, 2022 [#july-1-2022] #### New features [#new-features-33] ##### Hedging reports — New section in Web UI [#hedging-reports--new-section-in-web-ui] On a newly introduced Hedging Reports page, you can find the history of hedging orders, view comprehensive order data and drill down to the minute details of each execution. The data on order placement requests and hedging platform responses is readily available, along with the information related to timing of each step along the order processing pipeline. You can filter the reports by various criteria, including different types of order and counterparty IDs, order placement and execution data, as well as various time intervals. The table layout is configurable, making it possible to reorder the columns and display or hide any column according to your preferences. #### Resolved issues [#resolved-issues-30] * Fixed various usability issues to improve the user experience. * Fixed an issue which prevented access to inputs due to an overlapping menu. *** ### June 10, 2022 [#june-10-2022] #### New features [#new-features-34] ##### A tenfold increase in Level 2 quotes update speed [#a-tenfold-increase-in-level-2-quotes-update-speed] The rate of Level 2 quote updates has been increased ten times compared to the previous release, enabling liquidity feeds to be refreshed with an interval of 100 ms. This feature allows B2CONNECT Liquidity Hub clients to initiate and maintain the most up-to-date order books that enhance user experience for traders on the supported exchange and broker platforms, as well as make risk management aspects of trading venue operations more predictable. #### Improvements [#improvements-30] ##### API rate limits implementation [#api-rate-limits-implementation] The B2CONNECT Liquidity Hub hedging engine’s reliability has been given yet another boost with the implementation of support for request rate limits. This ensures optimal uptime for API connections employed for the purposes of trade executions and reporting. ##### Heartbeats and graceful connection termination [#heartbeats-and-graceful-connection-termination] Health checks and connection handling safeguards have been added to ensure a seamless connection to liquidity provider data. As a result, unmatched reliability in managing Level 2 quote feeds has been achieved. #### Resolved issues [#resolved-issues-31] * Fixed timeout issues that could affect reliability of full-duplex communication channels-while connecting to certain liquidity providers via API. * Fixed an issue with the mechanism responsible for restoring an API connection upon its interruptions in certain corner cases. * Fixed an issue due to which the Filled Amount field in hedging order execution reports could contain incorrect values. *** ### May 20, 2022 [#may-20-2022] #### New features [#new-features-35] ##### Markups as a function of order book depth [#markups-as-a-function-of-order-book-depth] B2CONNECT Liquidity Hub clients can now apply multiple markups based on the price level defined for Level 2 quotes. Together with variable volume modifiers introduced earlier this year, this feature empowers the trading venue operators to manage the liquidity of their order books to a highest precision, thus improving the user experience while mitigating market risks. #### Improvements [#improvements-31] ##### Improved logics for applying markups [#improved-logics-for-applying-markups] The algorithms used for applying both constant and multi-tiered markups have been revised. This has resulted in improved quality of liquidity distribution after applying markups. ##### More granular analytics with new data included in hedging order execution reports [#more-granular-analytics-with-new-data-included-in-hedging-order-execution-reports] More data about orders is now recorded by the B2CONNECT reporting engine. A new field has been added to store the order status information provided by hedging platforms. Furthermore, a new status has been included to distinguish expired orders from those canceled for other reasons. #### Resolved issues [#resolved-issues-32] * Fixed an issue that caused a leak of resources during disconnections occurring as a result of intermittent network failures. * Fixed several issues that occurred in rare scenarios. Reliability and high availability of services responsible for liquidity supply in various market conditions has been ensured as a result. *** ### April 29, 2022 [#april-29-2022] #### New features [#new-features-36] ##### Yet more liquidity from Huobi Global [#yet-more-liquidity-from-huobi-global] The B2CONNECT Liquidity Hub is celebrating a new major update: we worked hard to introduce a fully featured adapter for the top-rated crypto exchange Huobi Global. Both the Level 2 quote and hedging adapters have become available to all B2CONNECT Ecosystem participants. This highly anticipated component has boosted both the breadth and depth of the crypto spot liquidity offering, carrying a great advantage for supported digital asset exchanges, including B2TRADER. For the liquidity hub as a platform, this also ensures increased availability and improved failover capability. The influx of liquidity from the new source will also benefit the client venues integrated with B2CONNECT via FIX API. #### Improvements [#improvements-32] ##### Optimized market data delivery [#optimized-market-data-delivery] The parser of market data coming from one of the world's largest crypto exchanges has been optimized, which resulted in a significant improvement in the adapter performance. Latency has been reduced by an order of magnitude, and the quality of market data and overall reliability have been considerably improved. ##### More flexible hedging with enhanced time-in-force settings [#more-flexible-hedging-with-enhanced-time-in-force-settings] A hedging adapter for one of the major crypto-asset exchanges has been revamped, extending our offering to encompass the full range of trading parameters available for orders placed in the context of market risk hedging. With the newly introduced time-in-force options, our clients are free to devise more flexible and ultimately more efficient hedging strategies. #### Resolved issues [#resolved-issues-33] * Fixed an issue which didn't allow the hedging agent to record certain fields when trades were rejected by a hedging platform. * Fixed an issue which affected processing of incoming and outgoing messages used by one of the supported protocols, when some messages could be blocking other ones at a high load. A considerable potential bottleneck has been prevented as a result. * Fixed an issue that could affect order book consistency for one of the supported exchanges. * Fixed an issue that could have impact on the stability of some of the B2CONNECT services if reports were received in an incorrect format. * Fixed an issue that could result in a failure to cancel a previously placed order while executing a hedging strategy on one of the supported hedging platforms. ### April 8, 2022 [#april-8-2022] #### New features [#new-features-37] ##### Comprehensive integration with Bittrex Global [#comprehensive-integration-with-bittrex-global] A new adapter has been introduced to enable price discovery and market risk hedging on Bittrex Global. Connection to this global crypto exchange drastically extends the range of trading instruments and hedging options provided by B2CONNECT. ##### Hedging on Coinbase [#hedging-on-coinbase] A new adapter has been introduced to enable spot asset hedging on the Coinbase crypto exchange. For B2CONNECT Liquidity Hub clients who already came to appreciate the advantages of seamless Coinbase connection, this improvement signals complete integration with this major crypto trading platform, opening the opportunity for superior spot asset hedging. #### Improvements [#improvements-33] ##### Extended price feed options [#extended-price-feed-options] The price feed can now be streamed in the form of order book snapshots. Adding up to incremental feed updates, this further ensures even and reliable streaming of prices. ##### New performance benchmark reached [#new-performance-benchmark-reached] Over 200% increase in B2CONNECT performance has been secured thanks to optimization of the data interchange mechanism, which resulted in a major reduction of latency and more judicious use of computing resources. Smart use of cloud resources and bandwidth directly translates into the amount of trading instruments which a B2CONNECT instance can handle efficiently. This also implies increased market depth and higher frequency of symbol quote updates, along with a much better quality of order execution and improved bottom line. #### Resolved issues [#resolved-issues-34] * Fixed an issue impairing the reliability of streaming order book data in rare scenarios. * Fixed an issue which occasionally caused a resource leak in cases when specific configuration parameters were missing. The stability of the hedging services has improved as a result. * Fixed an issue causing occasional inversion of sides when hedging trades were placed on certain platforms. *** ### March 18, 2022 [#march-18-2022] #### New features [#new-features-38] ##### Streamlined order book consolidation [#streamlined-order-book-consolidation] With this release, B2CONNECT supports consolidation of Level 2 quotes with unlimited market depth into any order book, according to flexible configuration rules. As a result, B2CONNECT clients can stream a price feed with a specified liquidity distribution to fill an order book with fewer levels while preserving the overall market depth. This way the B2CONNECT platform, with its support for virtually unlimited market depth, becomes even easier to integrate with trading venues whose market depth is limited to just a dozen or a hundred order book levels. At present, this functionality is available only for services accessible via FIX API. ##### Improved SimpleFIX Go documentation [#improved-simplefix-go-documentation] The official documentation for the SimpleFIX Go library has been updated. This state-of-the-art library makes for a major contribution to open source on behalf of B2BROKER, providing an up-to-date FIX engine implementation out of the box while featuring high performance and employing a highly sought-after Go technology stack. The library is available at [https://github.com/b2broker/simplefix-go](https://github.com/b2broker/simplefix-go/) offering the global developer community a quick and easy approach to integrate FIX messaging pipelines into modern trading solutions powered by Go as well as ensure a closer integration with well-proven products from the B2BROKER family. #### Improvements [#improvements-34] ##### Support for liquidity with virtually unlimited order book depth [#support-for-liquidity-with-virtually-unlimited-order-book-depth] As a result of this improvement, nearly unlimited number of Level 2 quotes is now supported when it comes to the actual number of price levels in the order book, which includes (but is not limited to) order books featuring 1,000+ levels that are currently supported. ##### Extended configuration of Level 2 quotes [#extended-configuration-of-level-2-quotes] The set of configuration parameters required for consolidation of Level 2 quotes into a custom price feed has been extended to include the options that define the number of price levels being consolidated into a target order book, volume distribution settings and the rules for discovering prices at specific order book levels. #### Resolved issues [#resolved-issues-35] * Revamped a service responsible for switching the source of Level 2 quotes in the case when the counterparty starts supplying incorrect order book data. Continuous operation of price discovery services has been ensured as a result. * Fixed an issue that caused inversion of hedging trade sides in certain scenarios. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-39] ##### Pre-trade execution control [#pre-trade-execution-control] B2CONNECT now supports pre-trade execution control that enables the trading venues integrated via the FIX API to connect to the B2CONNECT Liquidity Hub as takers. When connected as a taker, a venue receives Level 2 quotes, it can place orders and receive confirmations when a maker executes the orders. ##### FIX API documentation [#fix-api-documentation] Basic [FIX API specification](fix-api) has become available to help independent trading venues and liquidity providers integrate B2CONNECT Liquidity Hub into their solutions via the FIX API. #### Improvements [#improvements-35] ##### Pricing Service streams prices with markups already applied [#pricing-service-streams-prices-with-markups-already-applied] A specialized B2CONNECT service providing top-of-the-book prices (that is, Level 1 quotes) is now streaming quotes with configurable markups already applied, as opposed to the earlier implementation, with only the raw quotes provided so that markups had to be applied explicitly upon receiving the markup values via separate REST APIs. The newly introduced approach is much easier and less time-consuming. #### Resolved issues [#resolved-issues-36] * Fixed an issue that resulted in the lot size not being taken into account when placing hedging orders on certain hedging platforms. * Fixed issues that affected the stability and performance of the B2CONNECT hedging engine. *** ### February 4, 2022 [#february-4-2022] #### New features [#new-features-40] ##### Full support for Kraken spot liquidity [#full-support-for-kraken-spot-liquidity] Trading venues participating in the B2CONNECT Ecosystem can now take advantage of ready access to spot liquidity on one of the top-ranked cryptocurrency exchanges — yet another milestone for B2CONNECT continuing on its mission of diversifying access to liquidity, be it crypto spot markets, crypto derivatives or other popular trading instruments. #### Improvements [#improvements-36] ##### Improved support for Poloniex API [#improved-support-for-poloniex-api] The Poloniex connection adapter has been updated following the changes to the API of this leading digital assets exchange, which resulted in enhanced performance and improved connection stability. ##### Extended integration with B2TRADER [#extended-integration-with-b2trader] With this release, B2CONNECT features even deeper integration with B2TRADER, a flagship matching engine and crypto assets exchange platform. As a result, more efficient delivery of trading reports and faster execution of hedging orders have become possible. #### Resolved issues [#resolved-issues-37] * Fixed an issue related to the Poloniex adapter and causing inconsistencies in Level 2 quotes under certain circumstances. * Fixed a reporting-related issue to ensure that the fees and commissions data is properly received and reflected in hedging reports. * Fixed issues causing occasional quote feed inconsistencies arising immediately after updating the configuration of some of the B2CONNECT services. *** ### January 14, 2022 [#january-14-2022] #### New features [#new-features-41] ##### Volume modifiers variable by price level [#volume-modifiers-variable-by-price-level] B2CONNECT Liquidity Hub clients can now configure a volume modifier (otherwise known as multiplier) as a function of market depth. Risk management precision can be ensured by fine-tuning liquidity distribution data in the order book. ##### Execution of hedging orders on Binance Futures [#execution-of-hedging-orders-on-binance-futures] A new adapter has been introduced for execution of hedging orders on Binance Futures, a major platform specializing in crypto derivatives. Combined with instruments for perpetual futures trading, this new service creates truly exciting opportunities for B2CONNECT Liquidity Hub clients. ##### Hedging of spot assets with Binance perpetual futures [#hedging-of-spot-assets-with-binance-perpetual-futures] Spot asset trades can be hedged with perpetual futures. B2CONNECT clients can reduce costs and improve the cash flow by applying more attractive strategies. #### Improvements [#improvements-37] * A new adapter has been introduced for connection to Gemini, another major cryptocurrency exchange providing spot liquidity for B2CONNECT clients. * A new adapter has been introduced for execution of hedging orders on the Poloniex crypto exchange. #### Resolved issues [#resolved-issues-38] * Fixed an issue that could result in omission of some trade parameters in the hedging orders trade history. * Fixed an issue that could cause an order timeout error despite normal execution of actual trades. ### December 17, 2021 [#december-17-2021] #### New features [#new-features-42] ##### Hedging configuration in the B2CONNECT Admin panel [#hedging-configuration-in-the-b2connect-admin-panel] Introducing a new Admin panel with a convenient user interface featuring useful hedging configuration options, allowing you to: * Specify the minimum and maximum amount at which to execute hedging orders, and define different hedge ratios for each order side. * Map some of the hedging order symbols to other symbols, meaning that you can hedge using any symbols apart from those present in a particular instrument. These options can find a variety of applications. For example, you can hedge by forcibly splitting large orders and executing each portion separately. ##### Hedging status — New section in Web UI [#hedging-status--new-section-in-web-ui] On a new Hedging Status page, you can manage and monitor trading venues and hedging platforms to solve any of the following tasks: * Run or stop the hedging process. * Connect hedging platforms to client exchanges or disconnect them according to your risk transfer preferences. * Manage API keys provided by the connected hedging platforms. *** ### December 3, 2021 [#december-3-2021] #### New features [#new-features-43] ##### FIX integration — Another major liquidity distribution platform supported [#fix-integration--another-major-liquidity-distribution-platform-supported] A new adapter has been introduced for connection to another major platform specializing in margin trading. This is a welcome addition to a rich set of connectivity options available to B2CONNECT Liquidity Hub clients. ##### Simultaneous connection to a number of ecosystem makers [#simultaneous-connection-to-a-number-of-ecosystem-makers] Any venue participating in the B2CONNECT ecosystem (or *ecosystem taker*) can now establish a live connection with multiple *ecosystem partners*, enjoying simultaneous access to multiple liquidity streams and gaining a competitive edge on the turbulent hedging market #### Improvements [#improvements-38] * The identifier assigned to executions by an exchange is now being tracked throughout the entire succession of hedging operations. This greatly improves the quality of end-to-end analytics available to risk managers employed at venues participating in the B2CONNECT ecosystem. * The hedging order placement process has been streamlined, resulting in improvements to the prioritization engine, which ensures the fastest possible routing of orders resulting in timely and efficient risk transfer coming handy to any risk management strategy. * In anticipation of possible connection failures or other issues compromising continuous liquidity flow from ecosystem makers, both the price feed and hedging can be configured to prescribe automatic switching to another ecosystem partner or external liquidity provider, followed by switching back to use them again as soon as the connection is restored. #### Resolved issues [#resolved-issues-39] * Fixed an issue that could compromise reliability of order routing services in some scenarios. Fault tolerance is now ensured in potentially disruptive cases, such as when trading symbols are found to be misconfigured or missing from a hedging configuration. *** ### November 12, 2021 [#november-12-2021] #### New features [#new-features-44] ##### The VWAP and total volume included in reports [#the-vwap-and-total-volume-included-in-reports] Hedging orders exceeding a certain amount (configurable) can be executed in multiple portions. The total hedging volume and Volume Weighted Average Price are included into a corresponding report. ##### 100 price levels — Market depth milestone passed [#100-price-levels--market-depth-milestone-passed] Liquidity can now be provided with a market depth of more than 100 order book levels, which in practice implies virtually infinite order book. The previous milestone, with a maximum of 100 levels in the order book, has been reached and passed — the actual market depth now depends solely on the available computing resources. ##### Flexible user roles and granular access permissions [#flexible-user-roles-and-granular-access-permissions] It is now possible to configure and assign custom user roles, dynamically if required. This approach to maintaining access permissions ensures proper access control granularity, promising an easier way to manage a multitude of permissions across various system modules. #### Improvements [#improvements-39] * Data exchange between various product services via the internal messaging system has been optimized, resulting in sturdier interoperability and reduced consumption of cloud resources. * Currency pairs can now be inverted, which adds up to the range of hedging parameters available for synthetic instruments. They can be modeled on any of the symbols in a pair, regardless of whether they are notionally considered base or quoted. #### Resolved issues [#resolved-issues-40] * Fixed an issue that imposed an unreasonable limit upon the order book depth. *** ### October 22, 2021 [#october-22-2021] #### New features [#new-features-45] ##### Synthetic Engine integration [#synthetic-engine-integration] The Synthetics Engine has become an integral part of the B2CONNECT Liquidity Hub ecosystem. ##### Notional values as hedging order limits [#notional-values-as-hedging-order-limits] The set of hedging configuration parameters has been extended, making for a much more flexible risk management: when configuring limit settings of your hedging orders, you can list both a base asset and a notional symbol which may be quoted in any asset, including fiat currencies. ##### More order types, hedging with time-in-force settings [#more-order-types-hedging-with-time-in-force-settings] The set of available time-in-force options has been extended. Apart from a variety of market orders, you can place limit orders and configure their slippage settings. #### Improvements [#improvements-40] * Precise timing is now an important aspect of analytics available to B2CONNECT Liquidity Hub clients. The time of order execution at a hedging platform is now being tracked, opening doors for new insights inspired by accurate execution data. * It is now possible to specify the minimum and maximum amount for hedging orders. The amount limits are adjusted to the hedge ratio. #### Resolved issues [#resolved-issues-41] * Fixed an issue compromising the stability of an internal service monitoring the status of sources supplying Level 2 quotes to B2CONNECT. Continuous streaming of liquidity feeds is now ensured. *** ### June 10, 2021 [#june-10-2021] #### New features [#new-features-46] ##### RESTful API with Swagger documentation [#restful-api-with-swagger-documentation] RESTful API has been provided to lay the ground for a graphical user interface and further integration between B2CONNECT and other B2BROKER products featuring a UI. ##### External liquidity providers as venues for price risk hedging [#external-liquidity-providers-as-venues-for-price-risk-hedging] Trades executed on B2TRADER can now be hedged automatically, by forwarding price risks to an external liquidity provider, such as Binance. ##### Direct hedging upon external liquidity providers for B2BX clients [#direct-hedging-upon-external-liquidity-providers-for-b2bx-clients] Direct hedging of price risks via external liquidity providers has become possible. You can execute hedging orders on Binance or any other platform connected to a client exchange participating in the B2CONNECT ecosystem and receiving liquidity from B2BX. ##### Currency conversion for values displayed in reports [#currency-conversion-for-values-displayed-in-reports] A new service has been introduced, tracking conversion rates and allowing you to convert the reported order size and trade total values into any currency. #### Improvements [#improvements-41] ##### Extended hedging parameters [#extended-hedging-parameters] The set of hedging parameters has been extended, enabling B2CONNECT clients to: * configure hedge parameters based on trader account identifiers * define a hedge ratio based on the trade side (buy or sell) * map a hedging instrument to another spot market symbol (for instance, you can hedge BTC/USDT trades with BTC/USDC orders) ##### Improved trade placement and execution analytics [#improved-trade-placement-and-execution-analytics] More data about each trade is now provided by B2TRADER, improving end-to-end analytics derived from hedging requests and responses. ##### Synthetics engine supports inversion [#synthetics-engine-supports-inversion] When designing synthetic instruments, components of synthetic cross pairs can now be inverted. #### Resolved issues [#resolved-issues-42] * Fixed an issue causing the hedging agent to drop connection in case of empty credentials having been specified for any API member in the configuration. * Fixed an issue preventing operation of some of the markets available to a pricing service. * Fixed an issue related to a price discovery gateway and resulting in improper application of market depth constraints to some of the trading instruments. *** ### February 18, 2021 [#february-18-2021] #### New features [#new-features-47] ##### Internal hedging on B2TRADER [#internal-hedging-on-b2trader] Introducing a new hedging agent, named Hedgehog, for redirecting trading orders placed on one platform to another venue. ##### Authorization based on JSON Web Token [#authorization-based-on-json-web-token] A new JWT-based service has been implemented, enabling authorization of clients connecting to B2CONNECT. Among other things, this makes it possible to identify transactions made on different B2TRADER platforms with a view of subsequent hedging. ##### Tracking of hedging orders [#tracking-of-hedging-orders] A new service has been implemented for gathering statistics and analytics necessary to properly monitor execution of hedging orders. #### Improvements [#improvements-42] ##### Timeout customization for individual instruments [#timeout-customization-for-individual-instruments] Custom timeouts can now be configured separately for each instrument. Using this option, you can reset the instrument's order book and switch to another price source, ensuring price quotation reliability for low-liquidity instruments. ##### Improved price feed [#improved-price-feed] The price feed reliability has been ensured, while the overall performance has improved. ##### New metrics for performance monitoring [#new-metrics-for-performance-monitoring] New metrics have been added for tracking the status and performance of B2CONNECT services to identify and prevent any possible failures. #### Resolved issues [#resolved-issues-43] * Fixed an issue preventing constructed quote (market) updates for some instruments by checking that a corresponding symbol is mapped. Learn about trading platforms, payment providers, and other third-party solutions integrated with B2CORE Learn about trading platforms, payment providers, and other third-party solutions integrated with B2CORE Gain a deeper view of the B2CORE Back Office user interface Gain a deeper view of the B2CORE Back Office user interface Step-by-step guides for common admin tasks and configurations in the B2CORE Back Office Step-by-step guides for common admin tasks and configurations in the B2CORE Back Office Deploy branded mobile apps for iOS and Android Deploy branded mobile apps for iOS and Android Identify and address common issues quickly and effectively with our guides Identify and address common issues quickly and effectively with our guides The B2CORE API is restricted and *not* publicly available. If you require the API documentation, please submit a support ticket with a clear and detailed description of your intended use cases. Providing a thorough explanation of how you plan to use the API will help us assess your needs accurately and minimize follow-up questions or delays. Back Office API — clients, accounts, finance, verification, and admin operations. Front Office API — the client-facing B2CORE HTTP API. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Explore the Back Office and learn how to launch your own partnership programs Explore the Back Office and learn how to launch your own partnership programs Discover IB Room and join a partner plan to begin attracting new clients while earning rewards Discover IB Room and join a partner plan to begin attracting new clients while earning rewards ## September 3, 2026 [#september-3-2026] ### New features [#new-features] #### IP whitelist for API apps [#ip-whitelist-for-api-apps] Access to the B2CORE IB API can now be limited to specific IP addresses. In **Preferences** > **Apps**, each app has a new **IP Whitelist** field where you can enter up to 50 IPv4/IPv6 addresses or CIDR ranges. Requests from any other address are rejected. An empty list keeps the previous behavior and allows requests from any IP address. *** #### Inherited registration type [#inherited-registration-type] A new **Inherited** registration type is available for IB types. Clients who sign up using a partner's referral link are added to the partner's program automatically, but only if the referring partner already participates in that program. Clients who sign up without a referral link, or whose partner is in a different program, are not added, and the program isn't shown in the B2CORE UI, so clients can't apply for it themselves. This is designed for invitation-only programs where every referral should land in the same program as the partner who brought them, without manual assignment in the Back Office. *** ### Improvements [#improvements] * A **Trading Volume** tab has been added to the **Reports** page in the IB Room. Partners can now view their own total trading volume in USD per day for a selected period and track their progress towards the next tier without asking the broker. * A **Level** column has been added to the **Platform Deposits** and **Platform Withdrawals** reports in the IB Room. It shows the level of the client in the partner's structure. *** ## Past releases [#past-releases] ### August, 2026 [#august-2026] #### New features [#new-features-1] ##### Client Deposits and Client Withdrawals [#client-deposits-and-client-withdrawals] New **Client Deposits** and **Client Withdrawals** sections list deposits and withdrawals made by IB clients through their B2CORE wallets. These operations are aggregated along the IB chain, which makes it possible to report deposits, withdrawals and the NET result for each IB branch, including sub-IB clients. Both lists show the client's name and email and can be filtered by them. To avoid confusion, the existing **Deposits** and **Withdrawals** sections, which list operations on trading accounts, have been renamed **Platform Deposits** and **Platform Withdrawals**. The same names are used on the **Reports** page in the IB Room. #### Improvements [#improvements-1] * Client tag restrictions for Back Office users now also apply to the **Accounts**, **Trades**, **Rewards** and **Clicks** sections of **Introducing Brokers**, and to partner details. Users restricted by client tags see only the rows that belong to clients within their tags, as they already do on the **Clients** page. * When data masking is enabled for a partnership program, the **Name** and **Email** columns are hidden from the **Client List** report in the IB Room instead of showing masked values. *** ### July, 2026 [#july-2026] #### New features [#new-features-2] ##### Savings Rebates [#savings-rebates] A new **Savings Rebates** reward model is now available. Brokers can reward partners when their referred clients invest in savings plans. A savings program defines the rebate rate for each level of the partner chain and is linked to an IB type, in the same way as a CPA program. Rebates are calculated and paid daily. Programs, acquisitions and payments are managed in the new **Savings Rebates** section of the Back Office. Partners get a **Savings Rebates** widget on the dashboard and a **Savings Rebates** tab on the **Reports** page in the IB Room, listing the rebates earned per client, program and level. Savings Rebates is disabled by default. Contact your B2BROKER integration team to enable it. ##### New IB Room widgets and reports [#new-ib-room-widgets-and-reports] The Partner Dashboard has been extended with new widgets: * **Performance overview** — key indicators for a selected period: new clients, active traders, trading volume, deposits, withdrawals and reward amount. * **Top Clients** — the partner's top clients by reward amount, with their trading volume. * **Transactions** — recent wallet transactions, the same data as the **Transactions** report. * **NET Deposit Summary** and **NET Deposit Top Clients** — deposits, withdrawals and the NET result for the partner's clients, including sub-IB clients. A new **NET Deposits** tab has been added to the **Reports** page, listing deposits, withdrawals and the NET amount per client. The **Transactions** and **Rewards by Symbol** widgets are now part of the default dashboard layout, so partners see them without adding widgets manually. #### Improvements [#improvements-2] * A new rewards distribution mode is available on request. By default, rewards for the whole partner chain are calculated from the payment plan of the client's direct partner, and each partner above receives their level's share of it. In the new mode, each partner in the chain is paid according to their own IB type and payment plan at their own level. If a partner in the middle of the chain is missing or inactive, that link is skipped and the partners above keep their original levels. Contact your B2BROKER integration team to enable it. * The **Min position lifetime** platform setting now applies to both the open and the close side of a position. If a position is closed earlier than the configured lifetime, no reward is generated for either side. Previously, the open-side reward could still be paid for such positions when the **Open & Close** option was used. * Deposits and withdrawals that are edited or deleted on the trading platform are now updated or removed in the **Platform Deposits** and **Platform Withdrawals** lists and in the related reports. *** ### May, 2026 [#may-2026] #### New features [#new-features-3] ##### CPA (Cost-Per-Acquisition) payment plans [#cpa-cost-per-acquisition-payment-plans] A new **Cost-Per-Acquisition (CPA)** payment model is now available. Brokers can reward partners when a referred client reaches a milestone, such as completing **registration**, passing **KYC verification**, or making a **minimum deposit**. *** ##### Granular access permissions [#granular-access-permissions] Access to the **Introducing Brokers** section can now be controlled with greater precision. The broad **View** and **Edit** permissions have been split into per-section permissions, so Back Office roles can be granted access to exactly the sections they need — for example, viewing **Reports** without the ability to edit **Payment plans**. *** #### Improvements [#improvements-3] * A **date range** filter has been added to an individual partner's payment report, making it easier to review rewards over a specific period. *** #### Resolved issues [#resolved-issues] * Resolved an issue where exporting trades for a specific client could be very slow for partners with large trade histories. These exports now complete significantly faster. *** ### April, 2026 [#april-2026] #### New features [#new-features-4] ##### Platform Spread and Platform Markup payment plans [#platform-spread-and-platform-markup-payment-plans] Two new payment plans are now available — **Platform Spread** and **Platform Markup**. They reward partners based on the actual spread and markup applied on the trading platform, captured automatically per symbol, rather than values estimated from a configured ratio. #### Improvements [#improvements-4] * The process that recalculates statistics and reports has been reworked for greater speed and reliability. Partner and program figures now refresh more consistently, even for brokers handling large data volumes. *** ### March, 2026 [#march-2026] #### New features [#new-features-5] ##### IB chain reassignment [#ib-chain-reassignment] New **“Reassign Users”** UI added. Brokers can now reassign an entire IB sub-branch from one partner to another in a single operation. This significantly simplifies the reassignment process, making it faster and less prone to errors than moving branches manually one by one. #### Improvements [#improvements-5] * A **Position lifetime** column has been added to the **Trades** table. *** ### February, 2026 [#february-2026] #### New features [#new-features-6] ##### TradeLocker platform integration [#tradelocker-platform-integration] The **TradeLocker** platform is now supported, enabling brokers to connect TradeLocker to their partnership program and reward partners on the same terms as other platforms. Support covers accounts, symbols, trading groups, trades, and payment plans, all manageable from the Back Office. #### Improvements [#improvements-6] * Added a new **IB Program Type** restriction. *** ### January, 2026 [#january-2026] #### New features [#new-features-7] ##### Asynchronous data exports [#asynchronous-data-exports] Exporting large data sets from the **Introducing Brokers** section — including trades, payments, accounts, and rewards — now runs asynchronously in the background. Brokers can continue working while an export is prepared and download the file once it's ready, rather than waiting on the page or risking a timeout. This makes it possible to export much larger data sets reliably. ### December, 2025 [#december-2025] #### New features [#new-features-8] ##### B2TRADER platform integration [#b2trader-platform-integration] The B2TRADER platform is now integrated with B2CORE IB, enabling brokers to connect B2TRADER to their IB setup and start rewarding partners on the same terms as other platforms. All payment plans are supported, so you can keep existing partner configurations and apply the same reward logic across supported environments. ##### Spread payment plan for cTrader [#spread-payment-plan-for-ctrader] The Spread payment plan is now available for the cTrader platform, allowing brokers to reward partners based on a percentage of the spread. This option aligns cTrader with the spread-based rewards model already available on other platforms, so you can keep a consistent approach to partner payouts. #### Improvements [#improvements-7] * Reports for deposits and withdrawals have been reimplemented to improve consistency and performance. The updated reporting logic is designed to present results in a clearer, more stable way. ### October, 2024 [#october-2024] #### New features [#new-features-9] ##### New Spread payment plan for MT5 platform [#new-spread-payment-plan-for-mt5-platform] The IB team is excited to introduce the much-anticipated Spread payment plan for the MetaTrader 5 platform. This innovative plan enables brokers to reward their partners based on a percentage of the spread, significantly expanding their referral reach across various markets. ##### Tier volume in USD [#tier-volume-in-usd] From now on, trading volume for tiers can be set not only in lots, but in USD as well, offering brokers increased flexibility in IB types configuration. #### Improvements [#improvements-8] * The **IB** column has been added to the **Clients** page. It shows the partner's name who referred the client and serves as a link to the partner details. * The **Payments** > **Methods** page has been removed from the Back Office due to the potential for unforeseen issues arising from modifying or deleting payment methods. For the same reason, it’s no longer possible to delete platforms through the Back Office. * When creating a new IB type, a default tier with empty parameters will no longer be automatically created, as previously done. #### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. *** ### August, 2024 [#august-2024] #### New features [#new-features-10] ##### Migration to PostgreSQL [#migration-to-postgresql] Our team is happy to announce that the migration from MongoDB to PostgreSQL has been successfully completed. Although this is mostly an internal technical enhancement, end-users will notice that the IB application now runs faster and more stable. ##### Min. position lifetime for cTrader [#min-position-lifetime-for-ctrader] For the cTrader platform, the **Min position lifetime** option has been added. The logic is exactly the same as for MT platforms: if a position was closed earlier than the Min position lifetime, it’s not taken into account in rewards calculations. The **Min position lifetime, sec.** field is now available in the cTrader platform preferences. #### Improvements [#improvements-9] * IDs of new partners are now in UUID format, not an index number, as it was before. This change eliminates the need for the **Encrypted** setting on the **Promo** > **Landings** > **Links** page. Existing IDs retain the numeric format, the **Encrypted** setting continues to work for them. All existing referral links remain working. * Information on clients’ accounts is now available on a separate **Accounts** tab in IB details. * Payment of rewards has become faster, thanks to technical improvements that allow for parallelization of the process. * Now running the system processes from the Back Office is disabled by default. It’s aimed at avoiding potential overloads of the database and application. Contact our technical support team if you need to restart a process. * To improve system performance, process logs are no longer stored in the database. As a result, the **Introducing brokers** > **Logs** section has been removed from the Back Office menu, and the **Logs** column has been removed from the **Introducing brokers** > **Processes** page. * To improve system performance, data storage limits have been implemented in the database: * Processes: 1 month * Deposits: 1 year * Withdrawals: 1 year * Trades: 1 year ### March 21, 2023 [#march-21-2023] #### New features [#new-features-11] ##### cTrader integration with IB [#ctrader-integration-with-ib] cTrader has been integrated with B2CORE IB, allowing you to connect the cTrader platform to your IB instance by navigating to **Introducing Brokers** > **Platforms** > **Platforms**. #### Resolved issues [#resolved-issues-2] * Fixed an issue due to which it was impossible to create a payment plan for all symbols in a trading group as it was only created for the selected symbol. * Fixed an issue due to which the trade opening time wasn’t updated according to the time zone set on the MetaTrade4 platform. * Fixed an issue due to which the position lifetime didn’t match the time difference between opening and closing a position. * Fixed an issue due to which the clients’ deposit and withdrawal operations weren’t displayed in the **Introducing Brokers** section. * Fixed an issue due to which duplicate records were displayed for deposit and withdrawal operations. ### April 12, 2022 [#april-12-2022] #### New features [#new-features-12] ##### Brand new IB section [#brand-new-ib-section] The IB section featuring new design and extended functionality for running partnership programs has been introduced in the B2CORE UI. For details, refer to the **For partners** section. ##### Max amount payment plan [#max-amount-payment-plan] A new **Max amount** payment plan has been introduced with this release. With this plan, you can pay partners a fixed amount for each lot traded by their clients, in the same way as with the Lot payment plan, but with the opportunity to set the maximum reward amount regardless of the number of levels and specify the exact amount which a partner receives at each level. For details, refer to [Payment plans](broker-guide/payment-plans#max-amount). ##### Data on deposits, withdrawals and trades [#data-on-deposits-withdrawals-and-trades] The **Deposits**, **Withdrawals**, and **Trades** tabs have been added to IB details in the B2CORE Back Office. The tabs display data on deposits, withdrawals, and trades of all clients of a selected partner. The export feature as well as filtering and sorting options are available. *** ### March 29, 2022 [#march-29-2022] #### New features [#new-features-13] ##### Deposits & withdrawals data [#deposits--withdrawals-data] The **Deposits** and **Withdrawals** sections have been added to **Platforms**. They display data on deposits/withdrawals of all clients on all trading accounts, indicating the date-time, account, amount, and currency as well as the unique identifier of the operation on the trading platform. *** ### March 15, 2022 [#march-15-2022] #### New features [#new-features-14] ##### Platform disabling [#platform-disabling] A new feature that enables you to turn off a trading platform without deleting it has been implemented. A new **Status** field (Enabled/Disabled) has been added to the platform details in **Platforms** > **Platforms**. ##### Account disabling [#account-disabling] A new feature that allows you to disable trading accounts without deleting them has been implemented. Disabled accounts are excluded from data sync and reward payment. A new **Enabled** field (Yes/No) has been added to the account details in **Platforms** > **Accounts**. ##### Filter by account type [#filter-by-account-type] This feature is aimed at closer integration with PAMM, MAM, and B2COPY. It helps to distinguish trading accounts from investment accounts. A new **Account type** field has been added to **Platforms** > **Accounts**, **Platforms** > **Trades** and **Payments** > **Rewards**. When opening a trading account, its type is obtained from B2CORE. When changing the type of an accounts group in B2CORE, the type is updated for all accounts. ##### Trading volume in USD [#trading-volume-in-usd] The **Trading volume, USD** column has been added to the **Introducing brokers** section and **Clients** tab in broker details. Filtering by non-zero/zero trading volume (Yes/No) is available. The **USD Trading volume** field has also been added to the **Payment report**, **Reports** tab in partner details and IB type details, to the trade details and payment details. ##### Deposits & withdrawals data [#deposits--withdrawals-data-1] The **Deposits** and **Withdrawals** tabs have been added to the client details in **Program** > **Clients** and account details in **Platforms** > **Accounts**. They display data on deposits/withdrawals, indicating the date-time, account, amount, and currency of the operation. ##### Contract size [#contract-size] A new **Contract size** field has been added to the symbol details, trade details and payment details. *** ### March 1, 2022 [#march-1-2022] #### New features [#new-features-15] ##### Partners and clients data import [#partners-and-clients-data-import] Customers who switch to B2CORE from other systems can now import data of their partners and clients into B2CORE IB. #### Improvements [#improvements-10] * Languages and themes of banners in selectors are now displayed in alphabetical order in the B2CORE UI. *** ### February 15, 2022 [#february-15-2022] #### New features [#new-features-16] ##### Deposits & withdrawals details [#deposits--withdrawals-details] Dates, currencies, amounts, and account numbers of deposits and withdrawals have been synchronized with MT4 and MT5. ##### Trading volume in USD [#trading-volume-in-usd-1] Trading volume in USD is now calculated for each trade. #### Improvements [#improvements-11] * The capability to sort banners by size has been added to the B2CORE UI. The banners are ordered by their width. If two banners have the same width, their length is taken into account. * The Client tag field has been added to the client’s details. Before, it was displayed only on the Clients tab in the partner’s details. *** ### February 1, 2022 [#february-1-2022] #### New features [#new-features-17] ##### PDO Driver v3 [#pdo-driver-v3] MetaTrader 4, MetaTrader5, and B2CORE Payment Method have migrated to the PDO driver v3. ##### B2CORE admin tags [#b2core-admin-tags] Access to the data of B2CORE Back Office sections can now be restricted using tags specified for the admin. See [B2CORE Back Office Guide](https://docs.b2core.b2broker.com/en/back-office-guide.html) for more details. ##### Languages priority [#languages-priority] The Priority property has been added to the Languages tab of **Promo** > **Landing** > **Links**. ##### Symbol group trades [#symbol-group-trades] The Trades tab has been added to the trading group details. On this tab, you can see and export a list of trades in the symbol group. #### Improvements [#improvements-12] * The **Base currency code** and **Quote currency code** fields have been added to **Platforms** > **Symbols**. Filtering and sorting by these fields are supported. *** ### January 18, 2022 [#january-18-2022] #### New features [#new-features-18] ##### WEBAPI v4 driver [#webapi-v4-driver] Sync of trading groups and trading symbols can now be run with the newly integrated WEBAPI v4 driver. ##### Drivers priority [#drivers-priority] The **Priority** property has been added to drivers, with prioritization logic similar to that of rate providers: first, the driver with the highest priority is taken, in case of failure — the next backup driver, and so on. If all drivers return a failure, the service reports that the function can't be performed. This property has been added to the **Drivers** tab in **Platforms** > **Platforms**. When creating a driver, it's automatically assigned the lowest priority; the priority can be changed when a driver is being edited. #### Improvements [#improvements-13] * A validation by platform ID has been added to the B2CORE Back Office, which prohibits connecting the same trading platform multiple times. ### December 21, 2021 [#december-21-2021] #### New features [#new-features-19] ##### Converter platform support [#converter-platform-support] Starting with this release, partners can receive rewards for the exchange operations performed by their clients. Currency pairs data is taken from the Currency pairs section of the B2CORE Back Office. Rewards are paid in the base currency of the partner's account, regardless of the currency pair of the exchange operation. The Commission payment plan is available. Rewards for exchange operations on demo accounts aren't processed. ##### Customizing link languages [#customizing-link-languages] For links in **Promo** > **Landings**, language customization has been added. You can configure separate URLs for each language of the landing page on the **Languages** tab, which has been added to the **Link** editing page. #### Improvements [#improvements-14] * From now on, when clients and partners are deleted from the B2CORE Back Office, their details such as name, email and account number are still displayed in the rewards history. * The **Platforms** section has been optimized to display information about various trading platforms: unused fields have been hidden to reduce the amount of displayed data and make it more accessible. * Sorting by the **Registrations**, **Clicks**, **Click Conversion Rate** fields has been added to the sections **Promo** > **Banners** > **Banners** and **Promo** > **Landing** > **Links**. *** ### December 7, 2021 [#december-7-2021] #### New features [#new-features-20] ##### Concurrency integration [#concurrency-integration] The concurrency framework has been implemented along with parallel processing of commands for synchronizing data with trading platforms, calculating rewards, crediting money to accounts and canceling rewards. The performance is expected to increase on average by 500%. ##### Support for B2CORE multi-currency accounts [#support-for-b2core-multi-currency-accounts] A new version of the **Payment method** for IB has been developed, which is compatible with multi-currency accounts of the B2CORE. It's important that this feature doesn't imply multi-currency payments: rewards are still paid in the original account currency or base currency. #### Improvements [#improvements-15] * The **Landing page** selector has been removed from banners create/edit pages. *** ### October 26, 2021 [#october-26-2021] #### New features [#new-features-21] ##### Export feature [#export-feature] The **Export** button is added to the number of sections and tabs and allows to download available data. For most sections, unless stated otherwise, the data is downloaded in CSV format, and retains all filters and a structure of the original table. The **Export** button is only visible to users with granted **Export** permissions. Explore the new feature here: * **Banners** — Introducing brokers > Program > Introducing Brokers > Edit > Banners tab. * **Links export** — Introducing brokers > Program > Introducing Brokers > Edit > Links tab. * **Currencies** — Introducing Brokers > Payments > Currencies section. * **Account transactions** — Introducing brokers > Payments > Accounts > Edit > Transactions tab. * **Transaction rewards** — Introducing brokers > Payments > Accounts > Edit > Transactions > Edit > Rewards tab. * **Logs** — Introducing brokers > Logs section. * **Countries** — Introducing brokers > Preferences > Location > Countries section. * **Accounts** — Introducing Brokers > Payments > Accounts section. The data in the Accounts section is downloaded in CSV format, and retains all filters and a structure of the original table except for the Balance field, which doesn't get exported. *** ### October 12, 2021 [#october-12-2021] #### New features [#new-features-22] ##### Transactions export [#transactions-export] List of transactions in the **Introducing Brokers** > **Payments** > **Transactions** section can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. The export feature for this and other sections and tabs is only available to users with Export permissions. ##### Symbols export [#symbols-export] List of symbols can now be exported in the **Introducing Brokers** > **Platforms** > **Symbols** and **Introducing brokers** > **Programs** > **Types** > **Symbols** tab sections via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Trades export [#trades-export] Trades data for a particular account or a client can now be exported via the **Export** button located on **Trades** tab in **Introducing Brokers** > **Platforms** > **Accounts** and **Introducing Brokers** > **Clients** sections. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Accounts export [#accounts-export] List of all accounts or accounts belonging to a specific client can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. To explore the feature navigate to **Introducing brokers** > **Platforms** > **Accounts** or **Introducing brokers** > **Clients** > **Account** tab. ##### Clicks statistics export [#clicks-statistics-export] Clicks data on the **Introducing brokers** > **Program** > **Introducing brokers** > **Clicks** tab can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. #### Improvements [#improvements-16] * Newly generated QR codes in the **Promo** section are now displayed in a smaller size. *** ### September 28, 2021 [#september-28-2021] #### New features [#new-features-23] ##### Clients and trading groups export [#clients-and-trading-groups-export] List of Introducing brokers clients and **Platform** > **Groups** can now be exported to a CSV file via the new **Export** button that replaced the **Excel** and **CSV** buttons. This feature is only available to users that have **Export** permissions. All entries in an exported data set are sorted in the same way they were in the original table. #### Improvements [#improvements-17] * Users can now see when a particular program's tier or level was created and updated. * Date-time in all sections is now displayed in a single format: `Mon. DD, YYYY HH:MM:SS`, for example: Jan. 21, 2021 11:28:06. Month abbreviations consist of the first three characters of the month name. Months with four-character names, such as June, aren't abbreviated. * Paxios currency new alias is updated in currency details. #### Resolved issues [#resolved-issues-3] * Fixed the Client ID filter error in Preferences > Security > Authorizations, Preferences > Security > Authentications. *** ### September 14, 2021 [#september-14-2021] #### New features [#new-features-24] ##### Tiers and levels settings export [#tiers-and-levels-settings-export] Tiers and levels settings of an IB Program can now be exported to a CSV file via the new **Export** button (that replaced the **Excel** and **CSV** buttons). This feature is only available to users that have Export permissions. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Introducing Brokers** > **Program** > **Types** > **details** > **Tiers** and **Levels** tab. ##### Clicks records export [#clicks-records-export] Clicks records export is now available to users with **Export** permissions via the new **Export** button. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Promo** > **Analytics** > **Clicks**. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-25] ##### Export and import permissions for Introducing brokers [#export-and-import-permissions-for-introducing-brokers] New **Export permission** and **Import permission** groups have been added to the **System** > **Groups** > **Introducing brokers** section of the B2CORE Back Office. ##### Geolocation update button [#geolocation-update-button] It has become possible to update your database to the latest version by clicking the **Update** button on the **Database** tab in the **Preferences** > **Location** > **Geolocation** section. ##### QR code generation [#qr-code-generation] It has become possible to generate QR codes for a partner link. A new feature is available in the **Program** > **Introducing brokers** section on the **Links** tab of the partner’s detailed information. #### Improvements [#improvements-18] * Only the languages, that are enabled in the **System** > **Localization** section, are now being displayed if you click the localization button next to the **Name** and **Description** fields of the **Preferences tab** in the **Introducing brokers** > **Program** > **Types** section. * You can now filter trading groups by multiple parameters at the same time. To do that, type in a list of groups separating them with space, comma, or colon in the filter field. * Symbol settings import support is available for macOS and Windows. *** ### August 03, 2021 [#august-03-2021] #### Improvements [#improvements-19] * The list of trading instruments is now synchronized and displayed in the **Symbols** section of the B2CORE Back Office. *** ### July 20, 2021 [#july-20-2021] #### New features [#new-features-26] ##### New Description field [#new-description-field] A new **Description** field has been added to IB types. In this field you can specify more information about the partnership program. ##### QR codes colors and icons [#qr-codes-colors-and-icons] Color and icon configurations for QR codes generation are added to the B2CORE Back Office. ##### Link to Release notes [#link-to-release-notes] You can navigate to Release notes from the **Updates** section of the B2CORE Back Office. #### Improvements [#improvements-20] * IB types, partners and clients are combined in the **Program** section in the B2CORE Back Office to optimize the convenience of B2CORE IB use. * To create a new IB type, specify only its name, description, type of registration, approval, and currency for rewarding partners. * When registering in the type with disabled approval option, the partner redirects immediately to the IB Room with no need to refresh the page. * The size of the distributive is now 2 times smaller. It speeds up the installation and updating processes, minimizes the amount of space needed on the hard drive and optimizes the hosting costs. * The troubleshooting is faster and more accurate, and the problems can be solved in a few seconds due to the improved diagnostics of the geographical location service. *** ### July 6, 2021 [#july-6-2021] #### Improvements [#improvements-21] * On the **Payment plans** tab of a symbol, you can now configure how much the broker pays for trades with this symbol for all IB types or edit these values in one place. This is especially useful when new symbols appear on trading platforms: on the list of symbols, sort and filter by date to select recently added symbols, then set up payment plans for all types at once on one page. * In the details of a partner, the number of levels for which the broker pays this partner is now explicitly displayed. When changing the IB type, the number of levels automatically changes according to the IB type settings. To set up individual conditions for a partner, the broker can select Custom Levels and specify the number of Master Levels for which the partner receives a reward. * The **encrypted links** configuration is moved from IB type settings to **Links** to make the setup more convenient. To enable or disable encryption for a link, open the edit link and set the value to Enabled or Disabled. * It's now possible to see not only levels for which the broker pays partners, but also those for which the broker doesn't pay. Partners still can see only paid levels which are configured in the IB type or individually for a partner. The Show hidden levels option can be enabled in the IB type, it's disabled by default. #### Resolved issues [#resolved-issues-4] * Fixed an issue with filtering by 0. You can now filter entries by any value including 0, for example, find crypto currency 0x. * In the partners app, fixed a filter that incorrectly displayed the list of rewards for the specified time period — not including the end date. For the end date, the time was set to 00:00, which caused incorrect selection and made it impossible to view the rewards of one day. The end date is now set to 23:59. *** ### June 22, 2021 [#june-22-2021] #### Improvements [#improvements-22] * Added currencies signs. * Special characters are now allowed in the Alias field for currency. * For payment plan, number of digits after the decimal separator now matches the currency settings (minor unit value). All non-significant zeros after the decimal separator are hidden for readability. * A new type of client request has been added to quickly filter requests related to Introducing brokers in the B2CORE Back Office. #### Resolved issues [#resolved-issues-5] * Fixed sorting and filters by country, latitude, longitude and position lifetime. *** ### June 8, 2021 [#june-8-2021] #### Improvements [#improvements-23] * Base and quote currencies were added to symbol details, trades details, and reward details. * Reward states naming was improved. The following states are now available: * **Done** — the reward was successfully credited to the partner’s account * **Pending** — the reward was calculated, but not yet credited to the partner’s account * **Canceled** — the reward was canceled and debited from the partner’s account * In the **trade details**, fields naming and order were reworked and improved. The data is now split into two tabs — **Trade data** and **Rewards**. * In the **reward details**, fields naming and order were reworked and improved. The data is now split into two blocks — **reward data** and **trade data**. * In the **symbol details**, fields naming and order were reworked and improved. The data is now split into two tabs — **Symbol** and **Payment plan**. * All top-ranked cryptocurrencies with a market capitalization of over $1B added to the default configuration to make the setup process easier. *** ### May 26, 2021 [#may-26-2021] #### New features [#new-features-27] ##### Min position lifetime [#min-position-lifetime] New parameter was added to MT4 and MT5 platforms in Introducing brokers. If a position was closed earlier than the min position lifetime, it's not taken into account in rewards calculating. ##### Symbols import [#symbols-import] It's now possible to import symbol settings, as a CSV file, in IB types. The **Import** button is available on the **Symbols** tab of the **IB type details** in the B2CORE Back Office. You can now export settings, change the formula, and then import the settings file in the same or in a different IB type. #### Improvements [#improvements-24] * Tier name was added. * Added MaxMind geolocation service diagnostics. * Added PostgreSQL reporting support for MT5. #### Resolved issues [#resolved-issues-6] * Fixed displayed number of digits after decimal separator for JYP. *** ### April 27, 2021 [#april-27-2021] #### New features [#new-features-28] ##### Reports [#reports] The Reports section has been added. At the moment, Acquisition report and Payment report are available with date range filters, grouping by hour, day, week, month, year. IB also provides performance indicators with actual value, absolute, and relative change compared to the previous period, as well as traffic analytics: group by country, geographic region, traffic source. ##### Symbols export [#symbols-export-1] It's now possible to export symbol settings to a CSV file. The Export button is available on the Symbols tab of IB type details. ##### New rates provider integrated [#new-rates-provider-integrated] A new rates provider has been integrated — **Open Exchange Rates**. #### Improvements [#improvements-25] * Reworked and optimized the naming of entities related to Symbols. * Another update in rates providers: B2BINPAY Rate Provider was removed. * Open positions on MetaTrader 4 added to trading session syncing. * Position ID added to trading session syncing. * Payment Level UX improved. * Added Diagnostic failure details. *** ### March 16, 2021 [#march-16-2021] #### New features [#new-features-29] ##### Lot size [#lot-size] A new **Lot size** field has been added for cent groups in the **Platforms** > **Groups** section. ##### Geolocation service [#geolocation-service] A new IP intelligence and online fraud prevention tool - **MaxMind** has been added to **Preferences** > **Location** > **Geolocation**. ##### Location data [#location-data] New fields: **Latitude**, **Longitude** and **Country** have been added to clicks statistics data in **Promo** > **Analytics**. ##### Country of residence [#country-of-residence] A new **Country of residence** field has been added to IB’s and client’s **Personal data** tabs. ##### Countries [#countries] A new **Countries** section has been added to **Preferences** > **Location**, displaying a list of countries divided into the following fields: Name, Alpha-2 code, Alpha-3 code and Numeric code, which conforms to the [ISO-3166 standard](https://www.iso.org/iso-3166-country-codes.html). ##### Geographic regions [#geographic-regions] A list of Geographic regions in M49 Standard Country or Area Codes for Statistical Use (United Nations GeoScheme) has been added. ##### Geospatial queries support [#geospatial-queries-support] Added Geospatial Queries support within GeoJSON objects: points and polygons. ##### Clicks and registrations stats [#clicks-and-registrations-stats] Statistics on banner clicks and the following registrations are added to **Promo** > **Analytics**. *** ### March 2, 2021 [#march-2-2021] #### New features [#new-features-30] ##### User-Agent info for link clicks [#user-agent-info-for-link-clicks] To **Promo** > **Analytics** > **Clicks**, a new field **User-Agent** has been added to display information about the software, such as browser and operating system, used by people who clicked on partners’ affiliate links. ##### Extended settings for Master levels [#extended-settings-for-master-levels] A new setting is added to Master partners that allows to override the number of Levels a Master partner is paid for. ##### HTTP version preference [#http-version-preference] Added HTTP Protocol Version (1.0, 1.1, 2.0) preference to deal with Expect: 100-continue header. *** ### February 16, 2021 [#february-16-2021] #### New features [#new-features-31] ##### Rewards data export [#rewards-data-export] Brokers can now export information about all rewards paid within a particular IB type or to a particular partner via the new **Export** button added to **Program** > **Introducing Brokers** / **Type** > **Edit** > **Rewards** tab. ##### Master partner settings [#master-partner-settings] A new feature that allows brokers to individually set the Number of Levels and Master Level Ratio for Master partners has been added to the Personal data tab of an IB. ##### Trading session sync by trading account number [#trading-session-sync-by-trading-account-number] A new **Trading account number** option has been added and allows a broker to synchronize the trading session for the selected trading account from the admin panel. ##### Banners [#banners] New **Banners**, **Themes**, **Languages** and **Sizes** subsections have been added to the Promo > Banners section, allowing the broker to create and manage the banners in an easier and more efficient way. ##### Prevented attacks log [#prevented-attacks-log] A new **Security** > **Attacks** section has been added that displays all prevented brute-force attacks. ##### System incidents log [#system-incidents-log] A new **Security** > **Incidents** section has been added that displays information about all security incidents registered in the systems such as: invalid client ID, invalid client secret or invalid access token. ##### Blacklist and Whitelist settings for an API access [#blacklist-and-whitelist-settings-for-an-api-access] New **Blacklist** and **Whitelist** sections have been added and allow admin users to manage which IPs get access to APIs. *** ### February 2, 2021 [#february-2-2021] #### New features [#new-features-32] ##### IB type change [#ib-type-change] A new option has been added that allows brokers to change partner’s type. ##### Rewards cancellation [#rewards-cancellation] A new option has been added that allows brokers to cancel trade rewards. ##### Tier rolling period [#tier-rolling-period] A new **Tier period** field has been added to the **Program** > **Types** > **Edit** > **Preferences** tab, allowing the broker to customize the duration of each tier in rolling days. ##### Trading groups archiving [#trading-groups-archiving] Brokers can now archive trading groups, accounts, and symbols that were removed from trading platforms. ##### Rewards per transaction [#rewards-per-transaction] A new **Rewards** tab, that contains a list of all rewards for a specific transaction, has been added to transaction details in **Payments** > **Transactions**. #### Improvements [#improvements-26] * The process of setting up landing links for partners is simplified. ### December 22, 2020 [#december-22-2020] #### New features [#new-features-33] ##### Encrypted tokens [#encrypted-tokens] Encrypted tokens option has been added to **Promo** > **Landings** > **Links**. ##### Tier calculation [#tier-calculation] Tiers can now be calculated by the number of active clients referred by a partner. ##### Position settings in payment plan [#position-settings-in-payment-plan] A new **Position** field has been added to the **Platforms** > **Symbols** > **Edit** > **Payment plan** tab and indicates whether the payments are made for a closed or an open position, or for both. ##### Bulk update of trading groups [#bulk-update-of-trading-groups] An option to bulk update the settings of the trading groups has been added. ##### 145 new filters [#145-new-filters] Data filtering across the entire **Introducing Brokers** section has been made even better with around 145 of new filters. *** ### December 8, 2020 [#december-8-2020] #### New features [#new-features-34] ##### Program rewards statistic [#program-rewards-statistic] Report on all rewards payable in a particular program type has been added to **Program** > **Types** > **Edit** > **Reports** tab. ##### Partner’s rewards statistic [#partners-rewards-statistic] Report on all rewards payable to a particular partner has been added to **Introducing brokers** > **Edit** > **Reports** tab. ##### Export of partners and clients data [#export-of-partners-and-clients-data] Data in the **Introducing brokers** > **Program** > **Introducing brokers** and **Introducing brokers** > **Program** > **Clients** sections can now be exported via the newly added export function in CSV or Excel formats. *** ### November 24, 2020 [#november-24-2020] #### New features [#new-features-35] ##### Payments and trades data export [#payments-and-trades-data-export] Data in the **Trades** and **Payments** sections can now be exported in CSV or Excel formats. ##### Restricted registration [#restricted-registration] A new **Restricted registration** type has been added to **Program** > **Types** > **Edit** > **Preferences** and allows a selective acquisition of new partners for a particular partnership program. *** ### November 17, 2020 [#november-17-2020] #### New features [#new-features-36] ##### New payment systems [#new-payment-systems] Three new rate providers have been integrated: **B2BINPAY**, **CoinMarketCap** and **European Central Bank**. ##### Custom rate provider [#custom-rate-provider] With the new **Custom rate provider** feature, brokers can now create their own crypto currency exchange rates. ##### Support for multi-language links [#support-for-multi-language-links] Multi-language links support has been added to the B2CORE URI. ##### System logs [#system-logs] The **Logs** section has been added and provides detailed information about all system events. ##### Network diagnostics [#network-diagnostics] Network diagnostic is added and allows to individually or in bulk test the connection of drivers in **Platforms**, **Rates** and **Geolocation** sections. ##### Unix socket support [#unix-socket-support] **Unix socket** support has been added to the **Payment method** connection settings. ##### AWS deployment support [#aws-deployment-support] Support for deployment on AWS has been added. *** ### September 22, 2020 [#september-22-2020] #### New features [#new-features-37] ##### Client details [#client-details] Brokers can now view full client details in the **Partner** > **Referral** section of the B2CORE UI. ##### Reward details [#reward-details] Brokers can now view full partner rewards details in the **Partner** > **Rewards** section of the B2CORE UI. #### Improvements [#improvements-27] * A majorly improved **Introducing brokers** section of the B2CORE Back Office that now displays all data available in the partnership program. * The **Client chain** field has been added to the client’s **Personal data** tab and indicates which partner referred a particular client to the broker. The chain data is presented in the following format: Partner's name → Client's name. Browse IB API operations in the sidebar. They are generated from the public OpenAPI specification synced into this repository. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Understand the basics and learn everything you need to start using the B2TRADER API Understand the basics and learn everything you need to start using the B2TRADER API Consult an in-depth reference describing REST API requests and responses Consult an in-depth reference describing REST API requests and responses Explore the supported WebSocket API methods and streams Explore the supported WebSocket API methods and streams Connect to the FIX 4.4 API for market data streaming and order execution Connect to the FIX 4.4 API for market data streaming and order execution The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. ## September 2026 [#september-2026] ### Resolved issues [#resolved-issues] #### FIX API stabilization [#fix-api-stabilization] This release includes reliability improvements to the FIX API's market-data streaming, resolving cases where a session could stop receiving updates without any visible error. #### Errors raised after response headers no longer abort the stream [#errors-raised-after-response-headers-no-longer-abort-the-stream] A failure that occurred while a `GET` response body was still being serialized aborted the HTTP/2 stream, which client libraries reported as a transport error rather than an API error. Such a failure is now returned as a normal error response. ## August 2026 [#august-2026] ### New features [#new-features] #### Public MCP endpoints for external AI agents [#public-mcp-endpoints-for-external-ai-agents] Two public Model Context Protocol (MCP) surfaces are now available per deployment: `mcp-read-only` (market data, portfolio, history, and analytics tools) and `mcp-full-access` (adds order placement, cancellation, position close, and triggers). Both authenticate through the platform's existing Keycloak identity provider; MCP clients that construct their own authorize URL are now redirected server-side to the external identity provider instead of landing on the login form. ## July 2026 [#july-2026] ### New features [#new-features-1] #### Trading API: Retry time-in-force for market orders [#trading-api-retry-time-in-force-for-market-orders] A new `Retry` time-in-force has been added for market orders, alongside the existing `Ioc`. A `Retry` order aims to fill the full requested volume by repeatedly filling the unfilled remainder at current market prices. `Ioc` remains the default; manual close-position actions on CFD and Perpetual Futures markets now use `Retry` by default. Some generated API clients validate time-in-force as a closed enum and reject an unrecognized value. Regenerate your client against the current contract before this value appears in a request or response you consume. ## June 2, 2026 [#june-2-2026] ### Improvements [#improvements] #### Trading API: Stop orders for closed markets [#trading-api-stop-orders-for-closed-markets] The **Trading API** now accepts **Stop** orders for markets that are closed according to their trading calendar. The order is stored and activates automatically when the market reopens, instead of being rejected at submission. #### Reports API: full account history [#reports-api-full-account-history] Trading reports can now be generated for the entire account history. The previous **92-day** limit has been removed, and an **All data** range is now available for report generation. #### Trading API: market asset identifiers [#trading-api-market-asset-identifiers] The `baseAssetId` and `quoteAssetId` fields have been added to the v6 `/markets` responses, allowing clients to resolve the base and quote assets of each market without additional lookups. #### Accurate unrealized PnL [#accurate-unrealized-pnl] Unrealized PnL returned by the API is now calculated using the correct order book side for each position direction, improving the accuracy of PnL values in position and margin responses. *** ### Resolved issues [#resolved-issues-1] * Resolved an issue where `WebhookAlert` order reason and position modifier values were returned as numeric codes instead of API enum strings in History API `/v2/orders` responses. ## April 9, 2026 [#april-9-2026] ### New features [#new-features-2] #### Equity Curve API [#equity-curve-api] The History API now provides `POST /api/history/v1/equity-curve`, returning account equity data points for a requested date range with daily, weekly, or monthly aggregation. #### Trading credit in API responses [#trading-credit-in-api-responses] Broker-issued **trading credit** is now exposed through the API. The account margin data response and the real-time margin stream include the current credit amount in the Reference Asset (`creditInRAT`). Credit is included in the account equity and excluded from the withdrawable amount. *** ### Improvements [#improvements-1] #### Webhook Trading API: webhook URL in key listing [#webhook-trading-api-webhook-url-in-key-listing] The list webhook API keys response now includes the `webhookUrl` field, so the configured webhook endpoint can be retrieved for each key. ## March 16, 2026 [#march-16-2026] ### New features [#new-features-3] #### Webhook Trading API [#webhook-trading-api] A new **Webhook Trading API** has been added, enabling automated order creation via webhook alerts with API key authentication. **Key points:** * Create and manage webhook API keys for secure authentication * Receive trading alerts and create orders automatically * Idempotency supported via deduplication ID * Market type resolved from the symbol prefix (spot, CFD, perpetual) #### Public Account ID [#public-account-id] A new `publicAccountId` field has been added across all API endpoints, providing a human-readable account identifier as an alternative to internal UUIDs. **Affected APIs:** * Trading API — account-related responses and filters * Settings API — account configuration endpoints * History API — all REST endpoints and WebSocket streams * Reports API — report responses and filters #### Long-term trading data history [#long-term-trading-data-history] Date range restrictions have been removed from **Order History** and **Closed Positions** endpoints, allowing access to full trading history without time-based limitations. *** ### Improvements [#improvements-2] #### Transfer subtype field [#transfer-subtype-field] A new `subtype` field has been added to transfer responses in the History API to distinguish **Negative Balance Protection** transfers from manual ones. #### Rounded position prices [#rounded-position-prices] The `positionPriceInRAT` values are now properly rounded in closed position API responses according to the Reference Asset (RAT) scale. *** ### Resolved issues [#resolved-issues-2] * Resolved an issue where `/total-swaps` requests returned HTTP 504 timeout errors. ## March 11, 2026 [#march-11-2026] ### Added FIX API documentation [#added-fix-api-documentation] Added new FIX API section covering Market Data and Trading sessions via the FIX 4.4 protocol. ## March 11, 2026 [#march-11-2026-1] ### Initial version [#initial-version] ## March 2, 2026 [#march-2-2026] ### New features [#new-features-4] #### Trading Terminal AI assistant [#trading-terminal-ai-assistant] A new **AI assistant** has been added to the Trading Terminal, providing traders with an intelligent widget for market analysis and trading support. *** ### Improvements [#improvements-3] #### Public Account ID (preview) [#public-account-id-preview] The `publicAccountId` field has been added to account-related API responses as a preview, ahead of the full rollout across all endpoints. ## February 25, 2026 [#february-25-2026] ### New features [#new-features-5] #### Funding Rates API [#funding-rates-api] New API endpoints have been added for retrieving funding rate data synchronized from **B2CONNECT**, including funding rates, mark price, and funding interval for Perpetual Futures markets. **Key points:** * Funding rate values streamed in real time * Mark price used for position valuation when available from LP * Funding interval synchronized per market configuration * FIX API contract extended with funding data fields #### OHLC Candlestick API [#ohlc-candlestick-api] A new API endpoint has been added for retrieving OHLC (candlestick) data, supporting both **Spot** and **Perpetual Futures** markets. Minute-level candle data is now stored for up to 5 years. OHLC candle data streaming is also available via the WebSocket API using gRPC transport, providing real-time candlestick updates. #### Favorite markets [#favorite-markets] A new **Favorite markets** feature has been added, allowing traders to manage personalized market lists via the Trading API. #### Comment field for orders and positions [#comment-field-for-orders-and-positions] A new `comment` field has been added to order and position responses across REST, WebSocket, and History APIs. The comment can be set when placing an order and is propagated to the associated position and execution records. #### B2COPY Integration API [#b2copy-integration-api] New API endpoints have been added for **B2COPY** and IB (Introducing Broker) integrations, including special account types for copy trading. The `isCopyTradingAccount` field has been added to the `/api/v1/total-fundings` endpoint. *** ### Improvements [#improvements-4] #### FIX API: enhanced request throughput [#fix-api-enhanced-request-throughput] The FIX API trading request processing has been optimized to support up to 100 requests per second per connection. All `TimeInForce` types are now supported, including **GTD** (Good Till Date). #### Multilingual support [#multilingual-support] Trading API, Settings API, and Reports API endpoints now support multilingual content with full Unicode character support, enabling localized responses for configurable fields, report names, and templates. #### Stop Market order calculation [#stop-market-order-calculation] The **Value** and **Amount** calculation for **Stop Market** orders has been corrected for **Spot** markets. **Slippage Rate** has been removed from **CFD** and **Perpetual Futures** order calculations. #### Trading API: empty categories hidden [#trading-api-empty-categories-hidden] Empty market categories are now automatically excluded from Trading API responses, reducing unnecessary data in category listings. #### Balance API: zero balance for all assets [#balance-api-zero-balance-for-all-assets] Assets without prior balance operations now return a zero balance in API responses instead of being omitted. #### Cross-rate market configuration [#cross-rate-market-configuration] Markets used exclusively for cross-rate calculations can now be disabled for trading while remaining active for rate conversion. #### History API: extended contracts [#history-api-extended-contracts] Positions and Events API responses have been extended with additional fields. The `updatedAt` field is now available as a sorting and filtering parameter in History Server API endpoints. #### Settings API: market update endpoint [#settings-api-market-update-endpoint] The market update endpoint has been changed from `PATCH` to `PUT` semantics, requiring the full market object in the request body. *** ### Resolved issues [#resolved-issues-3] * Resolved an issue where `takeProfitPrice` and `stopLossPrice` values were missing from the History Server `/v2/orders` endpoint responses. * Resolved an issue where bulk order cancellation returned a successful result for non-existing orders. * Resolved an issue where bulk order cancellation returned a successful result for orders that could not be cancelled. * Resolved incorrect error codes returned when `closePositionLotAmount` was set to `0`, a negative value, or an empty string. * Resolved an issue where the WebSocket Book stream continued sending prices with an outdated tick size after market parameter changes. * Resolved an issue where negative spreads in the **Market Data API** were not handled correctly. * Resolved an issue where orders could not be created when using the default 24/7 calendar. * Resolved an issue where the `/external-orders` API returned `null` for `rejectReason` although the Trading Server received a reason from the LP. Customize your Trading Terminal and configure settings Customize your Trading Terminal and configure settings Explore and manage all available trading widgets Explore and manage all available trading widgets Learn basic terms and values used across the platform Learn basic terms and values used across the platform API reference — operations generated from the live OpenAPI specification. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Get a quick introduction to B2TRANSLATE and get familiar with basics and key terms Get a quick introduction to B2TRANSLATE and get familiar with basics and key terms Explore the B2TRANSLATE interface and start managing your product translations Explore the B2TRANSLATE interface and start managing your product translations ## July 9, 2026 [#july-9-2026] ### New features [#new-features] #### Notifications [#notifications] **B2TRANSLATE** now includes a notification center. A bell at the bottom of the sidebar shows a badge with your unread count and opens a panel with your most recent notifications, such as a finished AI translation, a ready export, or a completed import. Open **All notifications** to see the full history, and mark notifications as read individually or all at once. Notifications can also be delivered outside the app — to **Email**, **Slack**, or **Telegram**. A workspace administrator sets up these channels and chooses who receives each type of event. *** #### Account settings page [#account-settings-page] A new **Account** item in the sidebar opens a dedicated **Settings** page that gathers your personal options into one place, with tabs for **Personal API tokens** and **Change password**. *** ### Improvements [#improvements] #### Change your own password [#change-your-own-password] You can now change your sign-in password yourself from **Account** > **Change password**, without contacting an administrator. *** #### Redesigned navigation [#redesigned-navigation] The controls for the interface language, notifications, and signing out have moved to the bottom of the sidebar for quicker access. **Personal API tokens** are now managed on the new **Account** > **Settings** page, replacing the former profile menu. *** ### Resolved issues [#resolved-issues] There have been no customer-facing issues reported in this release. ## June 29, 2026 [#june-29-2026] ### Improvements [#improvements-1] #### Modernized interface [#modernized-interface] The **B2TRANSLATE** interface has been rebuilt on a modern technology stack. Everything you use stays exactly where it was — the update refreshes the foundation of the interface and paves the way for faster delivery of new features. ## May 14, 2026 [#may-14-2026] ### Improvements [#improvements-2] #### Tenant language management for the Customer role [#tenant-language-management-for-the-customer-role] Users with the **Customer** role can now manage the list of languages on their tenant directly from the **Edit project** modal — add or remove languages without requesting help from an administrator. To prevent accidental changes, the tenant name field is now read-only for **Customer** users. ## April 29, 2026 [#april-29-2026] ### New features [#new-features-1] #### Translation version history [#translation-version-history] Every translation key now keeps an audit trail of the last 10 destination values per language. From the translation view, open the history dialog to see who changed a translation, when, and what the previous value was — and restore any earlier version with a single click. This protects translations from accidental edits and AI overrides. *** ### Improvements [#improvements-3] #### Personal API Tokens — custom expiration [#personal-api-tokens--custom-expiration] When you create or rotate a **Personal API Token**, you can now pick the exact expiration date through a calendar picker, up to one year ahead. This replaces the previous fixed presets and aligns with enterprise security policies that require periodic credential rotation. *** #### New languages: Hebrew and Mongolian [#new-languages-hebrew-and-mongolian] **Hebrew** is now available with full right-to-left (RTL) support, and **Mongolian** is added with the correct plural forms. Both languages are immediately available in every project and ready for AI translation. ## March 31, 2026 [#march-31-2026] ### New features [#new-features-2] #### Personal API Tokens [#personal-api-tokens] **B2TRANSLATE** now supports **Personal API Tokens** — a new authentication method for programmatic API access. Users can generate long-lived tokens to integrate **B2TRANSLATE** with external tools and automation workflows without sharing their login credentials. * Generate and manage personal tokens from the **Profile** page * Tokens support all V2 API endpoints * Configurable token expiration: 1, 6, 12, or 24 hours * Revoke tokens at any time for security ## March 17, 2026 [#march-17-2026] ### New features [#new-features-3] #### Custom language ordering [#custom-language-ordering] You can now customize the order in which languages appear across your project. Open the **Language order** modal from the **three-dot menu** on the **Projects** page or from within a project, and then drag and drop languages into your preferred sequence. The custom order is applied to language dropdowns and lists throughout the project. To revert to the default alphabetical order, click **Reset to default** in the modal. ## February 10, 2026 [#february-10-2026] ### New features [#new-features-4] #### Compact mode [#compact-mode] A new **Compact mode** toggle has been added to the **Profile menu**, giving you the ability to reduce spacing and density across all UI components. This option provides a more condensed interface for those who prefer to view more content on their screen at once. *** ### Improvements [#improvements-4] #### BCP 47 language support [#bcp-47-language-support] B2TRANSLATE now supports the **BCP 47 standard** for language codes, providing more precise language identification and regional variant handling. The system maintains backward compatibility with legacy format codes in the translations endpoint, ensuring existing integrations continue to work seamlessly. Each language in the languages table now includes a descriptive label for better clarity. #### Unified search and filters [#unified-search-and-filters] Search input fields and filter controls have been standardized across all system pages, providing a consistent user experience throughout the platform. This unified approach makes it easier to locate and filter content regardless of which page you're working on. *** ### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. ## January 13, 2026 [#january-13-2026] ### Improvements [#improvements-5] #### AI model upgrade [#ai-model-upgrade] B2TRANSLATE has upgraded its AI translation engine from Chat GPT 4.0 to **Chat GPT 5.2**, delivering improved translation quality and enhanced performance across all supported languages. #### Enhanced search with keyboard shortcuts [#enhanced-search-with-keyboard-shortcuts] Navigation has been streamlined with the addition of keyboard shortcuts for quick search access. Users can now press **⌘/** (**Ctrl+/**) and **⌘K** (**Ctrl+K**) to instantly open the search functionality, making it faster to locate keys and navigate through projects. *** ### Resolved issues [#resolved-issues-2] There have been no customer-facing issues reported in this release. ## December 12, 2025 [#december-12-2025] ### Improvements [#improvements-6] #### Redesigned Translations page [#redesigned-translations-page] The **Translations** page has been reorganized for a clearer view and smoother editing experience: * Key identifiers now occupy separate rows and include category badges and last‑updated timestamps. * Translation columns have clearer labels and each displays a language badge, so you always see which language you are editing. * Actions such as Translate with AI, Reset to source translation, and Save as empty are grouped under intuitive icons for easier discovery and use. * Global controls — language selector, search field, filter panel, key import, and CSV upload — are consistently placed and easier to find. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## September 30, 2025 [#september-30-2025] ### Improvements [#improvements-7] This release introduces comprehensive **default translations across various languages** and empowers administrators with **automated bulk translation capabilities via ChatGPT** integration, streamlining localization workflows and accelerating global deployment. ## September 10, 2025 [#september-10-2025] ### New features [#new-features-5] #### Pluralization support [#pluralization-support] B2TRANSLATE now includes comprehensive pluralization support, enabling accurate translation of **quantity-dependent strings** across all languages. This feature addresses the critical need for handling strings that change based on quantity, such as "1 file" versus "3 files", which is particularly important for languages with **complex plural rules**. The system intelligently detects when pluralization is required based on the combination of key format and target language. When pluralization is needed, B2TRANSLATE automatically generates multiple input fields for each key according to the Unicode rules for plural forms. Each form includes contextual labels that explain proper usage, such as "one," "few," or "many," helping translators understand when each form should be applied. This feature is fully compatible with AI translations. For more details, see [Handle plural forms](user-guide/manage-translations/handle-plural-forms). All existing non-pluralized strings remain fully functional, ensuring complete backward compatibility with current projects and workflows. *** ### Improvements [#improvements-8] #### Clearer hierarchy of translations [#clearer-hierarchy-of-translations] Managing default and custom translations has become more intuitive. The **padlock icon** has been removed, its functionality has been replaced by more declarative options: **Reset to default** and **Save as empty**. The tooltip in the **Translation** field indicates which default translation is currently used in the WebUI. #### Enhanced key display and project navigation [#enhanced-key-display-and-project-navigation] The project interface has been redesigned to provide better visibility and more flexible organization of translation keys. Previously, **Categories** were mandatory and could hide certain keys from view. Now, the system displays the complete list of all project keys by default, giving translators immediate access to their entire translation scope. **Categories** have been repositioned as optional **filtering** tools while maintaining their automatic assignment functionality. Translators can now work with any key regardless of its category assignment. This improvement is particularly beneficial for maintaining translation consistency, as similar keys are now visible together in the unified list rather than potentially hidden across different category sections. When needed, category filters can still be applied to narrow down the key list for focused work. Additionally, the **translation pages** have been reorganized for more clear structure and display: * Default translations have been grouped to a single column. * Language icons have been added. * Information on when a key was added or updated has been moved to key details. *** ### Resolved issues [#resolved-issues-4] There have been no customer-facing issues reported in this release. ## August 4, 2025 [#august-4-2025] ### Improvements [#improvements-9] This release is dedicated to behind-the-scenes improvements that benefit our platform administrators. While there aren't any new features for you this time, these updates help ensure everything runs smoothly. ## June 27, 2025 [#june-27-2025] ### New features [#new-features-6] #### Platforms [#platforms] This release introduces a new **platform** entity. Platforms are separate buckets inside products, such as Web, iOS, Android. Each platform has its own set of categories, while all platforms within a product share the same set of languages. Currently, this feature is enabled exclusively for the `b2core` product type. Platforms are added and configured by Admins. If a project has only one platform, the user experience remains unchanged. However, if multiple platforms are added, corresponding tabs appear on the **Categories** page and users must first select a platform before providing translations. *** ### Improvements [#improvements-10] * Internal improvement: A new endpoint has been added to update a list of languages in the language selection modal on the **Translations** page. *** ### Resolved issues [#resolved-issues-5] * Fixed an issue with key search in categories. ## May 20, 2025 [#may-20-2025] ### New features [#new-features-7] #### Translation Download/Upload functionality [#translation-downloadupload-functionality] With this release, we've implemented the Download/Upload functionality for translations. You can now export selected translations for a specific language in CSV format for external editing. Once edited, you can upload the CSV back to B2TRANSLATE, allowing for quicker and easier bulk updates and management of the translations. Additionally, the system will provide messages indicating the success or failure of an export/import attempt. For details, see [the article](user-guide/manage-translations/download-and-upload-translations). #### Copy buttons for keys [#copy-buttons-for-keys] To further improve user interaction, we have added a copy button next to each key name on the Translations page. This update provides you with the ability to effortlessly copy the full key name to the clipboard. The copy button is accompanied by a visual confirmation to indicate a successful copy action. This functionality is compatible across major web browsers including Chrome, Safari, and Firefox, ensuring a consistent user experience. #### RTL/LTR cursor for Arabic, Farsi, and Urdu languages [#rtlltr-cursor-for-arabic-farsi-and-urdu-languages] The translation handling has been enhanced by the support for both right-to-left (RTL) and left-to-right (LTR) languages in the editor. The text direction now automatically adjusts based on the selected language, optimizing text display without distortion. The movement of the cursor and text selection is smooth for all directions, and these improvements are seamlessly incorporated without affecting pre-existing editor capabilities. This update guarantees robust text management for all supported languages, providing you with an intuitive translation experience. *** ### Resolved issues [#resolved-issues-6] * Fixed an issue where icons weren’t displayed correctly in the Firefox browser. ## March 26, 2025 [#march-26-2025] ### New features [#new-features-8] #### AI translations with ChatGPT [#ai-translations-with-chatgpt] With this release, we've upgraded our integration with ChatGPT to enable AI translations for users. Note that this feature isn’t enabled by default and must be explicitly requested per project. Using AI for translations is limited: for each project utilizing ChatGPT integration, a monthly credit is provided, AI translation costs are automatically deducted from this allocated balance. AI translations are available for all project languages, excluding the default language (usually English). This feature translates the **Default translation (EN)** to your selected language and adds it to the **Translation** field. For more details, see [Translate with AI](user-guide/manage-translations/translate-with-ai). #### New Customer role [#new-customer-role] The new user role, **Customer**, has been added. It’s similar to the former **Editor** role, but expands functionality by providing access to AI-powered translations. All users currently assigned the **Editor** role will seamlessly transition to the **Customer** role, whether or not the AI translation feature is activated within their respective projects. *** ### Improvements [#improvements-11] * To enhance user experience and navigation efficiency, **search fields** have been added across all dropdowns. This allows users to swiftly locate specific items within extensive lists, streamlining overall interaction. * The **user avatar** icon has been added to the topbar. By hovering over it, you can access your email and role information alongside the **Log out** button. The language select has been removed from the topbar, but remains available within the main menu. *** ### Resolved issues [#resolved-issues-7] There have been no customer-facing issues reported in this release. ## February 11, 2025 [#february-11-2025] ### New features [#new-features-9] #### Enhanced security [#enhanced-security] With this release, two-factor authentication (2FA) has been updated to require authenticator apps, such as **Google Authenticator** as the primary option and **Twilio Authy** as an alternative for users in regions where Google Authenticator may be unavailable. When signing in to B2TRANSLATE, you’ll now be prompted to set up an authenticator app to generate 2FA codes by following the on-screen instructions. For security reasons, you’ll be requested to enter a code from the app each time you sign in after providing your credentials. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December, 2024 🎄 [#december-2024-] #### New features [#new-features-10] ##### UI enhancements [#ui-enhancements] The latest release brings several enhancements to the user interface for a more intuitive and streamlined experience. * On the **Projects** page, project types are now organized into tabs, providing a more compact and structured view. * The main menu has become collapsible for greater convenience. * The following updates have been made to the **Translations** page: * For translation editing, the input field now supports autocomplete and syntax highlighting for improved ease of use. * The **Send translations** menu has been repositioned above the table for quicker access. * The **Filters** button has been made more visible. * Pagination is consistently positioned at the bottom of the page. * On the **Login** page, the password is now hidden by default. Additionally, a support link has been added for users experiencing sign-in issues. #### Improvements [#improvements-12] * Backend enhancements have been made through the refactoring of certain endpoints, taking the first step towards improved performance and speed. * The design system components have been implemented, aiming to enhance code reusability, maintainability, and scalability. * New services for collecting metrics are introduced, supporting better monitoring and analysis. #### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. *** ### October, 2024 [#october-2024] #### New features [#new-features-11] ##### WebUI translated into 20 languages [#webui-translated-into-20-languages] We’re excited to announce that the B2TRANSLATE WebUI is now available in 20 languages. In addition to English, you can now use B2TRANSLATE in French, German, Italian, Polish, Portuguese, Russian, Spanish, Ukrainian, Turkish, Arabic, Indonesian, Hindi, Urdu, Farsi, Japanese, Korean, Vietnamese, and Chinese (both traditional and simplified). This update improves the user experience for our global community. We’ve added a language select option to the main menu, making it easy and intuitive to use. #### Improvements [#improvements-13] Yandex.Metrika along with Webvisor has been integrated to B2TRANSLATE so we can dive deeper into the analytics and better identify usability issues. ### September, 2024 (Part 2) [#september-2024-part-2] #### New features [#new-features-12] ##### AI integrated for enhanced translation [#ai-integrated-for-enhanced-translation] With this release, **DeepL** and **ChatGPT** have been integrated as a translation service. Key updates include: * **AI workflows**: Assign specific AI workflows to entire projects or individual languages. * **Translator permissions**: Configure AI users with translator permissions. * **Glossary functionality** (for DeepL only): Add terms to a glossary for consistent translation of defined terms. * And many more. These AI service integrations will boost translation efficiency, quality, and speed of delivery. *** ### September, 2024 [#september-2024] #### New features [#new-features-13] ##### Language selector for faster translation modifying [#language-selector-for-faster-translation-modifying] Following recent updates to simplify translation management, a language selector has been added to the **Translations** page. Previously, users had to constantly switch back to the language list when modifying translations for multiple languages. Now, selecting a category takes you directly to the key list. You can switch languages using the new selector on this page, significantly reducing the time needed for setting translations. #### Improvements [#improvements-14] * When adding a new project, it now loads faster and displays a dynamic preloader. * The **New keys** column has been removed from the project list. This change enhances user experience by decluttering the **Projects** page and improving performance through key data caching. * The search engine now retains search results across page reloads, providing a consistent user experience. * When switching to the next page of search results, the page scrolls to the top automatically, providing a more intuitive experience. *** ### June, 2024 [#june-2024] #### Improvements [#improvements-15] ##### Simplified Default translations management [#simplified-default-translations-management] A new column displaying default translations in the selected language, distinct from English, has been added to the **Translations** page. Previously, only English translations were provided, but now users can easily edit translations for all 22 supported languages. ##### New project types [#new-project-types] Two new project types have been added: `pbsr-v2` and `pbsr-admin`. *** ### April, 2024 [#april-2024] We're thrilled to announce the release of **B2TRANSLATE version 2**, packed with new features and enhancements to improve your translation workflow. Here's what's new in this release: #### New features [#new-features-14] ##### Pre-translated keys from the Template project [#pre-translated-keys-from-the-template-project] Pre-loaded translations for the keys from the Template project are now available for all supported languages in the existing projects. For new projects, users now have the flexibility to choose between pre-loading all languages or selecting specific languages that they require. ##### User-editable translations [#user-editable-translations] We have introduced the ability for users to modify the pre-translated keys in their respective languages. This flexibility empowers users to fine-tune translations according to their specific project requirements or preferences. ##### Feedback form [#feedback-form] A brand-new feedback form is now available in the main menu. This allows users to provide feedback directly from the B2TRANSLATE platform, enabling the B2TRANSLATE team to gather insights, address issues, and continuously improve the user experience. :tada: **Happy translating!** The following table provides an overview of liquidity provider platforms that are supported by B2CONNECT and outlines the B2CONNECT adaptor connectivity capabilities when connecting to a corresponding platform. [^1]: 20 for WSS B2CONNECT supports connectivity to multiple FIX-enabled trading platforms across various asset classes. Access or distribute liquidity with the [B2CONNECT FIX API](../fix-api). The table below outlines the supported platforms and their integration capabilities. Orders with the `GTC` Time in force are currently supported as `IOC`. 1, 2 Supported under the External Maker Specification. To properly connect Binance to B2CONNECT Hub using an Ed25519 key, you need to: ### Get a list of trusted IP addresses from B2CONNECT [#get-a-list-of-trusted-ip-addresses-from-b2connect] Contact your Account Manager to obtain a list of B2CONNECT IP addresses. You'll need them later, to properly configure a list of trusted IPs. ### Create Ed25519 keys [#create-ed25519-keys] 1. Download and install the Asymmetric Keys Generator. 2. Generate private and public Ed25519 keys. Follow the **How to create an Ed25519 key pair?** section of the [Binance instruction](https://www.binance.com/en/support/faq/detail/6b9a63f1e3384cf48a2eedb82767a69a) for step-by-step guidance. ### Register your Ed25519 keys on Binance [#register-your-ed25519-keys-on-binance] Follow the **How to register my Ed25519 key on Binance?** section of the [Binance instruction](https://www.binance.com/en/support/faq/detail/6b9a63f1e3384cf48a2eedb82767a69a) for step-by-step guidance. ### Edit restrictions [#edit-restrictions] Add previously acquired B2CONNECT IP addresses as trusted IPs to the allowlist of newly registered API keys. ### Configure the connection on the B2CONNECT side [#configure-the-connection-on-the-b2connect-side] Contact your Account Manager for guidance on integrating the keys into the B2CONNECT settings. When creating API keys on the Kraken platform, on the **Add API key** page, set the **Nonce window** field to `10000000000` (one followed by ten zeros). To avoid typos when entering this value, you can copy it above and paste it into the form as follows: Generate Kraken API keys This is required for proper handling of time variables (nanoseconds in this case). This guide outlines the steps you need to follow to properly prepare your Android app for Google review, approval, and successful publication on Google Play. These instructions provide general guidance as of the date of publication. You are responsible for completing all required fields in your Google Play Console. Providing incorrect or incomplete information may result in warnings, restrictions, or suspension of your developer account by Google. ## Step 1. Compliance checkpoint [#step-1-compliance-checkpoint] Before creating and submitting your Android app for Google review, determine the countries where you want your app to be available and ensure you hold all required licenses and legal permissions for each country. This process may take time, so obtain the necessary licenses in advance to confirm that you are authorized to offer all configured trading instruments in your B2CORE instance and provide this information during the Google Play review. To learn more about Google Play policies for financial services and cryptocurrency, refer to their **Policy center** and specifically to the following: * [Blockchain-based content](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA) * [Understanding Google Play’s cryptocurrency exchanges and software wallets policy](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA) ## Step 2. Prepare required app information [#step-2-prepare-required-app-information] Prepare the following information that will be required when creating your app in the Google Play Console and submitting it for Google review. ### Support and legal information [#support-and-legal-information] Provide the following details: * **Privacy policy URL** — a link to a publicly accessible web page that explains how your app collects, uses, stores, and protects user data. For Android apps published on Google Play, the privacy policy is mandatory, even if your app collects minimal data. The page must: * Be publicly available. * Be hosted on your website or another reliable public domain. * Clearly describe what data is collected, how it is used, and how users can request account deletion or data removal. * **Demo account** — a demo account that Google can use during the review process (for details, refer to [Step 3. Create and configure a demo account in the B2CORE UI](#step-3-create-and-configure-a-demo-account-in-the-b2core-ui)). * **Contact email for Google** — an email address used for official communication from Google. This email will be linked to your developer account in Google Play Console. * **Public developer contact details** — contact information visible to users on Google Play, which must include: * Support email * Contact phone number * Website URL ### Store Listing information [#store-listing-information] Prepare the following store listing details for your app: * App name * Short description (up to 80 characters) * Full description (up to 4,000 characters) * Graphical assets (can be provided by the B2CORE team). To request them, contact [android-support@b2broker.com](mailto:android-support@b2broker.com) or your account manager. ## Step 3. Create and configure a demo account in the B2CORE UI [#step-3-create-and-configure-a-demo-account-in-the-b2core-ui] To be able to review all of your app functionality, the Google reviewers need access to a demo account. For this reason, you need to configure a demo account as follows: * Verify your demo account by going through all the steps of your configured KYC procedure. * In the Back Office, examine and enable all the B2CORE UI modules that will be featured in your mobile app. Each module must be properly configured to ensure that your mobile app will not be rejected by Google during review. * If your app enables its users to transfer or exchange assets, you also need to make sure that there are enough funds on your demo account, so that the Google reviewers are able to check the transfer and exchange functionality as well. ## Step 4. Register in the Google Play Console as an Organization [#step-4-register-in-the-google-play-console-as-an-organization] To publish your Android app, you need to register in the [Play Console](https://play.google.com/console/signup) as an organization and create a developer account. Further on, with each Android release, the B2CORE team will provide new app bundles (`.aab` files) for you and you will be responsible for managing the regular maintenance of the app. For more information, refer to [Get started with Play Console](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA). ## Step 5. Create a new app in the Play Console [#step-5-create-a-new-app-in-the-play-console] To create an app: Sign in to the [Google Play Console](https://play.google.com/console/). Select your developer account. To start a new app, click **Create app**. Fill in the app details: * In the **App name** field, enter the name for your app. This is how your app will appear on Google Play. * In the **Default language** dropdown, select **English**. * In the **App or game** section, select **App**. * In the **Free or paid** section, select **Free**. App details Add an email address that Google Play users can use to contact you about your app. In the **Declarations** section, accept app developer declarations and confirm policy compliance. Declarations Click **Create app**. After creating the app, you'll be redirected to the Dashboard to continue the app setup. If you’re not automatically redirected, you can access it anytime from the **Home** menu in the Play Console by clicking your app. ## Step 6. Set up your app on the Play Console Dashboard [#step-6-set-up-your-app-on-the-play-console-dashboard] At this step, provide all the information requested by Google Play about your app. To provide information about the app: In the Play Console, select your app. Click each link in the **Set up your app** section of the Dashboard and fill in the required details. Play Console Dashboard ### Set privacy policy [#set-privacy-policy] * In this section, enter a link to your privacy policy that explains how you handle sensitive user and device data. * Click **Save** to return to the Dashboard. ### App access [#app-access] * In this section, select the option **All or some functionality in my app is restricted**. App access ### Ads [#ads] * In this section, select the option **No, my app does not contain ads**. * Click **Save** to return to the Dashboard. ### Content ratings [#content-ratings] * In the **Category** section, fill in the following: * **Email address** — specify your contact email. * Select the option **All other app types**. * Enable the checkbox to **Agree with the Terms of Use**. Content ratings — Category * In the **Questionnaire** section, select **No** for all the following: * Downloaded app * User content sharing * Online content * Promotion or sale of age-restricted products or activities * Miscellaneous Content ratings — Questionnaire * In the **Summary** section, verify the displayed summary and click **Save**. ### Target audience and content [#target-audience-and-content] * In the **Target audience**, select the checkbox **18 and over**. Selecting this checkbox will redirect you to the **Summary** section. * You can fill in the previous sections, such as **App details**, **Ads**, and **Store presence** if necessary. Target audience and content * In the **Summary** section, verify the displayed summary and click **Save**. ### Data safety [#data-safety] * Read the **Overview** section. * In the **Data collection and security** section, select the options as shown below and provide a URL to the section in your B2CORE UI where an account can be deleted. The URL must follow this format: `https://{your-Front-Office-URL}/profile-info` Make sure to replace `{your-Front-Office-URL}` with the domain of your B2CORE UI. Ensure that your B2CORE instance supports account deletion. This is a Google Play requirement and may be checked at any time by Google Play or by users. Failure to comply may result in suspension of your developer account in Google Play Console or a permanent ban. Data collection and security * In the **Data types** section, fill in the following: * **Location**: B2CORE does not collect this type of data. * **Personal info**: Specify the data that clients are required to provide during registration in your B2CORE instance. This usually includes (but isn't limited to) "Name", "Email address", "Phone number", or other. * **Financial info**: B2CORE does not collect this type of data. * **Health and fitness**: B2CORE does not collect this type of data. * **Messages**: B2CORE does not collect this type of data. * **Photos and videos**: B2CORE does not collect this type of data. * **Audio files**: B2CORE does not collect this type of data. * **Files and docs**: B2CORE does not collect this type of data. * **Calendar**: B2CORE does not collect this type of data. * **Contacts**: B2CORE does not collect this type of data. * **App activity**: B2CORE collects "App interactions" data. * **Web browsing**: B2CORE does not collect this type of data. * **App info and performance**: B2CORE collects "Crash logs" and "Diagnostics" data. * **Device or other IDs**: B2CORE does not collect this type of data. * In the **Data usage and handling** section, you will see a set of questionnaires related to the data collected by the app. * Complete the questionnaires in the **Personal info** section as shown in the example below: Personal info * Complete the questionnaires in the **App info and performance** and **App activity** sections as shown in the example below: Cash logs * In the **Preview** section, verify the displayed summary and click **Save**. ### Government apps [#government-apps] * Select **No** for the displayed option. Government apps * Click **Save** to return to the Dashboard. ### Financial features [#financial-features] * Select the checkboxes for the features that your app provides. Make sure to select only the features that your app actually provides. These may differ from the example shown below. Financial features * Click **Save** to return to the Dashboard. ### Health apps [#health-apps] * Select the option **My app does not have any health features** and click **Next**. * The **Documentation** section doesn't require any additional actions. * Click **Save** to return to the Dashboard. ### Store settings [#store-settings] * In the **App category** section, fill in the following: * In the **App or Game** option, select **App**. * In the **Category**, select **Finance**. * In the **Store Listing contact details** section, enter the email address, phone number, and website that will be visible to users on Google Play. * (Optional) In the **External marketing** section, you can select the checkbox for **Advertise my app outside Google Play**. Store settings ### Set up your store listing [#set-up-your-store-listing] * In the **Listing assets** section, fill in the following: * **App name** * **Short description** * **Full description** Listing assets * In the **Graphics** section, attach graphic assets provided by the B2CORE team. Click **Add assets** and upload each graphic asset one by one, and select the appropriate category for each asset. * After you’ve added all provided assets, click **Save**. ### Send app information for review [#send-app-information-for-review] All the information that you've provided about your app must be sent for Google review. Click **Publishing overview** in the main menu and then click **Send X changes for review**. ## Step 7. Upload the app bundle (.aab) for a production release [#step-7-upload-the-app-bundle-aab-for-a-production-release] To upload your app bundle and configure a production release in the Google Play Console: In the Play Console, select your app. Navigate to **Test and release** > **Production**. Open to the **Countries/regions** tab and select the countries where you want your app to be available, according to the licenses that allow you to distribute the app and provide services. Click **Create new release** in the upper-right corner. Create new release Click **Change signing key**. Google Play uses app signing based on cryptographic keys to verify the authenticity and security of your app. Proper configuration of **Google Play App Signing** is critical to ensure a secure deployment and, where applicable, a smooth transition for existing `.apk` users to the Google Play version. Change signing key Download the encryption public key. * Select the option **Upload a new app signing key from Java keystore**. * Click **Download encryption public key** (Option 1). Download encryption public key Send the downloaded key in the `.pem` file format to the B2CORE team either by emailing [android-support@b2broker.com](mailto:android-support@b2broker.com) or through your account manager. The B2CORE team will generate an app signing key, encrypt it using the provided public encryption key, and return it to you together with your application in `.aab` format, signed with the same key. This process may take some time. After receiving the **signed app bundle** (`.aab`) and the **app signing key archive** (`.zip`), return to **Test and release** > **Production** > **Releases** > **Untitled release**. On the **Releases** page, click **Edit release**. Upload the received **app signing key** (`.zip`). * Select the option **Upload the app signing key (.zip)**. * Click **Upload generated ZIP** (Option 4). Upload app signing key Upload the received **app bundle** (`.aab`). * Drag and drop the provided `.aab` file. Don't modify it. * After uploading, make sure no errors are shown. You may see the following warning message. This is expected and can be safely ignored. **Warning** `This App Bundle contains native code, and you've not uploaded debug symbols. We recommend that you upload a symbol file to make your crashes and ANRs easier to analyze and debug.` Fill in the **Release details**. * The **Release name** field is filled in automatically after uploading the `.aab` file. * In the **Release notes** field, paste the release notes provided by the B2CORE team or leave the field empty. Release details Click **Next**. Review the release information and make sure there are no errors highlighted in red. You may see the following warning message. This is expected and can be safely ignored. **Warning** `This App Bundle contains native code, and you've not uploaded debug symbols. We recommend that you upload a symbol file to make your crashes and ANRs easier to analyze and debug.` Start the rollout. * Click **Save** to submit the app for Google review. * You will be redirected to **Publishing overview**, where you must click **Send X changes for review**. App review and rollout may take several days. The review will result either in successful publication on Google Play or in a rejection with the reason provided. If you experience issues resolving a rejection, contact the B2CORE team at [android-support@b2broker.com](mailto:android-support@b2broker.com). ## Step 8. After approval: app monitoring [#step-8-after-approval-app-monitoring] After your app is approved, regularly check its availability and policy compliance to avoid enforcement actions. Failure to perform these checks may result in policy violations, app removal, suspension, or permanent termination of your developer account in the Play Console, often without prior notice. ### Check app availability [#check-app-availability] Confirm that the app is visible on Google Play in all allowed countries and that installation and basic functionality work as expected. ### Check compliance [#check-compliance] Keep your app listing, privacy policy, and country distribution aligned with your current licenses and legal permissions. ### Monitor policy status [#monitor-policy-status] Periodically check if any actions required in **Monitor and improve** > **Policy and programmes** > **Policy status**. ### Review app content [#review-app-content] Periodically check if any actions required in **Monitor and improve** > **Policy and programmes** > **App content**. Ensure that all app information is up to date. ### Monitor Google Play communications [#monitor-google-play-communications] Regularly check the contact email linked to your Google Play Console and respond promptly to any notifications. Google Play policies and deployment processes change regularly. If you notice any missing or outdated information in this instruction, contact us at [android-support@b2broker.com](mailto:android-support@b2broker.com) for assistance or clarification. In addition to creating standalone desktop solutions, B2CORE offers you assistance with publishing branded mobile applications for iOS and Android. To publish your app on the App Store, you need to consider a variety of policy issues to ensure strict compliance with all of the guidelines and regulations, which may be a non-trivial task. In this document, you can find detailed instructions on how to properly prepare your iOS app to speed up its approval and successful publication on the App Store. All trademarks, logos, and brand names referenced in this document are the property of their respective owners. All company, product, and service names used in this document are for identification purposes only. The use of these names, trademarks, and brands does not imply endorsement. ## Step 1. Prepare the licenses for trading crypto [#step-1-prepare-the-licenses-for-trading-crypto] First of all, before proceeding with building and submitting your iOS app for review, you need to determine in which countries this app will be available and take special care to obtain all the licenses required to provide your services in these countries. This procedure might be time-consuming, and you must obtain all the required licenses in advance to make sure that you are allowed to trade all the instruments that are configured in your B2CORE solution, and then hand over these licenses to the App Store review team. App Store Connect — Country and Region Availability The license requirements are mandatory, and the permissions to servicing trading operations must be granted by Apple. To learn more about the licensing requirements which apply specifically to cryptocurrencies, refer to [App Store Review Guidelines - 3.1.5 Cryptocurrencies](https://developer.apple.com/app-store/review/guidelines/#cryptocurrencies). ## Step 2. Create and configure a demo account in the B2CORE UI [#step-2-create-and-configure-a-demo-account-in-the-b2core-ui] To be able to review all of your app’s functionality, the App Store review team needs access to a demo account. For this reason, you need to configure a demo account as follows: * Verify your demo account by going through all the steps of your KYC procedure. * In the Back Office, examine and enable all the B2CORE UI modules that will be featured in your mobile app. Each module must be properly configured to ensure that your mobile app will not be rejected by the App Store during review. * If your app enables its users to transfer or exchange assets, you also need to make sure that there are enough funds on your demo account, so that the App Store review team is able to check the transfer and exchange functionality as well. ## Step 3. Enroll in the Apple Developer Program as an Organization [#step-3-enroll-in-the-apple-developer-program-as-an-organization] To be able to open an Apple Developer account, you must provide the following information: * your D-U-N-S number * your Legal Entity Status * your Legal Binding Authority * your website address To publish your iOS app, you need to enroll in the Apple Developer Program as an organization, and then share access to your developer account with the B2CORE team by sending your access credentials to our company email: [ios-admin@b2broker.com](mailto:ios-admin@b2broker.com). Further on, with each iOS release, the B2CORE team will upload a new app build for you, and you will be responsible for managing the regular maintenance of the app (for details, refer to [Step 8. Update your app with new releases](deploying-your-ios-app#step-8-update-your-app-with-new-releases)). For general information, refer to [Before You Enroll — Apple Developer Program](https://developer.apple.com/programs/enroll/). For step-by-step instructions, refer to [Enrolling in the Apple Developer Program as an organization](https://developer.apple.com/support/app-account/). ## Step 4. Grant access and admin permissions to the B2CORE team [#step-4-grant-access-and-admin-permissions-to-the-b2core-team] For the B2CORE team to be able to configure your app at App Store Connect, you need to grant the following admin permissions to our team. To do this, proceed as follows: 1. At App Store Connect, switch to **Users and Access**. 2. On the **People** tab, add a new person with the B2BROKER company email: [ios-admin@b2broker.com](mailto:ios-admin@b2broker.com). 3. In the **Roles** section, enable the **Admin** role. 4. In the **Additional Resources** section, make sure that all the permissions are enabled as follows: * **Access to Reports** * **Access to Certificates, Identifiers & Profiles**, which includes: * **Access to Cloud Managed Distribution Certificate** * **Access to Cloud Managed Developer ID Certificate** * **Create Apps** App Store Connect — Users and Access ## Step 5. Provide all necessary information to your account manager [#step-5-provide-all-necessary-information-to-your-account-manager] Contact your account manager at B2BROKER to inform the development team that they must prepare your app for publishing. You need to provide the following information to your account manager, which will be passed over to the development team: * The information about licenses, along with the credentials to your B2CORE Demo Account. * The URL of your B2CORE UI instance. * The legal name of your company, as well as your Apple Developer account name (typically, it coincides with the company name specified when creating a Developer Account as an Organization). Your Apple Developer account must be registered under your organization as an LLC; personal accounts aren't permitted. * The email of the Developer Account’s owner. In addition, you need to provide the following information: * The name of your iOS app (it must not exceed 16 characters). * The primary language of the app (English is set by default) and a list of supported languages for localization purposes. * Your preferences regarding the app icon (such as the required color scheme). * Your preferences regarding the app screenshots displayed on the product page on the App Store. After your account manager contacts the B2CORE development team, they prepare your app and upload the build to the App Store. The app then appears at the App Store Connect, with its version indicated and its status set to **Prepare for Submission**. App Store Connect — Prepare for Submission ## Step 6. Specify the pricing, availability and privacy options [#step-6-specify-the-pricing-availability-and-privacy-options] At App Store Connect, configure the following app settings: * **Pricing and Availability** In this section, you need to specify the following options: * We recommend that you offer your mobile app for free and set the **Price Schedule** field to `US$0.00 (Free)`. * Set the **Tax Category** field to `App Store software`. * In the **Availability** section, select the countries in which your app will be available, according to the licenses obtained by you. * For the other options in this section, you can leave the default settings. App Store Connect — Pricing and Availability * **App Privacy** In this section, specify the **Privacy Policy URL**, which must be the same one that you specified for your B2CORE UI instance. App Store Connect — App Privacy Next, click **Get Started** and complete the quiz to specify your app’s data collection policy: * **Contact Info** Your app will collect the user’s email address by default. Depending on your app’s configuration, it may also collect other data, such as the username, phone number, user address and other contact information. Please make sure that you indicate the collected data according to the options that are specified in your B2CORE Back Office. * **Identifiers** The **User ID** data is collected by default. The **Device ID** data is not collected. * **User Content** The user photos and videos are collected. * **Other User Content** On this page, select `App Functionality` and `Other Purposes`. The following example illustrates the data collection settings that must be specified by a client publishing a standard iOS app: * **Data Linked to You**: * **Contact Info** * **User Content** * **Identifiers** * **Data Not Linked to You**: * **Diagnostics** * **Contact Info**: * **Name** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Email Address** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` For the question **Do you or your third-party partners use email addresses for tracking purposes?**, select the answer `No, we do not use email addresses for tracking purposes.` * **Phone Number** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Physical Address** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Other User Contact info** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **User Content**: * **Photos or Videos** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Other User Content** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Identifiers**: * **User ID** * `Used for Other Purposes` and `App Functionality` * `Linked to the user's identity` * **Diagnostics**: * **Crash Data** * `App Functionality` To learn more, refer to [App privacy details on the App Store](https://developer.apple.com/app-store/app-privacy-details/). ## Step 7. Specify a demo account from which the Apple Review team will log in [#step-7-specify-a-demo-account-from-which-the-apple-review-team-will-log-in] Once your app is uploaded to App Store Connect, you need to specify a demo account that you have created at [Step 2](deploying-your-ios-app#step-2-create-and-configure-a-demo-account-in-the-b2core-ui). The App Store review team will use this account to log in and review your app. To specify a demo account, proceed as follows: 1. At App Store Connect, switch to **App Review** > **Prepare for Submission**. In the **App Review Information** section, enable the **Sign-in Required** checkbox, and then specify the login and password for your demo account. 2. In the **Contact Information** section, specify the contact information of a person responsible for configuring App Store Connect. The App Store review team will contact this person to inform them whether the app is accepted or rejected, or whether any additional information is needed. 3. In the **Notes** field, add the links to your licenses and attach their scans (if available). The licenses must be provided for each country that you selected in the **Availability** section at [Step 6](deploying-your-ios-app#step-6-specify-the-pricing-availability-and-privacy-options). The links must be added below the information on how to locate the delete account button. 4. In the **Notes** field, add the following text: > The app doesn't rely on any third-party API, including any API that might put our users' data at risk. The app uses only a custom REST API to communicate with the backend with the purpose of providing financial services. This API is developed and owned by our company. Therefore, we guarantee correct functioning of the API. App Store Connect — App Review Information 5. Specify the following fields: * **Promotional Text** * **Description** * **What’s New in This Version** * **Keywords** * **Support URL** * **Marketing URL** * **Version** * **Copyright** App Store Connect — Additional Information To learn more about these fields, refer to [Platform version information](https://developer.apple.com/help/app-store-connect/reference/platform-version-information). 6. Click **Add for Review** to submit your app for review to the App Store team. When your app is reviewed and approved, its status will be changed to `Ready for Distribution`. ## Step 8. Update your app with new releases [#step-8-update-your-app-with-new-releases] With each iOS release, the B2CORE team will upload a new app build for you in App Store Connect. You need to create a new app version, add the new build to the version, and submit it for review to the App Store team. ### Create a new app version [#create-a-new-app-version] When the B2CORE team notifies you of a new iOS release, create a new app version in Apple Store Connect, add a new build to it, and submit it for review to the App Store team. You can create a new version only if the current app version has the `Ready for Distribution` status. If for some reason, your current app version wasn’t submitted for review and has an editable status, [update the current version with a new build](deploying-your-ios-app#update-the-current-app-version-with-a-new-build) instead of creating a new version. For a full list of possible statuses, refer to [App and submission statuses](https://developer.apple.com/help/app-store-connect/reference/app-and-submission-statuses). 1. From Apps, select your app. 2. On the **Distribution** tab, click the **add** button (+) displayed in the **iOS App** section of the sidebar. 3. In the **New Version** popup, the new version number (for example, `1.24.0`) and click **Create**. You can view a complete list of app versions and builds uploaded for them on the **TestFlight** tab. 4. Review the new version metadata. When you create a new version, the metadata from the current version is transferred to the new version automatically. For a description of the version properties, refer to [Platform version information](https://developer.apple.com/help/app-store-connect/reference/platform-version-information). 5. Click **Save** in the upper-right page corner. 6. Add the latest app build to the newly created version: * Scroll down to the **Build** section, and then click the **add** button (+) displayed next to the section. * In the **Add Build** popup, select the build with the *highest* version number and click **Done**. App Store Connect — Add a build App Store Connect — Select the latest build 7. Add the release notes to the **What’s new in this version** field. The RNs for each iOS release can be found [here](../release-notes/release-notes-mobile). The RNs may not be fully applicable to your app, so you may need to edit them to include only the updates relevant to your app’s functionality. For example, if the RNs mention updates for a trading platform that your app doesn’t support, omit that item from the **What’s new in this version** field. 8. Click **Save** in the upper-right page corner. 9. Click **Add for Review** to submit the new app version for review to the App Store team. When your new app version is reviewed and approved, its status will be changed to `Ready for Distribution`. ### Update the current app version with a new build [#update-the-current-app-version-with-a-new-build] If your current app version doesn’t have the `Ready for Distribution` status in App Store Connect, you can’t create a new app version when a new iOS release is available. Instead, select a new build for the current version and submit it for review to the App Store team. 1. From Apps, select your app. 2. In the sidebar, select the app version for which you want to upload a new build. You can do it only for the version that has one of the editable statuses. For a full list of possible statuses, refer to [App and submission statuses](https://developer.apple.com/help/app-store-connect/reference/app-and-submission-statuses). 3. Scroll down to the **Build** section. 4. To remove the previous build, hover over the build and click the **delete** button (-) that appears on the right side of the build row. App Store Connect — Remove a build 5. Add the latest build: * Click the **add** button (+) displayed next to the **Build** section. * In the **Add Build** popup, select the build with the *highest* version number and click **Done**. App Store Connect — Add a build 6. In the **Version** field, update the version number to match the new iOS release. For example, change `1.23.0` to `1.24.0`. 7. Add the release notes to the **What’s new in this version** field. The RNs for each iOS release can be found [here](../release-notes/release-notes-mobile). The RNs may not be fully applicable to your app, so you may need to edit them to include only the updates relevant to your app’s functionality. For example, if the RNs mention updates for a trading platform that your app doesn’t support, omit that item from the **What’s new in this version** field. 8. Click **Save** in the upper-right page corner. 9. Click **Add for Review** to submit the new app version for review to the App Store team. When your new app version is reviewed and approved, its status will be changed to `Ready for Distribution`. The **Dashboard** page provides a quick overview of key financial metrics over the selected period, helping you analyze the overall performance and financial activity. ## Access to the Dashboard [#access-to-the-dashboard] The **Dashboard** is available to users who are assigned the permission `Access to Finance Dashboard` under the **Statistics** category and opens after signing in to the Back Office. For other Back Office users, the **Dashboard** is hidden, and they are redirected to the **Clients** > **General** page after signing in. For more details about user groups and permissions, refer to [How to add a user group and grant permissions](../how-to-articles/manage-system-settings/how-to-add-a-user-group-and-grant-permissions). By default, the financial metrics are displayed for the current day. You can select one of the following periods: * Today * Yesterday * Last 7 days * Last 30 days * Last 90 days * This month * Last month * Custom range You can also filter the displayed metrics by using the following filters located above the metric blocks: * **Client Type** * **Jurisdiction** * **Country** * **Manager** * **Client Tags** To reset the selected filters and period, click the **Reset** button. Dashboard The following information is displayed on the Dashboard: ## Deposits [#deposits] * **Total deposit** — the total amount of deposits, in USD, for the selected period. The metric is calculated against the **Final amount (USD)** column in [Finance > Deposits](finance/deposits). Only the completed deposits in the final status are included. * **Average deposit** — the average deposit amount for the selected period, which is calculated as: `Total deposit / Number of deposits` ## Withdrawals [#withdrawals] * **Total withdrawal** — the total amount of withdrawal, in USD, over the selected period. The metric is calculated against the **Final amount (USD)** column in [Finance > Payouts](finance/payouts). Only the completed withdrawals in the final status are included. * **Average withdrawal** — the average deposit amount for the selected period, which is calculated as: `Total withdrawal / Number of withdrawals` ## Summary [#summary] * **Net deposit** — the net amount of deposits, in USD, for the selected period, calculated as: `Total deposit − Total withdrawal` B2CORE is a fully-featured CRM providing a complete set of customization and access control options. ## Authorization and permissions [#authorization-and-permissions] B2CORE provides a full set of personalization and access control options. User access is controlled by applying different user group permissions. After your B2CORE profile is activated, you can sign in to the Back Office using the credentials provided by your administrator. Upon encountering an error when trying to sign in, check the login and password, along with the input language and Caps Lock state. If everything appears to be correct, contact your administrator to clarify the status of your profile. ## General interface options [#general-interface-options] The Back Office user interface is uniform across all pages, ensuring consistent look and feel and featuring a common set of basic options. This document describes how to shape the data displayed on a page, how to filter and sort this data, and then export it to a file. ### The top bar options [#the-top-bar-options] At the top of a typical Back Office page, you can find a top bar with the following elements: * the **☰ main menu** button Click it to expand or collapse the main menu. * **Backend version** The currently deployed version of your Back Office. * **Server time** The fixed system time in GMT+0. It can't be changed and ensures accuracy and consistency across all transactions, logs, and activities within B2CORE. * the **Open personal area** link Click the link to access the **Sign In** page of the B2CORE UI associated with your Back Office. * the **Bell** icon Click it to see pending client requests. The number of new requests is displayed on a counter badge. * the **Warning** icon Click it to view platform connectivity alerts, such as notifications about trading platforms that are currently unreachable. The number of active alerts is displayed on a counter badge. * the panel displaying the email address from your user profile In the upper-right page corner, click the profile button displaying your email address to access the **Log out** button and **Enable 2FA** option (or **Disable 2FA**, if two-factor authentication is already enabled). Two-factor authentication (2FA) is obligatory and must be enabled for all user profiles in the Back Office. To enable 2FA through time-based one-time passwords (TOTP) for your user profile, click **Enable 2FA**, and then click **OK** in the popup. Next, follow the displayed instructions to set up 2FA with Google Authenticator. After enabling 2FA, sign in to the Back Office by entering your login and password, followed by a code from the Google Authenticator app. ### Common options [#common-options] The following buttons can be found on most Back Office pages. * Above a table: * create button — the **Create** button used to add a new entry * export button — the **Export** button used to export table data to a CSV file * the **Select** and **Select All** buttons used to select multiple table entries and perform bulk actions on them (where available) * In a table header: * search button — the **Search** button used to apply custom filters * reset button — the **Reset** button used to reset custom filters * In a table row: * edit button — the **Edit** button used to drill down the data and access details * delete button — the **Delete** button used to delete an entry Page elements may serve as hyperlinks that can be clicked to drill down to details. Access to this data is maintained based on the permissions assigned to a particular user group. ### Filtering and sorting [#filtering-and-sorting] Throughout the Back Office, the data is typically organized in tables. Table data can be sorted and filtered. The columns by which you can sort data are marked with up and down arrows displayed in column headers (no arrows are displayed when sorting isn't available). You can click these arrows to sort data in ascending or descending order, by a single column at a time Along with a sorting order, you can specify multiple criteria for filtering column data. When filtering is available, the appropriate input fields are displayed in column headers. The inputs vary depending on a data format, such as text, number, date, time, or list. To facilitate filtering by date, two fields for the start and end dates may be displayed so that you can define a time period. To enable or disable filters, click the **Search** and **Reset** buttons. ### Pagination [#pagination] You can display table data across multiple pages and specify how many records to display on a page (the total number of records found is displayed next to the page size selector). To navigate between pages, click **Prev** or **Next**, or click a specific page number. ### Visibility [#visibility] To choose the data fields to include in a table, click **Column Visibility** and mark or unmark the columns you want to display or hide. Once applied, the new visibility settings become effective for all Back Office users (visibility of specific fields depends on the access permissions granted to particular users). ### Data export [#data-export] The data on most of the Back Office pages can be exported to a CSV or XLSX file. To do this, click the **Export** button, choose a file format, and then select whether to download the data to your computer or deliver it to an email address from your profile. The data in a resulting file matches both the current visibility settings and the applied sorting and filtering criteria. Use this menu to access to the functionalities of the **Introducing brokers (IB)** product, designed to support referral programs that help expand your client base. Through these programs, you can encourage your existing clients to become partners and attract new traders to your brokerage. In return, partners earn a percentage of the revenue generated from the trading activity of their referrals, fostering a mutually beneficial partnership. If you don't have this menu in your Back Office, contact your account manager to learn more about obtaining and implementing the IB program. For more information about IB, refer to the [product documentation](https://docs.ib.b2core.b2broker.com/). On this page, you can view feedback left by clients after tickets that they reported to HelpDesk in the B2CORE UI are marked as resolved. The following information is provided about each ticket for which feedback is submitted: **Id** The identifier of a ticket that was reported by a client to HelpDesk. Click a ticket identifier to view ticket details in SupportPal or Zendesk. *** **Email** The client email address. *** **Comment** The feedback text. *** **Date** The data and time when feedback was submitted. *** **Status** The client satisfaction rating. Possible values: * Extra Positive * Positive * Neutral * Negative * Extra Negative *** **Subject** The subject of a ticket. If a ticket is reopened and then resolved again, a client can submit updated feedback that is added as a new record to the **Ticket feedback** page. The following is a list of communication platforms supported in B2CORE: **See also** [How to manage communication platforms](../how-to-articles/manage-communication-platforms) The following is a list of KYC providers integrated with B2CORE. When configuring [verification levels](../back-office-guide/verification/levels), you can use the built-in KYC provider or rely on the supported third-party KYC providers to verify the identity of your clients. Listed below are the names of document groups that can be verified by each KYC provider, along with details explaining how the verification procedure is conducted with each provider in the B2CORE UI. **See also** [How to manage verification options](../how-to-articles/manage-verification-options) ## CRM & automation systems [#crm--automation-systems] The following CRM platforms can be connected to B2CORE to streamline sales processes and automate client management workflows: ## Customer support platforms [#customer-support-platforms] The following are platforms integrated with B2CORE, offering solutions for managing client tickets and enhancing support interactions: ## Market analysis & trading signals tools [#market-analysis--trading-signals-tools] The following are platforms integrated with B2CORE, offering market analysis tools and trading signals for clients: ## Data analytics tools [#data-analytics-tools] The following are platforms integrated with B2CORE for collecting and analyzing client action data in the B2CORE UI and mobile apps, providing insights into user behavior, engagement, and business results: The following is a list of payment systems integrated in B2CORE. These systems can be used to configure [deposit](../back-office-guide/system/deposit-system#deposit-methods) and [withdrawal methods](../back-office-guide/system/payout-system#payout-methods) that will be available to your clients in the B2CORE UI. For each payment system, it is indicated whether it supports deposits, withdrawals, or both. Additionally, you can find icons that can be displayed as icons of deposit and withdrawal methods in the B2CORE UI. The icons are used to easily identify a method that uses a specific payment system among the other methods. ## Payment System Service (PSS) [#payment-system-service-pss] For each payment system, it's also specified whether it supports connection to B2CORE through the new **Payment System Service (PSS)**. This service enhances integration by offering a single connection to support a range of deposit and withdrawal options offered by the system. This is especially effective when the system operates as a cashier system, consolidating and processing payments from multiple sources into one unified system (for details, refer to [How to add deposit and withdrawal methods through PSS](../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss)). If you intend to connect payment systems through PSS, please contact your account manager first to confirm the availability of PSS-supported connections on your B2CORE instance. ## Support for PSS methods in mobile apps [#support-for-pss-methods-in-mobile-apps] PSS payment methods, including both deposits and withdrawals, are now supported in the iOS and Android mobile apps starting from version 1.30.0 (iOS) and 2.8.0 (Android). **See also** [How to manage payment methods](../how-to-articles/manage-payment-methods) The following are the trading platforms and hubs supported in B2CORE, with details on their specific features and functionalities. ## Trading platforms [#trading-platforms] ## Trading hubs [#trading-hubs] ### December, 2025 [#december-2025] **v1.31 (iOS)** This version includes: * **Savings now available in the app** Clients can now access **Savings** directly in the app. They can view and subscribe to savings programs, create wallets in the required currencies, monitor active programs, add funds, track interest payments, and, if needed, withdraw funds before the plan's end date.
Savings hub Subscribe to a savings program Installments
* **Streamlined Total balance calculation** The total balance shown on the app **Dashboard** now reflects the combined balances of all wallets and trading accounts and fully matches the total displayed in the B2CORE UI. * **New Activity section** A new **Activity** section has been added to the app, providing a complete history of all transactions in one place. Clients can now easily track their deposits, withdrawals, transfers, and exchanges, as well as search for transactions in specific currencies. The **Activity** section is accessible from the tab bar, as well as from the **Home** and **Wallets** screens. Use **pull to refresh** to quickly update the section and view the most up-to-date information.
Activity Currency search
* **Support for copy trading, PAMM, and MAM** Copy trading, PAMM, and MAM functionality from **B2COPY** is now supported in the app via a web view. This enables clients to access these services directly from the app, through the **Services** section. * **Blockchain explorer link for withdrawal tracking** Clients can now track withdrawal transactions on the blockchain directly from the app. For crypto wallets, a link to `https://www.blockchain.com/explorer` is available for withdrawals in Bitcoin, Ethereum, and Bitcoin Cash, making transaction monitoring easier and improving transparency. * **Static payment details for deposits via B2BINPAY V3 and Coinsbuy V3** The app now supports **static payment details** for deposits via **B2BINPAY** and **Coinsbuy** when connected through **API V3**. With static payment details, clients can generate one or more blockchain-specific deposit addresses directly in the app. These addresses are saved for future use and can be reused for subsequent deposits. In addition, the crypto deposit flow via **B2BINPAY V3** and **Coinsbuy V3** has been improved with clear **fee breakdowns** and **indicative amount** displays, providing better transparency and a smoother deposit experience. * **Full B2TRANSLATE integration for payment forms** Payment forms in the app are now fully integrated with [B2TRANSLATE](https://docs.b2translate.b2broker.com/) (formerly Weblate). Labels for all components of dynamic forms for PSS-connected deposit and withdrawal methods, as well as validation error messages, can now be customized and translated into multiple languages via B2TRANSLATE. * Bug fixes and improvements to ensure a smoother and more efficient user experience. *** ### November, 2025 [#november-2025] **v1.30.2 (iOS)** * This version is a bug-fixing release that improves the app experience. *** ### September, 2025 [#september-2025] **v1.30.0 (iOS)** This version includes: * **Extended multi-lingual support** With [B2TRANSLATE](https://docs.b2translate.b2broker.com/) (formerly WEBLATE) integration, the app now supports localization in up to **35 languages**. The key benefits include: * Offering the same language options on the app as in the B2CORE UI. * Customizing translations for each of the 35 supported languages via B2TRANSLATE. * Maintain translations for both the app and the B2CORE UI using a single tool: B2TRANSLATE. * Improving scalability and client satisfaction by removing language barriers. The integration is already in place, but translations for the supported languages need to be added to B2TRANSLATE. Full localization will become available once this process is completed.
Ar Ch
* **PSS deposit & withdrawal methods now in the app** Withdrawal methods configured via the [Payment System Service (PSS)](../integrations/payment-systems#payment-system-service-pss) in the Back Office are now available in the app. This completes support for both **deposit methods**, which were previously integrated, and **withdrawal methods** connected through PSS. * **Bonuses now available in the app** Clients can now access and manage bonuses directly in the app, including deposit bonuses. Bonuses are supported on **MT4/5** and **cTrader**. Bonuses are added as **credit funds** to clients’ trading accounts, increasing trading capital and margin. Once the bonus requirements are met, the bonus amount is converted into real funds and becomes withdrawable; otherwise, it expires.
Bonus programs Subscribe to a bonus program Active bonus programs
* **Refreshed UI for trading accounts** The **Trading** section has been updated for a more intuitive and seamless experience, enabling clients to: * Open trading accounts effortlessly. * Top up accounts in fewer steps. * Navigate to trading smoothly.
Trading accounts Trading account details
* **Feedback form** Clients can now quickly rate their experience as positive or negative within the app, with the option to provide a more detailed comment. The feedback form appears automatically after several app launches or financial operations and can also be accessed anytime from the **Profile** menu. The feedback data can be tracked via analytics tools.
Feedback form Share feedback from Profile
* Fixes and improvements to ensure stable performance and reliability. *** ### July, 2025 [#july-2025] **v1.29.1 (iOS)** This version includes bug fixes and performance improvements for a better app experience. *** ### June, 2025 [#june-2025] **v1.29 (iOS)** This version includes: * **Deposits methods configured via PSS now supported in the app** Deposit methods configured in the Back Office through the [Payment System Service (PSS)](../integrations/payment-systems#payment-system-service-pss) are now accessible to users directly within the app. Please note, withdrawal methods via PSS aren’t yet supported in the app. * **Multi-language support** (Beta) The app now supports 16 new interface languages, including **Arabic**, **Polish**, **German**, **Russian**, **Persian**, **Chinese**, **French**, **Thai**, **Italian**, **Indonesian**, **Hindi**, **Vietnamese**, **Portuguese**, **Czech**, **Japanese**, and **Korean**. Languages can be switched directly in the app in **Profile** > **Languages**. All languages are currently in Beta, and translation improvements will continue in future updates.
Profile > Languages Language list
* **Redesigned Wallets** The **Wallets** interface has been updated with a cleaner, more modern design, featuring: * Refreshed wallet card design * Display of the portfolio’s **Estimated Total** * Quick access to depositing funds and other financial operations * Enhanced wallet details, including total and available balances, recent transactions, and clearly highlighted action buttons.
Wallet list Hide balances Wallet details
* **Enhanced deposit experience** A redesigned flow makes it easier and faster for users to complete deposits.
Enhanced deposits Deposit form
* **Support for favorite cTrader accounts** Users can now mark cTrader accounts as favorites. Once marked, these accounts appear in the **Favorite Trading Accounts** widget, providing quick and easy access to trading directly from the **Home** screen. Favorite cTrader accounts * **Support for custom tiles in Services** Custom tiles can now be added to the **Services** section to link users to third-party services or external resources that support your brokerage business. Configuration must be set in the **Back Office**, where the tile name and redirect URL must be specified. Once configured, custom tiles will appear in the app under **Services**. In the Back Office, the option to configure custom menu links will become available with the [June 2025 release](release-notes#july-2-2025). * **Streamlined account creation with the Go to Deposit option** The account creation process has been streamlined to clearly indicate when a minimum deposit is required. If funds are insufficient for opening a new trading account, users will see the required amount along with the **Go to Deposit** button, encouraging quick funding and faster trading. Go to Deposit * Optimized overall app performance to provide a faster, more stable, and responsive user experience. *** ### March, 2025 [#march-2025] **v1.28 (iOS)** This version includes: **Improved sign-up and onboarding experience** The sign-up and onboarding processes in the app for new clients have been improved: * **Quick app overview**: before accessing the **Sign Up** and **Sign In** forms, clients now see a brief app overview showcasing key features through several screens. This enhancement aims to increase registration conversion and attract more potential clients.
Make flexible deposits All wallets in one place All account operations Track every wallet easily
* **Revamped design**: the **Sign Up** and **Sign In** forms have been redesigned for a better user experience.
Sign In Sign Un
* **Enhanced security**: during sign-up, setting a passcode is now required. Once set, it can’t be disabled. Enabling Face ID remains optional. If a client hasn’t previously set up a passcode or enabled Face ID, these steps will now be included during sign-in.
Set a passcode Enable Face ID
* **Verification**: a prompt to complete verification has been added to the onboarding process, encouraging clients to verify their identity, make their first deposit, and start trading faster. Complete verification **One-click access to trading** Clients can now access the MT4, MT5, and cTrader trading terminals by tapping **Trade** from their accounts in the app, making trading more convenient. To enable this feature, specify the **Web Terminal URL** in the platform details upon navigating to **Products** > **Platforms** in the B2CORE Back Office (for details, refer to [How to enable one-click trading access from the B2CORE UI and mobile app](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals)). Trade button on account cards *** ### December, 2024 [#december-2024] **v1.27 (iOS)** This version includes: * **Enhanced security with passcodes** Setting a passcode is now available during sign-up or sign-in to ensure improved app security. * **Optional biometric authentication** Biometric options, such as Face ID or Touch ID, have been introduced as an additional layer of security for quick and secure access. * **Support for analytics in Amplitude** The Amplitude platform is now supported for the app, enabling you to get analytics about your clients’ actions within the app. Please contact your account manager for assistance in setting up and getting Amplitude analytics. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ### v1.26 (iOS) [#v126-ios] * This version brings internal enhancements and behind-the-scenes fixes to boost app performance and improve the user experience. *** ### v1.25 (iOS) [#v125-ios] This version includes: * **Redesigned Deposit section** The **Deposit** section, accessible via **Services** > **Finance**, has been redesigned for a smoother deposit experience. You can now easily select a wallet and deposit currency, and then choose one of the supported payment methods. Once selected, you’ll receive the deposit address or have the option to enter bank details to finalize your transaction. Additionally, before making a deposit, you can check current rates and calculate estimated amounts based on those rates in the **Indicative amounts** section. * The app performance has been enhanced for a faster and more seamless experience. *** ### v1.24 (iOS) [#v124-ios] This version includes: * **App Services** We are pleased to introduce the new app services feature, making it easier for you to locate supported services, such as Trading, Finances, HelpDesk, IB, and others, and see what will be available soon. The feature enables you to: * access services directly from the Home screen * search for the service you need * tap a service tile to quickly navigate to the desired service. * **Integration with Zendesk** The Zendesk customer support platform has been integrated, offering ticketing, live chat, and AI tools. Tap the HelpDesk button to navigate to the Zendesk interface from the app, without any additional authorization. * **Enhanced IB Room** The enhancements to the IB Room include detailed information about clients and rewards, enabling you to: * view a list of Direct IB and Sub-IB clients registered using your referral links. For each client, you can view the details about their total traded volumes and reward amounts you received. * view a list of rewards paid to your wallet and navigate to reward details. * **Password validation** When setting new passwords, they are now validated to comply with security standards, ensuring they meet the required length and include the necessary character requirements. * Bug fixes and improvements for a more refined and user-friendly interaction. *** ### v1.23 (iOS) [#v123-ios] This version includes: * **Integration with B2TRADER Brokerage Platform** With this release, we are thrilled to announce integration with B2TRADER Brokerage Platform, offering you a comprehensive trading experience: * Single sign-on: sign in to the app and navigate to the BBP platform without additional authorization. * Account list with detailed balances: keep your funds under control with a comprehensive view of account balances. Create and rename accounts to keep your funds well organized. * Asset balances screen: view asset details, including the amounts of free and frozen funds, with the option to hide assets with zero balances. * Order book and Price chart: monitor trading data and make buy and sell decisions, with quick access to the order placing screen. * Candlestick and Line charts: switch between chart types and scroll through historical values. * Limit & Market orders: place Limit and Market orders using all the supported time in force settings (Market: IOC, FOK; Limit: IOC, FOK, GTC, GTD, Day). * Order lists: access open and historical order lists, providing easy navigation to order parameters and details, and options for quick canceling or repeating an order. * **Redesigned Dashboard** The redesigned Dashboard offers the following enhancements: * **New widgets**: use new widgets, such as Total Balance, Last Transactions, Favorite Trading Accounts (now displaying only MT4 and MT5 accounts added to favorites), and IB Program. * **Organize the Dashboard**: easily organize your Dashboard by dragging and dropping widgets according to your preferences. * **Support for banners**: banners can now be displayed on the Dashboard. * **Profile info**: you can now view your profile name and picture at the top of the Dashboard. * **Quick navigation to HelpDesk**: tap the button in the topbar for quick access to the HelpDesk, if supported. * **Apple store info**: you can now review what’s new in the latest app version before downloading it. * Bug fixes and improvements to offer a smoother and more streamlined user experience. *** ### v1.22 (iOS) [#v122-ios] This version includes: * **Integration with CentroID** Support for CentroID has been added, providing connectivity to various trading platforms and liquidity sources. Now you can add your CentroID margin accounts, and make transactions on the accounts. * **Introducing Brokers (IB)** The IB Room option has become available in the Profile menu. Use it to register as a partner in referral programs and create your unique referral links. Attract new traders, earn rewards based on the trading activities of your newly referred clients, and track program performance using the IB Room Dashboard. * Bug fixes and improvements to ensure a more seamless and efficient user experience.
### December, 2025 [#december-2025-1] **v2.9.0 (Android)** This version includes: * **Multi-lingual support for the app via B2TRANSLATE** The app now supports localization in **14 languages** via [B2TRANSLATE](https://docs.b2translate.b2broker.com/). The key benefits include: * Offering the same language options on the app as in the B2CORE UI. * Customizing translations for each of the supported languages via B2TRANSLATE. * Maintain translations for both the app and the B2CORE UI using a single tool: B2TRANSLATE. * Improving scalability and client satisfaction by removing language barriers. The integration is already in place, but translations for the supported languages need to be added to B2TRANSLATE. Full localization will become available once this process is completed. * **Streamlined Total balance calculation** The total balance shown on the app **Dashboard** now reflects the combined balances of all wallets and trading accounts and fully matches the total displayed in the B2CORE Web. * **Rejection reasons in transaction details** For transactions rejected by admins, the rejection reason is now clearly displayed in the transaction details. Rejection reason * **Support for copy trading, PAMM, and MAM** Copy trading, PAMM, and MAM functionality from **B2COPY** is now supported in the app via a web view. This enables clients to access these services directly from the app, through the **Services** section. * **Static payment details for deposits via B2BINPAY V3 and Coinsbuy V3** The app now supports **static payment details** for deposits via **B2BINPAY** and **Coinsbuy** when connected through **API V3**. With static payment details, clients can generate one or more blockchain-specific deposit addresses directly in the app. These addresses are saved for future use and can be reused for subsequent deposits. In addition, the crypto deposit flow via **B2BINPAY V3** and **Coinsbuy V3** has been improved with clear **fee breakdowns** and **indicative amount** displays, providing better transparency and a smoother deposit experience. * **Full B2TRANSLATE integration for payment forms** Payment forms in the app are now fully integrated with [B2TRANSLATE](https://docs.b2translate.b2broker.com/) (formerly Weblate). Labels for all components of dynamic forms for PSS-connected deposit and withdrawal methods, as well as validation error messages, can now be customized and translated into multiple languages via B2TRANSLATE. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ### September, 2025 [#september-2025-1] **v2.8.0 (Android)** This version includes: * **Google Play app deployment** It’s now possible to deploy and publish your app on **Google Play**, making it easy for clients to download, install, and receive future updates directly from the store. * **PSS deposit & withdrawal methods now in the app** Withdrawal methods configured via the [Payment System Service (PSS)](../integrations/payment-systems#payment-system-service-pss) in the Back Office are now available in the app. This completes support for both **deposit methods**, which were previously integrated, and **withdrawal methods** connected through PSS.
Ar Ch
* **Full Profile information** The **Profile** > **Profile** info section in the app now fully aligns with the B2CORE UI, with added fields for **Name**, **Email**, **Date of Birth**, **Country**, **Phone**, **Client ID**, and **Nickname**. Sensitive data is masked by default with reveal-on-click, while **Nickname** can be updated directly in the app. Profile Info * **Device management for enhanced security** In **Profile** > **Security**, a new **Device management** section has been added. It displays log data about devices, IP addresses, and locations used to sign in to their profiles, and allows clients to terminate their current active session directly from the app. This gives clients better control over sessions and helps protect against unauthorized access.
Device management Device details Terminate session
* **Streamlined 2FA setup with Google Authenticator** The process of enabling 2FA via the **Google Authenticator** app has been simplified, with fewer steps and a more intuitive flow. 2FA setup * Fixes and improvements to ensure stable performance and reliability. *** ### August, 2025 [#august-2025] **v2.7.0 (Android)** This version includes: * **Feedback form** Users can now share their experience directly in the app. The feedback form automatically appears after several app launches or whenever a financial operation is performed, allowing a quick positive or negative rating with an optional comment. Feedback can also be submitted anytime from the **Profile** menu.
Feedback form Feedback after a withdrawal
* **UI improvements** The app’s appearance has been enhanced for a visually cleaner and more polished experience, with refreshed sections and improved widget layouts: * More rounded design of UI elements * Refreshed **Total Balance** and **IB** sections * Improved layouts for **Last Transactions** and **Wallets** widgets. Dashboard * Improved performance and stability for a faster, more reliable experience. *** ### June, 2025 [#june-2025-1] **v2.6.0 (Android)** This version includes: * **Deposits methods configured via PSS now supported in the app** Deposit methods configured in the Back Office through the [Payment System Service (PSS)](../integrations/payment-systems#payment-system-service-pss) are now accessible to users directly within the app. Please note, withdrawal methods via PSS aren’t yet supported in the app. * **Bonuses now available in the app** Users can now view and subscribe to bonus programs on **MT4/5** and **cTrader** directly in the app. If a user doesn’t have a suitable trading account, the required account can be created during the subscription process. Once the program requirements are met, the bonus amount is credited to the user’s balance and becomes available for withdrawal.
Bonus programs Active bonus programs Subscribe to a bonus program
* **Services: All key features in one place** A new **Services** section has been added to the app, providing users with centralized access to all available services and features. Each service is represented as a tile that redirects to its respective menu. Tiles can be easily rearranged using drag and drop. Services * **Support for custom tiles in Services** Custom tiles can be added to the **Services** section to link users to third-party services or external resources that support your business. Configuration must be done in the **Back Office**, where the tile name and redirect URL must be specified. Once configured, custom tiles will appear in the app under **Services**. In the Back Office, the option to configure custom menu links will become available with the [June 2025 release](release-notes#july-2-2025). * **In-app verification via SumSub** The full verification process via **SumSub** is now supported directly within the app, no external redirections are required. This streamlined experience makes the KYC journey faster, and more intuitive during onboarding. * **Blockchain explorer link for withdrawal tracking** Users can now easily track **withdrawal transactions** on the blockchain directly from the app. Crypto wallets include a link to `https://www.blockchain.com/explorer`, available only for withdrawals in Bitcoin, Ethereum, and Bitcoin Cash. This simplifies transaction monitoring and enhances transparency. Blockchain explorer link * Optimized overall app performance to provide a faster, more stable, and responsive user experience. *** ### May, 2025 [#may-2025] **v2.5.0 (Android)** This version includes: Performance improvements and bug fixes to enhance the overall user experience. *** ### April, 2025 [#april-2025] **v2.4.0 (Android)** This version includes: **Revamped sign-up and onboarding process** * **App preview**: before going to the **Sign Up** or **Sign In** forms, clients are now presented with a brief walkthrough highlighting the app’s main features across several screens. It enhances the user journey from the start, encouraging quicker sign-ups.
Make flexible deposits All wallets in one place All account operations Track every wallet easily
* **Improved design**: the **Sign Up** and **Sign In** forms have been redesigned to offer a smoother and more intuitive user experience.
Sign In Sign Up
* **Enhanced security**: for quicker and more secure access to the app, clients are now prompted to enable biometric authentication using their fingerprint during onboarding. If a client hasn’t previously set up fingerprint authentication, this step will be included during sign-in. Once enabled, fingerprints can also be used to confirm payments within the app. Clients can manage this feature anytime in **Profile** > **Settings**.
Enable fingerprint authentication Use fingerprint to confirm payments
* **Verification**: an additional **verification step** is now included in the onboarding process, encouraging clients to complete KYC immediately after sign-up. This enhancement streamlines the process, enabling clients to access full functionality, make their first deposit, and start trading faster. Complete verification * The app has been optimized to deliver a faster, more stable, and responsive experience. *** ### March, 2025 [#march-2025-1] **v2.3.0 (Android)** This version includes: * **Internal transfers** The app now supports internal transfers, enabling clients to transfer funds to other clients within the same brokerage by specifying the **Client ID** and **Account ID** of the recipient. The funds are transferred instantly and without commission. Internal transfers in the app * **Enhanced security with withdrawal address whitelisting** Secure your withdrawals by enabling the **Withdraw Whitelist** option in the **Security** section and adding trusted withdrawal addresses. Once enabled, funds can only be withdrawn to the specified addresses, preventing unauthorized transactions. Withdrawal whitelists in the app * **One-click access to trading** Clients can now access the MT4, MT5, and cTrader trading terminals by tapping **Trade** from their accounts in the app, making trading more convenient. To enable this feature, specify the **Web Terminal URL** in the platform details upon navigating to **Products** > **Platforms** in the B2CORE Back Office (for details, refer to [How to enable one-click trading access from the B2CORE UI and mobile app](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals)). Trade button on account cards *** ### December, 2024 [#december-2024-1] **v2.2.0 (Android)** This version includes: * **Introducing Brokers (IB)** The IB functionality is now supported in the app, making it easier to manage your referral activities. With this update, you can: * **Explore and join IB programs**: view all available IB programs and join new ones using the **IB Program** widget on the **Home** screen. * **IB clients**: view a list of your referred clients, organized across different levels. * **Track IB rewards**: monitor your earned rewards and view payment details. Additionally, you can track your IB wallet balance and make withdrawals directly from the app. * **Customize IB referral links**: configure referral link parameters for each program in the **Advanced Link** section to optimize your referral strategy. * **Enhancements to trading accounts** More options for MT4/5 and cTrader accounts are now available in the app, including: * **Essential account parameters**: view such parameters as Balance, Equity, Free Funds, Credit, and Leverage directly in the account details. * **Equity chart**: analyze account performance with the Equity chart, now available for daily, weekly, and monthly periods. * **Expanded trading data**: access more detailed trading data with the **Pending orders**, **Open positions**, and **Trading history** tabs. * The ability to archive trading accounts. * The ability to rename accounts for better organization. * Bug fixes and interface improvements to deliver a more seamless and user-friendly experience. *** ### November, 2024 [#november-2024] **v2.1.0 (Android)** This version includes: * **Support for exchanges** Exchanges are now accessible in the **Finance** section, enabling you to convert between different currencies, including fiat to crypto, and vice versa. When making exchanges, you can view real-time rates and refresh them as needed to stay up-to-date with the latest rates for your transactions. * **Integration with Zendesk** With the integration of Zendesk customer support, you can now easily create, submit, and track your support tickets directly from the **Profile menu** in the app. To use Zendesk in the app, the Zendesk configuration must be set up in the Back Office. This includes establishing an external connection to Zendesk and following the steps to [switch from SupportPal](../how-to-articles/manage-system-settings/how-to-switch-from-supportpal-to-zendesk) if it was previously used. * **Favourite wallets** You can now add wallets to your favorites in the app, making it easier to organize and access them quickly. * **More options for trading accounts** The options to rename your trading accounts and archive them are now available in the account details, giving you more flexibility in managing your accounts. * Bug fixes and performance enhancements have been implemented to deliver a smoother and more responsive user experience. *** ### October, 2024 [#october-2024] **v2.0.0 (Android)** This version includes: * **Support for MT4/5 and cTrader accounts** You can now open demo and live MT4/5 and cTrader accounts in the app, deposit and withdraw funds to/from your accounts, and monitor account trading parameters, such as balance, equity, credit, and free margin in real time. * **Transaction History section added** View your full deposit, withdrawal, and transfer history, along with detailed information for each transaction, in the new Transaction History section. * **Password change for profile security** Providing a convenient way to keep your profile secure, the Security section now includes an option to change your profile password. * **Sign in to the B2CORE UI with QR codes** You can now use the app where you’re already signed in to scan QR codes on the B2CORE UI **Sign In** page, allowing access without the need to enter your credentials. *** ### September, 2024 [#september-2024] **v1.0.0 (Android)** We're excited to announce the release of the B2CORE app for Android, which you can launch as your own branded app. This allows you to offer your clients an additional platform to access the B2CORE functionality. **App download** Currently, Android apps are available for download and installation via APK files. To make the APK available for download from your B2CORE UI, refer to [How to configure settings for mobile app downloads](../how-to-articles/manage-system-settings/how-to-configure-settings-for-mobile-app-downloads). This version includes: * **Registration** Registration through the app is available by clicking the Sign Up option on the Start screen. * **Dashboard** The Dashboard appears after signing in to the app, displaying the Total Balance, Last Transactions, and Wallets widgets, with banners at the top. * **Profile menu** Accessible by tapping the top left corner of the screen, the Profile menu enables you to: * upload profile photos * view your current verification levels and complete KYC verification to reach higher levels * access security settings, such as 2FA via Google Authenticator or SMS, anti-phishing codes, and more * displays the app version and a list of custom links to additional resources. * **Wallets** Displays a list of your wallets, grouped into crypto and fiat categories. At the top, the estimated total across all wallets, converted to USD, is shown. From this section, you can deposit, withdraw, and transfer funds. By tapping a wallet, you can view detailed information, including the available balance, amount on hold, and transaction history. * **Finance** This section is intended for deposits, withdrawals, and transfers. Recent transactions are displayed under each transaction type, allowing you to quickly initiate new ones with pre-filled fields based on previous transactions. * **Trading** This section supports the B2TRADER Spot Brokerage Platform, providing access to its extensive trading features and functionalities.
## August 31, 2026 [#august-31-2026] ### New features [#new-features] #### Client labels [#client-labels] B2CORE now supports **client labels** – short colored markers on client records that make it easy to spot and filter groups of clients in the Back Office. System labels are assigned automatically and kept up to date by B2CORE: the **Deposited** label marks clients who have made at least one successful deposit, and separate labels mark Introducing Broker partners and their clients. In addition, brokers can create their own custom labels and assign them to clients manually, one by one or in bulk. Labels are shown in the clients table view and on the client card, included in the clients export, and can be used as **Has all of labels** and **Has none of labels** filters. Labels are visible to back-office users only – clients never see them. For details, refer to [Client labels](../back-office-guide/system/client-labels). #### Country blocklist [#country-blocklist] Brokers can now block access to the B2CORE UI by country. The visitor's country is detected from their IP address, and if it's on the blocklist, the B2CORE UI isn't available to them at all: instead of the sign-in or registration form, they see a full-screen **Access blocked** page. Unlike the countries blacklist of a registration profile, which only hides countries from a registration form, the country blocklist prevents access to the platform entirely, helping brokers stay within their licensed markets. #### System rate provider [#system-rate-provider] B2CORE now includes a built-in **System** rate provider backed by the B2Broker rates service. Brokers no longer need to set up and maintain a connection to an external provider such as B2BINPAY, Fixer, or CoinGecko just to receive exchange rates: the System provider requires no credentials and works out of the box. ### B2CORE UI updates [#b2core-ui-updates] * On the crypto **withdrawal** form, the amount limits now match the selected **blockchain network** instead of showing a single limit for the whole currency. * A **wallet card** is now displayed even when no exchange rate is available for its currency, so clients always see the wallet and its balance. * In the legacy bank deposit details, copying a single requisite now copies **only its value**, without the label, so the copied data can be pasted straight into a banking app. ### Payment system updates [#payment-system-updates] * **XTC Pay** is now integrated via **PSS**, with support for both deposits and withdrawals. * For **Ozow**, a **Verified ID flow** option has been added to the deposit method configuration. When it's enabled, the client's verified document number – collected on the registration form as a custom field – is shown on the deposit form as a read-only value and passed to Ozow together with the payment, so the provider can match the payment to the verified identity of the payer. The option is disabled by default, and deposits aren't started if the document number is missing from the client's profile. * For **BridgerPay**, a **Hide CVV field** option has been added to card withdrawals, for setups where the provider doesn't require a CVV. * For **Skrill**, deposits and withdrawals in **ZAR** are now supported. * For **KoraPay**, mobile money withdrawals now support **EGP** and **Egypt**. ### Improvements [#improvements] * **Menu entries** in the B2CORE UI can now be restricted in more ways. In addition to the verification level and the client type, a menu entry can be shown or hidden based on the client's **IB parent** or **country and jurisdiction**, using the same restrictions mechanism as products. Existing restrictions are migrated automatically and keep their current behavior. * CPA payment plans for Introducing Brokers now support **Trading Activity** as a standalone condition, so a reward can be based purely on trading volume without a mandatory deposit condition. At least one trading criterion still has to be set. * In **Mailing** > **System** > **Queue**, emails whose delivery failed can now be sent again manually with a new **requeue** action. This helps when B2CORE has stopped retrying automatically because of an error on the side of the mailing provider. * An **Archived** filter has been added to the accounts table view and to its export, making it easier to separate active accounts from archived ones. Accounts that belong to a removed trading platform can now be shown as well, instead of disappearing from the list. * For Introducing Brokers, the **Client Deposits** and **Client Withdrawals** table views now show the client's name and email instead of only the client ID. In addition, hedged trades no longer generate a reward for the leg that was closed with zero profit – this behavior can be enabled for a broker on request. * For **Intercom**, brokers can now choose whether the client's **ID** or **email** is used as the Intercom user identifier, and add a **prefix** to it. The prefix prevents identifier collisions when one Intercom workspace is shared between several systems. * Three more transactional emails – the **trading account archive request**, the **client verification request**, and the **client transfer request** – have been migrated to the new email template engine. * Client requests now store the **IP address** the request was sent from and show the country detected for that address next to it, giving back-office users more context when reviewing a request. * The Back Office API now supports adding and deleting client **phone numbers**, and the IB version page additionally reports the versions of the IB microservices. * Performance has been improved across the B2CORE UI: the menu is now cached, and accounts, deposit and payout methods, widgets, banners, product currencies, and profile data all load faster. On the B2COPY side, outbox processing has been optimized and outdated records are now pruned automatically. ### Resolved issues [#resolved-issues] * In the IB Room, switching quickly between reports no longer leaves the filters of the previously opened report applied. * On the **Performance overview** widget, the KPI tiles and the chart now update together after a filter change, instead of the widget appearing to hang. * **IB type** selectors in the Back Office are no longer capped at 1000 groups. They now search on the server side, so all IB types can be found regardless of how many a broker has. * Renaming a **platform group** in the IB module no longer fails with a uniqueness error caused by previously deleted groups. * IB reward amounts are now calculated with the trade's commission and a single swap value. Previously, the swap was counted twice and the commission was ignored. * IB rewards are no longer skipped for archived or deleted trading accounts. Whether a reward is paid now depends only on the account's **Disabled** state. ## July 31, 2026 [#july-31-2026] ### New features [#new-features-1] #### Client custom fields [#client-custom-fields] Brokers can now define their own **custom fields** for client records in the Back Office, without developer involvement. Fields of different types – text, email, phone, number, date, dropdown, and multi-select – can be created, organized into groups, and translated, so each broker can capture exactly the client data their processes require. A new **Custom fields** tab on the client card lets back-office users view and edit the stored values for a specific client. For details, refer to [Custom fields](../back-office-guide/system/custom-fields) and the [Custom fields tab](../back-office-guide/clients/general/custom-fields-tab). #### New registration settings [#new-registration-settings] The new **registration settings** in **System** > **Registration** are now available and replace the legacy Registration wizards. Registration profiles are configured directly in the Back Office – fields, registration options, terms and conditions, and custom fields – making the registration process both easier to set up for brokers and easier for clients to complete. Together with custom fields, a profile can cover anything from a single-page form with an email address and a password to a multi-step onboarding flow. All brokers will be migrated from Registration wizards to registration profiles over the coming releases. If you use the B2CORE mobile apps, keep the existing Registration wizards enabled for now: clients on older app versions still rely on them. For details, refer to [How to migrate to the new registration settings](../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings) and [Registration](../back-office-guide/system/registration). #### Savings rebates for Introducing Brokers [#savings-rebates-for-introducing-brokers] A new **Savings** rebate program type is now available for Introducing Brokers, alongside CPA. Instead of rewarding trading activity, it pays partners when their clients invest in savings programs, with multi-level rewards distributed along the IB chain and payouts processed automatically on a daily basis. A Savings program is linked to a partner program in the Back Office in the same way as a CPA program, and partners can follow their savings rebates in the IB Room through a dedicated widget and report. #### Deposit tiers and trading conditions for CPA programs [#deposit-tiers-and-trading-conditions-for-cpa-programs] CPA programs now support more precise reward rules. The minimum-deposit condition can be split into **tiers**, and a new **Deposit Measure** option defines which amount is checked against them – **Gross** (the sum of all client deposits, as before) or **FTD** (the first deposit only). In addition, an optional **trading gate** can be required before a deposit reward is paid: a number of trades, a minimum position lifetime, a lot volume per instrument group, or a notional volume, with the option to exclude hedged positions. Existing programs keep their current behavior – Gross without a gate – until a broker opts in. #### New IB Room widgets and reports [#new-ib-room-widgets-and-reports] The IB Room dashboard has been extended with new widgets and reports that give partners a clearer view of their client base and rewards: * **NET Deposit Summary** – total deposits, withdrawals, and net deposits for the selected period, with the change against the previous period. * **NET Deposit Top Clients** – the partner's top clients by net deposit, with a click-through to the full **NET deposits** report. * **Performance overview** and **Top clients** – key partner performance metrics and the most valuable clients, available as a widget and a report. * **Transactions** and **Rewards by symbol** – both are now part of the default IB Room dashboard layout. The corresponding Back-Office API and IB API endpoints power these widgets, so the same data is available to integrators. #### Status checks in the Back Office [#status-checks-in-the-back-office] B2CORE now runs automated **status checks** of a broker's setup on a schedule and reports the results in the Back Office. The checks cover trading platform connectivity for live and demo platforms, visual customization, and registration availability. When a check fails, a warning indicator appears in the top bar next to the client requests icon, and a dedicated status page shows the history of each check as a timeline, making it easier to notice and investigate configuration or connectivity problems early. #### New PS integrations [#new-ps-integrations] **Skrill** (part of Paysafe) is now integrated via **PSS**, with support for both deposits and withdrawals. The new PSS-based connection supersedes the legacy Skrill integration. ### B2CORE UI updates [#b2core-ui-updates-1] * The broker's **logo** can now be displayed on the loading screen of the B2CORE UI instead of a generic loading bar, keeping the experience branded from the very first screen. The option is disabled by default. * Long menu item labels are now wrapped onto **multiple lines** instead of being cut off, so translated or descriptive menu names remain fully readable. * The **passkeys** prompt shown to clients after login can now be disabled for brokers who prefer not to promote passwordless sign-in yet. * The simplified registration flow **ID is now included in the URL**, making it possible to share a direct link to a specific registration flow. * On the verification step, the **Next** button now shows a loading indicator while the request is being processed, and a snackbar explains the reason when the submitted data can't be processed. ### Payment system updates [#payment-system-updates-1] * For **UniPayment**, deposits in **INR** are now supported. * For **PayRetailers**, withdrawals now support **Nigeria**, and multiple currencies can be configured per country. * For **BridgerPay**, configurable validation rules have been added for the first and last name fields, reducing payouts rejected by the provider because of an unsupported name format. * For **B2BINPAY** and **Coinsbuy**, the withdrawal form has been simplified – form field group names are no longer displayed above the fields. * For crypto deposits, a custom **blockchain label** is now supported on client deposit wallets and shown in the Back Office, making it clearer which network an address belongs to. * Following the currency rebranding, **TON** is now displayed as **GRAM** across B2CORE. ### Improvements [#improvements-1] * Client **profile change requests** are now processed without resetting the client's KYC verification. Clients who update their profile data keep their verification level and completed verification steps instead of having to pass KYC again. * Client **marketing data** has been extended: the remaining marketing fields have been added to the client record, and click identifiers from advertising platforms – **Google Ads**, **Cointraffic**, **Bitmedia**, and **Impact.com** – are now captured, so brokers can attribute conversions to the campaigns that generated them. * For **Adjust**, registration, KYC, and deposit events are now sent server-to-server via the Adjust S2S API, making conversion tracking independent of the client's device and browser. * For **RudderStack**, backend events now also include the client's **email**, **phone**, and the **payment method** used, allowing for more precise segmentation and campaign analysis. * A **countries blacklist** has been added to the simplified registration configuration. Blacklisted countries are hidden from all country selectors in the registration flow, helping brokers stay within their licensed markets. * In **Clients** > **Requests**, a **Method** filter has been added to the table view and the export, and the **Method** column is now shown for requests in all statuses, not only for processed ones. * Client **tags** are now included in the deposits export, and a **Date** column with the creation time has been added to the client withdrawal wallets table view. * Errors returned when a trading account can't be created no longer expose internal trading platform details, such as the platform group name. * Two more transactional emails – the **admin 2FA confirmation code** and the **admin access granted** notification – have been migrated to the new email template engine, and the generated password in the admin credentials email is now easier to copy. Some new email templates can also be disabled if a broker prefers not to send them. * Performance has been improved in several areas: the export of IB types (groups) now runs through the asynchronous export pipeline, balance cache warm-up has been centralized and removed from exports and reports, which noticeably speeds up **Finance** reports, and bulk actions no longer run out of memory on large CSV files. * For Introducing Brokers, the platform data stream has been hardened: fewer disconnects, no skipped deals, and lower latency between the trading platform and the IB module. When a new platform is added to the IB module, the initial synchronization of cached entities now starts automatically instead of having to be triggered manually. * In the IB API, the symbols endpoints now return the **payment plan** associated with each symbol and can be filtered by plan, so the plan for a symbol can be retrieved in a single call. * A self-XSS warning is now shown in the browser console of production builds, discouraging clients from pasting code they received from third parties. ### Resolved issues [#resolved-issues-1] * For **SumSub**, a duplicate applicant no longer interrupts the processing of a verification result. Verification decisions are now applied to the correct client instead of being lost. * Bulk action jobs no longer get stuck in the **New** status when processing large CSV files. * An email template can no longer be configured to extend itself, which previously could exhaust the available memory and break the client accounts endpoint. * On the **Transfers** page, the **To** account is now reset when its currency no longer matches the selected **From** account, preventing invalid transfer combinations. * Withdrawals: the idempotency key is now regenerated after a failed attempt, so a corrected request is no longer rejected as a duplicate. * The client menu is now rebuilt immediately after a change of the verification level, without requiring a manual page refresh. * For **PayRetailers** deposits, the payment method selector now shows only the method configured for the deposit method instead of all available ones. * The default date range on the IB Room dashboard is now normalized to day boundaries, so reports and widgets no longer load a partial current day. * Currencies whose blockchains are disabled are no longer offered in the deposit and withdrawal method selectors. * Payment plans can be created and edited again from symbol pages after the granular permissions split. ## June 30, 2026 [#june-30-2026] ### New features [#new-features-2] #### Per-blockchain crypto deposit and withdrawal commissions [#per-blockchain-crypto-deposit-and-withdrawal-commissions] For **B2BINPAY** and **Coinsbuy**, brokers can now configure limits and commissions separately for each blockchain network (for example, ERC-20 vs. TRC-20 for USDT) instead of one flat rate per currency. Clients choose their network and see the exact fee and the expected credited or payout amount before confirming, giving brokers accurate pricing of network costs and clients full fee transparency up front. #### CPA programs for Introducing Brokers [#cpa-programs-for-introducing-brokers] B2CORE now supports **CPA (Cost-Per-Acquisition)** programs and payment plans for Introducing Brokers, letting brokers set up flexible, rules-based partner compensation instead of a one-size-fits-all model. A CPA program is now bound directly to a partner program, so partners are rewarded automatically the moment they join a program with CPA attached – removing manual per-referral-link setup and reducing configuration errors. New API endpoints power the CPA widget and reports for partners. #### B2TRADER web terminal access [#b2trader-web-terminal-access] Brokers can now configure a **web terminal URL** for the B2TRADER platform, just as they already can for other platforms, giving clients one-click access to the trading terminal directly from the client portal. #### IB Trades reconcile process [#ib-trades-reconcile-process] A lighter-weight **reconcile** option has been added to the trade-sync process. It re-sends only the trades that failed to deliver instead of resyncing everything, giving brokers a faster, safer way to close data gaps after an outage without the impact of a full resync. ### B2CORE UI updates [#b2core-ui-updates-2] * During sign-up, the **country** field is now pre-filled automatically based on the visitor's detected location, reducing manual entry for new clients. * The client portal now detects the interface **language from the browser**, so new visitors see the portal in a familiar language from the start. * The simplified registration form is now split into **multiple pages**, making longer sign-up flows easier to complete. * A **"Coming soon"** screen can now be shown for features that are not yet available in a broker's setup. ### Payment system updates [#payment-system-updates-2] * **Volet** is now available to all brokers by default. * For **B2BINPAY** and **Coinsbuy**, deposit address destinations are now supported and a custom **blockchain label** can be shown in the payment details, making crypto deposits clearer for clients. * For **Flutterwave**, brokers can now choose whether the settled amount or the charged amount is used for a transaction via a new configuration option. * A **test connection** action has been added for the CoinsBuy V3 rate provider, so brokers can verify the integration directly from the Back Office. ### Improvements [#improvements-2] * **IB restrictions** are now applied to deposit and payout methods, so partners and their clients only see the payment options available to them. * The **Back Office dashboard** now supports filtering, including by client type, jurisdiction, and country, making it easier to focus on a specific segment. * Navigation between methods and operations grids in the payment configuration has been improved for faster back-office work. * Payment system configuration now shows a **fingerprint and masked preview** of secret fields, so operators can confirm which credential is stored without exposing it. * A client's **jurisdiction** set manually is now locked from automatic country-based mapping, with a clear indicator and an easy way to release it. * The precision of **FIAT currencies** can no longer be edited, preventing accidental misconfiguration. * Changing a client's **email** now propagates the update to B2TRADER, keeping platform records in sync. * For **cTrader**, product currencies are now filtered by the cBroker's deposit assets, so only relevant currencies are offered. * New Back Office API endpoints let integrators write client **marketing data**, and a new `/api/v2/countries` endpoint returns the country list. * Performance has been improved across data exports, the deposits and payouts lists, the clients API, IB payment tables, and large CSV imports, making these operations faster and more reliable at scale. ### Deprecated functionality [#deprecated-functionality] * The legacy **Volet** and **BFT365** payment provider integrations have been removed. They are superseded by the new PSS-based connections. ### Resolved issues [#resolved-issues-2] * Saving a corporate client's profile no longer overwrites a manually set jurisdiction via automatic country mapping, preventing clients from being placed under the wrong regulatory entity. * Decimal commission values are now accepted on the transaction update endpoint. * For Introducing Brokers, B2TRADER transactions now fall back to the account currency when needed, and per-account trading volume and rewards are correctly scoped to the viewing partner. * IB report and account filters now accept alphanumeric IDs. * The IB payment export preview table is now horizontally scrollable, so wide exports are easier to review. ## May 31, 2026 [#may-31-2026] ### New features [#new-features-3] #### Built-in brand-new identity provider [#built-in-brand-new-identity-provider] B2CORE now ships with its own built-in identity provider. Brokers can let clients sign up and log in with **Apple**, **Google**, or any other **OIDC-compliant** provider, offering a faster, more familiar sign-in experience. **Passkeys** are now supported as well, giving clients a secure, passwordless way to sign in. B2CORE can also act as a trusted identity provider itself, so third-party and in-house apps can offer a "Log in with B2CORE" option and authenticate clients via OIDC without managing separate credentials. The migration to the new identity provider has already started and will be completed for all brokers by the end of June 2026. #### B2CONNECT integration [#b2connect-integration] B2CORE now integrates with **B2CONNECT**, B2Broker's multi-asset liquidity and trading connectivity hub. Brokers can connect B2CORE directly to B2CONNECT as a trading platform, letting their clients access B2CONNECT-powered instruments and liquidity from within B2CORE. ### B2CORE UI updates [#b2core-ui-updates-3] * Embedded custom pages (iframe menu entries) now follow the client's selected interface language, so third-party tools open in the same language as the rest of the portal. * The trading platform password is now shown to the client once after an account is created, making it easier to save credentials for platforms that require them. Available for MT4/MT5. * A new immediate verification flow can be enabled to prompt clients to complete KYC right after a call to action, helping move new sign-ups through verification faster. ### Payment system updates [#payment-system-updates-3] * A **system precheck** has been added to the payout approval flow. Withdrawals are now validated against the PSS payment layer before they are processed, reducing the risk of approving payouts that would later be rejected downstream in PSP. * For **B2BINPAY** and **Coinsbuy**, the reverse exchange rate is now calculated for conversions, and the redundant **Label** field has been removed from the withdrawal form. * For **PayRetailers**, deposit and withdrawal status changes are now received via webhook notifications, keeping transaction states up to date automatically. * For **BridgerPay** card withdrawals, the email field is now always mandatory and the first and last name are pre-filled, reducing failed payout attempts. * For **Volet** bank-card withdrawals, additional form validation and the cardholder address have been added. ### Improvements [#improvements-3] * **Idempotency keys** are now supported on the `makeDeposit` and `makeWithdrawal` API endpoints as well as the Back Office manual deposit and withdrawal forms. Retried requests safely return the original transaction instead of creating a duplicate, giving integrators reliable retry behavior. * Account **auto-creation rules** have been reworked into a dedicated section with explicit per-trigger options, giving brokers clearer, more granular control over when trading accounts are opened automatically for clients. * For crypto payouts via **PSS**, the destination wallet address is now verified through SumSub and validated against the client's whitelist, adding protection against withdrawals to unauthorized addresses. * On the create-exchange form, operators with the appropriate permission can now enter the exchange rate manually, giving full control over admin-initiated conversions. * For **TradeLocker**, hedging is now enabled for all products and currencies. * The **Transactions** table now includes source and destination account number columns, and account numbers are now shown in the transfer account selectors, making it easier to identify the accounts involved. * Manual deposit creation now supports **invoice** and **transaction ID** fields for better reconciliation. * Contact synchronization with **ActiveCampaign** and **SendGrid** is now scheduled automatically, keeping marketing audiences up to date. * For KYC via **iDenfy**, a verification started on desktop and continued on mobile is now finalized automatically via webhook, smoothing the mobile hand-off. * Phone numbers received from **SumSub** are now marked as confirmed, so clients don't have to re-verify a number that has already been validated during KYC. * The **Back Office** now shows a clear "Access denied" message when a user without the required permission tries to change a client's verification level or rights. * Via the API, platform credentials can now be supplied when creating an account, and `api/v2/accounts` now returns and can be sorted by `updateTime`. * The registration date-of-birth field now restricts entries to a reasonable date range, reducing invalid sign-up data. ### Deprecated functionality [#deprecated-functionality-1] * The **Clients** > **Services** feature has been removed from the Back Office. * The **System** > **Localizations** section has been removed, along with the legacy language management it relied on. Languages are now managed entirely through B2TRANSLATE. ### Resolved issues [#resolved-issues-3] * Admin-initiated exchanges are no longer silently saved at a rate of 1.0 when the rate provider is unavailable; the operation now uses the correct rate. * For **cTrader**, a local copy of the country list is now used, avoiding errors when the external list is unavailable. * The **Centroid** free-funds calculation has been corrected. * The audit journal widget now shows all changed fields for an action. * Deleted clients are now excluded from the phone-number uniqueness check, so a new client can reuse a number freed up by a removed account. * Several incorrect language and locale codes and names have been fixed. * The granularity of the equity graph across time periods has been corrected. ## April 30, 2026 [#april-30-2026] ### New features [#new-features-4] #### New PS integrations [#new-ps-integrations-1] Support for the following new payment systems has been added: * **Columis** – with support for deposits * **Volet** – with support for deposits and withdrawals #### Intercom helpdesk integration [#intercom-helpdesk-integration] B2CORE now integrates with **Intercom**, allowing brokers to offer in-app live chat and support to their clients across the web, iOS, and Android apps. The Intercom authentication is handled securely on the server side, so credentials are never exposed to the client. #### New email template system [#new-email-template-system] A redesigned email template system has been introduced. Brokers can now customize the default transactional emails – such as welcome messages and notifications – directly from the Back Office, making it faster to match emails to their brand without developer involvement. All the email templates will be migrated there soon. #### Embeddable custom pages in the client portal [#embeddable-custom-pages-in-the-client-portal] Brokers can now embed their own or third-party pages directly in the B2CORE client portal as custom menu entries, choosing whether each entry opens in the same tab, a new tab, or an embedded iframe. A new authentication endpoint lets those embedded services securely identify the signed-in client without requiring a separate login. For details, refer to [How to integrate your app as iframe in B2CORE](../how-to-articles/manage-system-settings/how-to-integrate-your-app-as-iframe-in-b2core). ### B2CORE UI updates [#b2core-ui-updates-4] * B2TRADER Trading accounts now expose a dedicated, human-readable **display number**, shown consistently across the client portal, the Back Office, and data exports. * A **login button** has been added to the sign-up page, making it easier for returning clients to switch to the login screen. ### Payment system updates [#payment-system-updates-4] * For **B2BINPAY** and **Coinsbuy**, the EUROC stablecoin is now recognized under its updated **EURC** ticker, ensuring the currency is displayed and processed correctly. * For **BridgerPay**, the last four digits of the card are now stored and shown in the withdrawal payment snapshot, making it easier to identify the card used for a payout. ### Improvements [#improvements-4] * **Hint support** has been added to form fields and payment system configuration fields, so brokers can show inline guidance to clients on deposit and withdrawal forms and reduce support requests. * A **jurisdiction** filter has been added to the **Finance** section, helping brokers that operate across multiple legal entities narrow down financial records by jurisdiction. * For KYC via **SumSub**, the questionnaire answers submitted by a client are now visible in the Back Office. * The permission to update a client's **verification level and rights** is now separate from the general client-info read permission, so brokers can grant or restrict this capability to back-office users independently. * **Active Campaign** connections can now be tested directly in the Back Office with a check-connection action. * An **Apple touch icon** can now be configured under visual customization, so the B2CORE UI shows a branded icon when clients add it to their home screen. ### Deprecated functionality [#deprecated-functionality-2] * Several legacy payment provider integrations that are no longer supported have been removed, having been superseded by PSS-based connections. These include **SticPay**, **Sqala**, **Help2Pay**, and **KoraPay**. ### Resolved issues [#resolved-issues-4] * For **MT4/MT5**, the client's country is now mapped using each platform's own country dictionary, ensuring the correct country is sent to the trading platform. * Login push notifications now display human-readable text instead of raw codes. * Newly created accounts now appear in the account list immediately after creation. * Currency icon spacing has been fixed in right-to-left (RTL) layouts. * Withdrawal amount validation has been corrected. * The **Transfers** export now correctly populates the internal client type and includes client tags. * In **Savings**, the "hide unavailable programs" filter now also hides programs the client doesn't have enough balance to join. ## March 31, 2026 [#march-31-2026] ### New features [#new-features-5] #### Simplified registration flow [#simplified-registration-flow] A new, streamlined registration flow is now available, designed to reduce friction during onboarding and help new clients sign up faster. Brokers can enable and configure the simplified flow through the corresponding settings in the Back Office. ### B2CORE UI updates [#b2core-ui-updates-5] #### Calculator for crypto deposits [#calculator-for-crypto-deposits] A calculator has been added to the static deposits flow in the B2CORE UI. Before completing a deposit, clients can now estimate the amount and review conversion details, making deposits via static payment methods clearer and more predictable. ### Payment system updates [#payment-system-updates-5] * For crypto deposits via **B2BINPAY** and **Coinsbuy**, the network protocol is now displayed alongside the blockchain name (for example, Ethereum (ERC-20), BSC (BEP-20), or TRON (TRC-20)). This helps clients select the correct network and reduces deposit errors. * For **KoraPay** bank account withdrawals, the destination country can now be configured, so the correct list of banks is shown per country. This enables local bank withdrawals across additional African markets such as Nigeria and South Africa. * For **BridgerPay**, a deposit method can now be configured to open the checkout directly to a single payment option – such as credit card, wire transfer, or crypto – giving brokers tighter control over the deposit experience. * For **Sqala**, a human-readable **Code to pay via PIX** field has been added to PIX deposits, making it easier for clients in Brazil to identify and copy the correct payment code. In addition, the platform-side minimum and maximum amount limits for BRL transactions via Sqala have been removed. ### Improvements [#improvements-5] * A new **color scheme generator** has been added to visual customization, making it easier to produce a consistent, branded set of theme colors for the B2CORE UI. * A new option has been added to external connections to control whether an integration's key is shared with the B2CORE UI for client-generated events. For analytics connections such as **RudderStack**, disabling it keeps the key out of the public system-info endpoint, preventing misuse. * The client **jurisdiction** is now included in key financial reports (such as the Client Finance, Transaction, and Balances reports) as well as in the **Deposits**, **Payouts**, **Transfers**, and **Exchanges** export files, helping brokers that operate across multiple legal entities identify each client and transaction at a glance. * In **Bonuses** > **Bonus distribution**, the bonus name filter has been replaced with a text search, allowing operators to quickly find specific bonus programs by name. * The temporary bonuses list can now be filtered to show only unclaimed programs, so clients always see the offers still available to them. * The **Transactions** export now includes all records rather than only the currently visible page, bringing it in line with the other **Finance** sections. * The KYC upload form now validates the minimum required number of files before submission, showing clients an immediate, localized message if they haven't uploaded enough documents. * Clients can no longer submit more than one account deletion request at a time; if a request is already pending, a new one can't be created. ### Deprecated functionality [#deprecated-functionality-3] * The **Mailing** > **Marketing** feature has been removed from the Back Office, following the deprecation notice introduced in the previous release. ### Resolved issues [#resolved-issues-5] * The default cryptocurrencies list now uses the correct precision values. * In **Savings**, the preset name is now validated when a preset is updated. * The language dropdown in the B2CORE UI now preserves the order defined on the server instead of re-sorting the languages alphabetically. ## February 28, 2026 [#february-28-2026] ### New features [#new-features-6] #### New PS integrations [#new-ps-integrations-2] Support for the following new payment system has been added via **PSS**: * **We Payment** – with support for deposits and withdrawals #### Acuity Trading integration [#acuity-trading-integration] B2CORE now integrates with **Acuity Trading**, a provider of market analysis tools and trading signals. Once configured, brokers can offer their clients access to Acuity Trading research and analytics directly within B2CORE, enriching the trading experience and expanding the product offering. #### Adjust analytics integration [#adjust-analytics-integration] B2CORE now supports integration with **Adjust**, a mobile measurement and marketing analytics platform. When configured, B2CORE sends attribution and event data from the B2CORE UI, iOS, and Android apps to Adjust, helping brokers track user acquisition and measure the performance of their marketing campaigns. #### Journal log in the Back Office [#journal-log-in-the-back-office] A new **Journal log** is now available in the Back Office, starting with the client details. It provides a full audit trail showing who created, updated, or deleted a record and what exactly was changed, along with the actor and timestamp for each event. The journal is available to Back Office users assigned the corresponding permission. #### Redesigned Restrictions management [#redesigned-restrictions-management] The interface for managing restrictions has been reworked. A dedicated **Restrictions** tab is now available on the product editing page in the Back Office, listing all active restrictions – such as allowed countries and required verification levels – so admins can quickly see who is eligible for a product without leaving the page. #### Access restrictions for savings presets [#access-restrictions-for-savings-presets] Savings presets can now be configured with access restrictions by **client type**, **jurisdiction**, **country**, and **verification level**, similar to the restrictions already available for products and bonuses. Clients who don't meet the criteria won't see the preset, helping brokers comply with regulatory requirements across different jurisdictions. ### B2CORE UI updates [#b2core-ui-updates-6] * The deposit and withdrawal flows in the B2CORE UI have been further streamlined for a smoother and more intuitive experience. * Clients can now select a **preferred currency** for demo accounts. * The display density of tables has been improved for better readability, and the adaptive layout of the **Profile info** section has been refined for smaller screens. ### Payment system updates [#payment-system-updates-6] * The blockchain **transaction ID (hash)** is now saved and displayed in the deposit and withdrawal details in the Back Office, and is also available via the Back-Office API. This makes it easy to look up crypto transactions directly on the blockchain. * New Back-Office API v2 endpoints allow payment assistance applications – for deposits, withdrawals, and static deposits – to be moved between the **In Progress**, **Success**, and **Failed** statuses programmatically, enabling more automated payment operations. ### Improvements [#improvements-6] * Back Office users with the appropriate permission can now **delete incorrectly uploaded client documents** directly from the **Clients** > **Documents** table, removing the need to contact the support team for document cleanup. * The **Documents** table now includes **Uploaded by** and **Uploaded at** columns, with sorting and filtering, so admins can easily see who submitted each document and when. * For KYC via **SumSub**, clients who receive a final rejection now retain the ability to attempt verification again. A new option, **Allow new verification tries on reject**, controls this behavior in the SumSub connection settings. * The **Mobile description** field for verification levels now accepts **HTML** content, allowing brokers to craft richer descriptions shown to clients in the mobile apps. * Client tags linked to a jurisdiction are now automatically assigned or updated when a client's country changes, when they complete KYC, or when an admin applies jurisdiction changes to all clients. Tags set manually and unrelated to jurisdictions are preserved. * Data exports have been made more reliable with improved error handling and logging, and large high-precision numbers are now correctly handled in deposit and payout exports. * The Back-Office API endpoint for clients (`/api/v2/clients`) now supports sorting by **update time** in addition to creation time, enabling better synchronization workflows. * Overall platform performance has been improved: backend applications have been moved to a new, modern application server for faster API responses, and rate caching for the account total-balance endpoint has been optimized. ### Deprecated functionality [#deprecated-functionality-4] * A number of legacy payment provider integrations that are no longer supported have been removed. These have been superseded by PSS-based connections and include: AlgoGateway, ExLink, ChipPay (payout), PayRetailers, BitWallet, Payelata, NicePay, ISmartPay, EeziePay, NinePay, Chillpay, Epay, POLiPay, PayTrust88, SolidPayments, RpnPay, Axcess, LionPay, and Ozow. * As part of the ongoing move away from SMS-based authentication, the phone confirmation step has been removed from the registration wizards. New clients are no longer asked to confirm their phone number via SMS during registration. * A deprecation notice has been added to the **Mailing** > **Marketing** section in the Back Office. ### Resolved issues [#resolved-issues-6] * Quiz and test details are now returned with the correct translations in all enabled languages. * The translations of SumSub KYC field names in the Back Office have been improved. * On the **Transfers** page, the swap option is now disabled for clients who don't have the corresponding permission. * Savings plans without a matching preset are now handled correctly. * Validation on the PSS withdrawal form has been fixed for cases involving different currencies. * For **PayRetailers**, the deposit status is now recognized correctly (CANCELED is treated as CANCELLED). ## January 31, 2026 [#january-31-2026] ### New features [#new-features-7] #### Rate providers management via the Back-Office API [#rate-providers-management-via-the-back-office-api] New Back-Office API v2 endpoints have been added to list rate providers and update custom rate values. This enables brokers to programmatically manage and override the exchange rates used in B2CORE, simplifying integration with external rate sources and automated workflows. #### Backend analytics events for RudderStack [#backend-analytics-events-for-rudderstack] When **RudderStack** is configured as an external connection, B2CORE now automatically sends key backend events – such as deposits, withdrawals, sign-ups, and verification decisions – to the platform. This complements the existing front-end analytics and provides a more complete view of client behavior for brokers relying on RudderStack. ### B2CORE UI updates [#b2core-ui-updates-7] #### Cookie consent [#cookie-consent] A cookie consent modal window has been added to the B2CORE UI, allowing clients to review and accept the use of cookies in line with privacy requirements. ### Payment system updates [#payment-system-updates-7] * Payment forms for PSS methods now automatically pre-fill known client data, such as name, email, and address, from the client profile. Clients no longer need to re-enter information they have already provided when making deposits or withdrawals. * For **KoraPay**, withdrawals to bank accounts have been improved for more reliable processing. * **PaymentAsia** now supports the **MXN** (Mexican peso) currency code. ### Improvements [#improvements-7] * Backend images, including logos for the **Sign In** page and the menu header, are now managed from the **System** > **Visual customization** menu in the Back Office instead of a separate section. Logos for the login background and the platform logo can now also be uploaded in **SVG** format. * Login security notifications have been improved to reduce spam. Clients are now alerted only when a sign-in occurs from a **new device** or **new IP address**, rather than on every login, making security alerts more meaningful. * Disabling a client's TOTP (authenticator app) two-factor authentication from the Back Office is now correctly synchronized, ensuring the change is reliably applied and the client is no longer prompted for 2FA. * When using **Zendesk** with the B2CORE mobile apps, support requests are now routed through the correct messaging channel, ensuring mobile clients reach the right support queue. * It's now possible to add comments to external connection form groups in **System** > **External connections**, making configurations easier to document and maintain. * The performance of filtering transactions by **client** and **type** on the **Finance** pages has been optimized, and retrieving ignored symbol groups for bonuses now works faster. * A clear error message is now displayed when an operation can't be completed because the account lacks deposit or withdrawal rights. ### Resolved issues [#resolved-issues-7] * Custom menu items for the B2CORE UI can now be edited correctly, and creating a child menu item no longer fails in **Promotion** > **Menu**. * Multi-select controls in **System** > **External connections** now work as expected. * Exporting data from the **Bonuses** section now completes successfully. * The position of banners in the B2CORE UI has been corrected. * Default values for the text and button text are now set when creating announcements. ## December 18, 2025 [#december-18-2025] ### New features [#new-features-8] #### New PS integrations [#new-ps-integrations-3] With this release, support for the following new payment systems has been added via **PSS**: * **LuqaPay** – with support for withdrawals only * **Visionpay (HILZI)** – with support for deposits and withdrawals * **Ozow** – with support for deposits only * **B2BINPAY** (via API v3) – with support for static deposits and withdrawals * **Coinsbuy** (via API v3) – with support for static deposits and withdrawals #### Salesforce integration [#salesforce-integration] B2CORE now supports **Salesforce** integration, enabling seamless syncing of client data from the B2CORE Back Office to Salesforce. This allows you to centralize client information and leverage Salesforce tools for your business processes. For details, refer to [How to integrate Salesforce](../how-to-articles/manage-system-settings/how-to-integarte-salesforce). #### Twilio SendGrid integration [#twilio-sendgrid-integration] B2CORE now integrates with **Twilio SendGrid**, enabling automatic syncing of client data from the B2CORE Back Office to SendGrid contacts. This integration allows you to manage email delivery, marketing campaigns, contact segmentation, and related communication tasks directly through SendGrid. For details, refer to [How to integrate Twilio SendGrid](../how-to-articles/manage-communication-platforms/how-to-integarte-sendgrid). #### Address updates via the Profile in the B2CORE UI [#address-updates-via-the-profile-in-the-b2core-ui] Address updating can now be enabled for `individual` clients in the **Profile** menu of the B2CORE UI. To allow clients to change their country and residential address, configure the new **Address updating** option in **System** > **Settings** in the Back Office. This option enables you to choose how address changes are processed: * **Admin approval required**: an admin must approve the change via a client request in the Back Office. This option applies only when your KYC procedure *doesn’t include* address verification. * **Repeated verification required**: the client’s verification level is reset, and they must complete KYC again with the new address. This option applies only when your KYC procedure *includes* address verification. For more details, refer to the [Client profile](../back-office-guide/system/settings#client-profile) section in the **System** > **Settings** documentation. #### New notifications in the bell icon in the B2CORE UI [#new-notifications-in-the-bell-icon-in-the-b2core-ui] The **bell** icon in the top bar of the B2CORE UI and mobile app now displays a counter of new notifications and opens the **Notifications** panel when clicked. With this release, the panel shows alerts about **new login attempts**, **new login devices**, and **changes to passwords** or **2FA methods**, all grouped under the **Security** category. From the panel, clients can open the **Notifications** page, where they can review all notifications, see full details, and quickly navigate to the **Security** section of their profiles. More notification types will be supported in future updates. Notifications in the bell icon ### B2CORE UI updates [#b2core-ui-updates-8] #### New All tab in Transaction History [#new-all-tab-in-transaction-history] In **Transaction History**, a new **All** tab has been added, allowing clients to view transactions of all types in one place and filter them by status. Transaction History #### Support for the Zendesk chatbot [#support-for-the-zendesk-chatbot] When using **Zendesk** as your HelpDesk system with B2CORE, you can now enable the Zendesk chatbot in the B2CORE UI. This enhancement offers a more streamlined HelpDesk experience, allowing clients to ask questions, quickly find the information that they need, and seamlessly switch to a live operator, all without requiring additional authorization. For details, refer to [How to add Zendesk chatbot](../how-to-articles/manage-system-settings/how-to-configure-a-connection-to-zendesk#how-to-configure-the-zendesk-chatbot). #### Enhanced static Dashboard [#enhanced-static-dashboard] The static **Dashboard** with fixed widgets introduced in the previous release has been further enhanced to improve usability and clarity. **Last Transactions** * The widget is now displayed on the **Dashboard** only if the related **Transaction History** menu is enabled. If the menu is hidden, the widget won’t appear on the **Dashboard**. * Fiat currencies in the widget always use a precision of two decimals. All other currencies follow the decimal settings configured for each currency in the Back Office. * If a client has no transaction history, the **All** button is hidden from the widget. It becomes visible once transactions appear, allowing clients to view their full history directly from the widget. Dashboard with Transaction History **Portfolio** The tabs displayed in the widget now depend on whether the related **Wallets** and **Platforms** menus are enabled: * If both menus are enabled, the widget shows the **Wallets**, **Trading Platforms**, and **All** tabs, allowing clients to view their total portfolio value across all wallets and trading accounts. * If either menu is disabled, the corresponding tab is hidden from the widget. **Trading Accounts** The widget is displayed on the **Dashboard** only if the related **Platforms** menu is enabled. If the menu is hidden, the widget won’t appear on the **Dashboard**. Dashboard with Wallets and Trading accounts * **Automatic submission of verification code forms** In forms where verification codes are required to confirm actions, for example, signing in, changing a password, or others, the form is now automatically submitted once the code is entered, removing the need for clients to click the **Continue** button and making the process more seamless. ### Payment system updates [#payment-system-updates-8] #### Payment input snapshots [#payment-input-snapshots] In the B2CORE Back Office, it’s now possible to view the information that clients enter on the deposit and withdrawal forms when using **PSS** methods. This data helps admins to make informed decisions when approving or rejecting withdrawal requests and speeds up the investigation of potential payment-related issues. The information is available in the new **Payment input snapshot** section, which is added to: * Deposit details in **Finance** > **Deposits**. * Withdrawal details in **Finance > Payouts**. * Client requests in **Clients** > **Requests**, including: **Payout** requests, **PS Deposit Assistance** requests, and **PS Withdrawal Assistance** requests. #### Streamlined handling of PS Deposit Assistance requests [#streamlined-handling-of-ps-deposit-assistance-requests] When a **PS Deposit Assistance** request is triggered due to reaching a sync deadline with the respective payment system, a separate request is no longer created in **Clients** > **Requests**. Instead, such cases now must be handled directly in the deposit details, reducing the number of unnecessary assistance requests. #### Full B2TRANSLATE integration for payment forms [#full-b2translate-integration-for-payment-forms] Payment forms in the B2CORE UI and mobile apps are now fully integrated with [B2TRANSLATE](https://docs.b2translate.b2broker.com/) (formerly WEBLATE). Labels for all components of dynamic forms for PSS-connected deposit and withdrawal methods, as well as validation error messages, can now be customized and translated into multiple languages via B2TRANSLATE. This ensures consistent localization across all financial workflows. ### Improvements [#improvements-8] * The balance of source accounts is now checked when approving client requests for **transfers** and **internal transfers** to ensure sufficient funds are available. If the balance is insufficient for a transfer, the request can’t be approved, and the error message is displayed: `Application approve failed. Insufficient funds on source account`. * In **Bonuses** > **Bonus distribution**, a new **Created by** column has been added, displaying the emails and IDs of the Back Office users who added bonuses to clients. Clicking an ID opens the profile of the respective Back Office user. * The loading speed of the **Finance** > **Exchange** page in the Back Office has been significantly improved, especially for large data volumes. Exporting exchange data from the same page has also been accelerated. * Visibility of items in the main menu of the B2CORE UI can now be restricted based on a client’s **jurisdiction** and **country**, allowing more granular control over which features clients can access. ## October 1, 2025 [#october-1-2025] ### New features [#new-features-9] #### New PS integrations [#new-ps-integrations-4] Support for the following new payment systems has been added via **PSS**: * **Payrock** – with support for deposits and withdrawals * **Proxpay** – with support for deposits and withdrawals * **KoraPay** – the option for withdrawals to bank accounts has been added. #### Introducing static payment details for deposits [#introducing-static-payment-details-for-deposits] Starting with this release, deposit methods via integrated payment systems will gradually support **static payment details**. Previously issued payment information, such as crypto addresses or bank details, is saved for clients, allowing them to reuse it for deposits of different amounts at any time. In this release, **B2BINPAY** and **Coinsbuy** methods feature static deposit details. Clients can generate deposit addresses in the B2CORE UI, which are saved for future use, or create new blockchain-specific addresses, all stored for subsequent deposits. #### The Dashboard with key financial metrics [#the-dashboard-with-key-financial-metrics] The **Dashboard** now opens after signing in to the Back Office for users who are assigned the permission `Access to Finance Dashboard` under the **Statistics** category. The **Dashboard** displays key financial metrics, including **total deposits**, **total withdrawals**, and **net deposits**, helping users quickly review financial results and activity over the selected period (refer to [Dashboard](../back-office-guide/dashboard)). ### B2CORE UI updates [#b2core-ui-updates-9] #### Redesigned static Dashboard [#redesigned-static-dashboard] The B2CORE UI **Dashboard** has been redesigned to provide a clear, intuitive overview of a client’s portfolio and financial state. The **Dashboard** is now a fixed, non-customizable page with the following widgets: * **Portfolio**: shows the total balance with the ability to view allocation across wallets and trading accounts. The prominent **Deposit** button allows clients to add funds quickly. In addition, access to other financial transactions such as **Transfers**, **Exchanges**, and **Withdrawals** is available from the widget. * **Last Transactions**: shows a list of recent financial transactions along with their statuses for quick review and provides access to the full **Transaction History**. * **Trading Accounts**: displays active accounts, marked as favorites or accounts with non-zero balances, for easy access, and provides options to create a new account or go to trading with a single click. #### Clear display of verification request statuses [#clear-display-of-verification-request-statuses] For clients, it’s now easier to track the status of their verification requests. A new banner on the **Dashboard** and **Verification** page displays the pending status after a request is submitted and provides a direct link to the **Document verification** section, where clients can monitor their document statuses. #### More accurate indicative amounts for deposits and withdrawals [#more-accurate-indicative-amounts-for-deposits-and-withdrawals] The calculation of indicative amounts displayed to clients when initiating deposits and withdrawals in the B2CORE UI has been reworked. These amounts now more accurately reflect the final results that clients will receive after execution, taking into account commissions and exchange rates. ### Improvements [#improvements-9] * For **DXtrade**, it's become possible to add the **Account number prefix** when configuring a product in the Back Office. The prefix is added to the beginning of DXtrade account numbers to help distinguish, for example, live and demo accounts or accounts belonging to different brands within a single DXtrade infrastructure (refer to [How to integrate DXtrade](../how-to-articles/manage-platforms/how-to-integrate-dxtrade)). * For **ShuftiPro**, the document type `any` is now supported for address verification. It allows clients to submit any document containing their name and address, rather than a specific document type, making the KYC process more flexible and convenient (refer to [How to use ShuftiPro](../how-to-articles/manage-verification-options/how-to-use-shuftipro)). * Jurisdictions are now assigned to clients based on the combination of their **country** and **client type** as defined in the jurisdiction settings (refer to [Jurisdictions](../back-office-guide/clients/jurisdictions)). * PSS payment methods, including both deposits and withdrawals, are now supported in the mobile apps starting from version 1.30.0 (iOS) and 2.8.0 (Android). * Table loading in the Back Office has been optimized. In particular, the **Clients** > **Accounts** list now loads much faster, even when handling a large number of accounts. * For **Twilio** calls to clients from the B2CORE Back Office, you can now choose which phone number to use if you have several active Twilio numbers in your account. This enables you to select the most suitable local number, increasing the chances of successful contact and enhancing client trust. Outgoing calls made from the B2CORE Back Office via Twilio can now be recorded, with the recordings saved in your Twilio account for later playback. * The **Export** option has been enhanced to provide more reliable data export from the pages where this option is available in the Back Office. * In **Bonuses** > **Bonus distribution**, the **Ignored symbol groups** field is now optional and can be left empty when manually crediting bonuses to clients. If left empty, all symbols from available groups traded by a client are counted toward their traded volume for meeting bonus requirements. * Banner targeting in the B2CORE UI and mobile apps has been improved. In addition to **country** and **verification level**, restrictions can now be applied by **client type** and **jurisdiction** for more precise control over visibility. * In saved withdrawal presets in the B2CORE UI, the payment method now matches the selected withdrawal method, and the currency is clearly displayed. Previously, the technical method name used in the Back Office appeared, causing inconsistencies. ## July 2, 2025 [#july-2-2025] ### New features [#new-features-10] #### New PS integrations [#new-ps-integrations-5] Support for the following new payment systems has been added via **PSS**, with both deposits and withdrawals available: * **FundPay** * **Jetapay** * **PayRetailers** * **TopChange Pay** In addition, withdrawals are now supported for **AlfredPay**. #### Integration with SumSub Fraud Prevention [#integration-with-sumsub-fraud-prevention] Transaction monitoring via **SumSub Fraud Prevention** is now supported for fiat and crypto **deposits** and **withdrawals**. When such transactions are initiated, they're automatically checked by **SumSub**, with results returned to B2CORE. The results are displayed in the **Transaction monitoring** section of deposit and withdrawal details, as well as in the respective client requests before they can be approved or rejected. Additionally, a new **KYT status** column in **Finance** > **Deposits/Payouts** displays the transaction monitoring results. This also improves **auto-withdrawals** in B2CORE, allowing faster processing without compromising compliance. To use this feature, you must have **SumSub Fraud Prevention** enabled and properly configured in your SumSub account and the enabled **SumSub** external connection in the B2CORE Back Office (refer to [How to configure a connection to SumSub](../how-to-articles/manage-verification-options/how-to-use-sumsubstance#how-to-configure-a-connection-to-sumsub)). #### Integration with ActiveCampaign [#integration-with-activecampaign] It’s now possible to run targeted email campaigns using client data from B2CORE, seamlessly synced with the **ActiveCampaign** platform. This integration enables more efficient, data-driven email marketing and notifications by: * Configuring an external connection to **ActiveCampaign** in the B2CORE Back Office. * Automatically syncing client data from B2CORE to **ActiveCampaign**. * Creating email lists to improve client retention and provide more personalized interactions via **ActiveCampaign**. For details, refer to [How to integrate ActiveCampaign](../how-to-articles/manage-communication-platforms/how-to-integrate-activecampaign). #### Support for custom menu items in the B2CORE web and mobile apps [#support-for-custom-menu-items-in-the-b2core-web-and-mobile-apps] It’s now possible to add custom items to the menu displayed in both the B2CORE UI and mobile apps. In mobile apps, this functionality is supported starting from **iOS** v1.29 and **Android** v2.6.0. Custom items can be configured in **Promotion** > **Menu** by specifying their names, URLs to which clients will be redirected, and icons. When clicked, clients are redirected to third-party external resources or web pages that support your business (refer to [How to add custom menu items](../how-to-articles/manage-advertising-options/how-to-add-custom-menu-items)). ### B2CORE UI updates [#b2core-ui-updates-10] #### Improved Total Balance widget [#improved-total-balance-widget] The widget has been improved to show balances from both wallets and trading accounts, as well as the overall portfolio value for a comprehensive financial overview. #### Enhancements related to B2TRADER accounts [#enhancements-related-to-b2trader-accounts] The following improvements to B2TRADER accounts handling have been introduced: * **New B2TRADER Accounts widget**: accounts created on the B2TRADER platform can now be conveniently viewed and accessed via a dedicated widget on the **Dashboard** in the B2CORE UI. With a single click, traders can sign in to the trading interface and start trading instantly. * **Support for Netting accounts**: in addition to **Hedging**, B2TRADER accounts with the **Netting** execution type are now supported. This allows traders to choose the appropriate type to plan and adjust their trading strategies. To enable Netting accounts, a separate product must be configured in the B2CORE Back Office under the **Products** menu. * **Support for demo accounts**: demo B2TRADER accounts with a predefined balance can now be created via the B2CORE UI, allowing traders to safely practice using the trading interface.To enable demo accounts, a separate product must be configured in the B2CORE Back Office under the **Products** menu. #### Revised Sign Up and Sign In pages [#revised-sign-up-and-sign-in-pages] The **Sign Up** and **Sign In** forms have been redesigned for a cleaner layout, improved visual appearance, and a better overall user experience, including: * Displaying the client’s email or phone during confirmation to clarify where a verification code was sent. * The **Back** button now returns clients to the previous step without resetting the form. ### Improvements [#improvements-10] * PSS payment methods are now partially supported in the mobile apps. *Deposit* methods are available in the **iOS** app starting from v1.29 and **Android** starting from v2.6.0. *Withdrawal* methods via PSS aren't yet supported. * The use of bonus presets and temporary bonuses can now be restricted for clients based on a client's **country**, **client type**, **verification level**, **jurisdiction**, or **introducing broker (IB)**. These restrictions can be applied individually or in combination, allowing for more granular access control. If the restrictions are applied to the bonus preset used for crediting automatic deposit bonuses, these bonuses will only be credited to clients who meet the specified criteria (refer to [Bonus presets](../back-office-guide/bonuses/bonus-presets#details) and [Temporary bonuses](../back-office-guide/bonuses/temporary-bonuses#details)). * On the **Bonus** > **Bonus distribution** page, a new **Expired at** column has been added to display the date and time when a credited bonus is scheduled to expire or has already expired. This improvement makes it easier to monitor bonus timelines on client accounts and encourage clients to meet the bonus requirements before expiration. * Jurisdiction handling has been enhanced. You can now manually assign or change a client's jurisdiction in the client details in the Back Office. The list of countries for a jurisdiction can be edited, with the option to apply changes to existing clients or only to those who register after the update (refer to [Jurisdictions](../back-office-guide/clients/jurisdictions)). * For KYC via **ShuftiPro**, the **Show OCR form** – where clients can review, confirm, or if necessary, edit the information extracted from their submitted documents – can now be enabled or disabled in the ShuftiPro connection settings in **System** > **External connections**. * Confirmed phone numbers can now be removed from the **Contacts** tab in client profiles in the Back Office. To do this, a Back Office user must be assigned the `Update clients` permission. Once removed, the phone number becomes available for registering a new client profile. * The **Clients** > **Requests** page has been improved to include a **Country** column with filter options, making it easier to identify requests by client location. Additionally, the **Processing date** column now shows when a request was approved or rejected, helping you assess its processing time. * In **System** > **Visual customization**, images uploaded as logos can now only be in `SVG` format. ### Resolved issues [#resolved-issues-8] * Resolved an internal server error that occurred when uploading supporting documents for deposits via the **WireDocument** provider. Deposit requests now proceed without errors. ## April 18, 2025 [#april-18-2025] ### New features [#new-features-11] #### New PS integrations [#new-ps-integrations-6] With this release, we’ve integrated a new payment system, **AlfredPay**. It supports deposits and is fully integrated via PSS connections. #### Ongoing migration of payment systems to PSS [#ongoing-migration-of-payment-systems-to-pss] More systems have been successfully migrated to the **Payment System Service (PSS)**. You can view the complete list of PSS-supported payment systems in [Integrations > Payment systems](../integrations/payment-systems). They are marked with Yes in the **PSS-supported** column. Payment methods previously configured via non-PSS connections remain available and fully functional — except for **PayPal**, which is now only supported through PSS. Payment methods connected through PSS aren’t yet supported on the **iOS** and **Android** apps, meaning they are currently available to clients only via the B2CORE UI. #### Visual customization for the B2CORE UI [#visual-customization-for-the-b2core-ui] You can now personalize the appearance and style of your B2CORE UI to better reflect your brand using the new **System** > **Visual customization** menu in the Back Office. The available options enable you to: * Upload custom logos for the light and dark themes of your B2CORE UI. * Adjust light and dark theme colors. * Set and update background images for the **Sign In** and **Sign Up** pages of the B2CORE UI. * Add custom scripts, for example, for chatbot integration or analytics tracking. For more details, refer to [Visual customization](../back-office-guide/system/visual-customization). ### B2CORE UI updates [#b2core-ui-updates-11] #### Enhanced deposits and withdrawals [#enhanced-deposits-and-withdrawals] The deposit and withdrawal workflows in the B2CORE UI have been streamlined, making the processes faster and more intuitive for clients. The key enhancements include: * **Easier payment method selection**: based on the selected wallet currency and the currency used for deposit or withdrawal, only the available payment methods are displayed to a client, helping to quickly select the most suitable option without confusion. * **Clear commissions**: once a payment method is selected and a deposit or withdrawal amount is entered, the commission formula applied to the method is displayed, and the fee is automatically calculated. This helps clients make informed decisions when choosing their preferred method. * **Real-time rate updates**: when deposits or withdrawals involve currency conversion, clients can now manually refresh the rates to view the most current value. The rate refresh is optional and is intended for clarity. The rate applied at the moment of transaction is always up to date, ensuring accurate conversions even without manual refresh. * **Transaction summary**: after selecting a payment method and entering a deposit or withdrawal amount, clients can now view a detailed transaction summary before proceeding. The summary includes the amount to be deposited or withdrawn, the amount to be received, the current conversion rate, and any applicable commissions. * **Transaction statuses and notifications**: clients now receive real-time updates on the status of their transactions, helping reduce uncertainty and minimize the need for support requests. * **Redesigned icons**: the refreshed icons for payment methods are now better aligned with the overall design. #### Simplified B2BINPAY deposit form [#simplified-b2binpay-deposit-form] In the B2CORE UI, the B2BINPAY deposit form no longer displays fields for the amount, indicative amount, or conversion rate, as the funds are deposited when the transaction is processed on the blockchain after submitting the request in the B2CORE UI and receiving the deposit address, making these fields unnecessary. #### Preview of key B2CORE UI features [#preview-of-key-b2core-ui-features] Clients can now see a brief preview of B2CORE UI features before they access the **Sign Up** and **Sign In** forms through a new gallery showcasing main UI pages. This enhancement is designed to boost registration conversions and engage potential clients by providing them with an informative preview of the UI. #### Automatic sign-in after registration [#automatic-sign-in-after-registration] After successfully completing registration, new clients are now instantly signed in to the B2CORE UI without needing to enter their credentials on the **Sign In** page. #### Verification in the onboarding process [#verification-in-the-onboarding-process] New clients are now prompted to complete identity verification immediately after registration, streamlining the onboarding process to encourage faster verification, first deposits, and a quicker start to trading. Clients can still choose to skip this step and complete it later. If skipped, a friendly banner encouraging to complete KYC will appear on the **Dashboard**. #### Interactive UI hints for new clients [#interactive-ui-hints-for-new-clients] New clients signing in to the B2CORE UI for the first time are now provided with guided hints on key elements across various pages, helping them quickly understand the basic functionality and get started with B2CORE efficiently. #### Personal info update [#personal-info-update] Clients can now update their personal information directly in the B2CORE UI via the **Profile Info** menu. Any changes to personal data will reset the client’s verification level, requiring them to complete the KYC process again. #### Streamlined fund management in the Savings menu [#streamlined-fund-management-in-the-savings-menu] Clients are now prompted to deposit funds into savings programs or top up their wallets directly from the **Savings** menu when subscribing to a program and lacking sufficient funds to join it. Additionally, if a client subscribes to a savings program without having the required wallet, they will be offered the option to create a new wallet in the required currency. #### Enhanced widget management in the Dashboard [#enhanced-widget-management-in-the-dashboard] The **Dashboard** has become even more intuitive with a set of new widget management options designed to improve layout clarity and usability: * When multiple widgets are added, they now automatically align for a cleaner and more organized view. * Widgets can no longer be resized below the minimum size, ensuring all content remains clear and readable. * Widgets now snap into place, making it easier to arrange and maintain a structured dashboard layout. #### Seamless authorization to Zendesk [#seamless-authorization-to-zendesk] When signing in to **Zendesk**, clients are redirected to the B2CORE UI **Sign In** page. After signing in, they are automatically taken back to the Zendesk page specified in the connection details under **System** > **External connections**, ensuring a faster and smoother support experience. ### Improvements [#improvements-11] * In **Bonuses** > **Bonus distribution**, you can now view the history of transactions related to crediting or deducting specific bonuses on client trading accounts. This information is available on the **Bonus transactions** tab in the bonus details. Additionally, Back Office users with the appropriate permission can retry failed bonus transactions (refer to [Bonus transactions](../back-office-guide/bonuses/bonus-distribution#bonus-transactions). * For savings programs, the **Cancellation penalty** can now be set as a percentage of the invested amount, offering greater flexibility in penalty calculations. The higher the amount invested by a client, the greater the penalty will be in the case of early withdrawal. The penalty percentage can be applied to programs of both the Fixed and Flexible strategies (refer to [How to create a savings program](../how-to-articles/manage-savings-programs/how-to-create-a-savings-program)). * By the end of May 2025, the leverage parameter will no longer be applied directly to accounts on the **TradeLocker** platform. Instead, leverage will be configured per instrument within the platform. As a result, the leverage parameter for TradeLocker accounts is no longer supported in B2CORE. * Verification levels can now be restricted by country and jurisdiction, enabling you to create distinct KYC flows for clients based on their location and client type (refer to [How to restrict the use of verification levels by jurisdiction or country](../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-restrict-the-use-of-verification-levels-by-jurisdiction-or-country)). * Filtering options have been added to **Systems** > **External connections**. You can now quickly find the required connection by applying the filter for **ID**, **Caption**, **Name**, **Provider**, or **Status**. ### Deprecated functionality [#deprecated-functionality-5] Integration with **Google reCaptcha** has been deprecated and is no longer supported. The reCaptcha step has been removed from the **Registration** and **Authorization** wizards and will no longer appear on the **Sign Up** and **Sign In** pages in the B2CORE UI. *** ## Past releases [#past-releases] ### December, 2024 🎄 [#december-2024-] #### New features [#new-features-12] ##### Introducing the Payment System Service (PSS) [#introducing-the-payment-system-service-pss] We’re happy to announce the launch of the B2CORE **Payment System Service (PSS)**, a powerful feature designed to streamline connections to external payment providers and cashier systems that aggregate multiple payment solutions. By configuring a single connection to a payment provider through PSS, you can give your clients access to a variety of deposit and withdrawal options offered by the provider and fully leverage its benefits. Payment systems that can be connected to B2CORE through PSS are indicated in [Integrations > Payment systems](../integrations/payment-systems). Previous integration methods remain available for these systems, ensuring that existing connections can continue to be used. If you intend to connect payment systems through PSS, please contact your account manager first to confirm the availability of PSS-supported connections on your B2CORE instance. ##### New PS integrations [#new-ps-integrations-7] The following new payment systems have been integrated: * **Paymid** – with support for deposits * **PayRetailers** — with support for deposits * **Ozow** – with support for deposits and withdrawals * **iSmartPay** – with support for deposits and withdrawals in THB. ##### Enhanced DXtrade integration [#enhanced-dxtrade-integration] Integration with the DXtrade platform has been revamped and is now fully functional, providing the capability to open and manage client training accounts, along with deposits, withdrawals, and transfers via the Back Office and B2CORE UI (refer to [How to integrate DXtrade](../how-to-articles/manage-platforms/how-to-integrate-dxtrade)). ##### Client segmentation by jurisdiction [#client-segmentation-by-jurisdiction] Client segmentation by jurisdiction is now available. In the Back Office, you can assign countries to specific jurisdictions in **Clients** > **Jurisdictions**. Once configured, clients will automatically be assigned to the correct jurisdiction based on the country they select during registration. This feature enables you to effectively manage clients from different jurisdictions, assign managers to specific countries, and restrict their access to clients based on jurisdiction (refer to [Clients > Jurisdictions](../back-office-guide/clients/jurisdictions)). #### New B2CORE UI [#new-b2core-ui] The redesigned B2CORE UI, first introduced about a year ago, is now fully implemented, powered, and optimized for seamless use. With this release, it officially replaces the previous interface, which has been discontinued and is no longer available. #### Improvements [#improvements-12] * The **Import Data** module has been updated to offer a more user-friendly experience when importing client, account, and IB-related data into B2CORE. This feature enables you to quickly start using B2CORE with your existing client base, eliminating the need for complex migration processes (refer to [Import data](../back-office-guide/system/import-data)). * When manually crediting bonuses to clients on the **Bonuses** > **Bonus distribution** page in the Back Office, you can now assign captions to these bonuses. These captions will be displayed to clients in the B2CORE UI, enabling them to distinguish credited bonuses (refer to [How to manually credit bonuses to clients](../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients)). * A new setting, **Enabled Two-factor auth providers**, has been added to **System** > **Settings**, enabling you to control which 2FA methods are visible and available for clients in the B2CORE UI. You can select both Google Authenticator and SMS confirmation, or only one of them. * It’s now possible to show or hide the **Nickname** field in client profiles in the B2CORE UI by adjusting the corresponding setting in the **Information showing** section under **System** > **Settings** in the Back Office. * For platforms that support web trading terminals, such as **cTrader** and **DXtrade**, you can now enable one-click access to these terminals directly from the B2CORE UI. To set this up, specify the **Web Terminal URL** in the platform details upon navigating to **Products** > **Platforms**. When specified, the **Trade** button will appear on account cards in the B2CORE UI, enabling clients to open the web terminal with a single click (refer to [How to enable one-click trading access from the B2CORE UI](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals)). For **cTrader**, the terminal will directly open the account from which the **Trade** button was clicked in the B2CORE UI, eliminating the need for clients to search for the desired account. * For **cTrader**, when creating accounts in B2CORE, the client's first and last names are now automatically transferred to the corresponding **First name** and **Last name** fields on the cTrader platform. * For MetaTrader 4/5 accounts created via B2CORE, you can now control the **Send reports** option applied to accounts on those platforms for reporting purposes. A new setting, **Use reporting on the platform**, has been added to **Products** > **Platforms** in the Back Office. Enabled by default, it ensures accounts are created with the **Send reports** option active. * You can now add localizations for the captions of custom fields added to your **Constructor** method. When switching languages in the B2CORE UI, the field names will be displayed according to the selected language (refer to [How to add custom fields for the Constructor deposit or withdrawal method](../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method)). * The list of permissions that can be assigned to Back Office user groups in **Users** > **Groups** has been expanded to include new read-only permissions. These permissions allow Back Office users to view details in specified sections without the ability to make updates: * `View banners` – allows to view banner configurations in **Promotion** > **Banners**. * `View menu` – allows to view the configuration of the menu for the B2CORE UI in **Promotion** > **Menu**. * `View client rights` – allows to view permissions assigned to each verification level in **System** > **Client rights**. * `View rates` – allows to view rates in **Currencies** > **Rates**. * `View groups` – allows to view permissions assigned to Back Office user groups in **Users** > **Groups**. * `View mailing` – allows to view configurations of email sending services and SMTP providers in **Mailing** > **Marketing** and **Mailing > System**. * The **Rates** field in transaction details, such as those in **Finance** > **Deposits** or **Finance** > **Payouts**, is now displayed as read-only. This ensures the rate used for converting deposit or payout amounts into the final currency can’t be modified. * Clients in the B2CORE UI can now archive demo accounts without requests that require admin approval in the Back Office. * The country and country flag displayed in the phone number field of the registration form in the B2CORE UI are now automatically identified based on the client’s IP address. This streamlines the registration process by eliminating the need for clients to manually search for their country in the dropdown. * The **Switch** option has been added to account details in the B2CORE UI, enabling clients to quickly switch between their trading accounts on the selected platform without the need to go back to the accounts list and search for the desired account. #### Deprecated functionality [#deprecated-functionality-6] * Integration with **Acrobat Adobe Sign** has been deprecated and is no longer supported. * The **Event calendar** has been discontinued and isn’t available anymore. *** ### October, 2024 [#october-2024] #### New features [#new-features-13] ##### New PS integrations [#new-ps-integrations-8] With this release, a new payment system, **paypay89**, has been integrated, with support for deposits and withdrawals. Supported currencies include THB, IDR, and VND, with settlements conducted in USDT. ##### Introducing bonuses on cTrader [#introducing-bonuses-on-ctrader] We’re excited to announce the support for bonuses on **cTrader**. With this update, you can now automatically credit bonuses to clients upon deposits, configure bonus presets, and create temporary bonus programs for **cTrader**, similar to the functionality available for **MT4/5**. ##### Integration of RudderStack to enhance analytics [#integration-of-rudderstack-to-enhance-analytics] A new integration with the **RudderStack** platform has been introduced to enhance analytics capabilities. You can configure the connection to **RudderStack** in the **External connections** section of the Back Office. The platform collects data on new client registrations and helps evaluate marketing companies aimed at client acquisition. The collected data can then be sent to one of the [data analysis tools](https://www.rudderstack.com/integration/?type=Destination) like Amplitude, Google Analytics, or others. ##### Mobile app download settings [#mobile-app-download-settings] In **System** > **Settings**, the **Mobile** section now includes options to configure buttons for downloading your branded mobile apps for both iOS and Android. These buttons will be displayed in the B2CORE UI along with the download instructions (for details, refer to [System > Settings](../back-office-guide/system/settings#mobile)). #### Improvements [#improvements-13] * For deposit and withdrawal methods that use **KoraPay** as a payment provider, a new configuration option, **Merchant bears costs**, has been added. This option can be set to **Yes** or **No** and determines whether the commissions charged by the provider are added to the deposit or withdrawal amount specified by the client, or deducted from it. * The process of assigning new clients to managers has been significantly updated. New clients are now assigned to the default manager first, considering country restrictions. If the default manager can’t be assigned due to these restrictions or if no default manager is set, clients will be distributed sequentially among existing managers, without relying on their priority indexes (for details, refer to [Clients > Managers](../back-office-guide/clients/managers)). * You can now easily open the B2CORE UI **Sign In** page from the Back Office. The **Open personal area** link has been added to the top bar, giving you fast access to the B2CORE UI linked to your Back Office. * It’s now prohibited to configure **cTrader** products for the creation of cent accounts, as cent accounts aren’t supported on the cTrader platform. If attempted, an error message will be displayed. * In **cTrader** products the **Mail** option is now always set to **Don’t send** and can’t be changed, indicating that credentials won’t be sent to clients when creating cTrader accounts through B2CORE. This is due to all cTrader accounts being tied to a single cTrader ID, with one password for that ID. * Banners are now customizable for display to clients in selected countries and with designated verification levels (for details, refer to [How to restrict banner display by country and verification level](../how-to-articles/manage-advertising-options/how-to-create-a-banner#how-to-restrict-banner-display)). * In bonus presets, the **Ignored symbol groups** field can now be left empty if needed. * The bonus option previously named **Burn if balance \< 0** has been renamed to **Burn if Equity \< Credit** to more accurately reflect its functionality. * When creating **MetaTrader 5** accounts through B2CORE, clients' first and last names are now correctly saved in separate fields on the MT5 platform, rather than being combined into a single field. * In the Back Office, you can now open and reject pending client requests related to trading accounts that are no longer accessible due to being archived or deleted. * Verification levels created on the **Verification > Levels** page can no longer be removed if they are assigned to active clients. Attempting to remove these levels will trigger an error message. * Verification level descriptions, if specified in the Back Office, are now displayed in the new B2CORE UI, allowing users to easily understand the actions and benefits associated with each level. * The status of verification requests approved in **SumSub** is now accurately displayed in the Back Office. Previously, statuses were updated only after opening these requests. #### Deprecated functionality [#deprecated-functionality-7] * The **B2BINPAY** section where you could view client wallets and withdrawals has been deprecated in the Back Office. However, deposit and withdrawal methods via **B2BINPAY** can still be configured and used. *** ### July, 2024 [#july-2024] #### New features [#new-features-14] ##### New WEBAPI 2.0 connections for MT4 and MT5 platforms [#new-webapi-20-connections-for-mt4-and-mt5-platforms] Connections to MT4 and MT5 are now established using WEBAPI 2.0. When your existing connections are migrated to WEBAPI, platform connection settings for MT4 and MT5 will be found in the details of the respective platforms under **Products** > **Platforms**, instead of **System** > **External connections** (for details, refer to **MetaTrader 4/5** in [Platforms](../back-office-guide/products/platforms)). As before, live and demo accounts require separate platforms. Therefore, two distinct platforms (for each MT4 and MT5) must be configured for live and demo accounts in **Product** > **Platforms**. ##### Enhanced exchanges [#enhanced-exchanges] Exchanges in specific currency pairs initiated by clients in the B2CORE UI can now be configured to require admin approval. To enable requests of the **Exchange** type for specific pairs, navigate to **Currencies** > **Currency pairs** in the Back Office and set the **Exchange request creation** option to **Yes** for the relevant pairs. After the admin approval, such exchanges are executed using the rates specified in the approved requests. For details, refer to [How to enable requests for exchanges in specific currency pairs](../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs) and [How to update rates in exchange requests](../how-to-articles/manage-currencies/how-to-update-rates-in-exchange-requests). ##### PS integrations [#ps-integrations] After rebranding, the **Volet** payment provider, formerly known as **Advcash**, remains available for deposits and withdrawals in B2CORE. #### Improvements [#improvements-14] * For enhanced security when signing in to the Back Office, the only supported method for 2FA is through time-based one-time passwords (TOTP), such as those generated by Google Authenticator. 2FA using email codes has been discontinued. Enable TOTP 2FA by clicking your email address in the top bar and selecting the TOTP option. * For address verification through ShuftiPro, you can now use the **Standard Address** or **Enhanced Address** verification plan. Both ShuftiPro plans are now supported for comprehensive address verification. * When exporting data from the **Clients** > **General** page, you can now include the **Tags** and **Nickname** columns in the export if they are selected in the **Column visibility** option and displayed on the page. * When configuring a connection to **CentroID** on the **System** > **External connections** page, the connection is now checked for both connectivity and credentials upon clicking the **Test connection** button. * When creating cTrader accounts via B2CORE, the country specified in the client’s profile is now automatically added to the account settings on the cTrader platform. * For **Sticpay** payments, transaction IDs are now included in the **Invoice** column in **Finance** > **Deposits** and **Finance** > **Withdrawals**. This enhancement enables you to easily match Sticpay transactions listed in the Back Office with those on the payment provider’s side. * The icon for **Praxis** is now visible in the B2CORE UI, provided that the icon name is specified in the respective deposit method configuration in the Back Office. *** ### June, 2024 [#june-2024] #### New features [#new-features-15] ##### Support for a new trading platform [#support-for-a-new-trading-platform] With this release, the suite of integrated platforms in B2CORE has expanded to include **TradeLocker**. It’s now possible to open demo and live TradeLocker accounts via the Back Office and the B2CORE UI, make transfers, including transfers between accounts opened on other trading platforms, and view TradeLocker account statistics such as Balance, Equity, Credit, Leverage, and Free funds. ##### Zendesk integration [#zendesk-integration] The **Zendesk** customer support platform has been integrated with B2CORE, offering ticketing, live chat, and AI tools for better customer engagement. For submitting and managing tickets, clients will be redirected from the B2CORE UI to the Zendesk interface. ##### Standard address verification with ShuftiPro [#standard-address-verification-with-shuftipro] Address verification is now available via the **ShuftiPro** KYC provider. You can now request clients to verify their addresses and any other locations such as cities or countries using the following document types: `rent_agreement`, `bank_letter_receipt`, `employer_letter`, and `utility_bill`. ##### Enhanced Savings module [#enhanced-savings-module] The **Savings** module has been enhanced to support more settings in your savings programs, including the use of `Fixed` and `Flexible` strategies. Savings programs enable clients to invest their funds to earn interest, allowing them to passively grow their crypto assets, similar to traditional bank savings accounts. ##### Integration with Notabene [#integration-with-notabene] Integration with **Notabene**, a significant addition to the **B2BINPAY** payment provider, has been implemented. This integration empowers the provider with compliance capabilities for the crypto **Travel Rule**, ensuring enhanced security and regulatory adherence (refer to [How to integrate B2BINPAY](../how-to-articles/manage-payment-methods/how-to-integrate-b2binpay)). #### New B2CORE UI updates [#new-b2core-ui-updates] * The **Bonuses** page has become available in the new B2CORE UI. Clients can now view all bonus programs on the same page and filter them to display only the programs in which they can participate. The cards showing bonus program details have been redesigned to clearly indicate the conditions that must be met to receive bonuses, such as the required volume of traded lots or the number of days until the end of each program. * Enhanced trading account details now offer clients more comprehensive information and statistics. For example, clients can now scale the **Equity** chart by different time periods and view the overall account equity for all time. Additionally, on the **Deals History** tab, clients can switch between pending orders and open positions, and filter them by date and side. * A new widget, **Favourite trading accounts**, has become available. This widget displays MT4 and MT5 trading accounts marked as favorites by clients, enabling quick switching between platforms and account types (live and demo) to view the necessary accounts and their balances. * The deposit and withdrawal processes have been streamlined to offer a more intuitive experience. Among the enhancements are auto-suggestions in dropdowns for selecting options, elimination of unnecessary grouping, and improved display of QR codes. * It has become possible to display banners on any page of the B2CORE UI, such as Dashboard, Wallets, Deposit, Withdrawals, or others by configuring banner settings on the **Promotion** > **Banners** page in the Back Office. #### Improvements [#improvements-15] * It has become possible to select the **Margin calculation type** such as **Net**, **Sum**, or **Max** for cTrader accounts. This option has been added to the settings of cTrader products on the **Products** > **Products** page. * It has become possible to set the default manager on the **Clients** > **Managers** page. When meeting the country restrictions, the default manager is automatically assigned to all new clients, eliminating the need for manual assignments. * The **Administrators** group on the **System** > **Users** > **Groups** page can no longer be removed and its permissions can’t be modified. Users included in this group are now granted full permissions. If you need to restrict permissions for specific Back Office users, create a separate user group and assign to it only necessary permissions. * On the **System** > **Users** > **Users** page, it’s now possible to view the date and time when a Back Office user was added and who added the user in the new **Created At** and **Creator** columns. * Two-factor authentication is now obligatory for all Back Office sign-ins. If 2FA isn’t enabled for your user profile yet, you’ll be requested to activate it before proceeding. Click your email address in the top bar, click **Enable 2FA** in the dropdown, and then select the method for delivering 2FA codes. * English is now set as the default fallback language for all the languages enabled on the **System** > **Localizations** page. This ensures a seamless user experience across different languages by using the English version when no translation or template in a specific language is available. * On the **Finance** > **Deposits** and **Finance** > **Payouts** pages, it has become possible to filter transactions by the **Account type** column. * The transactions listed on the **Finance** > **Transactions** page can now be filtered by custom periods. To apply filtering, specify the start and end dates in the filter fields under the **Date** column. * Updates to the integration of the **ChipPay** payment provider: * The **Name** field has been added. This field is pre-filled with the client’s first and last names for making deposits and withdrawals in the B2CORE UI. * The format of area codes has been updated to meet the payment provider requirements. * It has become possible to set up exchange rate adjustments in the deposit method settings for the **ChipPay** payment provider. * It has become possible to select a bank code in the deposit method settings for the **Help2Pay** payment provider. If selected, the code is used for deposits by default. If no bank code is selected, clients can choose one when making deposits in the B2CORE UI. #### Resolved issues [#resolved-issues-9] * The email notification sent to Back Office users now includes complete information without any missing details regarding the **Internal transfer request** event. * The bulk action to zero out balances has been fixed to reset the balances to zero for all wallets in a specific currency belonging to the same client. * The **Update Balances** option on the **Clients** > **Accounts** page has been fixed to accurately update balances, regardless of the upper or lower case used in client email addresses included in CSV files (for details, refer to [How to update balances](../how-to-articles/manage-finances/how-to-update-balances)). * Filtering by the **Status** column on the **Verification** > **Documents** page now functions correctly, showing only documents of the selected status. * Clicking the client ID link on the **Security** > **Blocked clients** page now accurately redirects you to the details page of the clocked client associated with that ID. *** ### March, 2024 [#march-2024] #### New features [#new-features-16] ##### New PS integrations [#new-ps-integrations-9] A new payment system, **Sqala**, has been integrated, with support for deposits and withdrawals in Brazilian reals (BRL). ##### Savings programs [#savings-programs] It has become possible to create savings programs. Your clients can subscribe to such programs and invest their idle funds to earn interest for holding the funds during a period set for each program. In this release, fixed interest rates are supported (for details, refer to [Savings](../back-office-guide/savings/)). #### Improvements [#improvements-16] * For the **BridgerPay** payment provider, the deposit process via B2CORE UI has been streamlined. Now, the required fields for depositing funds are filled in automatically with client-related data. * The configuration of the **Praxis** payment provider has been enhanced to ensure secure transaction processing. Additionally, in order to meet the diverse regulatory standards, you can now enable clients from various countries to submit different sets of required documents for making deposits via this provider in the B2CORE UI. * It’s now possible to configure the **Constructor** payment method so that clients can attach necessary documents when making deposits or withdrawals using this method in the B2CORE UI (for details, refer to [How to add the Constructor deposit or withdrawal method](../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method)). * The following payment providers have been restored and can now be used: * **WireCustom** — for deposits and withdrawals * **1-2-Pay** — for deposits and withdrawals * It’s now forbidden to remove connections to email service providers on the **Mailing** > **Marketing** > **Configurations** page if these connections are used in email templates created on the **Mailing** > **Marketing** > **Email templates** page. * For convenient filtering, all possible [transaction statuses](../back-office-guide/references/transaction-statuses) have been added to the **Status** dropdown on the pages within the **Finance** menu in the Back Office. #### New B2CORE UI updates [#new-b2core-ui-updates-1] * In the new B2CORE UI, the **Summary** section has been added for withdrawals. This section provides detailed information about a withdrawal, including the amount of applied commissions, exchange rates, and the final amount that will be withdrawn from the system. * If in the Back Office, a product is configured with the **Minimum deposit** option, the option is no longer ignored when creating accounts based on that product in the new B2CORE UI. * On the **Deposit**, **Withdraw**, and **Transfer** pages in the new B2CORE UI, when selecting accounts in dropdowns, the available accounts are now grouped based on their types, such as Fiat, Coins, MT4, MT5, and others. * The **Last updated** fields in the new B2CORE UI now use the full date format: `YYYY.MM.DD HH:MM`. #### Resolved issues [#resolved-issues-10] * The **Update balances** option on the **Clients** > **Accounts** page has been fixed to process a large number of email addresses listed in a CSV file used for updating client balances. * The issue causing slow loading of popup forms for creating deposits and bonuses in the Back Office has been resolved, and they now load faster. * On the **Deposit** page in the old and new B2CORE UIs, the indicative deposit amount is now correctly calculated in the case when the amount was initially entered in the **Payment amount** field. * The ability to attach TXT files to HelpDesk tickets has been restored. #### Deprecated functionality [#deprecated-functionality-8] * Integration with **Google Analytics** has been deprecated in B2CORE. * The **Back Office API** has been deprecated. For any inquiries or assistance, please contact your account manager. ### December, 2023 [#december-2023] #### New features [#new-features-17] ##### New B2CORE UI [#new-b2core-ui-1] We are happy to introduce a new redesigned look of B2CORE UI. It has been created to streamline complex user scenarios, as well as keep the UI relevant and up-to-date with modern design trends. Onboarding instructions are displayed on the new UI pages to help you get familiar with the main changes and enhanced scenarios. #### Switch to the new UI [#switch-to-the-new-ui] You can switch to the new UI on the **Sign In** page or after you have signed in to the B2CORE UI by clicking **Go to New Interface**. To switch to the previous user interface version, click your profile icon in the top right and select **Switch to Previous Version** in the profile menu. #### Main UI changes [#main-ui-changes] **User profile** You can now navigate to your user profile by clicking your profile icon in the top right. In the expanded profile menu, select options to view and update your personal information, verification level, the security status of your profile, and saved withdrawal presets. **Dashboard** Widgets that you can add to your **Dashboard** are now listed in a new left bar that is opened after clicking the **Add Widget** button. Click widgets to immediately add them to the **Dashboard**. You can add several widgets at once. **Wallets** Wallet details are now displayed in a new right bar that is opened after clicking a selected wallet. From the bar, you can make balance operations, view the recent wallet transactions, or navigate to your full transaction history. **Deposits and withdrawals** The procedures for making deposits and withdrawals have been streamlined, enabling you to select a wallet, then select if you want to make a deposit or withdrawal in a crypto- or fiat currency, and finally select one of the payment methods supported for a selected currency. After that, you get a deposit or withdrawal address or fill in the required fields to complete your transaction. **Internal withdrawals** On the **Funds** > **Withdraw** page, you can now select the **Internal User** option to withdraw funds from your wallet to the wallet of another user registered in the same B2CORE system. **Withdrawal presets** When making withdrawals on the **Funds** > **Withdraw** page, you can save withdrawal details as presets. A list of saved presets is now available upon clicking your profile icon and selecting **Withdrawal Presets** in the profile menu. Use saved presets to make quick withdrawals and eliminate the need to fill in the same information every time. **Transaction history** View the history of all your transactions on the same page by switching between the **Deposits**, **Withdrawals**, **Exchanges**, **Transfers**, and **Internal Withdraw** tabs. Details of a specific transaction can now be viewed by expanding the transaction row. **Platforms** The cards showing the essential information about your accounts opened on various platforms have a new look and provide all the familiar functionality. The enhanced form for adding new accounts makes it convenient to switch between demo and live options, select the account currency, and apply other settings. **HelpDesk** The **HelpDesk** interface has been updated. It has become more convenient to use the support chart, as well as work with tickets and track their statuses. Working hours of support teams in specific languages are now displayed in a popup. **Mobile app download** If the mobile app is supported, it can now be downloaded to your mobile device by clicking the **Download app** button in the top bar and scanning the displayed QR code. #### Improvements [#improvements-17] * A new **Temporary bonus name** column has been added to the **Bonus distribution** page in the Back Office, enabling you to indicate temporary bonus programs that are the most popular among clients. * Kyrgyz language is now supported for localization. If needed, the language can be enabled on the **System** > **Localizations** page in the Back Office. #### Resolved issues [#resolved-issues-11] * Information displayed on the **Advanced** tab in client details is now prevented from being accidentally reset to the same values for all registered clients. * The list of banks supported by **PaymentAsia** has been updated so that withdrawals made via the provider are processed correctly. *** ### November, 2023 [#november-2023] #### New features [#new-features-18] ##### Centroid integration [#centroid-integration] The **Centroid** platform providing connectivity to various trading platforms and liquidity sources has been integrated. With this release, it has become possible to create accounts in B2CORE by adding the accounts that have already been opened on Centroid, view information about the added accounts in the Back Office and B2CORE UI, and make balance operations, such as deposits, withdrawals, and transfers. ##### New document types for Shufti Pro [#new-document-types-for-shufti-pro] Along with `passport` and `selfie`, the `id_card` and `driving_license` document types supported by **ShuftiPro** can now be used for configuring KYC procedures in the Back Office. #### Improvements [#improvements-18] * When making deposits and withdrawals using **ChipPay** in the B2CORE UI, the **Phone Number**, **Name**, and **Region Country** fields are now automatically filled in with information from a client profile. * The possibility to initiate several identical deposit transactions in a row in the B2CORE UI has been eliminated. * It has become possible to archive trading accounts with non-zero balances in the Back Office, eliminating the need to transfer funds from the accounts before archiving them. In this case, the existing balance is kept on an archived account. If the account is unarchived, its balance will become available again to the account owner. * Back Office user groups displayed on the **System** > **Users** > **Groups** page can now be removed only if no users are included in those groups. * It’s no longer possible to disable the default localization option on the **System** > **Localizations** page in the Back Office. * The client type identifier is now sent in requests to deposit funds using **Praxis** to ensure that such transactions are properly processed by the payment provider. #### Deprecated functionality [#deprecated-functionality-9] * The option to **Allow users to share the same accounts** has been deprecated from a list of platform settings that can be configured on the **Products** > **Platforms** page. * Support for the KYC provider **Sapuma** has been deprecated in B2CORE. #### Resolved issues [#resolved-issues-12] * When enabling 2FA for Back Office users, the **Enable 2FA** popup can no longer be closed by an accidental click outside the popup. * The **Max Demo Trading Accounts** and **Max Live Trading Accounts** options are no longer set to 0 (zeros) after updating a list of rights for newly registered clients on the **Settings** tab in the Back Office. * Clients can now complete their deposits via **PayPal** by confirming deposit information on the payment provider page instead of receiving an error message and being redirected back to the B2CORE UI. * When making withdrawals in MYR using **PaymentAsi** in the B2CORE UI, instead of the empty **Bank Name** dropdown, a list of available bank names for making withdrawals is now displayed. * The issue due to which the “Receiver Repeat Bank Account” error occurred when approving client requests to withdraw funds using **ChillPay** has been eliminated. * Withdrawals made in the Back Office using the **manual** provider are no longer stuck in the **Pending** status. *** ### October, 2023 [#october-2023] #### New features [#new-features-19] ##### 2FA for Back Office users [#2fa-for-back-office-users] For Back Office users, it has become possible to enable 2FA by using time-based one-time passwords (TOTP) from 2FA apps, such as Google Authenticator, or by using verification codes sent to their email addresses. ##### HTML templates are now rendered before saving [#html-templates-are-now-rendered-before-saving] HTML email templates marked as enabled can now be saved in the Back Office only after they are successfully rendered and displayed in the preview. #### Improvements [#improvements-19] * The **Platform Group** field located in the details of MetaTrader products can no longer be edited after client accounts have already been created based on those products. * If the only email service provider is configured for sending marketing emails (**Mailing** > **Marketing** > **Configuration**) or system emails (**Mailing** > **System** > **Providers**), the provider can’t be disabled or removed. * It has been shorten the period during which a new withdrawal or transfer request can’t be created by a client in the B2CORE UI if the previous one is still pending. * The email template for sending codes required to confirm withdrawals made via B2BINPAY has been added to the Back Office, enabling users to receive confirmation codes for withdrawal transactions created on the **B2BINPAY** > **Withdrawals** page. * It’s now possible to attach large files when adding comments to the **Events log** in the Back Office. * In the list of sent marketing emails, **Instant** is now displayed in the **Sent At** column for emails that were immediately sent after they were set up and saved in the Back Office. #### Deprecated functionality [#deprecated-functionality-10] * The **B2BInPay v1** rates provider and **Anfitraud** module have been deprecated. #### Resolved issues [#resolved-issues-13] * The correct bank codes are now passed when clients make deposits in the B2CORE UI using **ChillPay**. In addition, all transaction statuses returned by **ChillPay** are now processed, ensuring that appropriate deposit statuses are displayed in the Back Office. * When making deposits in the B2CORE UI using **Mercuryo**, clients are now redirected to the correct payment provider page to complete their deposits. * The correct list of banks that can be selected to deposit funds in IDR using the **Help2Pay QR Payment** method is now displayed to clients in the B2CORE UI. * Successful deposits made using **NicePay** and **Perfect Money** are now correctly processed and no longer remain in the **Pending** status in the Back Office. * The invalid signature error that occurred after clients were redirected from the B2CORE UI to the **EeziePay** payment page has been fixed, enabling clients to complete their deposits. * Deposits in VND and CNY that were previously unavailable using **ChipPay** are now supported. * Transaction IDs (TxID ) generated for withdrawals made using B2BINPAY that were previously missing in withdrawal details in the Back Office are now displayed there. * Verification via **Shufti Pro** is now properly processed and causes no errors in the Back Office. * The **Create from TR denied** permission now works properly when enabled for eWallets and B2TRADER products in the Back Office. The permission forbids clients to add currencies and open B2TRADER accounts in the B2CORE UI. * The enabled reCapture no longer prevents clients from proceeding with the registration procedure in the B2CORE UI. * **MatchTrader** demo accounts are now opened with the start balance specified in the corresponding product configured in the Back Office. * The issue that made it impossible to load data on the **MT Accounts** tab in the client details has been eliminated. * The load of data on client accounts and balances in the Back Office has been accelerated. * The bulk action to make deposits to client accounts in the Back Office has been fixed to accept a product and a specific product currency in which deposits must be made. * Email notifications sent when the **TransferSuccessfulOperation** event occurs now include transfer details instead of displaying empty data. * The countries specified by clients during registration in the B2CORE UI are no longer removed from client profiles in the Back Office after any other profile data is edited by admins. * The clients are no longer prohibited from passing a verification procedure in the B2CORE UI if their current verification levels enable them to do this. * The free margin previously missed in the details of PrimeXM accounts in the Back Office is now displayed there. * In the Back Office, it’s now prohibited to disable product groups if they are connected to any product in order to forbid creating accounts without groups. * The **Country restrictions** option displayed in the dropdown upon clicking the **Actions** button on the **Edit product** page is no longer duplicated. * The **Export** option now exports data about all products created on the **Products** > **Products** page instead of exporting only the data about products listed on the current page. * The comments added to operations of allocating bonuses to client MetaTrader accounts in the Back Office are now added to MetaTrader as well. * If more than 50 currencies are added to a product, the list of added currencies isn’t now truncated when viewing product details and displays all the added currencies. *** ### August 9, 2023 [#august-9-2023] #### New features [#new-features-20] ##### PS integrations [#ps-integrations-1] * It has become possible to make withdrawals using the **FairPay** payment provider. Deposits with **FairPay** are available only in USD. * It has become possible to make withdrawals in THB using the **ChillPay** payment provider. * When making deposits using **ChillPay**, it has become possible to select one of the supported deposit methods: **Internet banking**, **Credit card**, **QR payment**, or **Bill payment**. ##### Validation of payment provider connections [#validation-of-payment-provider-connections] For the following methods, it has become possible to check payment provider settings by clicking the **Check connection** button added to the **Deposit method** and **Payout method** pages: * the **BridgerPay** deposit method * the **CHIP** deposit method * the **B2BINPAY** deposit and payout methods #### Improvements [#improvements-20] * It is now prohibited to make a withdrawal, transfer, internal transfer, or exchange operation if there is another such operation that hasn’t been completed yet. * When users change passwords for signing in to the Back Office, new passwords are now validated to meet the specified complexity requirements. * When changing the date of birth in client profiles in the B2CORE UI, the birth date for clients under the age of 18 can’t be entered. #### Resolved issues [#resolved-issues-14] * For the **Praxis** payment provider, redirection from the B2CORE UI to the payment page and back now works properly when making deposits. * The error that made it impossible to approve client requests to withdraw funds using the **Help2Pay** payment provider has been eliminated. * Enabling the **Skrill** payout method in the Back Office no longer causes errors on the **Funds** > **Withdraw** page of the B2CORE UI. * If the auto-withdrawal option is enabled in the Back Office, a withdrawal request created by a client in the B2CORE UI is now approved automatically after the requested amount is put on hold and the withdrawal request status is changed from **New** to **Pending**. *** ### May 29, 2023 [#may-29-2023] #### New features [#new-features-21] ##### Cashback rewards [#cashback-rewards] It has become possible to set up cashback reward programs for clients who trade on MT4 and MT5 upon navigating to **Cashback** > **MetaTrader Volume** in the Back Office. For each traded lot, clients can earn cashback rewards that are calculated based on the settings configured for each platform. #### Improvements [#improvements-21] * It is now possible to make deposits in GBP using **BridgerPay**. #### Resolved issues [#resolved-issues-15] * The HTML template used to notify Back Office users by email about successful deposits now includes all the essential information that was previously missing. * MT account balances can no longer become negative in the case when clients attempt to make repeated transfers from their accounts while the platform connection is being restored after it was lost. * Alphanumeric values are now supported for the **Zip code** field that must be specified when making deposits using **BridgerPay**. * In the B2CORE UI, the withdrawal amounts that are automatically calculated after clicking the **25%**, **50%**, **75%**, or **100%** button are now displayed with decimal separators properly placed. The decimal separators were missing if the Russian language was selected in the B2CORE UI. *** ### April 18, 2023 [#april-18-2023] #### Resolved issues [#resolved-issues-16] * Fixed an issue due to which event notifications failed to be delivered through Slack and email if the recipients list included the Back Office users whose profiles were removed. * Fixed an issue due to which the Back Office could hang when attempting to view the **Events Log** details. * Fixed an issue that prevented loading of the data on the **Finance** > **Payout** page. * Fixed issues due to which the successful deposits made using the **PerfectMoney** and **FairPay** payment providers could be assigned the **Pending** status in the Back Office. * Fixed an issue due to which the credentials of the payment provider assigned to the **WireDocument** method were displayed to clients when making deposits in the B2CORE UI. ### April 4, 2023 [#april-4-2023] #### New features [#new-features-22] ##### Detailed cTrader data available [#detailed-ctrader-data-available] The balance and equity values are now displayed for clients’ cTrader accounts in the Back Office and B2CORE UI, as well as the data about deals, orders and open positions. ##### Bulk deposits to client accounts [#bulk-deposits-to-client-accounts] It has become possible to update account balances for multiple clients at once by using the **Update balances** button on the **Client** > **Accounts** page. After clicking the button, upload a CSV file containing a list of client emails, account IDs and amounts that you want to deposit to each account. #### Improvements [#improvements-22] * The **email**, **password** and **password\_confirm** fields are now displayed on the **Custom fields** tab when configuring the Registration wizard in the Back Office. You can change the order in which they are displayed in the registration form in the B2CORE UI. * To eliminate B2TRADER connection issues caused by the incorrectly specified value in the **Callback URL** field, this field has been removed from the configuration settings of the B2TRADER platform. The URL for sending callback messages is now set during B2CORE setups. * Tooltips are now displayed when positioning a cursor over the **Process**, **Cancel** and **Change status** buttons that can be used to manually process the transactions with the **Partial** status on the **Finance** > **Transactions** page. #### Resolved issues [#resolved-issues-17] * Fixed an issue due to which, after editing the data on the Back Office user details page, an email notification based on the **AdminUserCreated** template was sent. * Fixed an issue due to which newly registered clients couldn’t pass a verification procedure after clicking the **Next step** button on the **Verification** page in the B2CORE UI. * Fixed an issue due to which an error occurred when uploading the documents required for verification in the B2CORE UI. * Fixed an issue due to which the status of a closed help desk ticket could be updated in the B2CORE UI only after reloading the page. *** ### March 21, 2023 [#march-21-2023] #### Improvements [#improvements-23] * The **OTC 365** payment provider has changed its name to **ChipPay**; B2CORE continues to support deposits and withdrawals made with the provider. * The options for managing event notifications have been updated as follows: * The list of events about which Back Office users can be notified has been expanded by adding new [event types](../back-office-guide/references/event-types-for-triggering-event-notifications-for-back-office-users). To set up event notifications, navigate to **System** > **Event notifications**. * It has become possible to send event notifications to multiple Back Office users. * The available channels for sending event notifications now include Slack, Telegram, email and SMS. For Slack and Telegram, it has become possible to choose whether to send notifications to public channels and groups or as personal messages. * For each Back Office user, it has become possible to specify the identifiers of their personal Slack and Telegram chats for receiving event notifications. The identifiers are specified on the user details page upon navigating to **System** > **Users**. * On the **System** > **Logs** page, you can now track actions made by Back Office users. * The **Internal comment** column has been added to the **Finance** > **Deposits** and **Finance** > **Payout** pages. #### Resolved issues [#resolved-issues-18] * Fixed an issue due to which country restrictions didn’t apply to the document types defined for a verification procedure. * Fixed an issue due to which no data could be displayed in the **TradingView** widget after switching between workspaces in the Trading UI. * Fixed an issue due to which the **Resolved** status assigned to a ticket in an external help desk system appeared as **Duplicate** in the B2CORE UI. * Fixed an issue due to which the error “Signature is invalid” occurred when depositing funds using the **Mercuryo** payment provider. *** ### February 28, 2023 [#february-28-2023] #### New features [#new-features-23] ##### New PS integrations [#new-ps-integrations-10] A new payment system, **Nicepay**, has been integrated, with support for deposit operations. #### Improvements [#improvements-24] * It has become possible to configure separate verification flows for different types of clients. * It has become possible to configure the settings of the **Simple Exchange** widget by navigating to **Promotion** > **Dashboard** in the Back Office. * The following fields for configuring mobile banners are now optional: **Title**, **Subtitle**, **Button Title** and **Preview Text**. * The invalid data contained in a CSV or TSV file is now ignored when importing client-related data on the **System** > **Import data** page. Such import operations are assigned the **Success with errors** status. * Fixed table headers and filter fields are now used for tables displayed on various pages of the Back Office. * The internal Back Office library has been updated and now includes updated form fields, pagination components and others. #### Resolved issues [#resolved-issues-19] * Fixed an issue due to which it was impossible to automatically upload predefined options for custom fields added for the **Constructor** method by retrieving them from a specified API resource if the API response was not linear. * Fixed an issue due to which temporary bonuses didn’t expire after reaching the specified lifetime value. * Fixed an issue due to which it could have been impossible to close the documents opened for preview in the **Verified documents** section in the B2CORE UI. *** ### February 14, 2023 [#february-14-2023] #### Improvements [#improvements-25] * When adding custom fields for deposit and withdrawal methods using the **Constructor** payment provider, it has become possible to upload a list of field options by connecting to a client’s API and retrieving the required values instead of specifying them manually. * It has become possible to make internal transfers from the wallets of the **partner** type to the wallets of the **personal** type and trading accounts. * When creating client accreditation tests, it has become possible to specify test descriptions in the **Details** field. The test descriptions are displayed under test titles in the B2CORE UI. * It has become possible to filter client requests by the **Dealing approved** and **Compliance approved** columns on the **Clients** > **Requests** page in the Back Office. * On the **Services** > **Clients** page, it has become possible to filter data by the dynamic columns. * For exchange transactions made by the admin user in the Back Office, the Exchanged By column now displays the name or email address of the admin who made a transaction. #### Resolved issues [#resolved-issues-20] * Fixed an issue due to which the **Hold Amount** column wasn’t exported to an XLSX or CSV file from the **Clients** > **Accounts** page of the Back Office. *** ### January 31, 2023 [#january-31-2023] #### New features [#new-features-24] ##### Export and import options for Back Office user groups [#export-and-import-options-for-back-office-user-groups] It has become possible to export and import the data about Back Office user groups on the **System** > **Users** > **Groups** page. #### Improvements [#improvements-26] * The total deposit, total net deposit and total withdrawal amounts in USD are now displayed for each client on the **Accounts** tab in client details. Additionally, the total deposits and total withdrawals by all clients are displayed on the **Finance** > **Deposits** and **Finance** > **Payouts** pages. * The **Select**, **Select All** and **Edit selected clients** buttons have been added to the **Clients** > **General** page. Use them to collectively assign client tags and change client profile statuses. * When assigning tags to clients, it has become possible to replace the existing tags with the new ones by enabling the **Overwrite current values** option. * The email template used for notifications about new comments in the Event Log now includes the name of an admin user who has been tagged in a comment along with the admin email address. * When configuring deposit and withdrawal methods in the Back Office, a list of available currencies is now sorted alphabetically. #### Resolved issues [#resolved-issues-21] * Fixed an issue due to which an incorrect localization option could have been applied to emails notifying clients about newly created trading accounts. *** ### January 19, 2023 [#january-19-2023] #### New features [#new-features-25] ##### New PS integrations [#new-ps-integrations-11] * The **FairPay** payment provider has been integrated, with support for deposit operations. * The option to make withdrawals in fiat currencies using the **Mercuryo** payment provider has become available. ##### Match-Trader integration [#match-trader-integration] A new all-in-one FX trading platform **Match-Trader** has been integrated, providing the capability for managing client trading accounts and finances via the Back Office and B2CORE UI. ##### cTrader integration with IB [#ctrader-integration-with-ib] cTrader has been integrated with Introducing Brokers (IB), allowing you to configure and enable IB programs on this platform. ##### Feedback for HelpDesk services [#feedback-for-helpdesk-services] The system for collecting feedback has been integrated, enabling your clients to assess the quality of your HelpDesk service and leave their comments about resolved tickets. #### Improvements [#improvements-27] * It has become possible to import data related to IB programs (such as IB Email, Client Email and IB Type ID) by using a new import option named `import-ibs`, available upon navigating to **System** > **Import Data** in the Back Office. * When configuring verification levels in the Back Office, it has become possible to specify level descriptions separately for the B2CORE UI (in the HTML format) and for the mobile app (in the JSON format). * Specifying banner titles for desktop and mobile app versions has become optional. * When manually processing transactions with the **Partial** status, listed on the **Finance** > **Transactions** page, the modal windows containing explanations of further user actions are now displayed after clicking the **Push**, **Cancel** or **Change status** buttons. * To allow various departments to add specific parameters for configuring paid services, it has become possible to set up access to service parameters for different groups of Back Office users by navigating to a new **Services** > **Categories** page. * For temporary bonus programs, the **Traded lots** field is now displayed in the B2CORE UI, showing the volume traded by a client and matching the requirements of a bonus program. * It has become possible to set up delivery of email notifications to clients each time they sign in to the B2CORE UI. Such notifications contain the following sign-in details: date and time, IP address, device type, browser and location. #### Resolved issues [#resolved-issues-22] * Fixed an issue due to which it was impossible to upload a profile picture via the B2CORE UI if the uploaded image needed to be cropped to match the required size of 200x200 pixels. * Fixed an issue due to which admins who were permitted to view only the clients with certain tags couldn’t view the data on the **Bonuses** > **Bonus Distribution** page and create bonuses. * Fixed an issue due to which an error occurred after passing a client accreditation test if it included a close-ended question for which no correct answer options were specified. ### December 20, 2022 [#december-20-2022] #### Improvements [#improvements-28] * It has become possible to limit session time for Back Office users by specifying the session duration using the **User-admin Session** option added to the **System** > **Settings** page. After reaching a specified time limit, users are automatically signed out of the Back Office. * The **Device Management** section available on the **Profile** > **Security** page has been updated to log data about devices, IP addresses and locations from which clients sign in the B2CORE UI. * A new **IB** > **Reports** > **Trades** page has been added to IB programs in the B2CORE UI. #### Resolved issues [#resolved-issues-23] * Fixed an issue due to which it was sometimes impossible to import to the Back Office the data about client dates of birth. * Fixed an issue due to which an error occurred when uploading client profile pictures via the Back Office. *** ### December 6, 2022 [#december-6-2022] #### Improvements [#improvements-29] * The option to specify ranges of MT account numbers that can be assigned to newly created client accounts is now available to MT platforms switched to the Frontman v4 connection. * To help you identify MT groups, the name and identifier of a product to which a selected MT group belongs are now displayed when moving MT accounts between the groups. * To prevent incorrect interpretation of decimal amounts, it is no longer possible to change a character specified as a decimal separator on the **System** > **Localizations** page. *** ### November 24, 2022 [#november-24-2022] #### New features [#new-features-26] ##### Data import to the Back Office [#data-import-to-the-back-office] It has become possible to import data about clients and their accounts that was previously exported from other third-party systems to a CSV or TSV file. For this purpose, a new **System** > **Import Data** menu item has been added to the Back Office. #### Improvements [#improvements-30] * On the **Clients** > **General** page, it has become possible to assign tags to multiple clients or change their profile statuses at once. * **Profile pictures for Back Office users**: it has become possible to upload avatars to Back Office user profiles. Avatars can help you quickly identify users that add comments to the Event log. * It has become possible to confirm withdrawals that clients make in the B2CORE UI by entering 2FA codes from the **Google Authenticator** app. * A new **Exchanged By** column has been added to the **Finance** > **Exchange** page and the **Transactions** tab in the client details. The column indicates if an exchange operation was made by a client in the B2CORE UI or by an admin in the Back Office. * On the **Finance** > **Deposit wallets** page, it has become possible to select filtering values for the **Method** and **Currencies** columns. * The template used for Slack notifications about withdrawal requests has been updated to include the following fields and links to the corresponding Back Office pages: **Project**, **Client name**, **Client email** and **Task** (containing a link to a withdrawal request that must be approved or rejected). * A new set of permissions for managing parameter presets (which can be configured on the **Clients** > **Services** > **Saved presets** page) has been added to the **Client’s services** permission category: * View presets * Create presets * Update presets * Delete presets * For deposit and payout methods using the payment provider titled **Constructor**, it has become possible to select a field type (**text** or **Select with autocomplete**) when adding custom fields to a method. Depending on a selected field type, the added fields are displayed in the B2CORE UI as simple text fields or text fields with suggested values. ### November 8, 2022 [#november-8-2022] #### New features [#new-features-27] ##### Commission Cashback [#commission-cashback] A new **Commission Cashback** menu item has been added to the Back Office, making it possible to distribute rewards between the users who have contributed to the promotion of a specified token. The rewards are distributed as portions of commissions earned from trading the token on an exchange for a given period. #### Improvements [#improvements-31] * When configuring banners on the **Promotion** > **Banners** page, it has become possible to select an appropriate banner type: **Desktop** or **Mobile**. * On the **Event log** page, when attaching an image to a message, a user can now expand this image without opening it on a new tab. * For client requests of the **Transfer** type, the **From free funds** field has been added, displaying the amount of available funds on a client’s account. * For balance change operations, the **Operation type** names have been changed as follows: * from **Credit** to **Deposit** * from **Debit** to **Withdraw** * For the **Advanced** step of the **Registration** wizard, it has become possible to apply the `unique_id_card_number` rule to ensure that clients specify unique ID card numbers during registration. * It has become possible to check whether transactions with the **Partial** status have been executed on the MetaTrader platform by clicking the magnifying glass icon: * If a transaction was executed on a trading platform, its status in the Back Office changes to **Done**. * If a transaction is not found on a trading platform or the platform doesn’t support transaction check, you can process this transaction in the Back Office by clicking the **push**, **cancel** or **confirm** button. * The **cancel** button can now be used to cancel a transaction in the Back Office and attempt to cancel it on a trading platform if this transaction is found there. * The order in which deposit and withdrawal methods are displayed to clients in the B2CORE UI is now determined by the priority assigned to these methods in the Back Office. * When configuring menu options on the **Promotion** > **Menu** page, it has become possible to select the types of clients for which a particular menu option is available in the B2CORE UI. * The **Export** button has been added to the **Security** > **Search by IP** page, providing the capability to export filtered data to a CSV or XLSX file. * The data displayed on the **Services** tab in the client details can now be filtered by all columns. #### Resolved issues [#resolved-issues-24] * Fixed an issue due to which some clients couldn’t receive Slack notifications related to the Event log and withdrawal operations. * Fixed an issue that caused incorrect calculation of bonuses for trading accounts having the **Factory** value set to 100. *** ### October 25, 2022 [#october-25-2022] #### Improvements [#improvements-32] * It has become possible to allocate temporary bonuses only to trading accounts included in the selected MT platform groups. * It has become possible to upload 7-Zip and RAR archives to client folders using the **Upload multiple files** option on the **Files** tab in the client details. * After changing a client’s email address, the email used for the HelpDesk service now changes automatically. This enables clients to view the history of reported tickets, their statuses and message threads. * When entering a value in the **Withdrawal amount** field in the B2CORE UI, the **Source amount** field is now filled in automatically and displays a withdrawal amount in conversion to a required currency. * The answers to open-ended questions used in client tests are now saved after clicking the **Next** button and are not discarded if a client goes back to previous questions. * The banners configured for the **Referral Programs** section of the B2CORE UI are now displayed on a dashboard instead of being placed on top of the page. *** ### October 11, 2022 [#october-11-2022] #### New features [#new-features-28] ##### BitWallet supports withdrawal operations [#bitwallet-supports-withdrawal-operations] In addition to deposit operations, the **BitWallet** payment provider now supports withdrawal operations. ##### A White Label solution for cTrader [#a-white-label-solution-for-ctrader] It has become possible to configure a connection to the cTrader platform as a White Label solution by specifying the required company name in the **White label** field. #### Improvements [#improvements-33] * It has become possible to specify a lifetime for announcements to be displayed to clients in the B2CORE UI. The announcements expire on the **Due Date** specified in the announcement details and are no longer displayed to clients. * When exporting data from the Back Office to a file, it has become possible to choose the file format: XLSX or CSV. * The **Burn if balance \< 0** option has been revised to burn bonuses once equity on an MT account becomes less than the account credit (Equity \< Credit). *** ### September 27, 2022 [#september-27-2022] #### New features [#new-features-29] ##### New PS integrations [#new-ps-integrations-12] A new payment provider, **Advanced Payment Systems (APS)**, has been integrated, with support for deposit operations. ##### Password reset for master and investment accounts [#password-reset-for-master-and-investment-accounts] When clients reset passwords for their MetaTrader 4/5 accounts in the B2CORE UI, they are now required to select whether they want to reset a password for their master or investment account. #### Improvements [#improvements-34] * In order to control which images clients upload as their profile pictures in the B2CORE UI, a new request type named `Avatar` has been added. * The maximum allowed amount for internal transfer operations per day can now be set in the **Daily internal transfer** field in the verification level details. If a client wants to make an internal transfer after reaching a specified limit, a request for the internal transfer must be approved by an admin. * The **Total Balance** widget now supports conversion of the total balance on all client’s wallets to any of the currencies available in your B2CORE system. * The buttons to process, confirm or cancel transactions with the **Partial** status have been added to the **Finance** > **Transactions** page. * For demo-type products, it is now required to fill in the **Starting Amount** field. This field indicates the initial amount that is credited to demo accounts created for this product. #### Resolved issues [#resolved-issues-25] * Fixed an issue due to which it was impossible to directly navigate to a comment added on the **Even log** tab in the client details after clicking a notification displayed in the top bar. * Fixed an issue due to which the client name wasn’t displayed in the email sent after successful registration. *** ### September 13, 2022 [#september-13-2022] #### New features [#new-features-30] ##### Support for hedged and netted account types for cTrader [#support-for-hedged-and-netted-account-types-for-ctrader] A new option to specify a hedged or netted account type is now available when creating products for the cTrader platform. Based on the product settings, clients can select an account type when creating cTrader accounts in the B2CORE UI. ##### A new event type to trigger event notifications [#a-new-event-type-to-trigger-event-notifications] It has become possible to receive event notifications via Slack and email about accreditation tests passed by clients. ##### The capability to select a fixed percentage to transfer or withdraw [#the-capability-to-select-a-fixed-percentage-to-transfer-or-withdraw] In the B2CORE UI, clients can now select a fixed percentage of their account balance that they want to transfer or withdraw (the available options: 25%, 50%, 75% and 100%). #### Improvements [#improvements-35] * The process of configuring a workflow for the Registration wizard has been enhanced to allow you to quickly add the Basic Information fields and specify their settings on the **Custom fields** tab. * For close-ended questions included in client accreditation tests, it is now possible to choose if you want to add a single or multiple correct answers. * The **Internal transfer** type has been separated from the rest of the transfer operations. You can filter a list of transfer operations by the **Type** column. * On the **Finance** > **Deposit Wallets** page, the **Method** column now displays a link to the details of a deposit method used to generate a wallet address. * The **Test connection** option for the B2TRADER platform now validates the credentials specified in the **Front Office Client ID** and **Front Office Client Secret** fields in addition to the other connection settings. * The tabs displayed on the client details page have been reorganized for easier navigation. * It has become possible to select specific folders and files that you want to download from the **Files** tab displayed on the client details page. * A client phone number is now displayed in the **Personal information** section of a client profile in the B2CORE UI. * The language specified in the **Communication Language** field in a client profile is now automatically applied to the **Language Department** field when creating a ticket on the **HelpDesk** page in the B2CORE UI. * It has become possible to search submitted tickets by their **Ticket ID** on the **HelpDesk** page in the B2CORE UI. #### Resolved issues [#resolved-issues-26] * Fixed an issue due to which the description of the first selected deposit method was displayed for the other deposit methods available to a client in the B2CORE UI. * Fixed an issue due to which the default B2TRADER workspace wasn’t restored after clicking the **Reset** button if the workspace had previously been closed. *** ### August 30, 2022 [#august-30-2022] ##### Exchange and transfer operations between various platforms [#exchange-and-transfer-operations-between-various-platforms] It has become possible to exchange and transfer funds between wallets and accounts created on the B2TRADER, cTrader and MetaTrade platforms. ##### Support for Google Pay [#support-for-google-pay] You can enable Google Pay for specific payment systems to add one more option for your clients to deposit funds. ##### A new bonus expiration mechanism [#a-new-bonus-expiration-mechanism] It has become possible to configure partial bonus expiration for clients upon withdrawing funds. The new options have been added to the **Bonuses** section, which is available in **System** > **Settings** in the Back Office. #### Improvements [#improvements-36] * A new **Client Tags** menu item has been added to the **System** > **Users** section. Use this option to view a list of existing client tags and create new ones. * The following improvements related to the **Event log** have been introduced: * The **Events log** > **List** page now shows a list of comments added in the Back Office that you can view based on the assigned client tags. * It has become possible to add descriptions to the Event log categories in order to indicate the purpose of each category. * Slack notifications about new comments added on the **Event log** tab now contain the text of these comments. * In the top bar, the red counter badges are now only displayed when the number of unread notifications is not zero. * The links to download cTrader for supported operating systems have been added to the **cTrader** page in the B2CORE UI. * The **Equity** charts displayed on MT account cards and in the account details in the B2CORE UI have been synchronized to show the same data. * The **Next step** button is no longer displayed on the **Verification** page in the B2CORE UI if no KYC wizard is specified for a verification level in the Back Office. * On the **Exchange** page in the B2CORE UI, more accurate exchange results are now displayed in the **Amount To** field. #### Resolved issues [#resolved-issues-27] * Fixed an issue due to which the country allocation rules were ignored when allocating newly registered clients among managers. * Fixed an issue due to which it was impossible to withdraw funds using the manual and constructor methods unless a PS currency (in which funds are debited) was specified, which is not a requirement for these methods. * Fixed an issue due to which it was impossible to search through a list of tickets reported by a client on the **HelpDesk** page in the B2CORE UI. *** ### August 16, 2022 [#august-16-2022] #### New features [#new-features-31] ##### New KYC provider integrations [#new-kyc-provider-integrations] A new KYC provider, **Sapuma**, has been integrated, adding one more option for running an automatic KYC verification process. When using **Sapuma**, in addition to required fields, you can define a list of custom fields (such as NIK, Place of Birth, Email, First Name, Date of Birth, Phone Number, Address, City, State, Country and ZIP Code) that your clients must fill in to get verified unless these fields have been already specified in a client profile. ##### Deposit method constructor [#deposit-method-constructor] It has become possible to configure a new deposit method using the payment provider titled **Constructor**, which allows you to create a custom deposit form by adding to it a required number of text fields that your clients must fill in when creating requests for deposit operations. #### Improvements [#improvements-37] * For bank transfer operations made using the **Midtrans** payment provider, clients now should specify only a transfer amount and select a bank. The other required fields are filled in with the data specified in a client profile. * The Backend images menu item has been added to the System section, allowing users to change logos and other images related to the Back Office. * It has become possible to add questions of three types to client accreditation tests: * open — indicates an open-ended question that can be answered by clients in free form. * close — indicates a close-ended question that can be answered by clients by choosing only one correct answer from a given list of options. * questionnaire — indicates a multiple choice question that can be answered by clients by choosing one or more answers from a given list of options. * A new status **Test results pending** has been added to specify that a client passed an accreditation test and the admin should check test results and either approve or reject them. * When MT4 and MT5 accounts are added to another account group, the account details (such as **Product ID**, **Caption** and **Currency**) are now updated automatically according to the group configuration. If the previous group was associated with a product that supports multiple currencies, the **Product ID** doesn’t change. * The **Events log** has been enhanced as follows: * The buttons **View comments** and **Reply** have been added to the **Events log** tab, enabling you to expand comment threads and add new comments to them. * Slack notifications about new comments for which you are marked as a recipient now contain links to particular comments added in the Back Office. * The currencies enabled for the **B2TRADER** product in the Back Office are now automatically added as assets to the exchange. * The bulk action to zero out client B2TRADER accounts has been enhanced to support the following options: * Enable or disable email distribution informing clients about an executed bulk action. * Execute a bulk action for all enabled currencies. * Specify the identifier of a withdrawal operation in the System log. * Support additional statuses identifying whether a bulk action was completed. * The date and time displayed for *transfer*, *deposit* and *withdrawal* transactions on the **Transactions** page of the B2CORE UI now indicate when transactions were processed. #### Resolved issues [#resolved-issues-28] * Fixed an issue due to which on the **System** > **Countries** page, the name of a national currency was displayed in the **Citizenship** column instead of the **Currency** column. *** ### August 2, 2022 [#august-2-2022] #### New features [#new-features-32] ##### A new mechanism for configuring automatic withdrawals [#a-new-mechanism-for-configuring-automatic-withdrawals] The options for enabling automatic withdrawals have been detached from verification levels and become associated with the **payout** operation type (available upon navigating to **System** > **Operation types**). The following new settings have been added to the **payout** operation type details: * **Auto withdrawal** — this setting enables or disables the auto-withdrawal feature. * **Auto processing rules** — this setting specifies for which payout groups the auto withdrawal feature is enabled. All payout methods included in the specified payout groups will support auto-withdrawals. For each verification level, the maximum amounts allowed for automatic withdrawals can be set in the **Auto withdraw** field located in the verification level details. ##### Client accreditation tests associated with verification levels [#client-accreditation-tests-associated-with-verification-levels] When configuring a verification level, it is now possible to use a new **Passed Tests Needed** option and select a required accreditation test that your clients must pass before submitting documents for obtaining this verification level. #### Improvements [#improvements-38] * In order to preserve settings of the configured platforms, it is no longer possible to remove an existing external connection if it is associated with the platform set up to use this connection. * The columns that were previously available in the currency details for displaying detailed information about currencies (such as **Markup: Sell**, **Markup: Buy**, **Precision** and **Block explorer**) have been moved to the **Currencies** > **Currencies** section. Here, you can now view the complete data related to a currency as well as filter and sort this data by the available columns. * The maximum number of digits used to represent amounts in a currency in the B2CORE UI has been increased to 18. * The account cards shown to your clients in the B2CORE UI now display the time when an account balance was last updated and stay active even if the data about account balance is expired, still allowing your clients to operate their accounts. #### Resolved issues [#resolved-issues-29] * Fixed an issue that made it impossible to add the **email** option to the list of channels for the existing event notification. * Fixed an issue due to which the **Quick Links** widget didn’t display the link to the **IB** section in the case when this section was available in the B2CORE UI. *** ### July 19, 2022 [#july-19-2022] #### New features [#new-features-33] ##### Event Notifications [#event-notifications] With this release, it has become possible to set up notifications about particular events and send them via Slack and email. To configure notifications, navigate to a new **System** > **Event Notifications** section of the Back Office. The following events may trigger notifications: * **Tagging users in the Event log** — notifications about the notes and comments added on the **Event log** tab in the client details, for which users are marked as recipients. * **Payout requests** — notifications about payout requests created by clients. ##### Slack bot integration [#slack-bot-integration] A Slack bot has been integrated, adding one more channel for sending event notifications. #### Improvements [#improvements-39] * The **Mailing Log** tab has been added to the client details, allowing you to view a list of emails sent to a specific client. On this tab, you can export the email list to a CSV file. * The **Hide balances** option has been added to the **Wallets** section of the B2CORE UI, allowing clients to hide balances on their wallets for security purposes. * The **Use redirect location only** option has been added to the **PAMM** > **Links** section of the Back Office. With this option, you can redirect your clients to your own PAMM platform (using the URL specified in the **Redirect location** field) without attempting to authenticate them and create payment accounts. #### Resolved issues [#resolved-issues-30] * Fixed an issue due to which it was impossible to display the available options in the **Document groups** field in the verification level details. * Fixed an issue due to which clients were redirected to the **Sign In** page instead of the **Sign Up** page upon clicking the **Not a member? Sign up now** option in the case when they had previously signed out from the B2CORE UI. * Fixed an issue due to which it was impossible to save color settings applied to the **TradingView** widget after reloading the page. *** ### July 5, 2022 [#july-5-2022] #### New features [#new-features-34] ##### Enhanced security permissions for user groups [#enhanced-security-permissions-for-user-groups] With this release, you can restrict user access to entire sections of the B2CORE UI by disabling specific “view” options in the **System** > **Groups** section. #### Improvements [#improvements-40] * A new engine for the payment system RAMP has been implemented, following the recent major update to B2BINPAY, an integrated payment provider. * When creating a new verification level, you can now choose from among the available KYC providers that are listed in the Wizard drop-down menu displayed in the **Verification** > **Levels** section. * The Wallets Overview widget now displays the aggregate balance on all user wallets opened in the same currency. * It has become possible to introduce custom steps to the Registration Wizard pages displayed for the Advanced workflow type. #### Resolved issues [#resolved-issues-31] * Fixed an issue due to which duplicate transaction details were displayed upon rejecting a transfer request. * Fixed an issue due to which an incorrect commission currency was displayed in the Market/Limit widget. * Fixed an issue due to which different currencies were highlighted with the same color in the Wallets Overview widget. *** ### June 21, 2022 [#june-21-2022] #### New features [#new-features-35] ##### New PS integrations [#new-ps-integrations-13] A new payment provider, **PaymentAsia**, has been integrated, with support for both deposit and withdrawal operations. ##### Event log categories [#event-log-categories] It has become possible to define categories to organize notes and comments that are added on the **Event log** tab in the client details. For this purpose, a new **Clients** > **Events log** section has been added to the Back Office. ##### Enhanced multiselect fields for service parameters [#enhanced-multiselect-fields-for-service-parameters] The multiselect fields available for configuring service parameters (in the **Clients** > **Services** > **Parameters section**) have been modified to allow you to quickly move predefined options between two columns to enable or disable them. #### Improvements [#improvements-41] * The process of creating eWallet and B2TRADER products has been streamlined: it is now possible to select and enable multiple currencies when creating your products. * The following B2TRADER widgets can be added to the default Dashboard layout: **Assets**, **Watch List**, **Open Orders**, **Filled Orders** and **Order Book**. * It has become possible to hide QR codes displayed for signing in to the B2CORE UI from the **Sign In** page by leaving the Lifetime parameter (which is available in the **System** > **Settings** section of the Back Office) empty. * The size of QR codes displayed on the B2CORE **Sign In** page has been increased, making it possible to scan them using mobile devices with iOS 13 and 15. * The option for toggling password visibility by clicking the **Eye** icon has become available on the B2CORE **Sign In** page. * The password reset process for MT accounts has been streamlined: the window for selecting a password reset option (by either generating a random password or specifying a custom password) is no longer displayed if the Change Account Password (MetaTrader) wizard is disabled. * A request form on the HelpDesk has been extended to include a specific set of fields depending on the selected request option. #### Resolved issues [#resolved-issues-32] * Fixed an issue that made it impossible to sign in to the B2CORE UI when Google reCAPTCHA v2 was enabled. * Fixed an issue that prevented QR codes from being displayed on the B2CORE Sing In page when the light theme was enabled. * Fixed an issue due to which the Settings section of the B2CORE UI was unavailable in the case when a client wasn’t signed in to B2TRADER. *** ### June 7, 2022 [#june-7-2022] #### New features [#new-features-36] ##### Support for a new trading platform [#support-for-a-new-trading-platform-1] With this release, **cTrader** has been integrated, allowing your clients to create cTrader trading accounts via the B2CORE UI. ##### Signing in to the B2CORE UI with QR codes [#signing-in-to-the-b2core-ui-with-qr-codes] It has become possible to sign in to the B2CORE UI by scanning QR codes displayed on the **Sign In** page from the B2BROKER app to which you are already signed in. ##### Custom passwords for MT accounts [#custom-passwords-for-mt-accounts] The option to set up custom passwords for MT accounts has become available in B2CORE. Now clients can choose to set up custom passwords or generate random passwords for their MT accounts. #### Improvements [#improvements-42] * The B2CORE signup process has been improved for the cases when an expired invitation link is used to complete registration: the corresponding message is now displayed to users, and after that they are redirected to the **Sign Up** page of the B2CORE UI. * The option to select widgets that you want to shown on the default **Dashboard** via the B2CORE UI has been added. For this purpose, enable the **Show by default** switch for the required widgets in the **Promotion** > **Dashboard** section of the Back Office. * It has become possible to upload profile photos and specify nicknames for clients via the Back Office and B2CORE UI. #### Resolved issues [#resolved-issues-33] * Fixed an issue that made it impossible to open the details of MT demo accounts and display analytics data on them via the B2CORE UI. * For deposit methods for which transaction and payment currencies are set, fixed an issue due to which the minimum and maximum deposit values specified for a payment currency were applied to a transaction currency instead, which resulted in showing incorrect validation messages for the amounts that clients specified in the **Deposit amount** field via the B2CORE UI. * Fixed an issue that caused the data to be displayed beyond the column borders in the **Quotes Widget MT** in the case of a small widget size. * Fixed an issue that caused display of a list of available B2TRADER widgets instead of the **Quick Limit Order** and **Quick Market Order** widgets after their adding to a space. * Fixed the following issues related to the B2TRADER widget tooltips: * Fixed an issue that caused a B2TRADER space to become inactive after the last widget tooltip was displayed. * Fixed an issue due to which widgets located in the upper part of a B2TRADER space were not fully shown during the display of their tooltips. * Fixed an issue that resulted in showing the tooltip for an inactive **TradingView** widget. *** ### May 24, 2022 [#may-24-2022] #### New features [#new-features-37] ##### Support for new platforms [#support-for-new-platforms] With this release, **OneZero** and **PrimeXM** have been supported. The section for managing OneZero and PrimeMX accounts is now available under the **Platforms** menu item in the B2CORE UI. To display these accounts, enable the **OZ/PXM** option (**Promotion** > **Menu**) in the Back Office. ##### New KYC provider integration [#new-kyc-provider-integration] A new KYC provider, **ShuftiPro**, has been integrated, allowing you to verify client identity and documents. ##### A new Custom Commissions widget [#a-new-custom-commissions-widget] A new widget, containing data on commissions that have been customized for clients trading on particular markets, is now available upon navigating to **Profile** > **Settings** via the B2CORE UI. This widget is only displayed to the clients who have been added to the **Commissions** / **Custom** group. #### Improvements [#improvements-43] * It has become possible for clients to set up the default configuration for the **Dashboard** via the B2CORE UI by selecting the required widgets and customizing their parameters, such as the size and location on the dashboard. The default configuration set by a client is restored after resetting the **Dashboard** or signing out of the B2CORE UI. * The **I Agree to** checkbox, allowing you to get consent to custom agreements and terms from your clients, has been added to the cards for creating MT4/MT5 accounts. A link to the document to which clients should agree is specified in the **Agreement Link** field when configuring products via the Back Office. #### Resolved issues [#resolved-issues-34] * Fixed an issue that prevented loading of the **Trades History** widget when clicking the **B2TRADER** menu item in the B2CORE UI. * Fixed an issue with the **TradingView** widget that Firefox users might encounter: the widget displayed no data after switching between menu items in the B2CORE UI in the case when the widget had been previously changed to display specific data. * Fixed an issue that caused display of an incorrect flag on the **Sign up** screen when registering to the B2CORE UI with a phone number starting with +7. *** ### April 26, 2022 [#april-26-2022] #### Improvements [#improvements-44] * A new **Reaction Date** field has been added to the announcement details (**Promotion** > **Announcements**) in the Back Office. The new field shows the date and time when a client interacted with an announcement via the B2CORE UI. * When downloading client files from the Back Office, the filenames displayed in the **Caption** column on the **Files** tab in the client details are now used as filenames for the downloaded files. * The **Compliance approved** field has been added to client requests for withdrawals as well as to the list of withdrawal operations displayed upon clicking **Finance** > **Payouts**. This field identifies whether a compliance check for a withdrawal operation has been passed. The status of this field can be changed only by admin users who have been assigned the corresponding **Compliance approved** permission. #### Resolved issues [#resolved-issues-35] * Fixed an issue related to MT accounts that caused displaying MT4 accounts in the MT5 menu option and MT5 accounts in the MT4 menu option via the B2CORE UI. * Fixed an issue that caused the **Quick Link** widget to display no data in case the PAMM option has been enabled for the B2CORE UI. * Fixed an issue due to which the correct email and phone confirmation codes would not be accepted during the validation process under certain circumstances. *** ### April 12, 2022 [#april-12-2022] #### Improvements [#improvements-45] * Support for withdrawal operations has been added for the **Midtrans** payment provider. * The capability to customize the priority of exchange rate providers for each currency pair has become available via the Back Office. For this purpose, the **Rates Custom Priority** field has been added, allowing you to set the existing exchange rate providers in a desired order (for details, refer to [How to set priorities for exchange rate providers](../how-to-articles/manage-currencies/how-to-set-priorities-for-exchange-rate-providers)). * The option for auto withdrawal has become applicable to all payment providers integrated into B2CORE. Clients do not need a B2CORE admin’s approval to withdraw amounts that do not exceed those specified in the **Auto withdraw** field for each verification level. * It has become possible to change the text color when adding notes on the **Event log** tab. * The **Wallets Overview** widget has been renamed to **Total Balance** and now displays the total balance on all client’s wallets in conversion to a selected currency (the widget supports the following currencies: USD, EUR, INR, CAD and GBP). A list of currencies that will be available to clients while displaying the total balance can be configured upon navigating to **Promotion** > **Dashboard** in the Back Office. A maximum of three currencies can be selected for the widget. * The **Walkthrough** widget visibility via the B2CORE UI is now configured upon navigating to **Promotion** > **Dashboard** in the Back Office. #### Resolved issues [#resolved-issues-36] * Fixed an issue that prevented widget data from being loaded in the mobile version of B2CORE UI when a device was rotated to a landscape orientation. * Fixed an issue that prevented the **Filled orders** and **Inactive orders** widgets from being fully loaded via the B2CORE UI. *** ### March 29, 2022 [#march-29-2022] #### Improvements [#improvements-46] * The mechanism for obtaining currency rates from B2BINPAY has been enhanced to provide more exchange rate data for each currency pair and deliver it faster. * Email notifications sent to admin users upon creating new records on the **Event log** tab of the Back Office have been altered: the **Client ID** field is now clickable and contains a URL that points to the corresponding record logged via the Back Office; the fields that display short and full company names have been added. * The **Export** button has been added to the **Deposit**, **Payout**, **Transfer**, **Exchange** and **Withdrawal Wallet List** pages that are available in the client details via the Back Office, enabling export of the data that is contained on these pages to CSV files. #### Resolved issues [#resolved-issues-37] * Fixed an issue due to which selection of deposit or withdrawal methods has been available to the clients who have not completed KYC verification via the B2CORE UI. * Fixed an issue that resulted in displaying data on all client’s accounts on the **Analytics** page of the B2CORE UI instead of displaying only the data on selected accounts. * Fixed an issue due to which it was impossible to display the **Total Balance** chart in the **Wallets Overview** widget if the total balance was equal to zero. * Fixed the following issues related to the **Trading View** widget: * Fixed an issue that prevented the **Volume** chart from being displayed in the **Trading View** widget after adding the corresponding indicator. * Fixed an issue that prevented the **Trading View** widget from displaying data after switching between tabs and then returning to the tab containing the widget. * Fixed an issue that made it impossible to display data in the **Trading View** widget using a mobile version of the B2CORE UI. * Fixed an issue that caused the **Reset** button to only reset the default B2TRADER workspace to its default configuration instead of resetting all workspaces in the case when there have been more than one workspace created. * Fixed an issue due to which it was impossible to restore the default B2TRADER workspaces by clicking the **Reset** button if these workspaces have been previously closed. * Fixed an issue that caused the **SimpleExchange** widget to be missing from the list of available widgets in the B2CORE UI. *** ### March 15, 2022 [#march-15-2022] #### New features [#new-features-38] ##### New PS integrations [#new-ps-integrations-14] A new payment provider, **POLi**, has been integrated, with support for deposits. #### Improvements [#improvements-47] * Case-insensitive comparison of currency alpha codes has been implemented to correctly display available wallets sorted by currency code in the **Wallets Overview** widget regardless of the case of the currency alpha code specified in a client’s account. * The Dutch language has been added to the B2CORE UI. #### Resolved issues [#resolved-issues-38] * Fixed an issue due to which it was impossible to download the **Withdraw** page via the B2CORE UI. * Fixed an issue that caused an error upon clicking **Profile** > **API Key Management** in the B2CORE UI. * Fixed an issue that caused certain widgets in the B2CORE UI to display data only after reloading a page. * Fixed an issue due to which an error message was displayed after changing a language on the B2CORE UI **Sign In** page before switching to a selected localization. * Fixed an issue due to which the **Files** subgroup and the corresponding **Upload Files** permission were not available under the Right section located in **System** > **Groups** of the B2CORE Back Office. *** ### March 1, 2022 [#march-1-2022] #### New features [#new-features-39] ##### Transaction check [#transaction-check] A new button, **Check transaction**, has been added to the details of **Deposits** and **Payouts** in crypto. Upon successful verification, a corresponding transaction record is created in **Security** > **Transaction Monitoring**. This option is only available for clients with SumSub KYT configured. #### Improvements [#improvements-48] * When an SMTP connection test in the **Mailing** section fails, detailed error messages are now displayed, including information on validation and data input errors for each field. * **B2BINPAY** connectivity has been improved: * Asynchronous requests for wallets have been added to speed up the edit page loading for deposit and payout methods. * The **Destination tag** and **Destination tag type** fields have been added to **Provider settings**. #### Resolved issues [#resolved-issues-39] * Fixed an issue which caused the B2TRADER authorization error for clients that don’t provide exchange functionality. *** ### February 15, 2022 [#february-15-2022] #### Improvements [#improvements-49] * Integration with **BerryPay** has been improved. The format of asynchronous responses and the algorithm for generating a digital signature of transmitted data have changed. * Integration with **B2BINPAY** has been improved. When adding a new deposit method, the Local URL field in the provider settings is filled in automatically. * **PAX** currency has been renamed to **USDP**. The alpha code and caption have been updated. * For the **Registration** wizard, a new rule, `english_chars`, has been added. When enabled, the registration form in the B2CORE UI only accepts Latin characters for the **First name** and **Last name** fields. * The **Index** and **Next level** fields in **Verification** > **Levels** have become editable, which significantly simplifies creation and display customization of verification levels in the B2CORE UI. Previously, it was necessary to create levels in the reverse order — from the last to the first. In case of an error, it was impossible to edit the sequence of fields in the B2CORE UI. * A new **Enabled for admin** option has been added to the currency pair details. The **Enabled** option has been renamed to **Enabled for client**. This allows you to differentiate access rights to exchange operations via the B2CORE UI and B2CORE Back Office. * New fields have been added to the **Currencies** > **Currency pairs** table: * **Max amount** * **Step** * **Hedging enabled** * **Enabled for admin** * **Enabled for client** * Changing numbering of MT accounts in the B2CORE UI and B2CORE Back Office has been disabled until further improvements. #### Resolved issues [#resolved-issues-40] * Fixed an issue due to which the Profile > Settings > Tier and Profile > Security > WhiteList sections were not displayed in the B2CORE UI. * Fixed an issue due to which in the B2CORE UI, the Withdraw amount field retained the value of the previous input. * Fixed an issue that caused instant loading of the Trading UI. *** ### February 1, 2022 [#february-1-2022] #### New features [#new-features-40] ##### B2CORE UI menu management [#b2core-ui-menu-management] A new section, **Menu**, has been added to **Promotion**. Here, you can manage B2CORE UI menu items, such as changing their visibility depending on the client’s verification level. ##### Client folders tree [#client-folders-tree] A new section, **Client folders**, has been added to **System**. Now, you can create a folder tree with any nesting depth. Features: * You can create predefined system folders in the **System** > **Client folders** section. These folders will be automatically added to all clients. * You can additionally create custom folders for a specific client, on the **Files** tab in the client’s details. Note that you cannot delete system folders here. * If a system folder is created with the same name as that of a custom folder of some client, it is not a problem: a `_Custom` postfix will be added to the name of the custom folder, and a system folder with the same name will be created next to it. * When renaming a folder in **System** > **Client folders**, it will be automatically renamed on the **Files** tab in the client’s details. * You can assign access permissions to a folder, to specify which groups of users can view and edit it in the **Files** tab. * By default, nested folders inherit the access permissions from the parent folder. Their access permissions cannot be broader than that of the parent folder. * When access permissions assigned to a parent folder are revoked from a user group, access to all nested folders is automatically restricted for these users. * When granting access permissions to a parent folder for a user group, it will NOT be automatically granted access to nested folders. ##### Successful registration event [#successful-registration-event] A new event type, **SuccessfulRegistration**, has been added to **System** > **Events**. When a client registers via the B2CORE UI or an admin creates a new client profile via the B2CORE Back Office, a notification is sent to the admin email specified in the event. A new template, `SuccessfulRegistration (to admin)`, has also been added to **System** > **Templates**. ##### New rate provider [#new-rate-provider] A new rate provider, **WazirX**, has been integrated. #### Improvements [#improvements-50] * When uploading multiple files, the drag-and-drop function is now available. * When configuring commissions for deposits/payouts methods, you can select multiple currencies at once. * When creating a new product, the currencies list is now sorted in an alphabetical order. A quick search field has also been implemented. * When creating a bulk action for zero balance, alpha codes instead of captions are now displayed in the currencies list. * A new provider, **TransakV2**, has been integrated into B2BINPAY. * In the transaction details, the **Client** field has become a link to a client’s profile. * The **From account amount** and **From account equity** fields have been added to the details of a Transfer-type request. If the account does not have these parameters, `0` is displayed. The current balance is obtained from the platform. * The process of receiving rates on the exchange page has been optimized so that only rates for currency pairs corresponding to client wallets are loaded. #### Resolved issues [#resolved-issues-41] * Fixed an issue due to which it was impossible to log in to B2CORE UI without previously refreshing the page. *** ### January 18, 2022 [#january-18-2022] This release was aimed at technical debt and improved stability. #### Improvements [#improvements-51] * It has become possible to select an account type for cashback — trade or personal. For the personal account type, cashback is deposited to the wallet upon comparing the currency of the wallet with the currency of the trading account(s). In case the cashback has been calculated for more than one trading account, it is credited to the wallet in separate deposits. #### Resolved issues [#resolved-issues-42] * Fixed an issue due to which it was impossible to unarchive an MT account if `Max accounts = -1` was specified in the product settings. ### December 21, 2021 [#december-21-2021] #### New features [#new-features-41] ##### Clients accreditation [#clients-accreditation] A new feature has been implemented allowing you to manage and configure client accreditation. A new **Client Tests** section has been added to the **Verification** page. In this section, you can specify questions that the client should answer to be granted a higher verification level in the B2CORE UI. In addition, a new Test results tab has been added to the client’s details. ##### Saving withdrawal details [#saving-withdrawal-details] Upon making a withdrawal request via the B2CORE UI, clients can now choose to save withdrawal details to avoid specifying the same information once again for each subsequent withdrawal. A new **Finance** section has been added to the client’s profile, where all saved withdrawal data is available. This data can be also accessed by administrators via the B2CORE Back Office by switching to the newly added **Saved withdrawals** tab in the client’s details. ##### Wallet Details [#wallet-details] In the B2CORE UI, it has become possible to view a transaction history for a specified wallet. ##### Service presets [#service-presets] You can now create a pre-configured preset and quickly apply it when adding a new client service or customizing an existing one. Presets associated with specific services can be accessed in the **Clients** > **Services** > **Saved presets** section. #### Improvements [#improvements-52] * The data in the **Security** > **Transaction monitoring** section is now filtered in descending order by the **Transaction ID** field by default. * A new button, **Upload multiple files**, has been added to the **Files** tab of the client’s details. * Information about service parameters has been added to the **Clients** > **Services** section. Service parameters are listed in separate table columns; the parameter values specified for various clients are indicated in corresponding rows. * In the B2CORE UI, the **Delete account** option has been removed until further improvements. #### Resolved issues [#resolved-issues-43] * Fixed an issue due to which precision settings were ignored when displaying amount values of the Transaction history in the B2CORE UI. * Fixed a validation rule for the deposit amount field. It is now based on precision settings set for the asset selected in the Deposit amount field. * Fixed an issue due to which problems occurred upon adding a withdrawal whitelist. * Fixed an issue causing incorrect resetting of a timer after re-sending a 2FA code. *** ### December 7, 2021 [#december-7-2021] #### New features [#new-features-42] ##### Multi-currency accounts [#multi-currency-accounts] Starting with this release, B2CORE can process multi-currency accounts. A new tab **Currencies** has been added to the product details. After creating a product (base currency still has to be selected at this step), you can add an unlimited number of currencies to it. Settings of the added currency can overwrite product settings. In addition, creating products for the B2TRADER platform (which provides multi-currency accounts) has become easier. Previously, you had to create a platform product, and then create wallets for each currency with Wallet Wrapper. Now it all can be done at once, by creating a platform product and adding all required currencies to it. ##### B2BINPAY: Merchant clients and multiple address types [#b2binpay-merchant-clients-and-multiple-address-types] For B2BINPAY v2, processing of Merchant clients transactions has been implemented. Also, support for multiple address types has been added. In the settings of B2BINPAY methods, the Address Type field is displayed for currencies with multiple types of addresses. #### Improvements [#improvements-53] * Editing the values ​​of the **Dealing approved** (for payouts) and **Fin verified** (for deposits) fields has become available only to admin users with the appropriate access rights. The corresponding settings have been added to **System** > **Groups**. * For service parameters with type text, text wrapping has been enabled. * Several improvements have been implemented to **Security** > **Transaction monitoring**: * **Transaction ID** now displays the identifier of the operation itself. * Four columns that support filtering have been added: **Created date**, **Email**, **Source amount**, **Source currency**. * The **Export** button has been added. * To **System** > **Users** the following columns have been added: **2FA status**, **IP whitelist**, **Groups**. * For Trading UI, skeletons have been implemented to display the loading state of widgets. * Integration with CoinMarketCap has been improved to receive rates for “rare” currency pairs: additional rates resource is accessed if there are no rates provided. * Integration with SendGrid has been improved to bypass the maximum limit of 1000 email recipients. * When signing up to the B2CORE UI, a pre-selection of a phone code has been added based on the chosen country. #### Resolved issues [#resolved-issues-44] * Fixed an issue that caused infinite loading of the Verification page in the B2CORE UI. * For MT4 and MT5 accounts, fixed an issue that caused infinite loading of Pending orders in Deals history. * Fixed an issue with the up and down sorting arrows that incorrectly sorted MT accounts and wallets by balance or name. The up arrow now correctly sorts in the ascending order and the down arrow sorts in the descending order. * Fixed an issue due to which the Reset button did not work for the TradingView widget. * For MT5 accounts, fixed an issue due to which the Profit parameter values in Deals history were displayed in exponential notation instead of decimal. *** ### November 24, 2021 [#november-24-2021] #### New features [#new-features-43] ##### Hiding recipients emails [#hiding-recipients-emails] When receiving emails sent via SendGrid, your recipients now only see their own addresses in the mailing list and do not see the emails of other recipients. ##### SMS daily limit [#sms-daily-limit] A new setting **SMS limit for each recipient** has been added to **System** > **Settings** > **Other**. Use it to limit the number of SMS that can be sent to each client per day and avoid uncontrolled spending of the balance. The setting will be applied to SMS sent during registration and 2FA confirmation. If the limit has been exceeded (for example, the client has already received the allowed number of SMS but could not enter the correct 2FA code), SMS are blocked for this client for a year. ##### Verification requests via Back Office [#verification-requests-via-back-office] In the client details, a **Verification request** button has been added to the **Documents** tab. Use this button to upload files and create a request for the next verification level directly from the B2CORE Back Office. Important: you cannot create a request if an open request of the Verification type has already been created for this client. ##### New PS integrations [#new-ps-integrations-15] A new payment system, **Help2Pay**, has been integrated, with support for deposit and payout operations. The following currencies are available: * `MYR` — Ringgit Malaysia * `THB` — Thai Baht * `VND` — Vietnamese Dong * `IDR` — Indonesian Rupiah * `PHP` — Philippine Peso #### Improvements [#improvements-54] * In the client details, the **Files** tab has changed location and is now located between the **Services** and **Advanced** tabs for quicker access. * It is now possible to reject **Verification** requests related to already deleted clients. * Cashback calculation mechanism has been improved: * **Cashback percent** has been renamed to **Cashback value**, which means it is no longer a percentage value. The calculation formula remains the same: `cashback = lots amount × cashback value`. * If two trading platforms are active and connected to the same database, cashback is credited only once. * Cashback is no longer credited for trading with demo accounts. * It is no longer possible to disable all languages in **System** > **Localizations**. At least one language must be enabled, otherwise it is impossible to save changes. * For B2BINPAY transfers, the **Created** value is now considered a date and time of receiving a final confirmation and not the date and time of creating a transfer as before. The aim behind this change is to prevent inconsistencies. For other payment systems, this value still indicates the date and time of invoice creation. * List view is now available for wallets in the B2CORE UI. * Migration to the New WebSDK SumSub has been completed. For more information, check the [SumSub documentation](https://developers.sumsub.com/migrations/sdk.html#advantages-of-the-new-sdk). #### Resolved issues [#resolved-issues-45] * For Google Chrome and Safari, fixed an issue which caused a logging out instead of refreshing the token after the access token expiry. * Fixed an issue due to which the email message was sent only to the first email from the uploaded CSV file and the other addresses were not processed. *** ### November 9, 2021 [#november-9-2021] #### New features [#new-features-44] ##### Immediate password reset [#immediate-password-reset] In the Back Office, the option to request a password reset from a specific client or all clients at once is added. When trying to log in, the client will receive a notification that the password is no longer valid and must be changed. Email verification is required before the password reset (with a verification code). #### Improvements [#improvements-55] * Improved internal storage of system settings: added groups with unique names. * MT4/MT5 demo accounts can be archived without transfer of the remaining funds. Archiving is available in the client UI and Back Office. * For B2BINPAY v2 callbacks, added an additional check by currency alias to avoid errors in case of the name mismatch. * After deleting personal data (the Delete Account button), all active requests of this client are automatically rejected. #### Resolved issues [#resolved-issues-46] * Fixed an issue which caused a redirect to the dashboard when attempting to open the trading UI. * Fixed an issue due to which the TradingView graph was not displayed after several minutes of inactivity. *** ### October 26, 2021 [#october-26-2021] #### New features [#new-features-45] ##### Cashback for traded lots [#cashback-for-traded-lots] Brokers can now set a cashback ratio to reward traders. The cashback is set as a fixed amount per each traded lot and is paid in the currency of the wallet. ##### Testing mailing connection [#testing-mailing-connection] A new Test Connection button is added to the Mailing > System > Providers section and allows to test the status of existing connections. The automatic timeout increases after each unsuccessful email from 0 to 5, then 25, 125 seconds and so on, but will not exceed 52 minutes, after which the timeout loop will restart at 0. ##### New PS integrations [#new-ps-integrations-16] A new payment system, **Gibilling**, has been integrated, with support for payout operations. #### Improvements [#improvements-56] * The Watchlist widget is completely redesigned, has a new sleek interface and provides better user experience. * The Whitelist and Device management widgets in the Security section of the B2CORE UI switched their places for the convenience of users. * Sumsub connection settings are improved so that during the SyncData, the system retrieves client information from the Personal info section of the Sumsub, instead of the Provided Personal Info section as it was before. #### Resolved issues [#resolved-issues-47] * Fixed a currency exchange issue where the Exchange button was inactive if the balance of wallet in the quote currency was zero. * Fixed an issue with incorrect rates being displayed for exchange operations involving Cryptocompare and BTC-Alpha rates providers. *** ### October 12, 2021 [#october-12-2021] #### New features [#new-features-46] ##### Auto bonus minimum [#auto-bonus-minimum] Admin users can now set a minimum deposit amount that will trigger an automatic bonus creation. The minimum deposit amount applies to each funds transfer made to an MT account. To explore the new feature navigate to System > Settings > Bonuses. ##### Auto bonus limit [#auto-bonus-limit] Admin users can limit an overall amount of auto created bonuses paid to a client. When the overall amount of auto created bonuses to a client reaches the specified limit, new auto created bonuses will not be generated. Applies only to funds transfer to an MT account. To explore the new feature navigate to System > Settings > Bonuses. ##### Bonus burn on withdrawal [#bonus-burn-on-withdrawal] A new switch option Burn on withdrawal is added to the System > Settings > Bonuses section. If Enabled and a client makes a withdrawal — all bonuses calculated for a particular account will be burnt and marked as Expired; if Disabled and a client makes a withdrawal — all bonuses will remain active. ##### Table type for service parameters [#table-type-for-service-parameters] Service parameters now have a new option Table type, which can be used to specify the number of columns and rows for that particular service. To explore the new feature navigate to Clients > Services > Parameters and edit a selected parameter. ##### Register as workflow feature [#register-as-workflow-feature] User registration wizard has a new workflow option Register As, which allows admin users to select the client type which will automatically be assigned to all new users registered via this wizard. ##### New filters for user settings [#new-filters-for-user-settings] Admin users can now geographically limit the list of clients available to a particular user with the help of Include and Exclude options added to the Country field in the System > Users > Edit tab. If the Exclude option is active and a certain country is specified — the user with these settings will see a list of clients from all countries except a selected country. If the Include option is active and a certain country is selected — the user with these settings will see a list of clients from a selected country only. ##### Product view restriction by partner ID [#product-view-restriction-by-partner-id] Brokers can now restrict product access to a particular IB and consequently to such IB’s clients. The settings are made in Back Office and are reflected in the B2CORE UI. #### Improvements [#improvements-57] * Urdu, Greek, Ukrainian, Finnish, Swedish & Norwegian languages are added to the API. * Error messages of MT4/MT5 Wrapper v3 are now displayed in a descriptive and easy to understand format. #### Resolved issues [#resolved-issues-48] * Fixed a bug where the TradingView widget would not automatically switch its data to match the market selected by the trader. * Fixed an issue where the Wallet widget was unnecessarily rounding up the Total balance sum. * Fixed an error occurring during an internal transfer in case there are two accounts with an identical ID. * Fixed an issue where transactions with a Partial status were listed in a list of deposits with a status Successful. * Fixed an error resulting in new MT Demo accounts to be created with zero balance without the consideration of prior Start amount settings. * Fixed a bug that hidden several field labels in user creation form in the admin panel. * Fixed an issue with an empty Amount field in a new deposit message sent to a client. * Fixed an issue with an incorrect operation of Countries field filter in User settings of the admin panel. * Fixed unsynced statuses display between the list of all transfers and details of each transfer. * Fixed an issue with the Mailing section not being hidden while the View mailing option was unchecked. *** ### September 28, 2021 [#september-28-2021] #### New features [#new-features-47] ##### Data masking [#data-masking] Administrators with full access privileges can now apply data masking options to another admin or admin group, by enabling the *Mask Data* and *Update Masking Data* checkboxes, respectively. When enabled, data masking prevents selected users from seeing the following client data: Client Name, Email and a Phone number. This applies to data displayed in the system as well as exported documents. To explore the new feature navigate to System > Users/Groups > Edit. ##### Client data protection tool in compliance with GDPR [#client-data-protection-tool-in-compliance-with-gdpr] A new feature that allows brokers to delete all personal client data of deleted client profiles is added. The following personal data will be removed from the system: First Name, Middle Name, Last Name, Email, Country, Address, Phone, Documents, Historical Data, Devices. ##### B2BINPAY transactions check [#b2binpay-transactions-check] A new Check option is added to the B2BINPAY > Wallets section, and allows users to audit all B2BINPAY deposits or withdrawals for the selected time period. ##### New workflow type [#new-workflow-type] New SendNotificationFlow workflow is added to System > Events > SuccessfulOperationHandler > Event handler workflow. The new workflow sends the details of all successful transactions to the email. ##### Wallet display currency [#wallet-display-currency] Users can now choose which currency their Wallet data will be displayed in. For now the available currencies are USD and EUR, with more new currencies being added in the nearest releases. #### Improvements [#improvements-58] * Admin messages accessible from the message icon in the top bar of the home page are now always saved, regardless of whether they have been read or not. The list of tagged admins is displayed at the top of the message. Messages to the current admin, for easier navigation, have a different color indicator than the rest of the messages. * A Password field now cannot be removed from the System > Wizards > Edit element > Workflow, without the prior enabling of the Password Auto Generation option. * Users can now dynamically edit the following transaction details: *Transaction hash*, *Status*, *Rate (USD)*. The Final amount of the transaction will be automatically recalculated. * All accounts/wallets, transactions, products and platforms related to B2Margin are removed from the B2CORE databases. * B2TRADER Adv UI Workspace widget structure is improved so, when a user moves or adds a new widget, the existing widgets stay in place instead of moving, and a layering principle applies until all widgets are set. #### Resolved issues [#resolved-issues-49] * Fixed a bug that was blocking the automatic generation of monthly financial reports. * Fixed a Withdrawal filter in transaction monitoring that caused zero entries to be displayed when the filter was applied. * Fixed *In Progress* status error in Finance > Payouts that prevented the payout processing. * Fixed an error with missing *Payment Name* and *Name fields* in exported data in the Finance section. * Fixed a bug that was blocking reports building in Security > Transaction Monitoring. * Fixed a bug where deposits with the transfer status callback *unconfirmed* were considered as *confirmed*. *** ### September 14, 2021 [#september-14-2021] #### New features [#new-features-48] ##### Files migration tool [#files-migration-tool] A new Files Migration Tool is added, and allows you to move client files between directories simply by choosing the required directory in the Directory field of the Edit File tab. Files can only be moved to another directory of the same client. ##### B2BINPAY v2 rate provider integration [#b2binpay-v2-rate-provider-integration] A new rates provider is integrated — B2BINPAY v2. ##### Root folders restrictions [#root-folders-restrictions] A new section is added to System > Settings that lets an admin limit or grant selected users an access to root folders. #### Improvements [#improvements-59] * New event log message feature was added to Clients > Details > Event Log, that sends an event log message to admins tagged in a message. #### Resolved issues [#resolved-issues-50] * Fixed a GBPay callback issue where the B2CORE did not recognize the callback sent by the payment system. * Fixed a GBPay integration issue where the generated Reference number, consisting of numbers, upper, and lowercase letters was not accepted by the payment system that only takes numbers and uppercase letters. * Fixed an incorrect displaying of empty values in Total Amount in Payments > Deposits. * Fixed an issue in Accounts table settings where unticking Hide zero balance option was not refreshing the table back to the full list. * Fixed an issue that was causing 2FA settings to be displayed as Disabled, for users that had 2FA option enabled. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-49] ##### Transaction receival event [#transaction-receival-event] Added a new event type — SuccessfulOperation, which sends POST requests to a provided external URL upon receiving a new successful transaction: deposit, withdrawal, transfer, or exchange. ##### Balance receival event [#balance-receival-event] Added another new event type — AccountBalanceReceived, which checks balances of SMS providers every 12 hours and sends email notification if the balance is low. Also, the corresponding email template was added — BalanceSmall. ##### Client data synchronization [#client-data-synchronization] To the SumSub settings added a new action — Sync Data, which starts the synchronization of documents and personal data (First Name, Last Name, etc.) about the client for clients with a verification level higher than 0. The execution can be checked in logs. Action triggering is allowed once an hour. #### Improvements [#improvements-60] * Added a separate group of access rights for the Event Log tab of the client’s details. * For B2Margin and B2Margin Cash platforms, when you change the email in the B2CORE UI, the email on the platform changes. * B2TRADER platform settings are migrated to External connections. * Added the templates of email notifications on new deposits and rejected deposits. By default, the template of email notifications on new deposits is disabled. * Removed the following fields from the Services tab of the client’s details: Service Setup Fee, Service Monthly Fee, Service Sign Date. * To the parameter constructor in Services added the following types: text, numeric, date, select, multiselect, checkbox. * When archiving demo accounts, funds checking is now skipped and the account can be archived straight away. * The Nexmo provider was adapted to a new brand — Vonage. * Adjusted the Toshimart integration so that First Name, Last Name and Email are now taken from the client automatically. * Adjusted KYT integration with SumSub so that now exactly wallets that were used in the transaction are sent for the check. * Adjusted the BPay integration for external deposits with adding a new provider — BPayExternal. #### Resolved issues [#resolved-issues-51] * Fixed an issue which caused markups to be ignored in the calculation of the final deposit amount in deposits with conversion. * Fixed an issue due to which disabled countries were still available for selection at registration. * Fixed an issue which caused session expiration at the login page due to the slow connection. * For Windows 10, fixed an issue which caused widgets refresh after switching to another tab in Google Chrome. * Fixed infinite redirect when switching to the Exchange page after login. * Fixed incorrect display of percentages on progress bars of bonus widgets. * Fixed an issue due to which any indicator added to TradingView disappeared after switching to another page. * Fixed an issue due to which the auth request was sent after each click. * Fixed an issue due to which anti-phishing code didn’t accept values ​​written in Cyrillic. * Fixed incorrect margin level calculation for OneZero accounts. New correct formula is: `Margin Level = Margin Used [Equity — Free Margin] / Equity * 100% = (1 — Free Margin/Equity) * 100%`. * Fixed an issue due to which in the email notification about withdrawal request, the codes of custom fields were displayed instead of their names. *** ### August 3, 2021 [#august-3-2021] #### New features [#new-features-50] ##### Tagging and notifying an Admin [#tagging-and-notifying-an-admin] The dropdown list was added to the Event Log tab of the client’s details when creating a new comment. Use the dropdown list to tag an admin. The admin will be notified via the new icon, which was added to the upper toolbar. By clicking the icon, and then clicking a message, the admin will be redirected to the client’s details Event Log tab. ##### Directories [#directories] The functionality of using directories (folders) was implemented for the Files tab of the client’s details. ##### AdvCash withdrawal channels [#advcash-withdrawal-channels] Added AdvCash withdrawal channels inside the provider, now you can configure the channel on System > Payout system > Payout methods page in the admin panel. #### Improvements [#improvements-61] * External system id field was added to Services > List, as well as to the service creation form. * Improvements to Services > Clients: * New fields: Client internal type, Client type, Company short, Company long, Tags, and Manager. * ID is clickable and leads to the client’s details. * The Service name is clickable and leads to service details. * Email is clickable and is copied to the clipboard. * Simple Exchange in Adv UI now supports switching between buy and sell operations. For example, you can switch BTC/USDT market to USDT/BTC. * We merged B2Margin & B2Margin Cash into a single platform. The configuration was partly moved to External Accounts for ease of use. * We have enhanced BPay integration, making it possible to receive callbacks from external systems and crediting end-user by checking user ID in the details. * Now you can view the service details on the Services tab of client’s details even if you lack the permissions to edit it. * B2TRADER authorization is now using tokens instead of cookies. * The export functionality of Finance > Exchange and Finance > Transfers pages was improved by optimizing requests to the database. #### Resolved issues [#resolved-issues-52] * Fixed value rounding for **Amount** and **Final amount** fields, when exporting **Finance** > **Deposits**. * Fixed an issue, which allowed the withdrawal of an unpermitted asset using `account_id`. * For B2TRADER Adv UI, fixed an issue, which caused spontaneous page refreshing. * Fixed an issue due to which page horizontal scrolling failed to return to default value after pulling widgets outside the border on the Dashboard page. * Fixed an issue that caused TwilioPhone to not appear in the external connection list. * Fixed an issue that caused the CoinGecko rates provider not to display rates. * Fixed an issue, which caused a logout error of an authorized user, when changing user status to Inactive. * Fixed an issue, which prevented you from seeing the Anti-Phishing Code in emails. * Fixed an issue, which could cause an infinite redirect while opening the Exchange page. * Fixed an issue, which caused the added Anti-Phishing Code not to display if SMS 2FA is enabled. *** ### July 20, 2021 [#july-20-2021] #### New features [#new-features-51] ##### Twilio Voice integration [#twilio-voice-integration] The new Twilio Phone provider was added to External Connections. Set it up to be able to dial a client from the personal info page. ##### CoinGecko Integration [#coingecko-integration] CoinGecko API integration. The open-source rates provider. ##### Profile > Security [#profile--security] Several blocks were moved to, and new blocks added to the **Profile** > **Security** page: * **Address Management** moved from **Settings**. * **Two-factor authentication** moved from **Settings**. * Added **Anti-Phishing Code** block (4—20 non-special characters). Becomes available after enabling **Google Authenticator**. * Added **Device Management** block which displays the list of trusted devices. #### Improvements [#improvements-62] * The SMTP server settings were added to the admin panel in the Mailing section. It is possible to configure the email storage period, the resend, and the deletion of an unsent email. * Added a monitoring feature to prevent the abusive activity with Adv UI. If more than 20 widgets were added or more than 20 resizes/movements were performed within a minute, the user will be prompted to reset the Workspace and stop the abusive activity. * Optimized export of payouts lists. Download speed increased up to 4 times, email sending speed increased up to 3.5 times. #### Resolved issues [#resolved-issues-53] * For BetaTransfer PSP, fixed an issue that caused the return of the incorrect currency list during the creation of funds withdrawal method in admin panel. * Fixed the TradingView widget, which could display incorrect data after socket reconnection. * Fixed an issue due to which the TradingView widget refused to resize the chart. * Fixed an issue due to which during the deposit/withdrawal method changing, the rate of the previous method was displayed. * Fixed an issue due to which always the first currency was deposited in case multiple PS Currencies are used. * Fixed an issue that caused the dropdown lists to stick to the screen while scrolling the page. *** ### July 6, 2021 [#july-6-2021] #### New features [#new-features-52] ##### Payout method constructor [#payout-method-constructor] The Constructor payout provider has been added. General settings are identical to other providers, but with an additional Custom Fields block, which has an Add Field option. Fields names can be edited. Fields values can be set when creating a payout and also will be available in the corresponding client’s request. #### Improvements [#improvements-63] * Optimized export of clients, accounts and payments lists. Download speed increased up to 4 times, email sending speed increased up to 3.5 times. * Payeer settings were migrated to External Connections. Now B2CORE owners can configure the exact channel of Payeer payout in the method settings in order to configure separate commissions/naming etc. for different channels. * For B2Margin Cash, added the possibility to authorize to the trading UI with a token. * For PrimeXM, added request settings for transfers. * To the Deposits and Payouts tables, added the Final Currency field — currency in which funds were credited/debited. For more convenience, this field is also displayed in the tables on the Finance tab in client’s details, along with the Rate currency and Rate (USD) fields. * When searching by IP in Security, the Hide IP duplicates option is now available. Enable it to group entries by unique email + IP pairs. * 4-hour candle timeframe added to the TradingView widget. #### Resolved issues [#resolved-issues-54] * Fixed an issue due to which, in the Trade history widget, lots values were set to 0 for all instruments. * Fixed display name for internal client type “agent”. * Fixed an issue due to which, during payouts with conversion when only one PS currency is available, the incorrect destination currency was displayed in the Back Office. * Fixed an issue due to which the link to a specific currency pair did not work on the Public exchange and all widgets displayed the default currency pair. * Fixed an issue due to which the New Deposit Amount option affected the deposit amount in destination currency (TR Currency) instead of source currency (PS Currency). * Fixed an issue due to which the Fee Product value on the Trades tab in the client’s details were not displayed. *** ### June 22, 2021 [#june-22-2021] #### New features [#new-features-53] ##### PrimeXM integration [#primexm-integration] Now it is possible to configure connection to the PrimeXM platform and retrieve clients accounts. In the Back Office detailed information on balance, equity, margin, PnL, transfers from/to the account will be displayed. In the B2CORE UI, PrimeXM accounts will be displayed on the Wallets page. ##### Simple exchange for B2TRADER [#simple-exchange-for-b2trader] A new widget has been added to the advanced UI. Simple Exchange provides the ability to exchange currencies via FOK orders if both wallets are on the B2TRADER platform. #### Improvements [#improvements-64] * Now all custom fields of the rate provider are checked for validity. Also, if the provider is just created and has a password field, it will be created disabled; when trying to enable the provider with an empty password field, an error message will appear. * Bonus details for the client now display the fields that were set when the bonus was created. * B2Margin Cash logins are now stored in the B2CORE UI. * After reaching max inactivity, the accounts are no longer archived, only the trading option is disabled. * For Banners and Announcements, the Button URL field has been added. If the value is specified, by clicking on the button, the client will be redirected to the specified URL. * When creating MetaTrader accounts, it is now available to select the Investor Only template which contains no Password, only Investor Password. * A new type of client request has been added to quickly filter requests related to Introducing brokers. #### Resolved issues [#resolved-issues-55] * Fixed an issue which caused an error when trying to view exchange details. * Fixed an issue due to which the Internal Transfer item was not displayed in the menu for some clients despite the access rights. * Fixed an issue due to which empty wallets list was displayed when loading the Wallet page. * Fixed an issue due to which accounts which require approval were created without requests. * For Introducing brokers, fixed sorting and filters by country, latitude, longitude and position lifetime. * Fixed an issue due to which the language select window was not properly displayed in the exchange interface. * Fixed the gaps on the TradingView widget which occurred when zooming out and scrolling the chart. * Fixed incorrect translations in payout requests. *** ### June 8, 2021 [#june-8-2021] #### New features [#new-features-54] ##### Hedging fail handler [#hedging-fail-handler] A new type was added to Events. You can now receive email or Slack notifications which contain transaction ID upon hedging failed for exchange operations. ##### Request receival handler [#request-receival-handler] Another new type was added to Events, which sends email notifications when a request of a specific type is created. ##### B2TRADER platform support in IB [#b2trader-platform-support-in-ib] Another trading platform was added — B2TRADER. Connection to the platform and commission payment plan can be configured in the B2CORE Back Office. #### Improvements [#improvements-65] * Now verification level cannot be saved if a non-existing class is specified as a wizard. * In the Registration wizard fields constructor, the Label field value is now mandatory. * Several improvements for the B2Margin Cash platform: * In the account details, the trading platform groups are now displayed and can be edited. * In the product details, it is now possible to set several platform groups. * When editing the platform group of a product or B2Margin Cash platform account, only one group in one domain is allowed. * Added `nonce` value to the private API requests to B2TRADER platform. Nonce is a 64-bit integer which is unique within a 22 seconds time interval in the frame of the used public key. It is used to improve the security of trading methods. Applicable for B2CORE with B2TRADERShadow platform configured for exchange hedging purposes. * For B2TRADER platform authorization, tokens are now used instead of cookies. * The value of the currently active external connection is now sent in the `snsHost` field for the verification request. * In Introducing brokers, base and quote currencies were added to symbol details, trades details, and reward details. * In Introducing brokers, naming was reworked and improved for reward states and details, trade details, and symbol details. Data displaying was reorganized to improve convenience. #### Resolved issues [#resolved-issues-56] * Fixed an issue due to which the Open Orders widget displayed zero in Price of limit orders. * Fixed an issue that caused an unexpected error when canceling an order. * Fixed the expired session problem when re-logging to the B2CORE UI in Safari. * Fixed an issue that caused slow data loading when re-switching to the exchange tab in the B2CORE UI. * For the Trading View widget, fixed default chart type. Now it’s always Candles. * Fixed the behavior of the Remove tooltip, which did not disappear after deleting an entry in the WatchList widget. * For MT4 and MT5 Accounts, fixed an issue due to which accounts data was not displayed if there were no transactions. * Fixed incorrect displaying of connected B2BINPAY v2 wallets when configuring deposit method. * Fixed calculations for deposit methods with conversion. *** ### May 26, 2021 [#may-26-2021] #### New features [#new-features-55] ##### SumSub KYB [#sumsub-kyb] When changing the client type (individual/corporate), the client’s verification level in the B2CORE UI and verification system will be set to 0. Re-verification will be required. This option is available if Client Resetting Mode is enabled in External Connections for SNS. It is disabled by default. ##### Event log [#event-log] A new tab was added to the client’s details. On this tab you can add notes and commentaries about the client. Supported text formatting, hyperlinks, attachments, replies and message editing. ##### Parameter constructor for services [#parameter-constructor-for-services] It is now possible to configure additional parameters for each service. When adding a service to a client, these fields will be required. ##### IB symbols export [#ib-symbols-export] Now it is possible to export settings to CSV, change the formula and then import these symbol settings in the same or in a different IB Type. The Export button is available on the Symbols tab of IB Type details. ##### Min position lifetime [#min-position-lifetime] New parameter was added to MT4 and MT5 platforms in Introducing brokers. If a position was closed earlier than the min position lifetime, it is not taken into account in rewards calculating. #### Improvements [#improvements-66] * We have significantly enhanced our authorization technology. * Optimized rates receiving from CryptoCompare. Now instead of sending a request for every pair we accumulate the pairs and send one request for all. * New supported formats on the Files tab in the client’s details: DOC, DOCX, XLSX, CSV, PAGES, NUMBERS, ZIP. * API Key in B2TRADERShadow platform configuration is now visible. * Now every export request can be done in a matter of minutes. * Asynchronous balances are now updated right on the open page with no need to refresh. * Added PostgreSQL reporting support for MT5 in Introducing brokers. * In Introducing brokers, tier ID was replaced with tier name. * Min position lifetime parameter was added to MT4 and MT5 platforms in Introducing brokers. If a position was closed earlier than the min position lifetime, it is not taken into account in rewards calculating. * Added MaxMind diagnostics to Introducing brokers services. * IB now supports PostgreSQL reporting for MT5 apart from being only MySQL before. #### Resolved issues [#resolved-issues-57] * Fixed an issue that caused user to be banned due to Client Rights release. * Fixed an issue due to which Transaction Monitoring sent email notifications on “green” transactions. * Fixed an issue due to which on mobile devices deleting the Wallets Overview widget removed also the Quick Links widget. * Fixed an issue due to which the Add Widget link was displayed over the banner when creating a new workspace. * Fixed incorrect behavior of the Verification widget after re-login. * Fixed an issue due to which the trades history was not updated after disconnecting the exchange. *** ### April 27, 2021 [#april-27-2021] #### New features [#new-features-56] ##### Clients access rights [#clients-access-rights] You no longer have to manage client rights from different parts of the Back Office. Clients access rights management has been moved to the Clients Rights subsection in the System. You can create and edit access levels, assign a level to a client from the details of his profile, and so on. ##### Transaction verifying handler [#transaction-verifying-handler] A new type was added to Events. You can now receive email notifications once a RED transaction is detected in Transaction Monitoring (KYT SumSub). The notification contains transaction details and risk score. ##### Account created handler [#account-created-handler] Another new event type, which sends POST requests to a provided external URL when opening an account for a client. Request body contains the client’s identifiers, account number, and product details. ##### IB Reports [#ib-reports] The Reports section has been added. At the moment, Acquisition report and Payment report are available. ##### IB API Clients [#ib-api-clients] You can now connect your application and get API access to them via the Back Office. In Services > Security > API Clients, you can add an API client and get Client ID and Client Secret. You can delete the clients also, if necessary. #### Improvements [#improvements-67] * Integration with ChillPay has been adapted for payment statuses, success and error URLs were added to the method configuration. * Added validation to the Lots per unit field in Bonus Presets. Now zero value cannot be saved. * Balances on all remaining (Transfer, Deposit, Withdraw, MT5, MT4, Internal Transfer) pages are now updated asynchronously for quick and correct displaying of information. * The Wizards functionality has been improved: repeated signals of already completed wizards steps are blocked. * For the IB section, we have reworked and optimized the naming of entities related to Symbols. #### Resolved issues [#resolved-issues-58] * Fixed an issue due to which the Download file button did not work when exporting reports. * Fixed CSV-template for reports exporting. * Fixed an issue due to which client’s data from SumSub were not displayed in the client’s profile. * Fixed incorrect display of the password recovery window. * Fixed infinite loader in Safari when trying to load history in trading account details. * Fixed an issue due to which filter by clients registration date in IB did not work. * Fixed an issue due to which in the Firefox browser the tooltip was hidden behind currency balances on the Pie Chart Widget. * Fixed an issue that caused a wrong caption when depositing with the Wire method. * Fixed an issue that caused an error when interacting with Mercurio, if the client did not have the country value specified. * Fixed an issue due to which the Need help link in the footer could not correctly process HTML formatting. *** ### April 13, 2021 [#april-13-2021] #### New features [#new-features-57] ##### B2Margin platform groups editing [#b2margin-platform-groups-editing] Added the ability to remove/add trading platform groups for accounts. It is now possible to select several platform groups, but only one group in the domain. New functionality is available in account details. ##### New PS integrations [#new-ps-integrations-17] Two more payment systems have been integrated — **EeziePay** and **9PAY**. #### Improvements [#improvements-68] * In Antifraud, to the Identical IP Used By Multiple Accounts event, the Verification Level Monitor setting has been added, which allows you to specify the verification levels of the clients you want to check. * For B2Margin, it is now possible to authorize in the Trading UI by token. * For B2TRADER, a special comment is displayed for the operation when the hold is returned. * Monitoring and running of processes Introducing Brokers is now more convenient: we have analyzed and improved the captions of processes, making them more declarative. * We have added validation for the Options Type of the select field in the Registration Wizard. #### Resolved issues [#resolved-issues-59] * Fixed an issue due to which in the Back Office it was possible to create a withdrawal request with an empty value of the withdrawal wallet. * Fixed an issue that caused incorrect behavior (infinite loading, drag-and-drop block) of MT4/MT5 Payment Accounts and Trading Accounts widgets after they were added to the B2CORE UI dashboard. * Fixed an issue due to which the chart on the TradingView widget was not displayed for day/week/month time intervals. * Fixed an issue due to which the First Transfer Activation option for trading did not work. * Fixed an issue due to which the theme of the chart did not change if at the time of changing the theme of the B2CORE UI, it had not yet loaded. * Fixed an issue due to which the language of the interface was not displayed if only one localization was available. *** ### March 30, 2021 [#march-30-2021] #### Improvements [#improvements-69] * Antifraud updates: * We have added a check for unauthorized changes in the user’s verification level. * Information about all clients is now displayed in details of the Identical IP Used By Multiple Account notification. * MetaTrader5 platform and product updates: * The First Transfer Activation switch has been added to the product settings. If Enabled, all accounts are created with the Trade Enabled right turned off, this right is added upon the first successful transfer to the account. * The Max Inactivity field has been added to the platform settings. All accounts with a balance less than or equal to 0, for which there have been no balance transactions for more days than specified in this field, will be archived. The check runs once a week. * We have migrated HelpDesk settings to External Connections. Now B2CORE owners can configure HelpDesk by themselves with no waiting from the B2CORE team. * CryptoCompare Rates provider integration was adjusted to be able to insert a secret key in provider details. * We have added notifications about long report generation. * Vpay integration updates. The account parameter was moved to provider settings. * Now only admins with Update client’s request permission can audit requests. * We removed the non-relevant Account number field from the Total Balance pie chart. * Background images for banners are now supported for all pages. Previously we supported it only for the dashboard page. * Balances on the Dashboard and Wallets pages are now updated asynchronously for quick and correct displaying of information. #### Resolved issues [#resolved-issues-60] * Fixed an issue due to which an incorrect set of fields was displayed during Advanced registration for select, multiselect types with no configured options. * Fixed an issue due to which the Hide zero balance flag was missing in Accounts. * Fixed an issue due to which request color settings could not be applied. * Fixed validation process for advanced Registration step fields with numeric values ​​of the Name attribute. * Fixed an issue that caused the Amount missing in the Trades History. * Fixed problems with Signing in with desktop Safari. * Fixed an issue with the Asset widget where not all assets were displayed. * Fixed an issue that caused the Trading View widget to freeze in place when dragging and dropping and resizing adjacent widgets on the Dashboard. * Fixed an issue due to which a newly created wallet was displayed only after the page refresh. * Fixed an issue that caused incorrect fee calculation display for Buy Limit orders. * Fixed an issue due to which notifications upon ticket status changing were not displayed and some other small fixes in the HelpDesk. * Fixed an issue due to which for some clients 2FA confirmation via sms was unavailable. * Fixed an issue that caused incorrect tier fee displaying for some clients. *** ### March 16, 2021 [#march-16-2021] #### New features [#new-features-58] ##### Device management [#device-management] Device management provides an opportunity to take a unique “fingerprint” for each client login. Each fingerprint contains a set of data about the login and device. A list of devices is available on the Devices tab in client details. #### Improvements [#improvements-70] * We have added asynchronous updating of balances, which significantly speeds up the loading of user accounts. * We have added a profile picture and a nickname to Client Profile. * The Connections subsection was renamed to External Connections to improve clarity. For each connection, the Type field was added, which currently supports two values: Payment system and Other. Now when creating a new Deposit/Payout method only connections with Payment system type are available for selection. Also, the Enable/Disable option was added to connection details. * We have migrated SumSub configuration into the External Connections. Now B2CORE owners can configure the integration by themselves with no waiting from the B2CORE team. * Clients who are not connected to SumSub can now disable transaction monitoring. It is also possible now to specify a list of currencies to monitor. New settings are available in External Connections. * The Comment field was added to Services List and Services Groups. * Antifraud notifications can now be filtered by Responsible admin users. * Exceptions for antifraud notifications can now be set for the pattern of email addresses. For example, if the exception rule is created for `user*@email.com`, the antifraud system will not be triggered for any address which starts with `user` and ends with `@email.com` like `user+1@email.com`, etc. * Now we process callbacks without transaction IDs from B2BINPAY v2. * For deposit/payouts via WireDocuments provider admin users can now edit the amount of a transaction directly in the request. #### Resolved issues [#resolved-issues-61] * Fixed an issue due to which some clients could see infinite loading when viewing client accounts. * Fixed an issue that causes incorrect HTML displaying of the customer agreement on the registration page. * Fixed an issue due to which export of accounts by currencies did not work for some clients. * Fixed a rule which caused problems with the first name and last name fields when registering. * Fixed an issue that caused problems with verification levels via SumSub. * Fixed an issue due to which permissions for Clients Requests worked incorrectly. * Fixed problems with proxying requests at the server level. * Fixed Offline notification in the B2CORE UI interface. * Fixed an issue due to which some labels in the B2CORE UI could be displayed incorrectly. * Fixed an issue due to which order book in the Trading UI of B2TRADER and B2Margin could be displayed incorrectly after long inactivity. * Fixed an issue that caused incorrect display of the absent rate in the Total Balance widget. *** ### March 2, 2021 [#march-2-2021] #### New features [#new-features-59] ##### Wallets overview widget [#wallets-overview-widget] We have completed yet another Dashboard widget, the most representative and informative one, now end-users are able to check their asset balances and its USD-equivalent in both card and pie chart view. ##### Wizards v2 [#wizards-v2] We have completely reworked and polished wizards functionality, which provides you with an opportunity to configure on the side of the Back Office some parts of business logic, like registration, password recovery, profile changing, verification, etc. Each wizard has a list of steps available for installation and a list of default steps. The System > Wizards section is now available in the menu. We keep working on improvements. #### Improvements [#improvements-71] * We have developed Public Adv UI for all our B2TRADER Exchange clients. This feature is available upon account manager contact. * Now when changing the email of a user with the B2TRADER platform through the Back Office, the email will be automatically changed also on the platform. * Balance (USD) and Balance (EUR) fields were added to clients accounts. * We have improved handling of unsuccessful hedging. Now hedging status and logs are available in transaction details. * We have added transfer details, where you can also see Request Info if the transfer was made via the request. * We added Address Management to the Security section, where you can see which addresses the client has added to the whitelist. * We added Final Amount and Final Currency to Deposits and Payouts tables. * Now you can see which admin has added a comment on the Compliances Tab. * No more double verification for Mercuryo payment system: we can now use the SumSub token for it. * We have changed the logic of the calculation of Min Deposit Amount in product details, it will ignore the restriction in case of 0 or empty value. * We have made several adjustments to make Back Office tables more efficient and quicker to load. #### Resolved issues [#resolved-issues-62] * Fixed an issue due to which account balances in crypto were displayed with wrong precision. * Fixed an issue due to which historical info on email changes was not displayed. * Fixed an issue that caused Back Office freezing after transfer creation. * Fixed Antifraud false alerting for identical phone numbers used by multiple accounts. * Fixed an issue due to which Blockchain fees for withdrawals via B2BINPAY v2 were not displayed. * Fixed an issue that caused Bank Wire Local to not display information correctly. * Fixed an issue with permissions due to which the Client Services section could be unavailable for editing. * Fixed an issue that caused workspaces to reset after the refresh. * Fixed an issue due to which all widgets switched to the default currency pair after page refresh. * Fixed an issue which caused incorrect navigation by clicking on the logo. * Fixed an issue that caused incorrect values of 24h Volume/Change parameters in the Watchlist widget. *** ### February 16, 2021 [#february-16-2021] #### New features [#new-features-60] ##### Audit of financial operations [#audit-of-financial-operations] We have developed and implemented an audit algorithm that checks financial transactions and calculates abnormal discrepancies. New Audit button is now available in Clients > Requests. #### Improvements [#improvements-72] * We are proud to present Mailing 1.1 — we added: * sending an email to all customers at once, * importing recipients from a CSV file, * attachments to an email, * a visual editor for HTML tags, * a preview of an email, * easier template creation and saving an email as a template, * webhooks for Sendgrid. * We have improved hedging: now it can be enabled/disabled for a currency pair, and when exchanging hedging can be disabled for certain types of clients. * We unified transaction details for client requests. Now withdraw requests through all providers will show transaction details entered by end-user. * Now we can process more State codes for PAMM IB. * Upgraded twilio/sdk to version 6. #### Resolved issues [#resolved-issues-63] * Fixed an issue due to which a rejection reason was not displayed in the email notifications on a failed deposit. * Fixed an issue due to which the Created field was not displayed at exporting of transfers. * Fixed an issue that caused showing the incorrect currency for deposits with conversion. * Fixed an issue due to which user restrictions (such as Client Tag) did not apply to export. * Fixed an issue that caused an error when trying to create an applicant that already exists in SumSub. * Fixed an issue due to which wrong MT5 Accounts were displayed in client’s details. * Fixed an issue that caused an Access denied error for Client Services and Services Groups editing with appropriate permissions enabled. * Fixed an issue with failed deposits and actualized integration with Sticpay. * Fixed several issues in B2TRADER Advanced UI, such as a non-working light theme, infinite redirect when clicking on the logo, and other small fixes. * Fixed an issue that caused products to ignore Restrictions with Auto Creation on Login turned on. * Fixed an issue that caused Multiple IP Addresses to trigger with failed authorizations. *** ### February 2, 2021 [#february-2-2021] #### New features [#new-features-61] ##### SumSub transaction monitoring [#sumsub-transaction-monitoring] We have developed a completely new KYT functionality through SumSub integration. Now our clients who are connected to SumSub will be able to check their transactions and see the risk scores, where the money came from and all key signals about it. The new functionality was added to the Security > Transaction Monitoring section. #### Improvements [#improvements-73] * We have reworked integrations with B2Margin and B2TRADER to provide more stability and efficiency to these services. * We have reworked B2TRADERShadow needed for a converter hedging purposes platform to be connected through API keys that can be generated in the B2BX cabinet. * CoinmarketCap rates provider integration was updated and is now fully functional. * MT Accounts in the Back Office are now divided into tabs corresponding to the active platforms, to optimize loading and visualization of the tables. * Added Deposit Wallets export functionality to the Back Office. * All B2TRADER’s clients are now switched to a new updated, optimized advanced UI. * For top-ups with conversion we have removed unnecessary currency selection if there is only one currency available. * Other small UI improvements. #### Resolved issues [#resolved-issues-64] * Fixed an issue due to which 2FA stayed enabled for the enduser after disabling it from the Back Office. * Fixed an issue due to which multiple products with Liquidity type could be created. * Fixed an issue due to which the admins with specified client tags could not create new clients. Now a new client is created with the same tags as the admin. * Fixed an issue that caused blue Error snack bar to show on the login page. * Fixed an issue that could break monthly reports generation. * Fixed an issue that caused infinite loading of transfers table. * Fixed an issue due to which Ignored symbol groups selector was empty during bonus or bonus preset creation. * Fixed an issue due to which mobile numbers were displayed as confirmed while they were not, as twilio was not connected. * Fixed an issue that could not proceed Simplex deposit payment. * Fixed an issue that caused Decta payment gateway payments to stay in New status even though they were successful on the payment gateway side. * Fixed an issue that caused the login page to freeze sometimes when trying to log in. * Fixed an issue that caused incorrect layout display of verification levels in the B2CORE UI. * Fixed an issue due to which charts were not displayed in the trading view. * Fixed an issue due to which the payment details set in wire-custom were not displayed. **Introducing brokers (IB)** is a partnership program that enables brokers to expand their client network and boost their business growth and profits through revenue sharing. ## How it works [#how-it-works] The partnership program is based on a **revenue sharing** approach. Brokers attract new traders through their partners and, in return, reward these partners with a portion of the earnings generated from referred active traders. Rewards can be paid in any crypto- or fiat currency. The reward amount is calculated per trade and is paid to a partner based on pre-set payment schedules, which can be hourly, daily, weekly, or monthly. The programs are fully customizable to best suit your specific needs: * You can select from various joining options: from automatic registration of all clients to exclusive joining by personal invitation. * You can customize reward ratios for different symbols or symbol groups. * You can set up tiers by a number of active traders referred and/or trading volume to further motivate your partners. * You can configure levels to reward partners not only for trades of their direct clients, but also for trades of clients referred by their clients. * You can set personal reward plans for key partners. ## Key features [#key-features] ### Various trading platforms [#various-trading-platforms] B2CORE IB offers a real-time access to market data through integration with popular trading platforms: * [B2TRADER](https://b2broker.com/b2trader/) * [MetaTrader 4](https://www.metatrader4.com/en) * [MetaTrader 5](https://www.metatrader5.com/en) * [cTrader](https://ctrader.com/) * [DXtrade](https://dx.trade/) * Converter ### Diverse and flexible payment plans [#diverse-and-flexible-payment-plans] Explore our range of flexible payment plans and select the option that aligns perfectly with your business needs. Available payment plans depend on the platform. | Payment plan | B2TRADER | MT4 | MT5 | cTrader | DXtrade | Converter | | --------------------- | -------- | --- | --- | ------- | ------- | --------- | | **Commission** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | **Lot** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Max amount** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Markup** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Markup %** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Spread** | ✔️ | | ✔️ | ✔️ | | | | **Platform Spread %** | ✔️ | ✔️ | ✔️ | ✔️ | | | | **Platform Markup %** | ✔️ | ✔️ | ✔️ | ✔️ | | | To learn more, refer to [Payment plans](payment-plans). ### Advanced CRM tool [#advanced-crm-tool] With the B2CORE Back Office, you have access to a wide range of features and benefits: * Launch and manage multiple partnership programs. * Encourage your clients to attract new traders by offering them a variety of reward options and plans. * Monitor and control your partners’ performance and marketing campaigns. * Get valuable insights through robust data analysis and comprehensive reporting. ### Extended analytics for partners [#extended-analytics-for-partners] With the help of B2CORE UI, your partners can monitor their key performance indicators through comprehensive reports and beautiful charts, as well as customize their referral links. ### All-round equipped solution [#all-round-equipped-solution] B2CORE IB offers an extensive range of services and ready-to-go apps backed up by 24/7 multi-lingual support, ensuring that you have the necessary assistance whenever you need it. ## Broker [#broker] The owner of a partnership program. *** ## Direct client [#direct-client] The client who signed up to the B2CORE UI by a referral link of a partner. Let's say, it is *Jill*. *Jill* joined the partnership program by *Jack's* referral link. *** ## IB type [#ib-type] The set of criteria based on which a broker pays rewards and the set of parameters for calculating these rewards. The broker can configure more than one IB type with separate settings and, for example, different types of registration. *** ## Level [#level] The setting of an IB type. It determines how many participants in the chain from the partner to the trader receive a reward. By default, only Level 1 is configured, which means that the broker pays rewards only for trades of direct clients. Let's say, the broker pays *Jill* the Level 1 ratio for the trades of the direct clients. For example, the Level 1 multiplier is 1. But the broker may want to pay *Jack* the Level 2 ratio for the same trades (because if not for *Jack*, *Jill* might not have joined the program and would not have brought so many clients). For example, the Level 2 multiplier is 0.5. And so on. The depth of the clients tree is not limited, and the broker chooses the number of paid levels. With the [Max amount](payment-plans#max-amount) payment plan, the broker can also limit the total reward amount and specify reward amounts for each level as a fixed value, not a ratio. *** ## Master IB [#master-ib] The special status of a partner. For such partners, a broker can configure an individual number of paid levels with a fix ratio. The Master IB status overwrites settings of a partnership program for this partner. *** ## Partner [#partner] The client who signed up to the B2CORE UI and joined a partnership program. Let's say, it is *Jack*. After joining the partnership program, *Jack* receives a referral link. *** ## Personal ratio [#personal-ratio] The individual configuration of reward amount. For example, the broker can pay increased rewards to partners who bring many clients and trades. Unlike tiers, this setting is not automatic and is set manually by the broker for selected partners. *** ## Referral link [#referral-link] The personal link of a partner which usually leads to the Sign up page of the B2CORE UI. All clients who signed up by this link are [direct clients](key-terms#direct-client) of this partner. *** ## SubIB [#subib] The client who signed up to the B2CORE UI by a referral link of a partner and then joined a partnership program. In other words, this client decided to become a partner too. Let's say, it is *Jill*. Clients brought by *Jill* are not direct clients of *Jack*, but the broker can still trace them back: *Jack* → *Jill* → *Clients brought by Jill*. *Jill* has many friends, so 100 of them signed up to the B2CORE UI and started trading. *** ## Tier [#tier] The setting of an IB type. With the help of tiers a broker can encourage partners with extra motivation. For example, the broker can configure increased reward ratio for each partner who brings 100 active clients in 30 days. Or increased reward ratio for each partner whose clients have traded 1,000 lots in 14 days. Or both at once. If a partner qualifies for several tiers at once, the tier with the highest ratio is applied. See [how to configure tiers](how-to-articles/how-to-configure-tiers) for the full calculation logic. A payment plan is part of IB type configuration that the Broker sets when launching a partnership program. **Key points** * Payment plans can be configured for a single symbol or symbol group. For a step-by-step tutorial, refer to [How to set up a payment plan for symbols](how-to-articles/how-to-set-up-a-payment-plan-for-symbols). * The calculated reward amounts can be additionally multiplied by level, tier, personal or Master ratio, if applicable. * If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * Trading volume used for reward calculations can be changed by a platform group modifier. For example, the lot size for a group is set to 0.4 (**Introducing brokers** > **Platforms** > **Groups**). If the trade volume is 100 lots, this value will be multiplied by the group lot size: **100 lots × 0.4 = 40 lots**. The available payment plans are described below. Pay attention to a list of trading platforms to which each plan is applicable. **Disclaimer** All values given in this section are for demonstration purposes only and do not constitute a recommendation. ## Commission [#commission] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, DXtrade, and Converter platforms. The Broker pays partners a fixed percentage of commissions received for trades executed by their clients: **Reward amount = Commission × Percentage** Where: * **Commission** is a fee amount that a trader paid to the Broker for executing a trade. * **Percentage** is a commission percentage value specified by the Broker in the IB type settings. This is a percentage of the total commission received by the Broker. Consider an example of *Jack*, whose client brought 70 USD in commissions to the Broker, while the set commission percentage is 10%. In this case, the amount rewarded to *Jack* is calculated as follows: **70 USD × 10% = 7 USD**. **Implementation details of the Commission payment plan on the Converter platform** When the *Commission* plan is used on the Converter platform, brokers pay partners a fixed percentage of markups received from exchange transactions made by their clients. These markups are configured in B2CORE, applied to each exchange transaction, and then recorded as commissions. The partner's reward is then calculated based on the recorded commissions, using the percentage specified in the *Commission* plan. ## Lot [#lot] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners a fixed amount for each lot traded by their clients: **Reward amount = Trading volume, in lots × Amount per lot** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Amount per lot** is a fixed reward amount to be paid per lot, specified by the Broker along with the reward currency. The reward currency doesn't depend on the traded symbol. That is, the Broker can specify USD as the reward currency for the ETH/EUR symbol. Consider an example of *Jill*, whose client has traded 10 lots while the reward amount per lot is 2 USD. In this case, the amount rewarded to *Jill* is calculated as follows: **10 lots × 2 USD = 20 USD**. Keep in mind that you must monitor profitability using this scheme as the reward amounts may exceed the commissions charged. ## Max amount [#max-amount] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners a fixed amount for each lot traded by their clients, while also having the opportunity to specify both the maximum reward amount and the reward amount for each configured level. With the **Lot** payment plan, the Broker specifies the reward amount per lot for Level 1. The rewards for subsequent levels (if configured) are calculated as a percentage of Level 1 reward. With the **Max amount** payment plan, the Broker limits the total reward amount paid to partners, regardless of the number of levels, and then specifies the exact amount a partner receives at each level. The following example illustrates how the reward amount can be distributed across different levels. | | **1 level** | **2 levels** | **3 levels** | **4 levels** | **5 levels** | **6 levels** | | ----------- | ----------- | ------------ | ------------ | ------------ | ------------ | ------------ | | **Level 1** | 10 USD | 8 USD | 5 USD | 5 USD | 4 USD | 3 USD | | **Level 2** | | 2 USD | 3 USD | 3 USD | 2 USD | 2 USD | | **Level 3** | | | 2 USD | 1 USD | 2 USD | 2 USD | | **Level 4** | | | | 1 USD | 1 USD | 1 USD | | **Level 5** | | | | | 1 USD | 1 USD | | **Level 6** | | | | | | 1 USD | Based on the table above, consider an example of *Jack*, whose direct client has traded 10 lots. In this case, the reward is paid only to Level 1, and the amount rewarded to *Jack* is calculated as follows: **10 lots × 10 USD = 100 USD**. Next, consider an example of *Jill* who participates in *Jack's* sub-IB program. If *Jill's* direct client has traded 10 lots, then the reward amount is distributed between two levels: * at Level 1, the amount rewarded to *Jill* is calculated as follows: **10 lots × 8 USD = 80 USD** * at Level 2, the amount rewarded to *Jack* is calculated as follows: **10 lots × 2 USD = 20 USD** In this case, the total reward amount is 100 USD, that's 10 USD per each traded lot. ## Markup [#markup] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners rewards based on the volume traded by their clients and a markup specified in points: **Reward amount = Trading volume, in lots × Markup, in points** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Markup** is a markup value to be paid per lot, specified by the broker in the IB type settings. For example, the markup set on a platform is 14 points, and *Jack* decides to pay partners 1/7 of this markup value, that is 2 points. After *Jack's* clients have traded 10 lots of AUD/CAD, the amount rewarded to *Jack* is calculated as follows: **10 lots × 2 points = 20 CAD**. ## Markup % [#markup-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The broker pays the partners a percentage of the markup. The calculation formula depends on the trade side: * For **sell** trades: **Reward amount = Trading volume × Trade price × 2 × Markup % / (1 + Markup %)** * For **buy** trades: **Reward amount = Trading volume × Trade price × 2 × Markup % / (1 – Markup %)** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Trade price** is an execution price at which the asset was sold or bought by a trader as a result of a trade. * **Markup %** is a markup value, in percents, specified by the broker in the IB type settings. For example, the markup value is 20% and a client of *Jill* buys 15 lots at 4,000. In this case, the amount rewarded to *Jill* is calculated as follows: **15 × 4,000 × 2 × 0.2 / (1 - 0.2) = 30,000**. **When to use** Choose this plan when the Broker wants to pay partners a reward based on a rate set independently for each IB, regardless of the Broker's own spread/markup revenue. The reward is calculated instantly per trade and can apply to open, closed, or any position — useful when partners should be rewarded as soon as a position opens, not only once it's closed. ## Spread [#spread] > Supported for the B2TRADER, cTrader, and MetaTrader 5 platforms. The broker pays the partner a percentage of the market spread value at the moment of the trade. **Reward amount = (Market ask – Market bid) × Contract size × Trading volume × Percentage / 100** Where: * **Market ask**, **Market bid** are top-of-the-book bid and ask market prices valid at the moment of the trade, in the quote currency. * **Contract size** is a standardized quantity of asset per lot, set on a trading platform. * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Percentage** is a spread percentage value specified by the Broker in the IB type settings. Consider an example of *Jill*, whose client traded on the EUR/USD market: * **Market ask** = 1.08253 * **Market bid** = 1.07252 * **Contract size** = 100,000 * **Trading volume** = 2 lots * **Percentage** = 50% In this case, the amount rewarded to *Jill* is calculated as follows: **(1.08253 – 1.07252) × 100,000 × 2 × 50 / 100 = 1,001 USD**. ## Platform Spread % [#platform-spread-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, and cTrader platforms. This payment plan only applies to **closed** trade positions. The broker pays the partner a percentage of the spread value recorded by the trading platform for the closed trade. Unlike the **Spread** plan, which uses live market bid and ask prices, this plan uses the spread value stored in the trade data by the platform itself. **Reward amount = Platform spread × Contract size × Trading volume × Percentage / 100** Where: * **Platform spread** is the spread value recorded by the trading platform at the time of trade execution, in the quote currency. * **Contract size** is a standardized quantity of asset per lot, set on a trading platform. * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Percentage** is a spread percentage value specified by the Broker in the IB type settings. Consider an example of *Jack*, whose client traded EUR/USD: * **Platform spread** = 0.00200 * **Contract size** = 100,000 * **Trading volume** = 2 lots * **Percentage** = 50% In this case, the amount rewarded to *Jack* is calculated as follows: **0.00200 × 100,000 × 2 × 50 / 100 = 200 USD**. ## Platform Markup % [#platform-markup-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, and cTrader platforms. This payment plan only applies to **closed** trade positions. The broker pays the partner a percentage of the markup revenue generated from the closed trade. Unlike the **Markup %** plan, which is calculated instantly from a manually configured rate, this plan first computes the actual markup revenue the platform earned on the trade (based on the broker's symbol markup configuration), then pays the partner a percentage of that revenue. **Step 1 — Markup revenue** (depends on the markup type configured for the symbol): * Percent-type markup: **Markup revenue = Trade price × Trading volume × Contract size × (Markup bid % + Markup ask %) / 100** * Point-type markup: **Markup revenue = (Markup bid, in points + Markup ask, in points) × Point size × Contract size × Trading volume** * Spread-diff markup (MetaTrader 4/5): **Markup revenue = Spread diff × Point size × Contract size × Trading volume** **Step 2 — Reward amount** **Reward amount = Markup revenue × Percentage / 100** Where: * **Trade price**, **Trading volume**, **Contract size** are as defined in the sections above. * **Markup bid/ask** (in percent or points) or **Spread diff** is the markup configuration recorded by the trading platform for that symbol (set by the Broker at platform, group, account, or symbol level; account-level settings take priority). * **Percentage** is the reward percentage specified by the Broker in the IB type settings — this is the partner's cut of the platform's own markup revenue, not the markup rate itself. Consider an example of *Jack*, whose client buys 15 lots of EUR/USD at 1.1000. The contract size is 100,000, the symbol's markup configuration is 0.05% bid + 0.05% ask, and the reward percentage set for *Jack* is 20%. * **Markup revenue** = 1.1000 × 15 × 100,000 × (0.05 + 0.05) / 100 = **1,650 USD** * **Reward amount** = 1,650 × 20 / 100 = **330 USD** **When to use** Choose this plan when the partner's reward should track the Broker's own markup/spread profit on the client's trades, rather than a rate set independently for the IB. Because the actual revenue is only known once a position closes, this plan works only with **closed** trade positions. To join your first partnership program and become a partner: Sign in to the B2CORE UI with your credentials. Expand the partnership section in the main menu (labeled **IB Room** or **Partners**, depending on the broker configuration) and click any option in the expanded menu, such as **Partner Dashboard**, **Promo**, or **Reports**. In the **Partner Program** dropdown, select a partnership program that best meets your requirements. After selecting a partnership program, you can see its description that provides important information about the program. Click **Become a Partner** to join the selected partnership program. If several partnership programs are available to you and you've already joined one of them and want to join one more: Expand the partnership section in the main menu (labeled **IB Room** or **Partners**, depending on the broker configuration) and click any option in the expanded menu, such as **Partner Dashboard**, **Promo**, or **Reports**. In the dropdown located at the top of the page, select **Become a Partner**. In the displayed **Partner Program** dropdown, select a partnership program to which you want to join. Click **Become a Partner** to join the selected partnership program. Depending on the platform configuration, you may be allowed to join the selected partnership program immediately or after a B2CORE admin confirms your request for joining the program. After joining your first partnership program, you can access the menu options located under the partnership section (**IB Room** or **Partners**) in the main menu. The Market Data session provides real-time order book streaming via the FIX 4.4 protocol. Use this session to subscribe to price updates for specific trading instruments and receive continuous market data. For FIX connection settings (host, port, SenderCompID, TargetCompID, credentials), contact your broker. This page covers the **Market Data** session only. For trading operations (order placement, execution reports), use the [Trading](trading) session. ## Supported message types [#supported-message-types] The following values can be assigned to the `<35>` MsgType field: * `A` — Logon (Client → B2TRADER) * `0` — Heartbeat (Client ↔ B2TRADER) * `1` — Test Request (Client ↔ B2TRADER) * `3` — Reject (Client ← B2TRADER) * `4` — Sequence Reset (Client ↔ B2TRADER) * `5` — Logout (Client ↔ B2TRADER) * `V` — Market Data Request (Client → B2TRADER) * `W` — Market Data — Snapshot/Full Refresh (Client ← B2TRADER) * `X` — Market Data — Incremental Refresh (Client ← B2TRADER) * `Y` — Market Data Request Reject (Client ← B2TRADER) * `j` — Business Reject (Client ← B2TRADER) ## Getting started [#getting-started] ### Connection [#connection] To connect to the Market Data session, use the following parameters provided by B2TRADER: * **Host and port**: The Market Data endpoint (provided separately from the Trading endpoint) * **SenderCompID**: Your client identifier for the Market Data session * **TargetCompID**: The server identifier for the Market Data session * **Protocol**: FIX 4.4 The Market Data connection does not require SSL. ### Message structure [#message-structure] **Standard Header** All FIX messages must begin with a Standard Header containing the following fields: **`8 BeginString`** `String` Identifies the FIX version (`FIX.4.4`). Always the first field in a message. **`9 BodyLength`** `int` The automatically computed message length, in bytes. Always the second field. **`35 MsgType`** `String` The message type. See [Supported message types](#supported-message-types) for possible values. Always the third field. **`34 MsgSeqNum`** `int` The message sequence number, incremented by 1 for each consecutive message. **`49 SenderCompID`** `String` The identifier of the message sender. Provided by B2TRADER. **`52 SendingTime`** `Timestamp` The date and time when the message was sent, in UTC: `YYYYMMDD-HH:MM:SS.sss`. **`56 TargetCompID`** `String` The identifier of the message recipient. Provided by B2TRADER. *** **Standard Trailer** All FIX messages must end with a Standard Trailer: **`10 CheckSum`** `int` A three-digit checksum. Always the last field in a message. ### Logon (A) [#logon-a] This message is sent by the client to initiate a FIX session. It must be the first message in each connection. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`98 EncryptMethod`** `int` The encryption method. Required. Must be `0` (no encryption). **`108 HeartBtInt`** `int` The heartbeat interval, in seconds. Required. Indicates how often the server sends Heartbeat messages as part of a connection health check. **`141 ResetSeqNumFlag`** `Boolean` Indicates whether both parties should reset the currently used sequence numbers. Optional. **`553 Username`** `String` The client username. Required. Provided by B2TRADER. **`554 Password`** `String` The client password. Required. Provided by B2TRADER. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=138^35=A^1=68a4446ac84827ff5cd35c74^34=1^52=20231218-07:59:06.000^49=sender_b2trader^56=target_b2trader^554=password^553=username^98=0^108=30^10=139^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=112^35=A^1=68a4446ac84827ff5cd35c74^34=1^49=target_b2trader^52=20231218-07:59:06.655^56=sender_b2trader^98=0^108=30^10=009^ ``` ### Session maintenance [#session-maintenance] #### Heartbeat (0) [#heartbeat-0] This message is sent back and forth between the server and the client to check the connection status and in response to Test Request messages. **`112 TestReqID`** `String` The identifier of a Test Request in response to which this Heartbeat is sent. Required when the Heartbeat is a response to a Test Request. ```text title="Example" 8=FIX.4.4^9=73^35=0^34=2^52=20231218-07:59:36.000^49=sender_b2trader^56=target_b2trader^10=202^ ``` #### Test Request (1) [#test-request-1] This message is sent back and forth between the server and the client as a means of connectivity check. If a Heartbeat is not received within the expected interval, a Test Request is sent; the recipient must respond with a Heartbeat containing the same `<112>` TestReqID. **`112 TestReqID`** `String` The identifier of a Test Request. Optional. ```text title="Example" 8=FIX.4.4^9=81^35=1^34=137^52=20231218-10:12:38.000^49=sender_b2trader^56=target_b2trader^112=2^10=040^ ``` #### Sequence Reset (4) [#sequence-reset-4] This message indicates the sequence number of the next message from the sender, immediately following the Sequence Reset. This may be necessary to recover from a disconnect when some messages were lost or their resending is not desirable. **`123 GapFillFlag`** `Boolean` Indicates that this message replaces missing messages that won't be resent. Optional. Possible values: * `Y` — Gap fill: `<34>` MsgSeqNum is valid and indicates the beginning of the gap fill range * `N` — Sequence reset: `<34>` MsgSeqNum is ignored. Should only be used in disaster recovery situations **`36 NewSeqNo`** `int` The new sequence number. Required. ```text title="Example" 8=FIX.4.4^9=84^35=4^34=6^49=target_b2trader^52=20231219-21:11:38.578^56=sender_b2trader^123=Y^36=8^10=231^ ``` #### Logout (5) [#logout-5] This message is sent by the client or server to terminate a session. When terminated, the possible reason is specified in the `<58>` Text field. **`58 Text`** `String` The detailed information about the reason for logging out. Optional. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=83^35=5^34=5^52=20231218-13:40:48.000^49=sender_b2trader^56=target_b2trader^58=ST1234^10=229^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=75^35=5^34=748^49=target_b2trader^52=20231218-13:40:49.016^56=sender_b2trader^10=064^ ``` ### Reject (3) [#reject-3] This message is sent by the server upon receiving a malformed message from the client. The rejection reason is specified in the `<373>` SessionRejectReason field. This message is unrelated to application-level rejections (Market Data Request Reject and Business Reject). **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`371 RefTagID`** `int` The tag number of the field that caused message rejection. Optional. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`373 SessionRejectReason`** `int` The reason why the message is rejected. Optional. Possible values: * `0` — Invalid tag number * `1` — Required tag missing * `2` — Tag not defined for this message type * `3` — Undefined tag * `4` — Tag has no value assigned * `5` — Value is incorrect (out of range) for this tag * `6` — Incorrect value data format * `7` — Decryption issue * `8` — Signature problem * `9` — CompID issue * `10` — SendingTime accuracy issue * `11` — Invalid MsgType * `12` — XML validation error * `13` — Same tag appears more than once * `14` — Tag specified not in required order * `15` — Wrong order of repeating group fields * `16` — Incorrect NumInGroup count for repeating group * `17` — Non-"Data" value includes field delimiter (SOH character) * `99` — Other **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=125^35=3^34=193^52=20231219-22:41:16.000^49=target_b2trader^56=sender_b2trader^45=18^371=262^372=V^373=1^58=Required tag missing^10=122^ ``` *** ## Market Data Request (V) [#market-data-request-v] This message is sent by the client to subscribe to real-time quoting data for a specified ticker symbol. After subscribing, the server sends an initial Market Data — Snapshot/Full Refresh, followed by continuous Market Data — Incremental Refresh messages with each market data update. To subscribe to multiple symbols, send a separate Market Data Request for each symbol. To unsubscribe, send a Market Data Request with `<263>` SubscriptionRequestType set to `2`. All subscriptions are also terminated when the session is closed via Logout. **`262 MDReqID`** `String` The identifier of the Market Data Request. Required. Must be unique for the duration of each session. When unsubscribing, specify the ID of a previous request to discard. **`263 SubscriptionRequestType`** `int` The type of response expected from the server. Required. Possible values: * `1` — Subscribe: receive updates as the market status changes * `2` — Unsubscribe: stop streaming market data for the specified symbol **`264 MarketDepth`** `int` The market depth for an order book snapshot. Required. Possible values: * `0` — Full order book * `1` — Top-of-the-book prices **`265 MDUpdateType`** `int` The update type. Required. Must be `1` (incremental updates for changed price levels only). **`267 NoMDEntryTypes`** `int` The number of `<269>` MDEntryType entries requested. Required. > Repeating group: **`269 MDEntryType`** `int` The side of the quote. Required. Possible values: * `0` — Bid * `1` — Ask **`146 NoRelatedSym`** `int` The number of ticker symbols. Required. Must be `1`. To subscribe to multiple symbols, send a separate request for each. > Repeating group: **`55 Symbol`** `String` The market identifier. Required. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. ```text title="Example (Client → B2TRADER)" 8=FIX.4.4^9=141^35=V^34=7^52=20231220-08:11:50.000^49=sender_b2trader^56=target_b2trader^262=1235^263=1^264=0^265=1^267=2^269=0^269=1^146=1^55=spot.btc_usdt^10=250^ ``` ## Market Data — Snapshot/Full Refresh (W) [#market-data--snapshotfull-refresh-w] This message is sent by the server after the client subscribes to a ticker symbol. It contains the full current state of the order book. Subsequent updates are delivered as Market Data — Incremental Refresh messages. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`262 MDReqID`** `String` The identifier of the originating Market Data Request. **`268 NoMDEntries`** `int` The number of market data entries following. The value is `0` if the order book is empty. > Repeating group (present when `<268>` NoMDEntries > 0): **`269 MDEntryType`** `int` The side of the quote. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — Bid * `1` — Ask **`270 MDEntryPx`** `Price` The price of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`271 MDEntrySize`** `Qty` The tradable volume of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`278 MDEntryID`** `String` A unique market data entry identifier. Conditional — required if `<268>` NoMDEntries is not `0`. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=507^35=W^34=48^49=target_b2trader^52=20231222-14:40:39.983^56=sender_b2trader^55=spot.btc_usdt^262=1235^268=9^269=1^270=1.10338^271=3000000^278=4441516524^269=1^270=1.10337^271=1000000^278=4441516521^269=1^270=1.10339^271=5000000^278=4441516523^269=1^270=1.10335^271=600000^278=4441516522^269=0^270=1.10333^271=500000^278=4441516520^269=0^270=1.10332^271=1000000^278=4441516517^269=0^270=1.10331^271=3000000^278=4441516516^269=0^270=1.10334^271=100000^278=4441516519^269=0^270=1.1033^271=5000000^278=4441516518^10=025^ ``` ## Market Data — Incremental Refresh (X) [#market-data--incremental-refresh-x] This message is continuously sent by the server after the initial Snapshot/Full Refresh. Each message includes only the changes since the previous update. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`262 MDReqID`** `String` The identifier of the originating Market Data Request. **`268 NoMDEntries`** `int` The number of market data entries following. The value is `0` if the order book is empty. > Repeating group (present when `<268>` NoMDEntries > 0): **`269 MDEntryType`** `int` The side of the quote. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — Bid * `1` — Ask **`270 MDEntryPx`** `Price` The price of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`271 MDEntrySize`** `Qty` The tradable volume of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`278 MDEntryID`** `String` A unique market data entry identifier. Conditional — required if `<268>` NoMDEntries is not `0`. * Must be unique among active entries when `<279>` MDUpdateAction is `0` (New) * Must match the previous `<278>` MDEntryID when `<279>` MDUpdateAction is `1` (Change) or `2` (Delete) **`279 MDUpdateAction`** `int` The update type. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — New * `1` — Change * `2` — Delete **`58 Text`** `String` Additional context. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=201^35=X^34=52^49=target_b2trader^52=20231222-14:40:41.150^56=sender_b2trader^55=spot.btc_usdt^262=1235^268=2^279=1^269=0^270=1.10334^271=200000^278=4441516519^279=2^269=1^270=1.10339^271=0^278=4441516523^10=092^ ``` ## Market Data Request Reject (Y) [#market-data-request-reject-y] This message is sent by the server to reject a Market Data Request due to business or technical reasons. **`262 MDReqID`** `String` The identifier of the rejected Market Data Request. Required. **`281 MDReqRejReason`** `int` The reason why the request is rejected. Optional. Possible values: * `0` — Unknown symbol * `1` — Duplicate MDReqID * `2` — Insufficient bandwidth * `3` — Insufficient permissions * `4` — Unsupported SubscriptionRequestType * `5` — Unsupported MarketDepth * `6` — Unsupported MDUpdateType * `8` — Unsupported MDEntryType **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=118^35=Y^34=3^49=target_b2trader^52=20231221-10:25:11.849^56=sender_b2trader^262=1234^58=symbol 'btcusd' is not supported^10=104^ ``` ## Business Reject (j) [#business-reject-j] This message is sent by the server to reject a message due to a business-level issue not addressed by the standard Market Data Request Reject or session-level Reject. **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`380 BusinessRejectReason`** `int` The reason why the request is rejected. Required. Possible values: * `0` — Other * `1` — Unknown ID * `2` — Unknown Security * `3` — Unsupported MsgType * `4` — Application not available * `5` — Conditionally required field missing * `6` — Not authorized * `7` — DeliverTo firm not available at this time **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=120^35=j^34=2^49=target_b2trader^52=20231219-22:30:39.617^56=sender_b2trader^45=133^58=Unsupported Message Type^372=V^380=3^10=166^ ``` The Trading session enables order placement and execution management via the FIX 4.4 protocol. Use this session to submit orders and receive real-time execution reports for your trading activity. For FIX connection settings (host, port, SenderCompID, TargetCompID, credentials), contact your broker. This page covers the **Trading** session only. For real-time order book streaming, use the [Market Data](market-data) session. ## Supported message types [#supported-message-types] The following values can be assigned to the `<35>` MsgType field: * `A` — Logon (Client → B2TRADER) * `0` — Heartbeat (Client ↔ B2TRADER) * `1` — Test Request (Client ↔ B2TRADER) * `3` — Reject (Client ← B2TRADER) * `4` — Sequence Reset (Client ↔ B2TRADER) * `5` — Logout (Client ↔ B2TRADER) * `D` — New Order Single (Client → B2TRADER) * `8` — Execution Report (Client ← B2TRADER) * `j` — Business Reject (Client ← B2TRADER) ## Getting started [#getting-started] ### Connection [#connection] To connect to the Trading session, use the following parameters provided by B2TRADER: * **Host and port**: The Trading endpoint (provided separately from the Market Data endpoint) * **SenderCompID**: Your client identifier for the Trading session * **TargetCompID**: The server identifier for the Trading session * **Protocol**: FIX 4.4 The Trading connection requires SSL with a self-signed certificate. ### Message structure [#message-structure] **Standard Header** All FIX messages must begin with a Standard Header containing the following fields: **`8 BeginString`** `String` Identifies the FIX version (`FIX.4.4`). Always the first field in a message. **`9 BodyLength`** `int` The automatically computed message length, in bytes. Always the second field. **`35 MsgType`** `String` The message type. See [Supported message types](#supported-message-types) for possible values. Always the third field. **`34 MsgSeqNum`** `int` The message sequence number, incremented by 1 for each consecutive message. **`49 SenderCompID`** `String` The identifier of the message sender. Provided by B2TRADER. **`52 SendingTime`** `Timestamp` The date and time when the message was sent, in UTC: `YYYYMMDD-HH:MM:SS.sss`. **`56 TargetCompID`** `String` The identifier of the message recipient. Provided by B2TRADER. *** **Standard Trailer** All FIX messages must end with a Standard Trailer: **`10 CheckSum`** `int` A three-digit checksum. Always the last field in a message. ### Logon (A) [#logon-a] This message is sent by the client to initiate a FIX session. It must be the first message in each connection. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`98 EncryptMethod`** `int` The encryption method. Required. Must be `0` (no encryption). **`108 HeartBtInt`** `int` The heartbeat interval, in seconds. Required. Indicates how often the server sends Heartbeat messages as part of a connection health check. **`141 ResetSeqNumFlag`** `Boolean` Indicates whether both parties should reset the currently used sequence numbers. Optional. **`553 Username`** `String` The client username. Required. Provided by B2TRADER. **`554 Password`** `String` The client password. Required. Provided by B2TRADER. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=117^35=A^1=68a4446ac84827ff5cd35c74^34=1^52=20231218-07:59:06.000^49=sender_b2trader^56=target_b2trader^554=password^553=username^98=0^108=30^10=117^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=93^35=A^1=68a4446ac84827ff5cd35c74^34=225^49=target_b2trader^52=20231218-07:59:06.655^56=sender_b2trader^98=0^108=30^10=054^ ``` ### Session maintenance [#session-maintenance] #### Heartbeat (0) [#heartbeat-0] This message is sent back and forth between the server and the client to check the connection status and in response to Test Request messages. **`112 TestReqID`** `String` The identifier of a Test Request in response to which this Heartbeat is sent. Conditional — required when sent in response to a Test Request. ```text title="Example" 8=FIX.4.4^9=79^35=0^34=2^52=20231218-07:59:36.000^49=sender_b2trader^56=target_b2trader^10=156^ ``` #### Test Request (1) [#test-request-1] This message is sent back and forth between the server and the client as a means of connectivity check. If a Heartbeat is not received within the expected interval, a Test Request is sent; the recipient must respond with a Heartbeat containing the same `<112>` TestReqID. **`112 TestReqID`** `String` The identifier of a Test Request. Required. ```text title="Example" 8=FIX.4.4^9=87^35=1^34=137^52=20231218-10:12:38.000^49=sender_b2trader^56=target_b2trader^112=2^10=250^ ``` #### Sequence Reset (4) [#sequence-reset-4] This message indicates the sequence number of the next message from the sender, immediately following the Sequence Reset. This may be necessary to recover from a disconnect when some messages were lost or their resending is not desirable. **`123 GapFillFlag`** `Boolean` Indicates that this message replaces missing messages that won't be resent. Optional. Possible values: * `Y` — Gap fill: `<34>` MsgSeqNum is valid and indicates the beginning of the gap fill range * `N` — Sequence reset: `<34>` MsgSeqNum is ignored. Should only be used in disaster recovery situations **`36 NewSeqNo`** `int` The new sequence number. Required. ```text title="Example" 8=FIX.4.4^9=90^35=4^34=6^49=target_b2trader^52=20231219-21:11:38.578^56=sender_b2trader^123=Y^36=8^10=176^ ``` #### Logout (5) [#logout-5] This message is sent by the client or server to terminate a session. When terminated, the possible reason is specified in the `<58>` Text field. **`58 Text`** `String` The detailed information about the reason for logging out. Optional. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=105^35=5^34=5^52=20231218-13:40:48.000^49=sender_b2trader^56=target_b2trader^58=Session terminated by client^10=183^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=81^35=5^34=748^49=target_b2trader^52=20231218-13:40:49.016^56=sender_b2trader^10=009^ ``` ### Reject (3) [#reject-3] This message is sent by the server upon receiving a malformed message from the client. The rejection reason is specified in the `<373>` SessionRejectReason field. This message is unrelated to application-level rejections (Execution Report with rejected status and Business Reject). **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`371 RefTagID`** `int` The tag number of the field that caused message rejection. Optional. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`373 SessionRejectReason`** `int` The reason why the message is rejected. Optional. Possible values: * `0` — Invalid tag number * `1` — Required tag missing * `2` — Tag not defined for this message type * `3` — Undefined tag * `4` — Tag has no value assigned * `5` — Value is incorrect (out of range) for this tag * `6` — Incorrect value data format * `7` — Decryption issue * `8` — Signature problem * `9` — CompID issue * `10` — SendingTime accuracy issue * `11` — Invalid MsgType * `12` — XML validation error * `13` — Same tag appears more than once * `14` — Tag specified not in required order * `15` — Wrong order of repeating group fields * `16` — Incorrect NumInGroup count for repeating group * `17` — Non-"Data" value includes field delimiter (SOH character) * `99` — Other **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=128^35=3^34=193^52=20231219-22:41:16.000^49=target_b2trader^56=sender_b2trader^45=18^371=11^372=D^373=1^58=Required tag missing: ClOrdID^10=126^ ``` *** ## New Order Single (D) [#new-order-single-d] This message is sent by the client to place a new order. The server responds with an Execution Report confirming the order status. For details on supported order types, see [Order types](../get-started/order-types). For details on time-in-force options, see [Time in force](../get-started/time-in-force). **`11 ClOrdID`** `String` The unique client-assigned order identifier. Required. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`55 Symbol`** `String` The market identifier. Required. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. **`54 Side`** `char` The order side. Required. Possible values: * `1` — Buy * `2` — Sell **`38 OrderQty`** `Qty` The order quantity. Required. Must be greater than zero. The decimal precision must not exceed the market's amount scale, and the value must be at least the market's minimum amount. **`40 OrdType`** `char` The order type. Required. Possible values: * `1` — Market * `2` — Limit **`59 TimeInForce`** `char` The order's time-in-force policy. Required. Possible values: * `0` — Day * `1` — Good Till Cancel (GTC) * `3` — Immediate or Cancel (IOC) * `4` — Fill or Kill (FOK) * `6` — Good Till Date (GTD) **`44 Price`** `Price` The order price. Conditional — required when `<40>` OrdType is `2` (Limit), must not be present when `<40>` OrdType is `1` (Market). Must be greater than zero. The decimal precision must not exceed the market's price scale. **`126 ExpireTime`** `UTCTimestamp` The order expiration time. Conditional — required when `<59>` TimeInForce is `6` (GTD), must not be present otherwise. **`60 TransactTime`** `UTCTimestamp` The time of order creation. Required. ```text title="Limit order example (Client → B2TRADER)" 8=FIX.4.4^9=168^35=D^34=3^52=20231220-09:15:30.000^49=sender_b2trader^56=target_b2trader^1=68a4446ac84827ff5cd35c74^11=order001^55=spot.btc_usdt^54=1^38=0.5^40=2^44=42500.00^59=1^60=20231220-09:15:30.000^10=123^ ``` ```text title="Market order example (Client → B2TRADER)" 8=FIX.4.4^9=155^35=D^34=4^52=20231220-09:16:00.000^49=sender_b2trader^56=target_b2trader^1=68a4446ac84827ff5cd35c74^11=order002^55=spot.btc_usdt^54=2^38=0.1^40=1^59=3^60=20231220-09:16:00.000^10=045^ ``` ## Execution Report (8) [#execution-report-8] This message is sent by the server to confirm order status changes, including acknowledgment of new orders, fills, partial fills, cancellations, and rejections. For details on order statuses, see [Order statuses](../get-started/order-statuses). **`37 OrderID`** `String` The server-assigned unique order identifier. Required. **`11 ClOrdID`** `String` The client-assigned order identifier from the original New Order Single. Required. **`17 ExecID`** `String` The unique execution identifier. Present for trade executions. **`150 ExecType`** `char` The type of execution being reported. Required. Possible values: * `0` — New: order has been accepted * `4` — Canceled: order has been canceled by the server (e.g., IOC order partially filled, GTD order expired, or market settings changed) * `8` — Rejected: order has been rejected * `F` — Trade: order has been partially or fully filled **`39 OrdStatus`** `char` The current order status. Required. Possible values: * `0` — New * `1` — Partially filled * `2` — Filled * `4` — Canceled * `8` — Rejected **`1 Account`** `String` The account identifier. Required. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`. **`54 Side`** `char` The order side. Required. Possible values: * `1` — Buy * `2` — Sell **`40 OrdType`** `char` The order type. Required. Possible values: * `1` — Market * `2` — Limit **`44 Price`** `Price` The order price. Present for Limit orders. **`6 AvgPx`** `Price` The average price of all fills on this order. Required. **`14 CumQty`** `Qty` The total filled quantity. Required. **`151 LeavesQty`** `Qty` The remaining quantity to be filled. Required. Set to `0` for Canceled or Rejected orders. **`31 LastPx`** `Price` The price of the last fill. Present when `<150>` ExecType is `F` (Trade). **`32 LastQty`** `Qty` The quantity of the last fill. Present when `<150>` ExecType is `F` (Trade). **`15 Currency`** `String` The quote asset identifier. Optional. **`60 TransactTime`** `UTCTimestamp` The transaction time. Required. **`64 SettlDate`** `String` The settlement date in `YYYYMMDD` format. Required. **`58 Text`** `String` Additional information, such as the rejection reason. Optional. ```text title="New order accepted (B2TRADER → Client)" 8=FIX.4.4^9=220^35=8^34=5^52=20231220-09:15:30.100^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YP^11=order001^150=0^39=0^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=1^40=2^44=42500.00^6=0^14=0^151=0.5^60=20231220-09:15:30.100^64=20231220^10=087^ ``` ```text title="Trade execution (B2TRADER → Client)" 8=FIX.4.4^9=245^35=8^34=6^52=20231220-09:15:30.200^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YP^11=order001^17=01HBXK5V3R8NQ7YR^150=F^39=2^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=1^40=2^44=42500.00^6=42500.00^14=0.5^151=0^31=42500.00^32=0.5^15=usdt^60=20231220-09:15:30.200^64=20231220^10=154^ ``` ```text title="Order rejected (B2TRADER → Client)" 8=FIX.4.4^9=214^35=8^34=7^52=20231220-09:16:00.100^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YS^11=order002^150=8^39=8^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=2^40=1^6=0^14=0^151=0^58=Insufficient balance^60=20231220-09:16:00.100^64=20231220^10=201^ ``` ## Business Reject (j) [#business-reject-j] This message is sent by the server to reject a message due to a business-level issue not addressed by the standard session-level Reject or Execution Report rejection. **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`380 BusinessRejectReason`** `int` The reason why the request is rejected. Required. Possible values: * `0` — Other * `1` — Unknown ID * `2` — Unknown Security * `3` — Unsupported MsgType * `4` — Application not available * `5` — Conditionally required field missing * `6` — Not authorized * `7` — DeliverTo firm not available at this time **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=100^35=j^34=2^49=target_b2trader^52=20231219-22:30:39.617^56=sender_b2trader^45=133^58=Unsupported Message Type^372=V^380=3^10=006^ ``` Each trading account has an `accountStatus` field that determines which operations are permitted on the account. The field is returned on account objects by the API, such as in [Get accounts](../rest-api/settings). An account can be assigned one of the following statuses: * **Active**: All operations are permitted, including placing, modifying, and canceling orders, opening and closing positions, deposits, and withdrawals. * **Halted**: Trader-initiated trading is blocked. Requests to place, modify, or cancel orders and to open or close positions are rejected. Deposits and withdrawals remain allowed. Managed trading through the Management API (MAM, B2COPY) continues to work. * **Frozen**: All operations are blocked. Trading, deposits, and withdrawals are unavailable, and the account is view-only. Stop-out liquidation still executes as a safety mechanism. * **Archived**: The account is decommissioned and hidden from all user-facing surfaces. Real-time profit and loss, equity, margin level, and funding settlement continue for all statuses. Archived accounts are never returned in the trading API account list. They are excluded server-side, so an account that changes to *Archived* stops appearing in [Get accounts](../rest-api/settings) responses. A market can be assigned one of the following statuses: * **Open**: The market is operating properly and accepts orders via Trading terminal and API. Market data for charts is persisted. * **Paused**: The market stops accepting incoming orders via Trading terminal and API (previously placed Limit orders still await execution). Market data for charts is persisted. * **Halted**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is persisted. * **Disabled**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is not persisted. * **Archived**: The market is retired from regular operations. It doesn't accept trading activity, isn't included in market synchronization responses, and its historical chart data is deleted. ## Market and Limit orders [#market-and-limit-orders] Orders can be assigned one of the following statuses: * **Started**: The order has passed preliminary checks. * **Pending**: For Limit orders: the order is waiting for a price trigger. * **Working**: The order is being executed. * **Completed**: The order has been executed in its full amount. * **Cancelled**: The order has been cancelled by a trader. * **Rejected**: The order has been rejected by the system and has never been assigned the *Working* status. * **Expired**: The order has been cancelled due to [Time in force](time-in-force) settings. Some part of it may have already been executed. The status is applicable for GTD and Day orders only. ## Stop orders [#stop-orders] Orders can be assigned one of the following statuses: * **Waiting for activation**: The order awaits the Activation price trigger. * **Activated**: The Activation price has been reached, a new Market or Limit order has been placed. * **Rejected**: The Activation price has been reached, but an issue occurred with placing of a new Market or Limit order. The following order types are supported: * **Market**: An instruction to instantly buy or sell a certain asset amount at a currently best price on the market. Such orders are not listed in the order book. * **Limit**: An instruction to buy or sell a certain asset amount at a specified price. Limit orders are placed in the order book and executed only after the market price reaches the specified limit price (or at a better price). * **Stop Market**: Such an order is not placed unless the current market price meets a specified stop (or trigger) price, after which the order is placed as a regular Market order due to be executed or cancelled, depending on its Time in force. * **Stop Limit**: The order is similar to the Stop Market order in the sense that you need to indicate the stop price at which the order must be placed, after which it becomes a regular Limit order awaiting execution at a specified limit price. For Stop buy orders, the stop price should be above the best ask price; for Stop sell orders, the stop price should be below the best bid price (otherwise, the orders will be activated instantly). Stop Market and Stop Limit orders are accepted while a market is closed according to its trading calendar. The order is stored with the standard `WaitingForActivation` status and is evaluated against the first available price when the session opens. Market and Limit orders are still rejected while the market is closed. The market's own status must still be `Open` — a `Paused` or `Halted` market rejects every order type. Refer to [Time in force](time-in-force) to learn about execution parameters that can be specified for different order types. ## Introduction [#introduction] B2TRADER provides developers with three distinct methods for data delivery, each optimized for specific use cases and performance requirements: REST, WebSocket, and FIX APIs. The **REST API** provides read access to market data as well as both read and write access to trading operations. It serves as the foundation for synchronous data operations where immediate confirmation and guaranteed delivery are essential. The **WebSocket API** provides access to public market data streaming as well as private account updates. It delivers real-time updates with low latency, making it ideal for live trading environments. The **FIX API** provides direct access to market data and trading via the FIX 4.4 protocol. It is designed for institutional clients and algorithmic trading systems that require standardized, low-latency connectivity using the industry-standard Financial Information eXchange protocol. This approach provides developers with flexible options for building robust, scalable trading applications that can handle both operational requirements and real-time market dynamics. ### When to use REST API [#when-to-use-rest-api] * **Account configuration and settings**: Managing user preferences and system configurations. * **Order placement and modification**: Creating, updating, and canceling trading orders. * **Historical data retrieval**: Accessing past trading records and market data. * **One-time data requests**: Retrieving specific information that doesn't require continuous updates. * **Administrative operations**: Account management and system administration tasks. ### When to use WebSocket API [#when-to-use-websocket-api] * **Real-time price monitoring**: Live market price feeds and ticker updates. * **Live position tracking**: Continuous monitoring of open and closed positions. * **Order book visualization**: Real-time depth of market data. * **Market data feeds**: Streaming market statistics and trading activity. * **Account balance monitoring**: Live updates of account equity and margin status. ### When to use FIX API [#when-to-use-fix-api] * **Institutional connectivity**: Standardized FIX 4.4 protocol for professional trading infrastructure. * **Algorithmic trading**: Low-latency order execution and market data for automated strategies. * **Market data streaming**: Real-time order book snapshots and incremental updates via FIX protocol. * **Multi-venue integration**: Unified FIX connectivity for systems already integrated with other FIX-based venues. ## General considerations [#general-considerations] The following applies to all interface descriptions provided in this documentation: * **Endpoints**: All endpoints are relative and resolved based on a specified hostname (indicated as `{host}`). * **Authentication**: REST and WebSocket APIs require an access token (see [Authentication](#authentication)). The FIX API uses in-band authentication via the Logon message with Username, Password, and Account fields provided by B2TRADER. * **Data format**: REST and WebSocket APIs return results in JSON format. The FIX API uses the standard FIX 4.4 message format. * **Security**: All communications use secure protocols (HTTPS for REST, WSS for WebSocket, encrypted TCP for FIX). ### Authentication [#authentication] API access requires an access token for both REST and WebSocket connections. Authentication follows a two-step process: 1. Generate an offline token in the Trading terminal. 2. Exchange the offline token for an access token via API call. #### Token types [#token-types] **Offline token** * **Limit**: 10 tokens per account * **Validity**: 1 year * **Management**: Can be revoked or deleted at any time * **Purpose**: Generate access tokens **Access token** * **Type**: Bearer token * **Validity**: 60 minutes * **Purpose**: Authorize API requests ### Generate offline token [#generate-offline-token] To generate an offline token: 1. In the Trading terminal, open **Settings** and select **API token management**. 2. Click **+ Create new**. 3. In the **New API token** popup, fill in a **Name** for the token, to help you identify it later. 4. Click **Create**. The newly generated token will be displayed and available for copying, along with its name and expiration date. The token only reveals once in the creation popup. Copy and store it securely before closing the popup. The token can't be retrieved again after closing. ### Obtain access token [#obtain-access-token] Request an access token using your offline token. **Endpoint**: `POST` `/frontoffice/api/v4/access-token` **Request body**: ```json { "token": "{YOUR_OFFLINE_TOKEN}" } ``` **Response** (Success): ```json { "accessToken": "{YOUR_ACCESS_TOKEN}", "expiresIn": 3600, "tokenType": "Bearer" } ``` **`accessToken`** `string` The access token for API authorization. **`expiresIn`** `integer` The token lifetime, in seconds. **`tokenType`** `string` The authentication type, always `"Bearer"`. ### Using access tokens [#using-access-tokens] Include the access token in API requests: ```http title="REST" Authorization: Bearer {YOUR_ACCESS_TOKEN} ``` ```http title="WebSocket" {URL}?access_token={YOUR_ACCESS_TOKEN} ``` Access tokens must be refreshed before expiration by repeating the Step 2 with your offline token. ## REST API: Synchronous data operations [#rest-api-synchronous-data-operations] The REST API serves as the foundation for synchronous data operations within the B2TRADER platform. This approach follows standard HTTP protocols and is ideal for operations requiring immediate confirmation and guaranteed delivery. ### Key characteristics [#key-characteristics] * **Request-response operations** where immediate confirmation is required. * **Account management** including settings and configuration. * **Order placement and modification** with guaranteed delivery. * **Historical data retrieval** for analysis and reporting. * **Stateless operations** that don't require persistent connections. ### HTTP response codes [#http-response-codes] B2TRADER API uses conventional HTTP response codes to indicate the success or failure of requests. **Success codes:** * `200 OK` — Request successful **Error codes:** * `400 Bad Request` — Invalid request parameters * `401 Unauthorized` — Authentication required * `403 Forbidden` — Insufficient permissions * `404 Not Found` — Resource not found * `429 Too Many Requests` — [Rate limit](#rate-limits) exceeded * `500 Internal Server Error` — Server error In case of an error, an object will be returned with the following structure: ```json { "code": "text", "message": "text", "details": { "source": "text", "message": "text", "stackTrace": "text" } } ``` ### Available endpoints [#available-endpoints] * **[Trading operations](../rest-api/trading)**: Create, modify, and cancel orders; open, close, and modify positions; control price trigger settings. * **[Trading history](../rest-api/history)**: Retrieve detailed execution records for positions and orders. * **[Settings and configurations](../rest-api/settings)**: Access account information, market specifications, trading sessions, and asset details. ### Rate limits [#rate-limits] Rate limits are applied per minute for each unique **AccountId** to ensure fair resource usage and maintain optimal API performance. All limits use the **Fixed Window** strategy. When rate limits are exceeded, the API returns a `429 Too Many Requests` HTTP status code. #### Trading methods [#trading-methods] * **Default limit**: 600 requests per minute for all methods. * **Reduced limit (200 rpm)** applies to: * Get order data methods * Bulk close positions method * Price triggers methods #### History methods [#history-methods] * **All request types**: 60 requests per minute. #### Settings methods [#settings-methods] * **GET requests**: 100 requests per minute. * **POST and DELETE requests**: 60 requests per minute. Rate limits are calculated independently for each method category. For example, you can make 100 GET requests to Settings methods and 60 requests to History methods within the same minute without hitting rate limits. ## WebSocket API: Real-time data streaming [#websocket-api-real-time-data-streaming] The WebSocket API delivers real-time updates with minimal latency, essential for modern trading applications. The implementation uses unidirectional communication from server to client, ensuring efficient data delivery. ### Key characteristics [#key-characteristics-1] * **Unidirectional communication** from server to client for optimal performance. * **Real-time market data** for live trading environments. * **Position and order updates** as they occur in real-time. * **Low-latency data delivery** for time-sensitive trading operations. * **Persistent connections** maintaining continuous data flow. ### SignalR implementation [#signalr-implementation] B2TRADER utilizes **AspNetCore SignalR** for WebSocket message organization and transmission, providing a robust and scalable real-time communication framework. **Resources:** * [Official GitHub Repository](https://github.com/dotnet/aspnetcore/tree/main/src/SignalR) * [Official Documentation](https://dotnet.microsoft.com/en-us/apps/aspnet/signalr) SignalR provides a structured approach to real-time communication through standardized message formatting and connection management. ### Connection lifecycle [#connection-lifecycle] The data transfer process consists of two essential phases: 1. **Connection establishment** — Initial handshake, authentication, and subscription setup. 2. **Data streaming** — Continuous real-time data flow with automatic reconnection handling. ### Message types [#message-types] SignalR utilizes numerical `type` indicators for different operations: ### Available stream types [#available-stream-types] * **[Trading streams](../ws-api/trading)**: Track active orders, open and closed positions. * **[Market data streams](../ws-api/market-data)**: Get real-time order book updates, market statistics and price changes. * **[Account information streams](../ws-api/account-info)**: Get live account balance and margin updates. ## FIX API: Standardized protocol connectivity [#fix-api-standardized-protocol-connectivity] The FIX API provides direct access to B2TRADER via the FIX 4.4 protocol, the industry standard for electronic trading communication. It is designed for institutional clients and algorithmic trading systems. ### Key characteristics [#key-characteristics-2] * **FIX 4.4 protocol** for standardized, vendor-neutral connectivity. * **Dedicated sessions** for Market Data and Trading with separate endpoints. * **In-band authentication** via Logon message (Username, Password, Account). * **Real-time market data** with order book snapshots and incremental updates. * **Session management** with Heartbeat, Test Request, and Sequence Reset support. ### Authentication [#authentication-1] Unlike REST and WebSocket APIs, the FIX API does not use access tokens. Authentication is performed in-band as part of the FIX Logon message using credentials provided by B2TRADER: * **Username** (`<553>`): The client username * **Password** (`<554>`): The client password * **Account** (`<1>`): The account identifier ### Available session types [#available-session-types] * **[Market Data](../fix-api/market-data)**: Subscribe to real-time order book updates, snapshots, and incremental refreshes. * **[Trading](../fix-api/trading)**: Place orders and receive execution reports in real time. ## Integration best practices [#integration-best-practices] ### API selection strategy [#api-selection-strategy] * Use **REST API** for operational tasks requiring confirmation (order placement, account management). * Use **WebSocket API** for real-time monitoring and market data visualization. * Use **FIX API** for institutional connectivity, algorithmic trading, and integration with existing FIX-based infrastructure. * Implement multiple APIs in comprehensive trading applications for optimal functionality. ### Performance optimization [#performance-optimization] * Implement proper connection pooling for REST API requests. * Use WebSocket subscriptions efficiently by subscribing only to required data streams. * Handle reconnection logic for WebSocket connections to ensure data continuity. * Implement appropriate error handling and retry mechanisms. ### Security considerations [#security-considerations] * Store authentication tokens securely and implement token refresh mechanisms. * Use secure connections (HTTPS/WSS) for all API communications. * Implement proper input validation and sanitization. * Monitor API usage and implement rate limiting on the client side. This comprehensive API architecture enables developers to build sophisticated trading applications that can handle both real-time market dynamics and operational trading requirements efficiently. When trading on CFD or Perpetual markets, the following triggers can be enabled to manage investments and mitigate risks: * **Take profit**: A take-profit order is used to sell or buy an asset automatically once it hits a predefined price, ensuring the trader locks in profits. For example, if a trader buys ETH at $2,000 and sets the Take profit at $2,100, the platform will sell the ETH automatically when the market price reaches $2100, securing the trader's profit. * **Stop loss**: A stop-loss order is a tool to limit potential losses. It automatically sells an asset when its price falls to a predetermined level. For example, if a trader buys ETH at $2,000 and sets the Stop loss at $1,900, the asset will be sold if the price drops to $1,900, capping the loss to $100 per ETH. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified percentage. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. For example, a trader buys ETH at $2,000 and sets the Trailing stop at $1900 with a 10% adjustment. If ETH rises to $2,200, the Trailing stop increases to $2,090. A drop to $2,090 triggers the sale, locking in gains. The triggers are applicable to all order types: Market, Limit, Stop Market, and Stop Limit. Multiple triggers can be applied simultaneously. The triggers can be adjusted anytime until a position is fully closed. The Take profit, Stop loss, and Trailing stop always operate with the current position volume. For **buy** orders, the triggers are activated by the top-of-the-book **bid** price. For **sell** orders, the triggers are activated by the top-of-the-book **ask** price. Triggers do not activate if a position is in the *Stop out* state. However, if the position persists after the *Stop out*, triggers can then be activated. The following time-in-force settings can be specified for orders: * **FOK** (fill-or-kill): Such orders are either filled instantly or killed (cancelled). In other words, a fill-or-kill order must be fulfilled instantly or not executed at all. FOK orders are used when partial delivery of assets isn't acceptable for any reason. * **IOC** (immediate-or-cancel): This setting implies that any part of an order that can't be filled instantly must be cancelled. Upon placing an IOC order, an attempt will be made to instantly execute it (in full or in part) at the best possible price, after which any remaining, unfilled part will be cancelled. If no amount is available at a specified price upon placing such order, it's cancelled instantly. * **GTC** (good-‘til-cancelled): The default setting applied to all Limit orders. Open GTC orders are awaiting execution until they are cancelled explicitly by a trader or filled. * **GTD** (good-‘til-date): Can be applied to Limit and Stop Limit orders. Such orders remain listed in the order book until a specified date or until they are cancelled by a trader. By that time the order can be partially executed. * **DAY**: Can be applied to Limit and Stop Limit orders. Such orders remain listed in the order book until 23:59 of the current day or until they are cancelled by a trader. By that time the order can be partially executed. * **Retry**: Can be applied to Market orders only. A Retry order aims to fill your full volume by repeatedly filling the unfilled remainder at current market prices. The average price may be worse than shown, and in thin markets a remainder may stay unfilled. The order expiration time is defined by the time settings specified for the platform, without taking into account the time settings of the devices from which the platform is accessed. Guest endpoints serve public market data to callers with no access token. Each one is the anonymous counterpart of an authenticated endpoint: same request shape, same response schema, no authorization. They exist so an unauthenticated Trading terminal session can render markets, charts, and order books, and you can use them the same way for read-only integrations. Every guest endpoint sits under a `/guest` path segment inserted after the API version, and shares these rules: * **No authentication.** Do not send an `Authorization` header. There are no required operations. * **No `accountId`.** The `accountId` header used by the authenticated endpoints does not apply and is not read. * **Public data only.** Balances, positions, orders, trade history, margin, and user profile are not reachable through any guest endpoint. * **Guest-visible markets only.** A market that is not active and well-configured is rejected with `400`, even if it exists. * **No account context.** A guest has no trading account, so nothing account-specific enters the calculation. Commissions come from the tenant's **default** commission profile rule, with volume-based tiers evaluated at a traded volume of `0`, so a guest always sees the entry tier. Prices and calculated figures can therefore differ from the same call made with an access token. * **Rate limited per caller.** Guest traffic is subject to its own request-rate limit, separate from the authenticated limits. * **Read-only.** There is no guest counterpart of order placement, position closing, trigger submission, or favorites. ## Assets [#assets] `GET` `/frontoffice/api/v3/guest/assets` Anonymous counterpart of [Get assets](settings#get-assets). Returns the same schema, restricted to CRM-source assets — assets that exist only on a liquidity provider stay hidden. ## Info [#info] `GET` `/frontoffice/api/v3/guest/info` Anonymous counterpart of [Get server info](settings#get-server-info). Same platform time, same schema. *** `GET` `/frontoffice/api/v3/guest/info/time-zones` Anonymous counterpart of [Get server time zones](settings#get-server-time-zones). Same schema. ## Markets [#markets] `GET` `/frontoffice/api/v5/guest/markets` Anonymous counterpart of [Get markets](settings#get-markets). Lists active, well-configured markets ordered by display name. Accepts the optional `categoryId` query parameter. Each item carries `marketId`, `displayName`, `fullName`, `type`, and `subtype` — the authenticated `isFavorite` field is absent, because guests have no per-account favorites. *** `GET` `/frontoffice/api/v5/guest/markets/{marketId}` Anonymous counterpart of [Get market](settings#get-market). Returns the instrument's trading parameters — price and amount scales, tick size, lot size and step, amount limits, trading calendar, slippage rate, price deviation, and the funding schedule for perpetual markets. The per-account, commission, and leverage fields of the authenticated response are absent. An unknown, disabled, or misconfigured `marketId` returns `400`. *** `GET` `/frontoffice/api/v4/guest/markets-categories` Returns the broker's market category tree, pruned to branches that contain at least one guest-visible market. Each category carries `id`, `name`, and a nested `categories` array. ## Order data [#order-data] These endpoints price a hypothetical order without placing it. They are the calculation behind the order form's preview figures. `POST` `/frontoffice/api/v3/guest/order-data` Anonymous counterpart of [Get SPOT order data](trading#get-spot-order-data). Same request body. The response carries the same `order` object with `baseAmount`, `quoteAmount`, `commissionAmount`, and `total`, calculated without any account-specific settings and with the tenant-default commission rule. *** `POST` `/frontoffice/api/cfd/v4/guest/order-data` Anonymous counterpart of [Get CFD order data](trading#get-cfd-order-data). Same request body. The response carries the same `order` object — `lotAmount`, `requiredMarginInRAT`, `quoteAmount`, `commissionAmountInRAT`, `takeProfit`, and `stopLoss` — calculated without any account-specific settings, and with `marginLevel` always `null`, since it needs a balance and open positions. *** `POST` `/frontoffice/api/perpetual/v4/guest/order-data` Anonymous counterpart of [Get PF order data](trading#get-pf-order-data). Behaves exactly as the CFD guest variant above, including `marginLevel` always being `null`. ## Charting [#charting] `GET` `/marketdata/api/v4/guest/instruments/{marketSymbol}/history` Returns historical candles for a market. Candle prices are not account-specific and can differ from the authenticated endpoint's response for the same market and window. Response schema matches the authenticated charting history endpoint at `/marketdata/api/v4/instruments/{marketSymbol}/history`. `type`, `startDate`, and `endDate` are **required** here, and the requested window is capped per timeframe: | Timeframe | Maximum window | | ---------------------- | -------------- | | 1, 5, 15, 30 minutes | 30 days | | 1, 4, 12 hours | 365 days | | 1 day, 1 week, 1 month | 5 years | A missing, malformed, or oversized window returns `400`. `endDate` may not be in the future beyond a one-minute allowance for client clock drift. A market that is hidden from traders returns an empty candle set rather than an error. *** `GET` `/marketdata/api/v4/guest/instruments/{marketSymbol}/funding` Returns the funding event history of a perpetual market. Funding events do not depend on an account, so the response matches the authenticated endpoint at `/marketdata/api/v4/instruments/{marketSymbol}/funding` exactly. Accepts the same `limit`, `offset`, `appliedAtFrom`, and `appliedAtTo` query parameters. An unknown market symbol, or a market that is not a perpetual, returns `400`. ## AI recommendation [#ai-recommendation] `GET` `/marketdata/api/v1/guest/ai-recommendation/{marketId}` Returns the AI-generated recommendation for a market — price forecast, sentiment ratios, suggested actions, market metrics, and triggers. Response schema matches the authenticated endpoint at `/marketdata/api/v1/ai-recommendation/{marketId}`. Accepts the same optional `language` query parameter, defaulting to `en`. An unknown `marketId` returns `400`. ## Streaming market data as a guest [#streaming-market-data-as-a-guest] The endpoints above cover snapshots and history. For live prices, order books, and candles without a token, use the guest market data stream — see [Guest market data](../ws-api/market-data#guest-market-data). ## Open positions [#open-positions] ### Get executions for an open position [#get-executions-for-an-open-position] `POST` `/frontoffice/api/v4/positions/``{positionId}``/executions/list` #### Summary [#summary] Use this method to retrieve execution details for a specific open position using its position identifier. #### Request [#request] ##### Header parameters [#header-parameters] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters] **`positionId`** `required` The position identifier. ##### Body [#body] **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`offset`** `integer · int32 | nullable` The number of items to skip before starting to collect the result set. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2PMT0VMJG5B8XBDNZ7FNM1F/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 2, "offset": 0 } ``` #### Response [#response] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.293Z", "executionId": "01K2PMT0VNWB23GSRN2XQAJD6Q", "baseAmount": "0.314", "executionPrice": "4603.5", "commissionAmountInRAT": "0", "commissions": [], "comment": null }, { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.293Z", "executionId": "01K2PMT0VN1F2JPM14AEV6V8YJ", "baseAmount": "0.045", "executionPrice": "4603.49", "commissionAmountInRAT": "0", "commissions": [], "comment": null } ] } ``` ### Get executions for open positions [#get-executions-for-open-positions] `POST` `/frontoffice/api/v4/positions/executions/list` #### Summary [#summary-1] Use this method to retrieve execution details for multiple open positions by providing an array of position identifiers. #### Request [#request-1] ##### Header parameters [#header-parameters-1] **`accountId`** `required` The trading account identifier. ##### Body [#body-1] **`positionIds`** `array · string[]` The array of position identifiers. **`limit`** `integer · int32 | nullable` The maximum number of items to return. ```http title="Request example" POST /frontoffice/api/v4/positions/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "positionIds": [ "01K2PMT0VMJG5B8XBDNZ7FNM1F", "01K2PMXY63HESK110WT1CHMAFA" ], "limit": 5 } ``` #### Response [#response-1] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "01K2PMXY63HESK110WT1CHMAFA", "orderId": "01K2PMXY1894RC6E2BYFR00T87", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:38:10.627Z", "executionId": "01K2PMXY63NXM30VNWPDECSFJR", "baseAmount": "15", "executionPrice": "4333.69288", "commissionAmountInRAT": "32.27", "commissions": [ { "assetId": "eur", "amount": "32.27" } ], "comment": null }, { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.292Z", "executionId": "01K2PMT0VMPCZW0JB2C9J6B405", "baseAmount": "0.141", "executionPrice": "4602.3", "commissionAmountInRAT": "5", "commissions": [ { "assetId": "eur", "amount": "5" } ], "comment": null } ] } ``` ## Closed positions [#closed-positions] ### Get orders for closed positions [#get-orders-for-closed-positions] `POST` `/frontoffice/api/v4/orders/closed-positions` #### Summary [#summary-2] Use this method to retrieve orders associated with closed positions within specified date ranges and market filters. #### Request [#request-2] ##### Header parameters [#header-parameters-2] **`accountId`** `required` The trading account identifier. ##### Body [#body-2] **`createdAtFrom`** `string · date-time | nullable` The start date of the period when the positions were opened. **`createdAtTo`** `string · date-time | nullable` The end date of the period when the positions were opened. **`closedAtFrom`** `string · date-time | nullable` The start date of the period when the positions were closed. **`closedAtTo`** `string · date-time | nullable` The end date of the period when the positions were closed. **`marketId`** `string | nullable` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`marketType`** `string | nullable` The market type. Possible values: * `Cfd` * `Perp` **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`lastOrderId`** `string | nullable` The identifier of the final order to be returned. ```http title="Request example" POST /frontoffice/api/v4/orders/closed-positions HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 2, "createdAtFrom": "2025-08-01T12:00:32.886Z", "createdAtTo": "2025-08-15T12:00:32.886Z" } ``` #### Response [#response-2] In case of success, an object will be returned. Each object contains the following information: **`marketId`** `string` The market identifier. **`marketFullName`** `string | nullable` The market full name or description (optional). **`marketDisplayName`** `string | nullable` The market ticker. **`marketType`** `string` The market type. Possible values: * `Cfd` * `Perp` **`orderId`** `string` The order identifier. **`orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`timeInForce`** `string` The [time-in-force setting](../get-started/time-in-force) of the order. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`side`** `string` The order side. Possible values: * `Buy` * `Sell` **`positionCloseLotAmount`** `decimal string` The position amount closed by the order, in lots. **`reason`** `string` The reason for placing the order. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`closedAt`** `string · date-time | nullable` The date and time when the position was closed. **`positionId`** `string` The position identifier. **`openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`closePrice`** `decimal string` The volume-weighted average price (VWAP) of trades related to a position-closing order. **`positionPriceInRAT`** `decimal string` The position price, in conversion to RAT. **`rateToRAT`** `decimal string` The conversion rate to RAT. **`openedAt`** `string · date-time` The date and time when the position was opened. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "data": [ { "marketId": "cfd.eth_eur", "marketFullName": null, "marketDisplayName": "CFD ETH/EUR", "marketType": "Cfd", "orderId": "01K2PNGX50SR1FRE6P14PJC17E", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "15", "reason": "Trader", "realizedPnlInRAT": "-144.64", "closedAt": "2025-08-15T10:48:32.393Z", "positionId": "01K2PMXY63HESK110WT1CHMAFA", "openPrice": "4333.69288", "closePrice": "3370.58389", "positionPriceInRAT": "50558.75", "rateToRAT": "1", "openedAt": "2025-08-15T10:38:10.628Z", "comment": null }, { "marketId": "perp.eth_usdt", "marketFullName": "ETH/USDT_4s8hKqiPXmXOEhsO1J6W", "marketDisplayName": "ETH/USDT_jC6Im5PxwgZLrwyccRcI", "marketType": "Perpetual", "orderId": "01K2PNG3N6NKAJVV4RV5E2V0HK", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "0.5", "reason": "Trader", "realizedPnlInRAT": "13.42", "closedAt": "2025-08-15T10:48:06.234Z", "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "openPrice": "4603.1607", "closePrice": "4634.3915", "positionPriceInRAT": "1992.78", "rateToRAT": "0.86", "openedAt": "2025-08-15T10:36:02.293Z", "comment": null } ], "isExceeded": true } ``` ### Get executions for a closing order [#get-executions-for-a-closing-order] `POST` `/frontoffice/api/v5/orders/``{orderId}``/executions/list` #### Summary [#summary-3] Use this method to retrieve execution details for a specific position-closing order using its identifier. #### Request [#request-3] ##### Header parameters [#header-parameters-3] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-1] **`orderId`** `required` The order identifier. ##### Body [#body-3] **`positionId`** `string | nullable` The position identifier. **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`lastExecutionId`** `string | nullable` The identifier of the final execution to be returned. ```http title="Request example" POST /frontoffice/api/v4/orders/01K2PNG3N6NKAJVV4RV5E2V0HK/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 5 } ``` #### Response [#response-3] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed amount of the base asset. **`executionPrice`** `decimal string` The price at which the execution was settled. **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. Structure: * **`assetId`** `string` * **`amount`** `decimal string` **`positionSizeIncreased`** `boolean` Indicates if a position size was increased (`true`) or decreased (`false`) as a result of the execution. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "string", "orderId": "string", "side": "Buy", "reason": "Trader", "createdAt": "2025-12-18T19:02:22.196Z", "executionId": "string", "baseAmount": "string", "executionPrice": "string", "realizedPnlInRAT": "string", "commissionAmountInRAT": "string", "commissions": [ { "assetId": "string", "amount": "string" } ], "positionSizeIncreased": true } ], "isExceeded": true } ``` ### Get executions for closing orders [#get-executions-for-closing-orders] `POST` `/frontoffice/api/v5/orders/executions/list` #### Summary [#summary-4] Use this method to retrieve execution details for multiple position-closing orders by providing an array of order identifiers. #### Request [#request-4] ##### Header parameters [#header-parameters-4] **`accountId`** `required` The trading account identifier. ##### Body [#body-4] **`orderId`** `string` The order identifier. **`positionId`** `string` The order identifier. ```http title="Request example" POST /frontoffice/api/v4/orders/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "orderPositionPairs": [ { "orderId": "01K31APDKZCVGWZA3XTF5JPAMD", "positionId": "01K31APDWF2EBHRKHH15VGB1ST" } ], "limit": 0 } ``` #### Response [#response-4] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. Structure: * **`assetId`** `string` * **`amount`** `decimal string` **`positionSizeIncreased`** `boolean` Indicates if a position size was increased (`true`) or decreased (`false`) as a result of the execution. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "string", "orderId": "string", "side": "Buy", "reason": "Trader", "createdAt": "2025-12-18T18:53:15.657Z", "executionId": "string", "baseAmount": "string", "executionPrice": "string", "realizedPnlInRAT": "string", "commissionAmountInRAT": "string", "commissions": [ { "assetId": "string", "amount": "string" } ], "positionSizeIncreased": true, "comment": null } ], "isExceeded": true } ``` ## Equity Curve [#equity-curve] ### Get equity curve data [#get-equity-curve-data] `POST` `/api/history/v1/equity-curve` #### Summary [#summary-5] Use this method to retrieve equity data points for a trading account over an inclusive date range. The response can contain daily, weekly, or monthly data points. #### Request [#request-5] ##### Header parameters [#header-parameters-5] **`accountId`** `string` `required` The trading account identifier. ##### Body [#body-5] **`dateFrom`** `string · date-time` `required` The start of the inclusive date range, in ISO 8601 format. **`dateTo`** `string · date-time` `required` The end of the inclusive date range, in ISO 8601 format. It must be later than `dateFrom`. **`granularity`** `string` `required` The aggregation granularity. Possible values are `Days`, `Weeks`, and `Months`. ```http title="Request example" POST /api/history/v1/equity-curve HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "dateFrom": "2026-03-01T00:00:00Z", "dateTo": "2026-04-01T00:00:00Z", "granularity": "Days" } ``` #### Response [#response-5] In case of success (`200`), an object containing the equity curve data points is returned. **`dataPoints`** `array of object` The data points for the requested range and granularity. Each data point contains: * **`date`** `string · date-time` — the date represented by the data point, in ISO 8601 format. * **`marginBalance`** `decimal string` — the margin balance at the data point. * **`equity`** `decimal string` — the equity at the data point. * **`totalEquity`** `decimal string` — the total equity at the data point. * **`unrealizedPnl`** `decimal string` — the unrealized profit or loss at the data point. * **`deposits`** `decimal string` — the deposits recorded for the data point or aggregation period. * **`withdrawals`** `decimal string` — the withdrawals recorded for the data point or aggregation period. **`lastUpdated`** `string · date-time` The timestamp of the most recent data update, in ISO 8601 format. An invalid granularity or a date range where `dateFrom` is not before `dateTo` returns `400 Bad Request`. ```json title="Response example — 200: OK" { "dataPoints": [ { "date": "2026-04-01T00:00:00Z", "marginBalance": "10000.50", "equity": "10500.75", "totalEquity": "10500.75", "unrealizedPnl": "500.25", "deposits": "0", "withdrawals": "0" } ], "lastUpdated": "2026-04-01T12:00:00Z" } ``` ## Accounts [#accounts] ### Get accounts [#get-accounts] `GET` `/frontoffice/api/v3/accounts` #### Summary [#summary] Use this method to retrieve a list of all trading accounts with their basic information including account type and total balance. #### Request [#request] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/accounts HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response] In case of success, an array of objects will be returned. Each object contains the following information: **`accountId`** `string` The trading account identifier. **`publicAccountId`** `integer` The public account identifier for display purposes. **`accountName`** `string` The account name. **`accountType`** `string` The account type. Possible values: * `Hedging` * `Netting` **`accountStatus`** `string` The account status, which determines the permitted operations. For a description of each value, see [Account statuses](../get-started/account-statuses). Possible values: * `Active` * `Halted` * `Frozen` **`totalBalanceInRAT`** `decimal string` The total balance, in RAT. **`isCopyTradingAccount`** `boolean` Indicates if the account is `Copy`. ```json title="Response example — 200: OK" [ { "accountId": "685a7eaa360f9e7416221a61", "publicAccountId": 1234567, "accountName": "B2TRADER Hedging account", "accountType": "Hedging", "accountStatus": "Active", "totalBalanceInRAT": "6020.12", "isCopyTradingAccount": false }, { "accountId": "6891e70db552ff9c6fbbccf5", "publicAccountId": 1234568, "accountName": "B2TRADER Netting account", "accountType": "Netting", "accountStatus": "Halted", "totalBalanceInRAT": "10987.39", "isCopyTradingAccount": false } ] ``` ## Assets [#assets] ### Get assets [#get-assets] `GET` `/frontoffice/api/v3/assets` #### Summary [#summary-1] Use this method to retrieve a list of available assets on the platform. #### Request [#request-1] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/assets HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-1] In case of success, an array of objects will be returned. Each object contains the following information: **`assetId`** `string` The asset identifier. **`assetName`** `string` The asset display name. **`isRootAsset`** `boolean` Indicates whether this is a root asset. ```json title="Response example — 200: OK" [ { "assetId": "usdt", "assetName": "Tether", "isRootAsset": true }, { "assetId": "xrp", "assetName": "Ripple", "isRootAsset": false } ] ``` ## Markets [#markets] ### Get markets [#get-markets] `GET` `/frontoffice/api/v6/markets` #### Summary [#summary-2] Use this method to retrieve a list of available markets with their type, subtype, and favorite status. #### Request [#request-2] ##### Query parameters [#query-parameters] **`categoryId`** The market category identifier. **`dynamicCommissionGroupId`** The dynamic commission group identifier. **`isFavorite`** `boolean` Filter by favorite status. If set to `true`, only markets marked as favorites are returned. ```http title="Request example" GET /frontoffice/api/v6/markets?isFavorite=true HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} ``` #### Response [#response-2] In case of success, an array of market objects is returned. Each market object contains the following information: **`marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`displayName`** `string` The market ticker. **`fullName`** `string | nullable` The market full name or description. **`type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`subtype`** `string | nullable` *Applicable to CFD markets only.* The market subtype. Possible values: * `Crypto` * `Fx` * `Metals` * `Indices` * `Energies` * `Ndf` * `Shares` * `Etf` **`isFavorite`** `boolean` Indicates whether the market is marked as a favorite by the current user. ```json title="Response example — 200: OK" [ { "marketId": "spot.btc_usdt", "displayName": "BTC/USDT", "fullName": null, "type": "Spot", "subtype": null, "isFavorite": true }, { "marketId": "cfd.eth_btc", "displayName": "ETH/BTC", "fullName": "Ethereum to Bitcoin", "type": "Cfd", "subtype": "Crypto", "isFavorite": false }, { "marketId": "perp.trx_usdt", "displayName": "TRX/USDT", "fullName": "TRX to Tether Perpetual", "type": "Perpetual", "subtype": null, "isFavorite": false } ] ``` ### Get market [#get-market] `GET` `/frontoffice/api/v6/markets/``{marketId}` #### Summary [#summary-3] Use this method to retrieve detailed information about a specific market using its market identifier. #### Request [#request-3] ##### Path parameters [#path-parameters] **`marketId`** `required` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. ```http title="Request example" GET /frontoffice/api/v6/markets/{marketId} HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-3] In case of success, an object will be returned. Each object contains the following information: **`marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`displayName`** `string` The market ticker. **`fullName`** `string | nullable` The market full name or description (optional). **`baseAssetId`** `string` The base asset identifier. **`quoteAssetId`** `string` The quote asset identifier. **`minAmount`** `decimal string | nullable` *Applicable to Spot markets only.* The minimum tradable amount of the base asset. **`maxBaseAmount`** `decimal string | nullable` The maximum tradable amount of the base asset. **`priceDeviation`** `decimal string` The allowed price deviation for Limit orders placed on the market. Supports decimal values in the range `[0, 1]`, with up to 4 decimal places, for example: * `0.1` = 10% * `0.01` = 1% * `0.001` = 0.1% * `0.0001` = 0.01% If set to `0`, no restriction is applied, the price deviation is ignored. **`priceScale`** `integer` The price precision, which is the number of digits after a decimal separator. Also determines the minimum allowed trade price. Supports only integer values in the range `[2, 8]`. For example, `2` means the following price format: `0.01`, and `8`: `0.00000001`. **`amountScale`** `integer | nullable` *Applicable to Spot markets only.* The amount precision, which is the number of digits after a decimal separator. Also determines the minimum trade amount. Supports only integer values in the range `[0, 8]`. For example: * `0` means `1` (no digits after the decimal separator) * `5` means `0.00001` (five digits after the decimal separator) * `8` means `0.00000001` (eight digits after the decimal separator) **`type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`subtype`** `string | nullable` *Applicable to CFD markets only.* The market subtype. Possible values: * `Crypto` * `Fx` * `Metals` * `Indices` * `Energies` * `Ndf` * `Shares` * `Etf` **`swapSettings`** `object | nullable` *Applicable to CFD markets only.* The fee type charged for holding open positions overnight. The amount can be negative for rebates. Possible values: * `FixPerLot`: The fixed amount per lot. * `Percent`: The fixed amount in points which is applied to the position size, in the range `[-1, 1]`, with up to 5 decimal places. * `Points`: The fixed amount of percents which is applied to the position size, with up to 3 decimal places. Structure: * **`type`** `string` — Swap calculation type. Possible values: `FixPerLot`, `Percent`, `Points`. * **`shortPositionSettings`** `object` — Settings for Short positions: * **`size`** `decimal string` * **`assetId`** `string | nullable` * **`longPositionSettings`** `object` — Settings for Long positions: * **`size`** `decimal string` * **`assetId`** `string | nullable` **`lotSize`** `integer | nullable` *Not applicable to Spot markets.* The standardized quantity of the base asset per lot. Supports only integer values in the range `[1, 1000000]`. **`minLotAmount`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum order amount, in lots, that can be placed and executed. Supports values in the range `[0.00000001, 1]`. **`maxLotAmount`** `integer | nullable` *Not applicable to Spot markets.* The maximum order amount, in lots, that can be placed and executed. Supports only integer values in the range `[1, 10000]`. **`tickSize`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum price increment. **`lotStep`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum lot amount increment. Supports values in the range `[0.00000001, 1]`. By default, equals to the `minLotAmount`. **`slippageRate`** `decimal string` The expected slippage, that is, the difference between the expected execution price and the actual one. This value is used as a multiplier to calculate the funds to be put on hold for a market order execution. Supports values in the range `[1, 10]`, including decimal values with up to 4 decimal places. The default value is `1` which means that only the current bid/ask price is put on hold. For example, `1.1` means that the current bid or ask price + 10% is put on hold for each order, to cover the 10% slippage. **Mind that** the total amount funds to be held depends on the order parameters and takes into account many conditions, the slippage rate is only one of them. **`calendar`** `object` The trading calendar defining market trading hours. Structure: * **`timeZoneId`** `string` — IANA time zone identifier. * **`tradingSessions`** `array` — Weekly trading sessions: * **`dayOfWeek`** `string` — One of: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. * **`timeIntervals`** `array` — List of intervals with: * **`start`** `string` (time) — Start time in `calendar.timeZoneId`. * **`end`** `string` (time) — End time in `calendar.timeZoneId`. * **`sessionOverrides`** `array` — Optional specific-date overrides: * **`date`** `string` (date) — In `YYYY-MM-DD` format. * **`timeIntervals`** `array | nullable` — Intervals for that date. **`fundingStartTime`** `string | nullable` *Applicable to Perpetual markets only.* The time of the first funding settlement, in the following format: `HH:MM:SS`. **`fundingIntervalInHours`** `integer | nullable` *Applicable to Perpetual markets only.* The funding settlement interval, in hours. Possible values: 1, 2, 3, 4, 6, 8, 12, 24. **`leverageProfile`** `object` *Not applicable to Spot markets.* The leverage profile. Structure: * **`leverageType`** `string` — Leverage type. Possible values: `Fixed`, `Dynamic`. * **`leverage`** `object` * **`useOnlyMaxLeverage`** `boolean` * **`maxLeverage`** `integer` — For `Fixed` leverage type only. * **`tiers`** `array` — For `Dynamic` leverage type only. * **`maxLeverage`** `integer` — The maximum allowed leverage for this tier. * **`maxNotionalValueInRAT`** `string | nullable` — The maximum position notional for this tier. **`commissionSettings`** `object` The commission settings. Structure: * **`type`** `string` — Leverage type. Possible values: `Fixed`, `Dynamic`. * **`charge`** `object` * **`type`** `string` — Possible values: `Percent`, `FixPerLot`. * **`assetId`** `string | nullable` — For `Fixed` commission type only. * **`size`** `decimal string` — For `Fixed` commission type only. * **`tiers`** `array` — For `Dynamic` commission type only. * **`size`** `string` — The commission amount for this tier. * **`minTradingVolumeInRAT`** `string` — The minimum required trading volume for this tier. * **`minCommissionInRAT`** `decimal string | nullable` * **`dynamicCommissionGroupId`** **`isFavorite`** `boolean` Indicates whether the market is marked as a favorite by the current user. ```json title="Response example — 200: OK" { "marketId": "string", "displayName": "string", "fullName": "string", "baseAssetId": "string", "quoteAssetId": "string", "minAmount": "string", "maxBaseAmount": "string", "minQuoteAmount": "string", "priceDeviation": "string", "priceScale": 0, "amountScale": 0, "type": "Spot", "subtype": "Cash", "swapSettings": { "type": "FixPerLot", "shortPositionSettings": { "size": "string", "assetId": "string" }, "longPositionSettings": { "size": "string", "assetId": "string" } }, "lotSize": 0, "minLotAmount": "string", "maxLotAmount": 0, "tickSize": "string", "lotStep": "string", "slippageRate": "string", "calendar": { "timeZoneId": "string", "tradingSessions": [ { "dayOfWeek": "Monday", "timeIntervals": [ { "start": "string", "end": "string" } ] } ], "sessionOverrides": [ { "date": "2025-12-18", "timeIntervals": [ { "start": "string", "end": "string" } ] } ] }, "fundingStartTime": "string", "fundingIntervalInHours": 0, "leverageProfile": { "leverageType": "Fixed", "leverage": { "useOnlyMaxLeverage": true, "maxLeverage": 0 } }, "commissionSettings": { "type": "Dynamic", "сharge": { "type": "Percent", "tiers": [ { "size": "string", "minTradingVolumeInRAT": "string" }, { "size": "string", "minTradingVolumeInRAT": "string" } ], "minCommissionInRAT": "string" }, "dynamicCommissionGroupId": "string" }, "isFavorite": true } ``` *** ### Add favorite market [#add-favorite-market] `POST` `/frontoffice/api/v6/markets/favorites/add` #### Summary [#summary-4] Add a market to the current user's favorites list. #### Request [#request-4] ##### Body [#body] **`marketId`** `string` `required` The market identifier to add to favorites. ```http title="Request example" POST /frontoffice/api/v6/markets/favorites/add HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "marketId": "spot.btc_usdt" } ``` #### Response [#response-4] In case of success (`200`), an empty object is returned. *** ### Remove favorite market [#remove-favorite-market] `POST` `/frontoffice/api/v6/markets/favorites/delete` #### Summary [#summary-5] Remove a market from the current user's favorites list. #### Request [#request-5] ##### Body [#body-1] **`marketId`** `string` `required` The market identifier to remove from favorites. ```http title="Request example" POST /frontoffice/api/v6/markets/favorites/delete HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "marketId": "spot.btc_usdt" } ``` #### Response [#response-5] In case of success (`200`), an empty object is returned. ## Account margin settings [#account-margin-settings] ### Get margin assets [#get-margin-assets] `GET` `/frontoffice/api/v4/account-margin-settings/assets` #### Summary [#summary-6] Use this method to retrieve a list of assets that can be used as collateral for margin trading. #### Request [#request-6] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v4/account-margin-settings/assets HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-6] In case of success, an object will be returned. Each object contains the following information: **`assets`** `array` A list of assets that can be used as a collateral for margin trading. Each array item contains: **`assetId`** `string` The asset identifier. **`assetName`** `string` The asset display name. **`available`** `decimal string` The available asset balance. This value is calculated as *Total balance* – *Locked balance*. **`total`** `decimal string` The overall amount of the asset, including locked funds. **`marginRatio`** `decimal string` The percentage of the asset value used as a collateral. Supports values in the range `[0, 1]`, where `1` represents 100.00%. **`isSelected`** `boolean` Indicates whether the asset is selected to be used as collateral. Can be `true` only for assets with the `marginRatio` more than `0`. ```json title="Response example — 200: OK" { "assets": [ { "assetId": "btc", "assetName": "btc", "available": "0.031", "total": "0.031", "marginRatio": "1", "isSelected": true }, { "assetId": "eth", "assetName": "eth", "available": "0", "total": "0", "marginRatio": "1", "isSelected": false } ] } ``` ### Select margin asset [#select-margin-asset] `POST` `/frontoffice/api/v4/account-margin-settings/assets/``{assetId}` #### Summary [#summary-7] Use this method to enable a particular asset to be used as collateral for margin trading. Only assets with the `marginRatio` more than `0` can be selected. #### Request [#request-7] ##### Path parameters [#path-parameters-1] **`assetId`** `required` The asset identifier. ```http title="Request example" POST /frontoffice/api/v4/account-margin-settings/assets/usdt HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json Accept: */* {} ``` #### Response [#response-7] In case of success, an empty object will be returned. ```json title="Response example — 200: OK" {} ``` ### Disable margin asset [#disable-margin-asset] `DELETE` `/frontoffice/api/v4/account-margin-settings/assets/``{assetId}` #### Summary [#summary-8] Use this method to prohibit a specific asset from being used as collateral for margin trading. #### Request [#request-8] ##### Path parameters [#path-parameters-2] **`assetId`** `required` The asset identifier. ```http title="Request example" DELETE /frontoffice/api/v4/account-margin-settings/assets/usdt HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-8] In case of success, an empty object will be returned. ```json title="Response example — 200: OK" {} ``` ## Info [#info] ### Get server info [#get-server-info] `GET` `/frontoffice/api/v3/info` #### Summary [#summary-9] Use this method to retrieve current server time and timezone information. #### Request [#request-9] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/info HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-9] In case of success, an object will be returned. Each object contains the following information: **`serverTime`** `string` The server time, in the Unix timestamp format. **`serverTimeZone`** `string` The server time zone. ```json title="Response example — 200: OK" { "serverTime": "1755190380", "serverTimeZone": "+00:00" } ``` ### Get server time zones [#get-server-time-zones] `GET` `/frontoffice/api/v3/info/time-zones` #### Summary [#summary-10] Use this method to retrieve available server time zones. #### Request [#request-10] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/info/time-zones HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-10] In case of success, an array of objects will be returned. Each object contains the following information: **`id`** `string` The time zone identifier. **`offset`** `string` The UTC offset, in the following format: `HH:MM:SS`. **`offsetInMinutes`** `integer · int32` The UTC offset in minutes. **`shortLabel`** `string` The short label for the time zone. **`label`** `string` The display label for the time zone. ```json title="Response example — 200: OK" [ { "id": "Africa/Abidjan", "offset": "00:00:00", "offsetInMinutes": 0, "shortLabel": "Africa/Abidjan", "label": "(UTC+00:00) Côte d’Ivoire Time" }, { "id": "Africa/Algiers", "offset": "01:00:00", "offsetInMinutes": 60, "shortLabel": "Africa/Algiers", "label": "(UTC+01:00) Central European Time (Algiers)" }, { "id": "Africa/Bissau", "offset": "00:00:00", "offsetInMinutes": 0, "shortLabel": "Africa/Bissau", "label": "(UTC+00:00) Guinea-Bissau Time" }, ... ] ``` ## Webhooks [#webhooks] ### Create webhook API key [#create-webhook-api-key] `POST` `/frontoffice/api/v3/webhook/api-keys` #### Summary [#summary-11] Create a new webhook API key for receiving TradingView alerts. #### Request [#request-11] ##### Header parameters [#header-parameters] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ##### Body [#body-2] **`name`** `string` `required` A descriptive name for the API key, up to 100 characters. ```http title="Request example" POST /frontoffice/api/v3/webhook/api-keys HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "name": "My TradingView Key" } ``` #### Response [#response-11] In case of success (`201`), the created API key object is returned. **`id`** `string` The unique identifier of the API key. **`apiKey`** `string` The full API key value. The key is shown only once at creation. **`name`** `string` The name assigned to the key. **`userId`** `string` The user identifier the key is bound to. **`status`** `string` The key status: `Active`. **`createdAt`** `string` The timestamp when the key was created. **`expiresAt`** `string` The timestamp when the key expires (one year from creation). ```json title="Response example" { "id": "01JZ3CVZKN20410JPYYH1YZJSK", "apiKey": "wh_key_abc123def456...", "name": "My TradingView Key", "userId": "01JZ3CVZKN20410JPYYH1YZJSK", "status": "Active", "createdAt": "2026-02-02T12:00:00Z", "expiresAt": "2027-02-02T00:00:00Z" } ``` The API key is shown only once in the creation response. It can't be retrieved again after this call. *** ### List webhook API keys [#list-webhook-api-keys] `GET` `/frontoffice/api/v3/webhook/api-keys` #### Summary [#summary-12] Retrieve all webhook API keys for the authenticated user along with the webhook URL. #### Request [#request-12] ##### Header parameters [#header-parameters-1] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ```http title="Request example" GET /frontoffice/api/v3/webhook/api-keys HTTP/1.1 Host: {host} Authorization: Bearer JWT ``` #### Response [#response-12] In case of success (`200`), the webhook URL and a list of API keys are returned. **`webhookUrl`** `string` The webhook URL to configure in TradingView alerts. **`apiKeys`** `array of objects` The list of API keys. **`apiKeys[].id`** `string` The unique identifier of the API key. **`apiKeys[].name`** `string` The name assigned to the key. **`apiKeys[].status`** `string` The key status. Possible values: * `Active` * `Revoked` * `Expired` **`apiKeys[].createdAt`** `string` The timestamp when the key was created. **`apiKeys[].expiresAt`** `string` The timestamp when the key expires. ```json title="Response example" { "webhookUrl": "https://trading.example.com/frontoffice/api/v3/webhook/alerts/01JZ3...", "apiKeys": [ { "id": "01JZ3CVZKN20410JPYYH1YZJSK", "name": "My TradingView Key", "status": "Active", "createdAt": "2026-02-02T12:00:00Z", "expiresAt": "2027-02-02T00:00:00Z" } ] } ``` *** ### Revoke webhook API key [#revoke-webhook-api-key] `DELETE` `/frontoffice/api/v3/webhook/api-keys/{id}` #### Summary [#summary-13] Revoke an active webhook API key. After revocation, the key can no longer be used to authenticate webhook requests. #### Request [#request-13] ##### Header parameters [#header-parameters-2] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ##### Path parameters [#path-parameters-3] **`id`** `string` `required` The unique identifier of the API key to revoke. ```http title="Request example" DELETE /frontoffice/api/v3/webhook/api-keys/01JZ3CVZKN20410JPYYH1YZJSK HTTP/1.1 Host: {host} Authorization: Bearer JWT ``` #### Response [#response-13] In case of success (`200`), a confirmation object is returned. **`success`** `boolean` Indicates whether the key was revoked successfully. **`message`** `string` A description of the result. ```json title="Response example" { "success": true, "message": "API key revoked successfully" } ``` *** ### Receive TradingView alert [#receive-tradingview-alert] `POST` `/frontoffice/api/v3/webhook/alerts/{userId}` #### Summary [#summary-14] Accept a webhook alert from TradingView and place an order on the specified trading account. TradingView calls this endpoint when an alert triggers. #### Request [#request-14] ##### Path parameters [#path-parameters-4] **`userId`** `string` `required` The B2TRADER user identifier (ULID format). ##### Body [#body-3] **`apiKey`** `string` `required` The webhook API key for authentication. **`accountId`** `string` `required` The trading account identifier. **`symbol`** `string` `required` The market symbol with a type prefix (`spot.`, `cfd.`, or `perp.`) followed by the pair name. For example: `spot.btc_usdt`, `cfd.eur_usd`, `perp.btc_usdt`. **`side`** `string` `required` The order side. Possible values: * `buy` * `sell` **`quantity`** `decimal string` `required` The order quantity in the base asset. **`orderType`** `string` The order type. Default: `market`. Possible values: * `market` * `limit` * `stop` * `stop_limit` **`price`** `decimal string` The limit price. Required for `limit` and `stop_limit` orders. **`stopPrice`** `decimal string` The stop price. Required for `stop` and `stop_limit` orders. **`leverage`** `decimal string` The leverage ratio. Applicable to CFD and Perpetual Futures markets only. **`takeProfit`** `decimal string` The take profit trigger price. **`stopLoss`** `decimal string` The stop loss trigger price. **`timeInForce`** `string` The time-in-force policy. Default: `gtc`. Possible values: * `gtc` * `ioc` * `fok` * `day` **`comment`** `string` A custom comment, up to 256 characters. **`deduplicationId`** `string` A UUID for idempotency. Duplicate requests with the same ID within five minutes return a cached response. ```http title="Request example" POST /frontoffice/api/v3/webhook/alerts/01JZ3CVZKN... HTTP/1.1 Host: {host} Content-Type: application/json { "apiKey": "wh_key_abc123def456...", "accountId": "01JZ3CVZKN20410JPYYH1YZJSK", "symbol": "spot.btc_usdt", "side": "buy", "quantity": "0.01", "comment": "TV Strategy Signal" } ``` #### Response [#response-14] In case of success (`200`), an order confirmation is returned. **`success`** `boolean` Indicates whether the order was placed successfully. **`orderId`** `string` The unique identifier of the created order. **`orderStatus`** `string` The initial status of the order. **`message`** `string` A description of the result. **`timestamp`** `string` The timestamp of the response. ```json title="Response example" { "success": true, "orderId": "01JZ3CVZKN20410JPYYH1YZJSK", "orderStatus": "Working", "message": "Order placed successfully", "timestamp": "2026-02-02T12:34:56.789Z" } ``` #### Rate limits [#rate-limits] Webhook requests are limited to five requests per second per user. If the limit is exceeded, the response returns a `429` status code with the following headers: * `X-RateLimit-Limit`: Maximum requests per window * `X-RateLimit-Remaining`: Remaining requests in the current window * `X-RateLimit-Reset`: Unix timestamp when the window resets ## Orders [#orders] ### Place SPOT order [#place-spot-order] `POST` `/frontoffice/api/v3/orders` #### Summary [#summary] Use this method to create and submit a new order for SPOT markets. #### Request [#request] ##### Header parameters [#header-parameters] **`accountId`** `required` The trading account identifier. ##### Body [#body] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For Market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/v3/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "spot.btc_usdt", "side": "Buy", "orderType": "Limit", "timeInForce": "Gtc", "requestedAmount": 0.02, "requestedPrice": 115193.35, "comment": "Strategy A" } } ``` #### Response [#response] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` — the order was created manually via UI or API. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. Right after the order is created commission is `0`. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the originally requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.btc_usdt", "marketDisplayName": "SPOT BTC/USDT", "orderId": "01K1ZTB4DB0S6Y2NH81S781BQX", "orderType": "Limit", "side": "Buy", "status": "Pending", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.02", "remainingAmount": "0.02", "requestedPrice": "115193.35", "executionPrice": "0", "createdAt": "2025-08-06T13:50:13.931Z", "updatedAt": "2025-08-06T13:50:13.9325008Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Place CFD order [#place-cfd-order] `POST` `/frontoffice/api/cfd/v4/orders` #### Summary [#summary-1] Use this method to create and submit a new order for CFD markets. #### Request [#request-1] ##### Header parameters [#header-parameters-1] **`accountId`** `required` The trading account identifier. ##### Body [#body-1] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/cfd/v4/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Limit", "timeInForce": "Gtd", "requestedLotAmount": 1, "requestedPrice": 3280, "leverage": 75, "cancellationDate": "2025-08-10T00:00:00Z", "stopLoss": { "price": 3320, "isTrailing": false }, "takeProfit": { "price": 3200 }, "comment": "Strategy A" } } ``` #### Response [#response-1] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2253Q9X3VTJ68PNWY40JC6Q", "status": "Pending" } } ``` ### Place PF order [#place-pf-order] `POST` `/frontoffice/api/perpetual/v4/orders` #### Summary [#summary-2] Use this method to create and submit a new order for Perpetual markets. #### Request [#request-2] ##### Header parameters [#header-parameters-2] **`accountId`** `required` The trading account identifier. ##### Body [#body-2] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `perp.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/perpetual/v4/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "perp.eth_usdt", "side": "Buy", "orderType": "Market", "timeInForce": "Ioc", "requestedLotAmount": 10, "leverage": 159, "comment": "Strategy A" } } ``` #### Response [#response-2] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K228VN55N7WFZRG70M24T9J1", "status": "Working" } } ``` ### Cancel order [#cancel-order] `DELETE` `/frontoffice/api/v3/orders/``{orderId}` #### Summary [#summary-3] Use this method to cancel an active order placed on SPOT, CFD, or Perpetual markets. #### Request [#request-3] ##### Header parameters [#header-parameters-3] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters] **`orderId`** `required` The order identifier to cancel. ```http title="Request example" DELETE /frontoffice/api/v3/orders/01K2PF9XS29WN4JZRHMCTTQYJB HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Accept: */* ``` #### Response [#response-3] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The canceled order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` * `StopOrder` * `FixApi` * `System` **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the originally requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.eth_usdt", "marketDisplayName": "SPOT ETH/USDT", "orderId": "01K2PF9XS29WN4JZRHMCTTQYJB", "orderType": "Limit", "side": "Buy", "status": "Cancelled", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.1", "remainingAmount": "0.1", "requestedPrice": "4450", "executionPrice": "0", "createdAt": "2025-08-15T08:59:51.97Z", "updatedAt": "2025-08-15T09:00:06.2791048Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Modify order [#modify-order] `PATCH` `/frontoffice/api/v3/orders/``{orderId}` #### Summary [#summary-4] Use this method to modify a resting (not yet fully executed) order placed on SPOT, CFD, or Perpetual markets. The order keeps its `orderId`, its creation timestamp, and its place in your order history — nothing is cancelled and no new order is created. The market, side, and order type cannot be changed. To change them, cancel the order and place a new one. If the order is already fully filled, cancelled, expired, or currently executing, the modification is rejected and the order is left exactly as it was. #### Request [#request-4] ##### Header parameters [#header-parameters-4] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-1] **`orderId`** `required` The order identifier to modify. ##### Body [#body-3] **`order`** `object` `required` The new values to apply to the order. **`order.requestedPrice`** `decimal string` `required` The new limit price. **`order.requestedAmount`** `decimal string` `required` The new quantity of the base asset to buy or sell. If the order is already partially filled, this is the order's total requested amount, not the remaining amount — it must not be lower than what has already executed. **`order.timeInForce`** `string` `required` The new time-in-force policy. Possible values: `Gtc`, `Gtd`, `Day`. **`order.cancellationDate`** `string | nullable` The new expiration date, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required when `timeInForce` is `Gtd`; ignored otherwise. **`order.leverage`** `integer | nullable` The new leverage. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.takeProfit`** `object | nullable` The new Take Profit trigger. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.takeProfit.price`** `decimal string` `required` **`order.stopLoss`** `object | nullable` The new Stop Loss trigger. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.stopLoss.price`** `decimal string` `required` **`order.stopLoss.isTrailing`** `boolean` `required` **`order.comment`** `string | nullable` The new comment. ```http title="Request example" PATCH /frontoffice/api/v3/orders/01K2PF9XS29WN4JZRHMCTTQYJB HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json ``` ```json title="Request body example" { "order": { "requestedPrice": "4400", "requestedAmount": "0.15", "timeInForce": "Gtc" } } ``` #### Response [#response-4] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The modified order, under its unchanged `orderId`. **`order.marketId`** `string` The market identifier, same as before the modification. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The order identifier — unchanged by the modification. **`order.orderType`** `string` The order type — unchanged by the modification. **`order.side`** `string` The order side — unchanged by the modification. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` * `StopOrder` * `FixApi` * `System` **`order.timeInForce`** `string` The order's time-in-force policy, reflecting the new value. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. **`order.requestedAmount`** `decimal string` The order's total requested amount, reflecting the new value. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price, reflecting the new value; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The original timestamp when the order was created — unchanged by the modification. **`order.updatedAt`** `string` The timestamp of this modification, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the currently requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.eth_usdt", "marketDisplayName": "SPOT ETH/USDT", "orderId": "01K2PF9XS29WN4JZRHMCTTQYJB", "orderType": "Limit", "side": "Buy", "status": "Pending", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.15", "remainingAmount": "0.15", "requestedPrice": "4400", "executionPrice": "0", "createdAt": "2025-08-15T08:59:51.97Z", "updatedAt": "2025-08-15T09:14:22.4471048Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Get SPOT order data [#get-spot-order-data] `POST` `/frontoffice/api/v3/order-data` #### Summary [#summary-5] Use this method to retrieve and validate order data for SPOT market orders before placing. #### Request [#request-5] ##### Header parameters [#header-parameters-5] **`accountId`** `required` The trading account identifier. ##### Body [#body-4] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.requestedBaseAmount`** `decimal string | nullable` The requested amount in base asset units. **`order.requestedQuoteAmount`** `decimal string | nullable` The requested amount in quote asset units. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. ```http title="Request example" POST /frontoffice/api/v3/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=3.0 Accept: */* { "order": { "marketId": "spot.eth_usdt", "side": "Buy", "orderType": "Limit", "requestedBaseAmount": 0.2, "requestedPrice": 4600 } } ``` #### Response [#response-5] In case of success, an object will be returned. Each object contains the following information: **`baseAmount`** `decimal string` The calculated base asset amount for the order. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmount`** `decimal string` The estimated commission amount to be charged. **`total`** `decimal string` The total quote asset amount, including the estimated commission. ```json title="Response example — 200: OK" { "order": { "baseAmount": "0.2", "quoteAmount": "920", "commissionAmount": "9.2", "total": "929.2" } } ``` ### Get CFD order data [#get-cfd-order-data] `POST` `/frontoffice/api/cfd/v4/order-data` #### Summary [#summary-6] Use this method to retrieve and validate order data for CFD market orders before placing. #### Request [#request-6] ##### Header parameters [#header-parameters-6] **`accountId`** `required` The trading account identifier. ##### Body [#body-5] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.isTrailing`** `boolean | nullable` If `true`, enables the Trailing behavior for Stop loss. ```http title="Request example" POST /frontoffice/api/cfd/v4/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "takeProfit": { "triggerSize": 15000, "triggerType": "points" }, "stopLoss": { "triggerSize": "4020", "triggerType": "price", "isTrailing": false }, "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Market", "leverage": 135, "requestedLotAmount": 1 } } ``` #### Response [#response-6] In case of success, an object will be returned. Each object contains the following information: **`requiredMarginInRAT`** `decimal string` The required margin amount, in conversion to RAT. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmountInRAT`** `decimal string` The estimated commission amount to be charged, in conversion to RAT. **`marginLevel`** `decimal string | nullable` The resulting margin level. **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "order": { "requiredMarginInRAT": "34.4613643", "quoteAmount": "4004.345", "commissionAmountInRAT": "0", "marginLevel": "5.3015", "takeProfit": { "price": "3989.345", "rate": "0.0037", "points": 15000, "pnl": "17.42713545" }, "stopLoss": { "price": "4020", "rate": "-0.0039", "points": -15655, "pnl": "-18.18812036" } } } ``` ### Get PF order data [#get-pf-order-data] `POST` `/frontoffice/api/perpetual/v4/order-data` #### Summary [#summary-7] Use this method to retrieve and validate order data for Perpetual market orders before placing. #### Request [#request-7] ##### Header parameters [#header-parameters-7] **`accountId`** `required` The trading account identifier. ##### Body [#body-6] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.isTrailing`** `boolean | nullable` If `true`, enables Trailing behavior for Stop loss. ```http title="Request example" POST /frontoffice/api/perpetual/v4/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "takeProfit": { "triggerSize": "0.01", "triggerType": "rate" }, "stopLoss": { "triggerSize": "-100", "triggerType": "pnl", "isTrailing": false }, "marketId": "perp.btc_usdt", "side": "Buy", "orderType": "Limit", "leverage": 100, "requestedLotAmount": 0.5, "requestedPrice": 118450 } } ``` #### Response [#response-7] In case of success, an object will be returned. Each object contains the following information: **`requiredMarginInRAT`** `decimal string` The required margin amount, in conversion to RAT. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmountInRAT`** `decimal string` The estimated commission amount to be charged, in conversion to RAT. **`marginLevel`** `decimal string | nullable` The resulting margin level. **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "order": { "requiredMarginInRAT": "592.25", "quoteAmount": "59225", "commissionAmountInRAT": "0", "marginLevel": "0.3582", "takeProfit": { "price": "119634.5", "rate": "0.01", "points": 11845, "pnl": "592.25" }, "stopLoss": { "price": "118250", "rate": "-0.0016", "points": -2000, "pnl": "-100" } } } ``` ## Stop orders [#stop-orders] Stop orders are accepted while the market is closed according to its trading calendar. The market's own status must still be `Open` — a `Paused` or `Halted` market rejects Stop orders too. At submission the platform validates the requested and activation price scales, the amount scale, the market minimum amount, and the time in force: a Stop Market order requires `Ioc` or `Fok`, a Stop Limit order requires an explicit value. The stop price is additionally checked against the best bid and ask **only when a price is available** — while the market is closed there may be no top of the book to compare against, in which case the check is skipped. The accepted order is stored with the standard `WaitingForActivation` status — no new status value was introduced — and is evaluated against the first available price when the session opens; if the market gapped past the stop price, it triggers at the open. An order accepted while no price was available first has its internal pricing finalised from the next incoming price, so its activation can take one extra price update. No balance or margin is reserved at submission. The margin check runs at trigger time, and an order that fails it is cancelled with a failure reason rather than dropped. `Cancel Stop order` also works while the market is closed. Market and Limit orders are still rejected during non-trading hours. ### Place SPOT Stop order [#place-spot-stop-order] `POST` `/frontoffice/api/v3/stop-orders` #### Summary [#summary-8] Use this method to create and submit a new Stop order for SPOT markets. #### Request [#request-8] ##### Header parameters [#header-parameters-8] **`accountId`** `required` The trading account identifier. ##### Body [#body-7] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For Market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/v3/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "spot.btc_usdt", "side": "Buy", "orderType": "Market", "activationPrice": 128000, "requestedAmount": 0.01, "timeInForce": "Ioc", "comment": "Strategy A" } } ``` #### Response [#response-8] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order, same as in the request. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "order": { "marketId": "spot.btc_usdt", "marketDisplayName": "SPOT BTC/USDT", "orderId": "01K2MNC3BVR5WRTBEE9YWAS91K", "orderType": "Market", "side": "Buy", "requestedPrice": "0", "activationPrice": "128000", "requestedAmount": "0.01", "timeInForce": "Ioc", "status": "WaitingForActivation", "createdAt": "2025-08-14T16:07:25.8193038Z", "updatedAt": "2025-08-14T16:07:25.8193044Z", "cancellationDate": null, "comment": null } } ``` ### Place CFD Stop order [#place-cfd-stop-order] `POST` `/frontoffice/api/cfd/v4/stop-orders` #### Summary [#summary-9] Use this method to create and submit a new Stop order for CFD markets. #### Request [#request-9] ##### Header parameters [#header-parameters-9] **`accountId`** `required` The trading account identifier. ##### Body [#body-8] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/cfd/v4/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Limit", "activationPrice": 3200, "requestedLotAmount": 0.5, "timeInForce": "Gtd", "leverage": 76, "requestedPrice": 3500, "cancellationDate": "2025-08-18T00:00:00Z", "stopLoss": { "price": "3900", "isTrailing": false }, "takeProfit": { "price": "3100" }, "comment": "Strategy A" } } ``` #### Response [#response-9] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2MNRWP2J1S8T9TKTCXWYY87", "status": "WaitingForActivation" } } ``` ### Place PF Stop order [#place-pf-stop-order] `POST` `/frontoffice/api/perpetual/v4/stop-orders` #### Summary [#summary-10] Use this method to create and submit a new Stop order for Perpetual markets. #### Request [#request-10] ##### Header parameters [#header-parameters-10] **`accountId`** `required` The trading account identifier. ##### Body [#body-9] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/perpetual/v4/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "perp.btc_usdt", "side": "Sell", "orderType": "Market", "activationPrice": 115000, "requestedLotAmount": 1, "timeInForce": "Fok", "leverage": 22, "stopLoss": { "price": "118020", "isTrailing": true }, "takeProfit": { "price": "113873" }, "comment": "Strategy A" } } ``` #### Response [#response-10] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2MNM0S8B2R9DS7BWJ8PGYPR", "status": "WaitingForActivation" } } ``` ### Cancel Stop order [#cancel-stop-order] `DELETE` `/frontoffice/api/v3/stop-orders/``{orderId}` #### Summary [#summary-11] Use this method to cancel an active Stop order placed on SPOT, CFD, or Perpetual markets. #### Request [#request-11] ##### Header parameters [#header-parameters-11] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-2] **`orderId`** `required` The Stop order identifier to cancel. ```http title="Request example" DELETE /frontoffice/api/v3/stop-orders/01K2MNGAWPMQJ7WGATFSCAS1G4 HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-11] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The canceled order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. ```json title="Response example — 200: OK" { "order": { "marketId": "perp.btc_usdt", "marketDisplayName": "Perpetual BTC/USDT", "orderId": "01K2MNGAWPMQJ7WGATFSCAS1G4", "orderType": "Limit", "side": "Sell", "requestedPrice": "115100", "activationPrice": "115000", "requestedAmount": "1", "timeInForce": "Gtc", "status": "Rejected", "createdAt": "2025-08-14T16:09:44.5986099Z", "updatedAt": "2025-08-14T16:09:44.5986103Z", "cancellationDate": null } } ``` ### Modify Stop order [#modify-stop-order] `PATCH` `/frontoffice/api/v3/stop-orders/``{orderId}` #### Summary [#summary-12] Use this method to modify a Stop order placed on SPOT, CFD, or Perpetual markets, while it is still waiting to be triggered. The order keeps its `orderId` — nothing is cancelled and no new order is created. The market, side, and order type cannot be changed. To change them, cancel the order and place a new one. If the order has already triggered, been cancelled, or expired, the modification is rejected and the order is left exactly as it was. #### Request [#request-12] ##### Header parameters [#header-parameters-12] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-3] **`orderId`** `required` The Stop order identifier to modify. ##### Body [#body-10] **`order`** `object` `required` The new values to apply to the order. **`order.activationPrice`** `decimal string` `required` The new trigger price that activates the Stop order. **`order.requestedPrice`** `decimal string` `required` The new limit price for a Stop-Limit order. Must be `0` for a Market order. **`order.requestedAmount`** `decimal string` `required` The new quantity of the base asset to buy or sell. **`order.timeInForce`** `string` `required` The new time-in-force policy. **`order.cancellationDate`** `string | nullable` The new expiration date, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required when `timeInForce` is `Gtd`; ignored otherwise. **`order.leverage`** `integer | nullable` The new leverage. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.takeProfit`** `object | nullable` The new Take Profit trigger. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.takeProfit.price`** `decimal string` `required` **`order.stopLoss`** `object | nullable` The new Stop Loss trigger. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.stopLoss.price`** `decimal string` `required` **`order.stopLoss.isTrailing`** `boolean` `required` **`order.comment`** `string | nullable` The new comment. ```http title="Request example" PATCH /frontoffice/api/v3/stop-orders/01K2MNGAWPMQJ7WGATFSCAS1G4 HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json ``` ```json title="Request body example" { "order": { "activationPrice": "115200", "requestedPrice": "0", "requestedAmount": "1", "timeInForce": "Gtc" } } ``` #### Response [#response-12] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The modified order, under its unchanged `orderId`. **`order.marketId`** `string` The market identifier, same as before the modification. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The order identifier — unchanged by the modification. **`order.orderType`** `string` The order type — unchanged by the modification. **`order.side`** `string` The order side — unchanged by the modification. **`order.requestedPrice`** `decimal string | nullable` The limit price, reflecting the new value. **`order.activationPrice`** `decimal string | nullable` The trigger price, reflecting the new value. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, reflecting the new value. **`order.timeInForce`** `string` The time-in-force policy, reflecting the new value. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The original timestamp when the order was created — unchanged by the modification. **`order.updatedAt`** `string` The timestamp of this modification, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired; `null` if not cancelled. ```json title="Response example — 200: OK" { "order": { "marketId": "perp.btc_usdt", "marketDisplayName": "Perpetual BTC/USDT", "orderId": "01K2MNGAWPMQJ7WGATFSCAS1G4", "orderType": "Limit", "side": "Sell", "requestedPrice": "115300", "activationPrice": "115200", "requestedAmount": "1", "timeInForce": "Gtc", "status": "WaitingForActivation", "createdAt": "2025-08-14T16:09:44.5986099Z", "updatedAt": "2025-08-14T16:22:10.1123456Z", "cancellationDate": null } } ``` ## Positions [#positions] ### Close position [#close-position] `POST` `/frontoffice/api/v4/positions/``{positionId}``/close` #### Summary [#summary-13] Use this method to close a specific position entirely or partially. #### Request [#request-13] ##### Header parameters [#header-parameters-13] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-4] **`positionId`** `required` The position identifier to close. ##### Body [#body-11] **`closePositionLotAmount`** `decimal string | nullable` The portion of the position to close, in lots. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2PFXDP1FWCJSGTX4GJ6JHM0/close HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-13] In case of success, an object will be returned. Each object contains the following information: **`positionId`** `string` The position identifier. ```json title="Response example — 200: OK" { "positionId": "01K2PFXDP1FWCJSGTX4GJ6JHM0" } ``` ### Bulk close positions [#bulk-close-positions] `POST` `/frontoffice/api/v4/positions/bulk-close` #### Summary [#summary-14] Use this method to close multiple positions simultaneously based on different criteria such as all positions, positive PnL only, or negative PnL only. #### Request [#request-14] ##### Header parameters [#header-parameters-14] **`accountId`** `required` The trading account identifier. ##### Body [#body-12] **`mode`** `string` `required` The bulk close mode. Possible values: * `AllPositions` — close all positions. * `PositivePnl` — close only positions with positive PnL. * `NegativePnl` — close only positions with negative PnL. ```http title="Request example" POST /frontoffice/api/v4/positions/bulk-close HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "mode": "AllPositions" } ``` #### Response [#response-14] In case of success, an object will be returned containing identifiers of closed positions. ```json title="Response example — 200: OK" { "status": "accepted", "positionIds": [ "01K228VNC2Q7E7K9W8GABWBZ5Z", "01K22BZ2DCETJZKW6MK81N1T8Y", "01K2CXF06A3A5SK2YFJT67CMZ5", "01K2CXF2ZJ6MJYMEK663TBBY8K", "01K2PFXDP1FWCJSGTX4GJ6JHM0" ] } ``` ### Get trigger data [#get-trigger-data] `POST` `/frontoffice/api/v4/positions/``{positionId}``/trigger-data` #### Summary [#summary-15] Use this method to retrieve Stop loss and Take profit settings for an open position. #### Request [#request-15] ##### Header parameters [#header-parameters-15] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-5] **`positionId`** `required` The position identifier. ##### Body [#body-13] **`stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`stopLoss.isTrailing`** `boolean | nullable` Indicates if Stop loss is Trailing. **`takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2HYXA7N2G9NHTFEWYVM9SEQ/trigger-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "stopLoss": { "triggerSize": "-0.01", "triggerType": "rate", "isTrailing": true }, "takeProfit": { "triggerSize": 2500, "triggerType": "points" } } ``` #### Response [#response-15] In case of success, an object will be returned. Each object contains the following information: **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "takeProfit": { "price": "248.27", "rate": "0.1119", "points": 2500, "pnl": "21.5" }, "stopLoss": { "price": "221.04", "rate": "-0.01", "points": -223, "pnl": "-1.91" } } ``` ### Submit triggers [#submit-triggers] `PUT` `/frontoffice/api/v4/positions/``{positionId}``/triggers` #### Summary [#summary-16] Use this method to modify Stop loss and Take profit settings for an open position. #### Request [#request-16] ##### Header parameters [#header-parameters-16] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-6] **`positionId`** `required` The position identifier. ##### Body [#body-14] **`stopLoss.price`** `decimal string` The Stop loss trigger price. **`stopLoss.isTrailing`** `boolean` If `true`, enables the Trailing behavior for Stop loss. **`takeProfit.price`** `decimal string` The Take profit trigger price. ```http title="Request example" PUT /frontoffice/api/v4/positions/01K2HYXA7N2G9NHTFEWYVM9SEQ/triggers HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "stopLoss": { "price": "165.13", "isTrailing": true }, "takeProfit": { "price": 250 } } ``` #### Response [#response-16] In case of success, an object will be returned containing the identifier of the updated position. ```json title="Response example — 200: OK" { "positionId": "01K2HYXA7N2G9NHTFEWYVM9SEQ" } ``` ## Commissions [#commissions] ### Get account trading volume [#get-account-trading-volume] `GET` `/frontoffice/api/v3/commission/``{dynamicCommissionGroupId}``/account-trading-volume` #### Summary [#summary-17] Use this method to obtain a cumulative account trading volume used for calculating the commission tier. #### Request [#request-17] ##### Header parameters [#header-parameters-17] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-7] **`dynamicCommissionGroupId`** `required` The dynamic commission group identifier. Use [Get market](settings#get-market) to obtain. ```http title="Request example" GET /frontoffice/api/v3/commission/{dynamicCommissionGroupId}/account-trading-volume HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-17] In case of success, an object will be returned containing current trading volume, in RAT, for the account. ```json title="Response example — 200: OK" { "currentTradingVolumeInRAT": "string" } ``` ## Get full balance [#get-full-balance] ### Connection [#connection] ```text title="URL" /frontoffice/ws/v3/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"FullBalance"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "FullBalance", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of balance objects. **`item.assetId`** `string` The asset identifier. **`item.available`** `decimal string` The available asset balance. This value is calculated as *Total balance* – *Locked balance*. **`item.total`** `decimal string` The overall amount of the asset, including locked funds. **`item.locked`** `decimal string` The asset amount locked on the account for execution of all placed Limit orders. ```json title="Example" { "type": 2, "invocationId": "0", "item": [ { "assetId": "eur", "available": "497838.8", "total": "497838.8", "locked": "0" } ] } ``` ## Get margin data [#get-margin-data] ### Connection [#connection-1] ```text title="URL" /frontoffice/ws/v3/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"MarginData"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "MarginData", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.marginBalanceInRAT`** `decimal string` The total amount of funds that can be used as a collateral for trading, in RAT. This value is calculated as SUM (*TotalAmountX* × *MarginRatioX* × *Rate X/RAT*) Where: * *TotalAmountX* is the the total amount of the asset X, including both available and locked funds. * *MarginRatioX* is the Margin ratio set for the asset X. * *Rate X/RAT* is the constantly updated rate of the asset X to the BP root asset. **`item.creditInRAT`** `decimal string` The promotional trading credit granted to the account by the broker, in RAT. Credit is included in the account equity but excluded from the withdrawable amount. During a rolling deployment, older payloads might omit this field. In that case, default it to `0`. **`item.unrealizedPnlInRAT`** `decimal string` The total potential profit or loss earned from all open positions. This value is calculated as *Σ(Unrealized PnL for Long positions + Unrealized PnL for Short positions)*, where: * *Unrealized PnL for Long positions* = *Position size* × (*Current price* – *Open price*) * *Unrealized PnL for Short positions* = *Position size* × (*Open price* – *Current price*) **`item.equityInRAT`** `decimal string` The potential balance if all open positions were closed right now. This value is calculated as *Margin balance* + *Credit* + *Unrealized PnL*. **`item.usedMarginInRAT`** `decimal string` The amount of funds that is used for maintaining all open positions. Is opposed to the *Free margin*. The Used margin for positions on a specific market is calculated using the maximum value between the total margin of long positions and the total margin of short positions: MAX(*MarketPositionLong*, *MarketPositionShort*). **`item.freeMarginInRAT`** `decimal string` The amount of funds that can be used for opening new positions. **`item.marginLevel`** `decimal string` The ratio of funds to a used collateral, in percents. This value is calculated as *Equity* / *Used margin* × 100%. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "marginBalanceInRAT": "497838.8", "creditInRAT": "0", "unrealizedPnlInRAT": "-5.25", "equityInRAT": "497833.55", "usedMarginInRAT": "100.18", "freeMarginInRAT": "497733.37", "marginLevel": "4969.3905" } } ``` ## Get order book [#get-order-book] ### Connection [#connection] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide the `marketId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Book"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", "cfd.eur_chf" ], "invocationId": "0", "target": "Book", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.instrument`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.askTotalAmount`** `string` The total ask amount. **`item.bidTotalAmount`** `string` The total bid amount. **`item.asks`** `array of objects` The array of ask price objects. **`item.asks.price`** `string` The price, in the quote asset. **`item.asks.amount`** `string` The total amount of the base asset available at a corresponding price level. **`item.asks.total`** `string` The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. **`item.bids`** `array of objects` The array of bid price objects. **`item.bids.price`** `string` The price, in the quote asset. **`item.bids.amount`** `string` The total amount of the base asset available at a corresponding price level. **`item.bids.total`** `string` The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. **`item.version`** `string` The order book version. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "instrument": "cfd.eur_chf", "askTotalAmount": "18700000", "bidTotalAmount": "19100000", "asks": [ { "price": "0.93677", "amount": "5000000", "total": "4683850" }, { "price": "0.93676", "amount": "0", "total": "0" }, { "price": "0.93676", "amount": "0", "total": "0" } ], "bids": [ { "price": "0.93654", "amount": "0", "total": "0" }, { "price": "0.93654", "amount": "0", "total": "0" }, { "price": "0.93655", "amount": "5000000", "total": "4682750" } ], "version": "12498", "snapshot": false } } ``` ## Get trading data [#get-trading-data] ### Connection [#connection-1] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"TradingData"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "spot.bnb_btc" ] ], "invocationId": "0", "target": "TradingData", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.markets`** `array of objects` The array of market objects. **`item.markets.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.markets.type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.markets.displayName`** `string` The market ticker. **`item.markets.fullName`** `string` The market full name or description (optional). **`item.markets.price`** `decimal string` The current top-of-the-book price, in the quote asset. **`item.markets.priceInRAT`** `decimal string` The current top-of-the-book price, in conversion to the root asset of the platform. **`item.markets.priceChange24hr`** `decimal string` The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. **`item.markets.priceChangeAbs24hr`** `decimal string` The price change over the last 24 hours. This value is calculated as *Current price* – *Price 24h ago*. **`item.markets.highPrice24hr`** `decimal string` The highest trade price over the last 24 hours. **`item.markets.lowPrice24hr`** `decimal string` The lowest trade price over the last 24 hours. **`item.markets.markPrice`** `decimal string` *Applicable to Perpetual markets only.* The mid-spread price, in conversion to RAT. **`item.markets.fundingRate`** `decimal string` *Applicable to Perpetual markets only.* The current funding rate. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "markets": [ { "marketId": "cfd.eur_chf", "type": "Cfd", "displayName": "cfd.eur_chf", "fullName": "", "price": "0.93586", "priceInRAT": "1", "priceChange24hr": "-0.0006", "priceChangeAbs24hr": "-0.00049", "highPrice24hr": "0.93695", "lowPrice24hr": "0.93134", "markPrice": null, "fundingRate": null } ], "snapshot": false } } ``` ## Get top of the book [#get-top-of-the-book] ### Connection [#connection-2] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Tob"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "spot.eth_usdt" ] ], "invocationId": "0", "target": "Tob", "type": 4 } ``` *** ### Message [#message-2] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.markets`** `array of objects` The array of market objects. **`item.markets.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.markets.ask`** `decimal string` The top-of-the-book ask price. **`item.markets.bid`** `decimal string` The top-of-the-book bid price. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "markets": [ { "marketId": "spot.eth_usdt", "ask": "2483.82", "bid": "2483.81" } ], "snapshot": false } } ``` ## Get trading chart [#get-trading-chart] ### Connection [#connection-3] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide the `marketId` and `timescale` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Chart"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", "cfd.eth_eur@15m" ], "invocationId": "0", "target": "Chart", "type": 4 } ``` *** ### Message [#message-3] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.instrument`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.low`** `decimal string` The lowest base asset price within the specified time interval. **`item.high`** `decimal string` The highest base asset price within the specified time interval. **`item.open`** `decimal string` The base asset price at the beginning of the specified time interval. **`item.close`** `decimal string` The base asset price at the end of the specified time interval. **`item.start`** `dateTime` The beginning of the specified time interval, in ISO 8601 format. **`item.end`** `dateTime` The end of the specified time interval, in ISO 8601 format. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "instrument": "cfd.eth_eur", "low": "2240.88", "high": "2270.29", "open": "2265.63", "close": "2255.99", "start": "2025-05-21T15:30:00Z", "end": "2025-05-21T15:45:00Z" } } ``` ## Get market summary [#get-market-summary] ### Connection [#connection-4] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Summary"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "cfd.eur_chf" ] ], "invocationId": "0", "target": "Summary", "type": 4 } ``` *** ### Message [#message-4] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.items`** `array of objects` The array of data objects. **`item.items.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.items.last`** `decimal string` The price of the last trade. **`item.items.high24hr`** `decimal string` The highest trade price over the last 24 hours. **`item.items.low24hr`** `decimal string` The lowest trade price over the last 24 hours. **`item.items.percentChange`** `decimal string` The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "items": [ { "marketId": "cfd.eur_chf", "last": "0.93597", "high24hr": "0.93695", "low24hr": "0.93134", "percentChange": "-0.02" } ], "snapshot": false } } ``` ## Guest market data [#guest-market-data] Every stream on this page has an anonymous counterpart on a separate hub. Use it to read live market data without an access token — for example, to drive a public dashboard. ### Connection [#connection-5] ```text title="URL" /marketdata/v5/guest ``` No `access_token` query parameter and no `Authorization` header. The connection carries no account, so guest traffic is subject to its own limits, separate from the authenticated ones: a per-instance cap on concurrent connections and a per-client-IP cap on concurrent connections. A connection beyond either cap is rejected with a `GuestConnectionLimitExceeded` hub error. The per-IP cap keys off the real-client-IP header configured for the deployment; connections whose IP cannot be resolved share one fallback bucket. ### Differences from the authenticated hub [#differences-from-the-authenticated-hub] The five stream targets are identical — `Book`, `TradingData`, `Tob`, `Chart`, and `Summary` — and each returns the same message shape as documented above. Two things change: * **`arguments` has one element, not two.** Drop the `accountId` element and pass only what the authenticated hub takes as its second element: | Target | `arguments` | | ------------- | ---------------------------------------- | | `Book` | `[ "cfd.eur_chf" ]` | | `Chart` | `[ "cfd.eth_eur@15m" ]` | | `TradingData` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | | `Tob` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | | `Summary` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | * **Prices are not account-specific.** A guest stream and an authenticated stream on the same instrument can therefore quote different prices. Only markets that are active and well-configured are streamed. A reconnect needs no credentials. ```json title="Example: subscribe to a guest order book" { "arguments": [ "cfd.eur_chf" ], "invocationId": "0", "target": "Book", "type": 4 } ``` For guest snapshots, instrument lists, and candle history over REST, see [Guest](../rest-api/guest). ## Get open orders [#get-open-orders] ### Connection [#connection] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"OpenOrders"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "OpenOrders", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of market objects. **`item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.marketDisplayName`** `string` The market ticker. **`item.marketFullName`** `string` The market full name or description (optional). **`item.orderId`** `string` The unique identifier of the order assigned by the system. **`item.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`item.status`** `string` The current [order status](../get-started/order-statuses). Possible values: * `Started` * `Pending` * `Working` **`item.source`** `string` The source of the order. Possible values: * `Manual` — the order was created manually via UI or API. **`item.reason`** `string` The reason for placing the order. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`item.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`item.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`item.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`item.remainingAmount`** `decimal string` The order amount that hasn't yet been filled, in the base asset. **`item.requestedPrice`** `decimal string` The limit price for Limit orders; `null` for Market orders. **`item.executionPrice`** `decimal string` The volume-weighted average price of the order executions. **`item.createdAt`** `dateTime` The timestamp when the order was created, in ISO 8601 format. **`item.updatedAt`** `dateTime` The timestamp of the most recent update to the order, in ISO 8601 format. **`item.cancellationDate`** `dateTime` The timestamp when the order was cancelled or expired, in ISO 8601 format; `null` if not cancelled. **`item.commissionAssetId`** `string` The currency in which the commission was held. **`item.commissionAmount`** `decimal string` The total commissions put on hold for executing the order. **`item.leverage`** `int` *Applicable only to CFD markets.* The leverage ratio used when placing the order. **`item.fillFactor`** `decimal string` The proportion of the order amount filled so far, where `1` represents 100% fulfillment. **`item.comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`item.takeProfit`** `decimal string` The Take Profit price, if set. **`item.stopLoss`** `decimal string` The Stop Loss price, if set. ```json { "type": 2, "invocationId": "0", "item": [ { "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "orderId": "01JVQBFSTVC40VK03A0AY7K016", "timeInForce": "Gtc", "status": "Pending", "source": "Manual", "reason": "Trader", "side": "Buy", "orderType": "Limit", "requestedAmount": "10000", "remainingAmount": "10000", "requestedPrice": "0.9", "executionPrice": "0", "createdAt": "2025-05-20T17:22:31.899Z", "updatedAt": "2025-05-20T17:22:31.9001213Z", "cancellationDate": null, "commissionAssetId": "eur", "commissionAmount": "0", "leverage": 1, "fillFactor": "0", "takeProfit": null, "stopLoss": null, "comment": null } ] } ``` ## Get open positions [#get-open-positions] ### Connection [#connection-1] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"OpenPositions"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "OpenPositions", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.item`** `array of objects` The array of position objects. **`item.item.positionId`** `string` The unique identifier of the position assigned by the system. **`item.item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.item.marketDisplayName`** `string` The market ticker. **`item.item.marketFullName`** `string` The market full name or description (optional). **`item.item.createdAt`** `dateTime` The timestamp when the position was opened, in ISO 8601 format. **`item.item.updatedAt`** `dateTime` The timestamp of the most recent update to the position, in ISO 8601 format. **`item.item.side`** `string` The position side. Possible values: * `Buy` * `Sell` **`item.item.status`** `string` The current position status. Always `"Open"`. **`item.item.leverage`** `int` *Applicable only to CFD markets.* The leverage ratio used when opening the position. **`item.item.positionLotAmount`** `decimal string` The position volume, in lots. **`item.item.positionPriceInRAT`** `decimal string` The current position price, in conversion to RAT. **`item.item.rateToRAT`** `decimal string` The current exchange rate of a quote asset to RAT. **`item.item.usedMarginInRAT`** `decimal string` The amount of trader’s funds used for maintaining a position, in conversion to RAT. **`item.item.openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`item.item.currentMarketPrice`** `decimal string` The current market price of the base asset: bid for Long positions and ask for Short positions. **`item.item.unrealizedPnlDayInRAT`** `decimal string` The potential profit or loss earned for a current day, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *First bid price for today*). For **Short** positions, this value is calculated as *Position size* × (*First ask price for today* – *Current ask price*). If a position was opened today, then the *Open VWAP* is used instead of the *First price for today*. **`item.item.unrealizedPnlDayPercent`** `decimal string` The potential profit or loss earned for a current day, in percents. **`item.item.unrealizedPnlTotalInRAT`** `decimal string` The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *Open VWAP*). For **Short** positions, this value is calculated as *Position size* × (*Open VWAP* – *Current ask price*). **`item.item.unrealizedPnlTotalPercent`** `decimal string` The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to RAT, in percents. **`item.item.takeProfit`** `decimal string` The Take Profit price, if set. **`item.item.stopLoss`** `decimal string` The Stop Loss price, if set. **`item.item.positionModifier`** `string` The reason for the latest position update. **`item.item.comment`** `string | nullable` The text note inherited from the opening order, up to 100 characters. **`snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "item": [ { "positionId": "01JP4H3AMS7Q1H6Y6H3XJ52JTA", "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "createdAt": "2025-03-12T06:36:31.257Z", "updatedAt": "2025-03-12T06:36:31.257Z", "side": "Buy", "status": "Open", "leverage": 1, "positionLotAmount": "0.01", "positionPriceInRAT": "1000.46", "rateToRAT": "1.07", "usedMarginInRAT": "1000.53", "openPrice": "0.96304", "currentMarketPrice": "0.93501", "unrealizedPnlDayInRAT": "1.86", "unrealizedPnlDayPercent": "0.0018", "unrealizedPnlTotalInRAT": "-29.93", "unrealizedPnlTotalPercent": "-0.0291", "takeProfit": null, "stopLoss": null, "positionModifier": "Trader", "comment": null }, { "positionId": "01JVQB9ZWJ6G4QV0P98X0QWNA7", "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "createdAt": "2025-05-20T17:19:21.49Z", "updatedAt": "2025-05-20T17:19:21.491321Z", "side": "Buy", "status": "Open", "leverage": 100, "positionLotAmount": "0.1", "positionPriceInRAT": "10004.6", "rateToRAT": "1.07", "usedMarginInRAT": "100.06", "openPrice": "0.93666", "currentMarketPrice": "0.93501", "unrealizedPnlDayInRAT": "18.61", "unrealizedPnlDayPercent": "0.0018", "unrealizedPnlTotalInRAT": "-17.02", "unrealizedPnlTotalPercent": "-0.0017", "takeProfit": null, "stopLoss": null, "positionModifier": "Trader", "comment": null } ], "snapshot": false } } ``` ## Get closed positions [#get-closed-positions] ### Connection [#connection-2] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"ClosePositionsOrders"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "ClosePositionsOrders", "type": 4 } ``` *** ### Message [#message-2] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of position objects. **`item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.marketDisplayName`** `string` The market ticker. **`item.marketFullName`** `string` The market full name or description (optional). **`item.orderId`** `string` The unique identifier of the order assigned by the system. **`item.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`item.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`item.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`item.positionCloseLotAmount`** `decimal string` The closed volume, in lots, which is equivalent to the corresponding filled order volume. **`item.reason`** `string` The reason for position closing. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`item.realizedPnlInRAT`** `decimal string` The actual profit or loss earned, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Close price* – *Open price*). For **Short** positions, this value is calculated as *Position size* × (*Open price* – *Close price*). **`item.closedAt`** `dateTime` The timestamp when the position was closed, in ISO 8601 format. **`item.positionId`** `string` The unique identifier of the position assigned by the system. **`item.openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`item.closePrice`** `decimal string` The volume-weighted average price (VWAP) of trades related to a position-closing order. **`item.positionPriceInRAT`** `decimal string` The position price, in conversion to RAT. **`item.rateToRAT`** `decimal string` The conversion rate to RAT. **`item.openedAt`** `dateTime` The timestamp when the position was opened, in ISO 8601 format. ```json title="Example" { "type": 2, "invocationId": "0", "item": [ { "marketId": "cfd.eur_chf", "marketFullName": "", "marketDisplayName": "EUR/CHF", "marketType": "Cfd", "orderId": "01JVSQ8WFA3QZ6AQTKYPXVXDWA", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "0.01", "reason": "Trader", "realizedPnlInRAT": "-29.25", "closedAt": "2025-05-21T15:26:57.0027785Z", "positionId": "01JP4H3AMS7Q1H6Y6H3XJ52JTA", "openPrice": "0.96304", "closePrice": "0.93571", "positionPriceInRAT": "1001.2", "rateToRAT": "1.07", "openedAt": "2025-03-12T06:36:31.257Z" } ] } ``` You can connect B2Trader to **ChatGPT** as a **connector**. It uses the same B2Trader MCP URL and OAuth sign-in as every other agent. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` Ask your broker for the exact base URL for your platform. The read-only connector may also be discoverable directly in ChatGPT's connector directory. Connector availability depends on your ChatGPT plan. ## Connect the B2Trader connector [#connect-the-b2trader-connector] 1. In ChatGPT, open **Settings** → **Connectors**. 2. Choose to add a connector by **URL** (custom connector). 3. Paste the B2Trader MCP **URL** for the surface you want (read-only or full access). 4. Confirm. ChatGPT reads the endpoint's OAuth metadata and opens the sign-in page for your platform in your browser. 5. Sign in with the credentials you normally use. Depending on how your broker set up your platform, this is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account. Authentication uses OAuth 2.1 with PKCE — no API key is pasted into ChatGPT. 6. **Full access only:** approve the consent screen (see [The full-access consent screen](#the-full-access-consent-screen)). 7. ChatGPT lists the connector as connected, and the B2Trader tools become available to it. ## The full-access consent screen [#the-full-access-consent-screen] When you connect the **full-access** surface, B2Trader shows an explicit consent screen before issuing a token. It reads: Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. * **Approve** — ChatGPT receives a token carrying the `mcp:trade` scope and can trade on your account. * **Decline** — no token is issued and ChatGPT stays disconnected from the full-access surface. The read-only surface does **not** show this screen — it only grants the `mcp:read` scope. Before approving full access, read [Full-access safety](full-access-safety). ## What "connected" looks like [#what-connected-looks-like] * The connector appears as connected in ChatGPT's settings. * B2Trader tools are available to ChatGPT in your chats. * On read-only, no order-placing or position-closing tools appear — they are not part of that surface. ## Disconnecting [#disconnecting] * In ChatGPT, remove the connector to stop it calling B2Trader. * To revoke B2Trader's side of the grant, use the account console — see [How to stop your agent](full-access-safety#how-to-stop-your-agent). You can connect B2Trader to **Claude** in two places: * **claude.ai** (web and desktop app) — add B2Trader as a **custom connector**. * **Claude Desktop** — add B2Trader as an MCP server; the OAuth sign-in completes through Claude's hosted redirect (`https://claude.ai/api/mcp/auth_callback`). Both use the same B2Trader MCP URL and the same OAuth sign-in. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` Ask your broker for the exact base URL for your platform. The read-only connector may also be discoverable directly in Claude's connector directory. ## Connect on claude.ai [#connect-on-claudeai] 1. Open **Settings** → **Connectors** in claude.ai. 2. Click **Add custom connector**. 3. Paste the B2Trader MCP **URL** for the surface you want (read-only or full access). 4. Click **Add**. Claude reads the endpoint's OAuth metadata and opens the sign-in page for your platform in your browser. 5. Sign in with the credentials you normally use. Depending on how your broker set up your platform, this is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account. Authentication uses OAuth 2.1 with PKCE — you are **not** pasting an API key into Claude. 6. **Full access only:** approve the consent screen (see [The full-access consent screen](#the-full-access-consent-screen)). 7. Claude shows the connector as **Connected**, and the B2Trader tools appear in the tool list for your conversations. ## Connect in Claude Desktop [#connect-in-claude-desktop] 1. Open **Claude Desktop** → **Settings** → **Connectors**. 2. Add a new MCP server pointing at the B2Trader MCP URL for your surface. 3. Claude Desktop opens your browser for OAuth sign-in and completes the flow through Claude's **hosted** redirect (`https://claude.ai/api/mcp/auth_callback`), a pre-registered redirect URI. 4. Sign in and — for full access — approve the consent screen. 5. The B2Trader tools appear in Claude Desktop once the connector reports **Connected**. ## The full-access consent screen [#the-full-access-consent-screen] When you connect the **full-access** surface, B2Trader shows an explicit consent screen before issuing a token. It reads: Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. * **Approve** — Claude receives a token carrying the `mcp:trade` scope and can trade on your account. * **Decline** — no token is issued and Claude stays disconnected from the full-access surface. The read-only surface does **not** show this screen — it only grants the `mcp:read` scope. Before approving full access, read [Full-access safety](full-access-safety). ## What "connected" looks like [#what-connected-looks-like] * The connector is listed as **Connected** in Claude's settings. * B2Trader tools (for example `trader_get_accounts`, plus platform market-data and portfolio tools) are available to Claude in your conversations. * On read-only, no order-placing or position-closing tools appear — they are not part of that surface. ## Disconnecting [#disconnecting] * In Claude, remove the connector to stop it calling B2Trader. * To revoke B2Trader's side of the grant, use the account console — see [How to stop your agent](full-access-safety#how-to-stop-your-agent). If you are building your own agent (for example with an Agent SDK) or using an MCP client that is not Claude or ChatGPT, you connect to the same two B2Trader endpoints and the same OAuth flow. This page covers the OAuth details a custom client needs. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` `` is the domain you open your B2Trader terminal on, not a separate API address. ## OAuth discovery [#oauth-discovery] Your client needs no B2Trader-specific configuration beyond the MCP URL. B2Trader is an OAuth 2.1 protected resource and advertises everything a compliant client needs: 1. Your client calls the MCP endpoint without a token and receives `401 Unauthorized` with a `WWW-Authenticate: Bearer resource_metadata="…"` header. 2. That header points at the protected-resource metadata (RFC 9728) for the surface you called — each surface has its own document: `https:///.well-known/oauth-protected-resource/mcp-read-only` and `https:///.well-known/oauth-protected-resource/mcp-full-access`. Fetching it returns the resource identifier, the authorization server (your broker's Keycloak realm), and `scopes_supported` — one scope only, matching the surface: `[mcp:read]` for `/mcp-read-only`, `[mcp:trade]` for `/mcp-full-access`. 3. Your client runs the standard OAuth 2.1 **authorization-code flow with PKCE** against that authorization server, requesting the scope for the surface you want. 4. B2Trader validates the token's audience (`bbp-mcp`) and the required scope (`mcp:read` for read-only, `mcp:trade` for full access) before serving any tool. Use a compliant MCP client library — it performs discovery, PKCE, and token refresh for you. You only supply the MCP URL. ## Pre-registered OAuth clients [#pre-registered-oauth-clients] B2Trader ships two pre-registered public OAuth clients. Use the one matching your surface: | Surface | `client_id` | Scope | Consent | | ----------- | ----------------- | ----------- | ---------------------------- | | Read-only | `mcp-read-only` | `mcp:read` | None | | Full access | `mcp-full-access` | `mcp:trade` | Explicit trade-scope consent | Both are **public** clients (no client secret) and require **PKCE (S256)**. A custom client authenticates as one of these `client_id`s and completes the browser sign-in as any other agent does. Depending on how your broker set up your platform, the page that opens is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account — your client behaves the same either way. ## Command-line agents (Codex CLI, Claude Code) [#command-line-agents-codex-cli-claude-code] Command-line MCP clients default to **Dynamic Client Registration (DCR)** — on first connect they try to register a brand-new OAuth client with the authorization server instead of using a fixed `client_id`. The B2Trader Keycloak realm does not permit anonymous DCR, so these tools must be told to use one of the pre-registered `client_id`s above: * **Codex CLI:** ```bash codex mcp add --url --oauth-client-id mcp-full-access codex mcp login ``` Use `mcp-read-only` in place of `mcp-full-access` for the read-only surface. * **Claude Code:** ```bash claude mcp add --transport http --client-id mcp-full-access --callback-port 8080 ``` Without an explicit `client_id`, both tools fall back to anonymous DCR, which the authorization server rejects — the connection fails before you reach the sign-in page. ## Redirect URIs [#redirect-uris] The pre-registered clients accept these redirect URIs: | Redirect URI | Use | | ------------------------------------------------------- | ----------------------------------------------------- | | `https://claude.ai/api/mcp/auth_callback` | Claude (claude.ai) | | `https://chatgpt.com/connector_platform_oauth_redirect` | ChatGPT | | `http://localhost:8080/*` | Claude Code — fixed callback port | | `http://127.0.0.1/*` | Codex CLI and other loopback clients — ephemeral port | If your custom agent runs locally, use one of the loopback redirects above. Most Agent SDKs and MCP client libraries (including Codex CLI) default to an ephemeral-port loopback callback on `127.0.0.1`, matching `http://127.0.0.1/*`, so no configuration change is needed. Claude Code is the exception: it needs a **fixed** callback port to match a registered redirect, so pass `--callback-port 8080` (matching `http://localhost:8080/*`) as shown above. ## Adding a custom redirect URI (broker step) [#adding-a-custom-redirect-uri-broker-step] If your agent runs on a hosted callback URL that is **not** one of the above (for example a server-side agent with its own public redirect), your broker must add that redirect URI to the pre-registered client in Keycloak before sign-in will succeed. A redirect URI that is not registered on the client fails at the sign-in step with an "Invalid redirect URI" error from Keycloak. Send your broker the exact callback URL your agent uses and which surface it needs (read-only or full access). Adding a redirect URI is a broker-side change to the MCP client registration. It requires no product change and is the documented path for onboarding custom, non-marketplace agents. ## Full access [#full-access] If your custom agent uses the full-access surface, the same [full-access safety](full-access-safety) rules apply: no per-action confirmation, irreversible actions, and the prompt-injection risk of an autonomous agent. Read that page before granting `mcp:trade`. The full-access surface (`/mcp-full-access`) lets a connected AI agent trade on your account **directly**. This page explains exactly what that means and how to stay in control. Read it before you approve the full-access consent screen. Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. ## No per-action confirmation [#no-per-action-confirmation] The in-terminal **AI Assistant chat** asks you to confirm each trade before it executes. The full-access MCP surface does **not**. Once connected, the agent can place, cancel, and close orders and set price triggers on its own, as fast as it decides to — there is no confirmation dialog and no "are you sure?" step. ## Actions are irreversible [#actions-are-irreversible] Trades execute against the live market. A filled order, a closed position, or a cancelled order **cannot be undone**. If your agent makes a mistake — or is manipulated into one — the market result stands. ## Prompt-injection risk [#prompt-injection-risk] An autonomous agent acts on the text it reads. If your agent processes untrusted content — a web page, an email, a chat message, a document — that content can contain hidden instructions telling the agent to trade against your interest. This is called **prompt injection**. Because the full-access surface has no confirmation gate, a successful injection can move real money before you notice. To reduce the risk: * Prefer the **read-only** surface unless you specifically need the agent to trade. * Only grant full access to agents and workflows you trust and control. * Be cautious about letting a full-access agent read untrusted external content in the same session it can trade. ## How to stop your agent [#how-to-stop-your-agent] You have two independent controls. Use either — or both. 1. **Stop it in the agent (fastest).** Disconnect or remove the B2Trader connector in your agent (Claude, ChatGPT, or your custom client). The agent immediately stops making new calls. 2. **Revoke the grant in B2Trader.** Open your **account console** (your broker's Keycloak account page) → **Applications**, find the connected MCP application, and **revoke** its access. This removes your consent so the agent cannot obtain a new token. There is no broker-side "kill switch" that instantly voids a token already in the agent's hands. A token the agent already holds stays valid until it expires (see [Access tokens are short-lived](#access-tokens-are-short-lived)). Revoking in the account console stops **new** tokens; disconnecting in the agent stops it using the one it has. Do both to be certain. ## You still get execution notifications [#you-still-get-execution-notifications] Every order the agent places, cancels, or closes fires the **same account notifications** you already receive for terminal activity. Your normal notification channels keep working, so a full-access agent cannot act silently — watch them to see what your agent is doing. ## Access tokens are short-lived [#access-tokens-are-short-lived] The agent's access token has a **short lifetime**. If you revoke consent in the account console, the agent can finish using its current token but cannot get a new one once it expires — so a revoked grant fully lapses within the token's short window, without any forced server-side revocation. ## Choosing read-only instead [#choosing-read-only-instead] If you do not need the agent to trade, connect the **read-only** surface (`/mcp-read-only`) instead. Its tools cannot place or change anything — the trading tools are not part of that surface at all. See [Overview](overview) for the comparison. B2Trader can expose your trading account to external AI agents through the **Model Context Protocol (MCP)** — an open standard that lets AI applications such as Claude and ChatGPT call a defined set of tools on your behalf. Once you connect an agent, it can read your market data and portfolio, and — on the full-access surface — place and manage orders directly. This is different from the **in-terminal AI Assistant chat**, which runs inside the B2Trader terminal and confirms each trade with you before it executes. An external MCP agent runs in *its own* application (Claude, ChatGPT, or your own client) and connects to B2Trader over the internet using your account sign-in. Connecting an AI agent is optional — it's your choice whether to use it. The MCP surfaces are available by default, though your broker can restrict or disable them for your platform. The MCP endpoints live on the same domain you use to open your B2Trader terminal, so wherever these pages show `https:///…`, that means your terminal address — not a separate API address. If a connection URL below doesn't work, contact your broker. ## Two surfaces [#two-surfaces] B2Trader publishes **two** separate MCP endpoints. You choose one when you connect your agent. | | Read-only | Full access | | ------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Endpoint path** | `/mcp-read-only` | `/mcp-full-access` | | **What the agent can do** | View market data, your portfolio, order and position history, and analytics | Everything in read-only **plus** place, cancel, and close orders and set price triggers | | **Tools exposed** | 23 | 39 | | **Trading** | None — mutating tools are not present at all | Full trading, with **no per-action confirmation** | | **OAuth scope** | `mcp:read` | `mcp:trade` | | **Consent screen** | No extra consent | Explicit trade-scope consent (see [Full-access safety](full-access-safety)) | | **Marketplace-listed** | Yes | No — connect by URL | The **read-only** surface is the one listed in AI marketplaces (for example the Claude and ChatGPT connector directories). It is safe to connect broadly: the trading tools are **structurally absent** — the agent cannot see or call them. The **full-access** surface is connected by pasting its URL directly. It grants your agent the ability to trade with no confirmation gate. Read [Full-access safety](full-access-safety) before you connect it. ## Tool categories [#tool-categories] Both surfaces expose the same read tools; the full-access surface adds the mutating ones. | Category | Read-only | Full access | | ------------------------------------------------------------------------------ | --------- | ----------- | | Market data — B2Trader platform prices (tickers, order book, market summaries) | Yes | Yes | | Portfolio & account (balances, margin, open positions) | Yes | Yes | | Order & position history | Yes | Yes | | Analytics & reference data | Yes | Yes | | Place / cancel / close orders (single) | No | Yes | | Bulk order / position actions | No | Yes | | Set & edit price triggers, other account mutations | No | Yes | | **Total tools** | **23** | **39** | The 16 tools that the full-access surface adds are the mutating actions: single trading actions, bulk trading actions, and non-trading account mutations. ## Which surface to choose [#which-surface-to-choose] * **Choose read-only** if you want an agent to analyze markets, summarize your portfolio, or answer questions about your trading history. This is the recommended default and the safest option. * **Choose full access** only if you deliberately want your agent to trade for you without confirming each action, and you understand the risks in [Full-access safety](full-access-safety). ## Prerequisites [#prerequisites] Before connecting any agent you need: * A **B2Trader account** on a platform that offers the MCP surfaces. They are available by default; a broker can restrict or disable them. * Your account must be **active** (`bbp.spot.status = Active`) — the same status required to trade in the terminal. A non-active account can sign in, but its tool calls are rejected by the platform. * An AI application that supports MCP with OAuth — for example [Claude](connect-claude), [ChatGPT](connect-chatgpt), or a [custom agent](connect-custom-agent). ## How connecting works [#how-connecting-works] You never paste an API key or password into your agent. Connection uses **OAuth 2.1 with PKCE**: 1. You add the B2Trader MCP URL to your agent. 2. The agent discovers B2Trader's authorization server automatically — it reads the endpoint's protected-resource metadata at `/.well-known/oauth-protected-resource/mcp-read-only` or `/.well-known/oauth-protected-resource/mcp-full-access`, depending on the surface. 3. Your browser opens the sign-in page for your platform, where you sign in with the credentials you normally use. 4. For the full-access surface, you approve an explicit consent screen describing what the agent may do. 5. The agent receives a short-lived access token and is connected. No long-lived secret is stored in the agent. The sign-in page you see depends on how your broker set up your platform: either the B2Trader sign-in form, or the sign-in page of the portal you normally use to access your account, which opens automatically. If you are already signed in there in the same browser, no sign-in prompt appears. The per-client steps are covered in the connection guides: * [Connect Claude](connect-claude) * [Connect ChatGPT](connect-chatgpt) * [Connect a custom agent](connect-custom-agent) * [Full-access safety](full-access-safety) ## Global interface controls [#global-interface-controls] ### Account selection [#account-selection] The **Account select** is located in the topbar and enables you to switch between your trading accounts. Each account shows its type: `H` (Hedging) or `N` (Netting). Once you switch the account, all the widgets automatically adjust to show relevant information for the selected account. Account select #### Account status [#account-status] An account can have a status that limits what you can do with it. When a status applies, a status indicator is shown on the account, and a banner explains the restriction. Account status is managed by your administrator. The following statuses are visible to you: * **Halted**: A banner reads *Account is locked for trading. Contact your administrator.* The trading controls are disabled, but you can still deposit and withdraw funds, and your balances, positions, and history stay visible. * **Frozen**: A banner reads *Account is frozen. Contact your administrator.* The account is view-only. All controls are disabled, while your balances, positions, and history stay visible. To restore trading on an account that is Halted or Frozen, contact your administrator. Archived accounts don't appear in the account list. ### Instrument selection [#instrument-selection] The **Instrument select** is located in the topbar and enables you to switch between various markets and trading pairs. Once you change the market, all the widgets automatically adjust to show relevant information for the selected instrument. Instrument select #### Favorite markets [#favorite-markets] Mark instruments as favorites for quick access. To add or remove a market from favorites, click the **star icon** next to the market name in the instrument selection list. Favorite markets can be accessed in two ways: * **Favorites tab** in the instrument selection panel — filters the list to show only your favorite markets. * **Favorites dropdown** in the topbar — provides quick access to favorite markets from anywhere in the terminal. ### Settings [#settings] Use this control to access interface and system settings. Refer to [Settings](settings) for details. Settings ### Other controls [#other-controls] * **Introduction tour**: Access the interactive platform walkthrough. Introduction tour * **Alerts**: View new system notifications. Unread alerts * **Analytics**: Open the **Account Analytics** view with the **Equity Curve** chart — your account balance and equity dynamics over time (Margin Balance, Equity, Total Equity, Unrealized PnL, Deposits / Withdrawals) for a selected period and granularity. The data updates hourly. Click **Back to Trading** to return to the terminal. Analytics * **Log out**: Log out of the system to securely terminate the session. After that you’re navigated to the Login page. Log out ## Working with widgets [#working-with-widgets] > For more information about available widgets, refer to the **Widgets** section of this guide. ### Add widgets to your workspace [#add-widgets-to-your-workspace] **To add a new widget**: 1. Click the **Add Widget** button. 2. Browse the available widgets. 3. Click any widget to add it to your workspace. Add Widget **To add widgets to existing panels**: 1. Look for the **+** button next to the tabs in a panel's header. 2. Click it to open the widget catalog. 3. Select a widget to add it as a new tab to that panel. Add widget tabs ### Move and position widgets [#move-and-position-widgets] **To move a widget**: 1. Click and hold the **move handle** in the top-right corner of the panel header. 2. Drag it to desired location on the page. 3. Drop it. Move widgets **To rearrange widget tabs within a panel**: 1. Click and hold any widget tab. 2. Drag it left or right to reorder. 3. Release to set the new position. ### Resize widgets [#resize-widgets] **To resize a widget panel**: * **Single edge**: Hover over any edge until you see the resize cursor, then drag. * **Corner resize**: Drag a corner to adjust both width and height simultaneously. * **Precision**: Use edge dragging for fine-tuned sizing. Resize widgets ### Remove widgets and tabs [#remove-widgets-and-tabs] **To remove a tab**: 1. Click the **×** button in the top-right corner of the widget tab. 2. The tab will be removed immediately. 3. When you remove the last tab from a panel, the entire panel disappears. Remove tabs and widget panels ### Link panels to a group [#link-panels-to-a-group] Each panel header has a **Link to group** button — the circle icon **next to the move handle** in the top-right corner. Linking panels to the same colored group keeps them in sync: when you select an instrument in one linked panel, the other panels in the same group switch to it automatically. **To link a panel to a group**: 1. Click the **Link to group** button (next to the move handle) in the panel's top-right corner. 2. Select one of the color groups (Group 1–5). 3. Repeat for other panels, choosing the same group to keep them synchronized. Link to group ### Customize widget content [#customize-widget-content] Certain widgets let you customize which columns to display and their order: Look for the **column settings** button in the widget header. **To customize columns**: 1. Click the **column settings** button. 2. **Show/hide columns**: Check or uncheck boxes (grayed-out columns are required). 3. **Reorder columns**: Drag and drop items in the list. 4. **Reset**: Click *Reset to default* to restore original settings. Configure columns ## Managing workspaces [#managing-workspaces] ### Create new workspaces [#create-new-workspaces] **To create a workspace**: 1. Click the **+** tab next to your existing workspaces. 2. Choose a template: * **Pre-built templates**: Start with common widget combinations. * **Empty**: Build completely from scratch. 3. Enter a name for your workspace. 4. Start customizing. Add a new workspace ### Workspace management [#workspace-management] **To rename or delete a workspace**: 1. Click the menu icon on the workspace tab. 2. Select **Rename** or **Remove**. Workspace menu **To reorder workspaces**: 1. Click and hold any workspace tab. 2. Drag it left or right to reorder. 3. Release to set the new position. ## Market info panel [#market-info-panel] Click the **info icon** next to a market symbol in widgets to view: * Detailed market information. * Trading session schedules. * Leverage details (for CFD and PF markets). * Fee details. * Funding details (for PF markets). Market info ## Pro tips [#pro-tips] ### Efficient layout building [#efficient-layout-building] * Start with a template that is close to your needs, then customize. * Group related widgets in tabs to save screen space. * Use larger panels for charts, smaller ones for order books. ### Layout best practices [#layout-best-practices] * **Save multiple workspaces** for different trading strategies. * **Test your layout** during low-activity periods. * **Keep essential widgets visible** (account info, positions, alerts). Guest mode lets you open the Trading terminal and look around without an account. You get the real interface with live market data, so you can judge the platform and its market coverage before you sign up. Everything that would move money or show someone's balance stays behind login. You do not switch Guest mode on. Open the terminal URL without a session and it loads in Guest mode on its own — there is no redirect to a login page first. On your first visit a short disclaimer appears, stating that the page is for information only and that the instruments actually available for trading are determined by current legislation. Click **OK** to dismiss it; it is remembered in your browser and does not appear again. Your broker can turn the disclaimer off. ## What you can do as a guest [#what-you-can-do-as-a-guest] * Browse the full list of instruments your broker offers, and filter, group, and search it exactly as a logged-in trader would. * Follow live prices, the [Order book](../widgets/order-book), and [Market depth](../widgets/market-depth). * Work with the [Price chart](../widgets/price-chart): change the instrument, change the timeframe, and use the chart tools. * Open the [AI Assistant](../widgets/ai-assistant) widget for market analysis. * Fill in the [Place order](../widgets/place-order) form — order type, side, quantity, price, stop loss, take profit, time in force. The fields behave the same as they do for a logged-in trader, so you can see exactly what placing an order involves. ## What needs logging in [#what-needs-logging-in] In the [Place order](../widgets/place-order) widget the order submit button is replaced by a **Log In** button. You can fill in the whole form and see the calculated figures, but there is no way to submit an order as a guest. Account-related widgets are not hidden either. Each is covered by an overlay with a padlock icon, the message *Log in to unlock all features*, and a **Log In** button, so you can see where your own data will appear once you have an account. The affected widgets are: * [Assets](../widgets/assets) * [Margin](../widgets/margin) * [Open orders](../widgets/open-orders) * [Open positions](../widgets/open-positions) * [Closed positions](../widgets/closed-positions) * [Order history](../widgets/order-history) * [Stop orders](../widgets/stop-orders) * [Messages](../widgets/messages) * [Price control](../widgets/price-control) ## Your guest workspace [#your-guest-workspace] Guest mode opens with a workspace laid out by your broker. It is the same on every visit and it is not saved: rearranging widgets as a guest does not carry over to your next visit, and it never becomes your workspace after you log in. ## Logging in from Guest mode [#logging-in-from-guest-mode] Use **Log In** in the terminal topbar, or the **Log In** button on any account widget overlay or in the Place order widget — they all do the same thing. After you log in, the terminal reloads into the full trading experience and opens your saved workspace. On a first login, when you have no saved workspace yet, it opens the default one. If you are already logged in to your broker's client portal in the same browser, the terminal detects that session on load and takes you straight into the full trading experience — no second login. ## Logging out [#logging-out] Logging out returns you to Guest mode on the same address, not to a login page, so you can keep watching the markets. Your account data is cleared from the browser first, so no balances, positions, orders, or history remain visible. Access settings by clicking the **gear icon** in the topbar of the Trading terminal. Settings Settings are organized into tabs: * [Interface](#interface): Configure language, time display, and visual theme. * [Widgets](#widgets): Customize widget display options. * [Action Confirmation](#action-confirmation): Choose which actions require additional confirmation. * [Account margin](#account-margin): Manage collateral assets for margin trading. * [Trading report](#trading-report): Generate comprehensive trading and account reports, including an official Client Account Statement. * [API token management](#api-token-management): Generate and manage tokens for accessing the Trading API. * [TradingView Webhooks](#tradingview-webhooks): Configure TradingView webhook alerts for automated order execution. ## Interface [#interface] Configure global interface preferences: **Language** Select the interface language from the dropdown menu. **24 hour mode** * Enable: Display time in 24-hour format. * Disable: Display time in 12-hour format with AM/PM. **Dark theme** * Enable: Apply dark color scheme. * Disable: Apply light color scheme. ## Widgets [#widgets] Configure display options for the following widgets. ### Price chart [#price-chart] **Display positions** When enabled, open positions are shown on the chart along with: * Position size and current PnL. * Quick access to edit price triggers and close positions. * Color coding: Long positions (green), Short positions (red). **Display orders and triggers** When enabled, the following orders and triggers are displayed on the chart: * Active Limit and Stop orders with order type, price, and amount. * Stop loss, Take profit, and Trailing stop triggers. * Quick access to edit triggers and cancel orders. * Color coding: Buy orders (green), Sell orders (red). **Display executed orders** When enabled, executed orders are shown on the chart with order type indicators: * Green `B` tag for Buy orders. * Red `S` tag for Sell orders. Clicking `B` or `S` will open details of one or more orders that were executed during the candle interval. **Market quick trade panel** When enabled, a panel is displayed on the chart for placing Market orders with: * Quick amount selection from preset values. * Leverage ratio input (when applicable). Amount presets can be configured in the corresponding field displayed when the option is enabled. **Limit quick trade panel** When enabled, a panel is displayed on the chart for placing Limit orders with: * Quick amount selection from preset values. * Leverage ratio input (when applicable). Amount presets can be configured in the corresponding field displayed when the option is enabled. ## Action Confirmation [#action-confirmation] Choose which trading actions require an additional confirmation dialog before execution. **Cancel orders** * Enable: A confirmation dialog is displayed before canceling orders. * Disable: Orders are canceled immediately without confirmation. This setting applies to single and bulk order cancellations from the **Open Orders** widget and the **Price chart**. The confirmation dialog includes a **"Don't ask again"** checkbox. To skip the confirmation for future order cancellations, check this box. **Full Close Positions** * Enable: A confirmation dialog is displayed before closing positions. * Disable: Positions are closed immediately without confirmation. This setting applies to single and bulk position closures from the **Open Positions** widget. **Limit order cross-TOB warning** * Enable: A confirmation dialog is displayed before a Limit order is submitted if its price crosses the current top-of-book — that is, when a Buy price is at or above the best ask, or a Sell price is at or below the best bid. The dialog shows the entered price and the current best bid/ask, and includes a **Do not show this warning again** checkbox. * Disable: Crossing Limit orders are submitted immediately without the warning. The warning is enabled by default. The dialog checkbox and this toggle share the same global setting and stay in sync. The warning is informational only — it does not block the order. If you confirm, the order is submitted with the original price. The warning applies only to standard Limit orders; Stop-limit, Take-profit-limit, IOC, FOK, and other order types are not affected. If best bid or best ask data is unavailable (empty book or disconnected feed), the order is submitted without the warning. ## Account margin [#account-margin] Control which assets can be used as collateral for margin trading. ### Asset list [#asset-list] The following information is provided about each asset: **Asset** The alphabetical code of the asset. The first asset in the list is the **root asset** of the platform. *** **Caption** The asset name. *** **Available** The balance available for trading, calculated as *Total – Halted*, where *Halted* represents funds locked for pending Limit orders. *** **Total** The complete asset balance including locked funds. *** **Margin ratio** The percentage of asset value that can be used as collateral for margin trading. *** **Use as margin** Enable this toggle to use the asset as collateral for margin trading. Configure which assets can be used as collateral for margin trading by toggling the **Use as margin** setting for each asset. Only assets with **Margin ratio** greater than 0 (zero) can be enabled. The platform root asset is enabled by default and can't be disabled. ### Filtering options [#filtering-options] Click the **funnel icon** to configure the asset list display: * **Show/Hide zero balances**: Control visibility of assets with zero balance. By default, hidden. * **Show/Hide assets unused as margin**: Control visibility of assets with disabled margin usage. * **Show/Hide assets with zero margin ratio**: Control visibility of assets that can't be used as collateral. By default, hidden. ## Trading report [#trading-report] Generate comprehensive reports containing: * **Trade history** * Closed positions * Executed orders * Individual trades * **Transfers history** * All account transfers * **Account statistics** * Total balance * Realized PnL * Position swaps * Position funding * Commissions * Margin Balance, Equity, Margin Used, Free Margin, Margin Level, Unrealized PnL, and As Of — the same account summary values as the HTML statement, see [Client Account Statement](#client-account-statement) To generate a report: 1. Select a custom period of time (UTC time), or generate a report for your entire account history using the **All data** range. The following timeframe presets have been implemented for your convenience: * **Today** * **Current**: week, month, quarter * **Previous**: week, month, quarter * **All data**. 2. Click **Download**. Once generated, the report will be automatically downloaded to your computer as a zipped file. ### Client Account Statement [#client-account-statement] Along with the CSV file, the downloaded archive contains an HTML **Client Account Statement**: a self-contained document you can open directly in your browser, without any additional software. Besides your trade and transfer history, the statement can include: * Your broker's trading entity details and logo, when configured. * The statement period, currency, and the generation date and time, in UTC. * Your account details: legal name, account number, and account type, when available. * A point-in-time account summary — Margin Balance, Equity, Margin Used, Free Margin, Margin Level, and Unrealized PnL — as of the end of the selected period, or the latest available snapshot while the period is still open, with the exact time printed next to the summary. * Legal texts configured by your broker, such as a disclaimer or a confidentiality statement. A field your broker hasn't configured is left out of the statement rather than shown blank. If the requested period ends before account summary data becomes available, the statement states that account summary data isn't available for that period, instead of showing the summary. To save the statement as a PDF file, open the downloaded HTML file in your browser, then use your browser's Print dialog and select **Save as PDF**. ## API token management [#api-token-management] Generate tokens for accessing the [Trading API](https://api-docs.b2trader.b2broker.com/): * **Limit**: 10 tokens per account * **Validity**: 1 year * **Management**: Can be revoked or deleted at any time To generate a token: 1. Click **+ Create new**. 2. In the **New API token** popup, fill in a **Name** for the token, to help you identify it later. 3. Click **Create**. The newly generated token will be displayed and available for copying, along with its name and expiration date. The token only reveals once in the creation popup. Copy and store it securely before closing the popup. The token can't be retrieved again after closing. ## TradingView Webhooks [#tradingview-webhooks] Use TradingView Webhooks to automatically execute orders on your trading account based on alerts from TradingView. When a TradingView alert triggers, it sends a webhook request to B2TRADER, which places an order according to the parameters specified in the alert message. This feature supports all market types: Spot, CFD, and Perpetual Futures. ### Set up the webhook [#set-up-the-webhook] #### Step 1: Create a webhook API key [#step-1-create-a-webhook-api-key] To create a webhook API key in the Trading terminal: 1. Click the **gear icon** in the topbar to open Settings. 2. Navigate to the **TradingView Webhooks** tab. 3. Click **+ Create new**. 4. In the popup, fill in a **Name** for the key. 5. Click **Create**. The popup displays the generated API key and the webhook URL. Copy both values and store them securely. The API key is shown only once at creation. It can't be retrieved after closing the popup. The following limits apply: * Maximum 10 active keys per user * Each key is valid for 1 year from creation * Keys can be revoked at any time #### Step 2: Configure the alert in TradingView [#step-2-configure-the-alert-in-tradingview] 1. In TradingView, create a new alert or edit an existing one. 2. In the **Notifications** section, enable **Webhook URL**. 3. Paste the webhook URL copied from the terminal. 4. In the **Message** field, enter the alert body in JSON format (see [Alert message format](#alert-message-format)). 5. Save the alert. When the alert triggers, TradingView sends the message to B2TRADER, and the order is placed automatically. ### Alert message format [#alert-message-format] The alert message is a JSON object with the following fields: | Field | Required | Description | | ----------------- | ----------- | -------------------------------------------------------------------------- | | `apiKey` | Yes | Webhook API key generated in the terminal | | `accountId` | Yes | Trading account ID | | `symbol` | Yes | Market symbol with type prefix (see [Symbol format](#symbol-format)) | | `side` | Yes | Order side: `buy` or `sell` | | `quantity` | Yes | Order quantity in base asset | | `orderType` | No | `market` (default), `limit`, `stop`, or `stop_limit` | | `price` | Conditional | Limit price. Required for `limit` and `stop_limit` orders | | `stopPrice` | Conditional | Stop price. Required for `stop` and `stop_limit` orders | | `leverage` | No | Leverage ratio. Applicable to CFD and Perpetual Futures markets only | | `takeProfit` | No | Take profit trigger price | | `stopLoss` | No | Stop loss trigger price | | `timeInForce` | No | `gtc` (default), `ioc`, `fok`, or `day` | | `comment` | No | Custom comment, up to 256 characters | | `deduplicationId` | No | UUID for idempotency. Duplicates within 5 minutes return a cached response | #### Symbol format [#symbol-format] The symbol must include a market type prefix: | Market type | Prefix | Example | | ----------------- | ------- | --------------- | | Spot | `spot.` | `spot.btc_usdt` | | CFD | `cfd.` | `cfd.eur_usd` | | Perpetual Futures | `perp.` | `perp.btc_usdt` | #### Examples [#examples] **Market buy order (Spot):** ```json { "apiKey": "wh_key_your_api_key_here", "accountId": "your_account_id", "symbol": "spot.btc_usdt", "side": "buy", "quantity": "0.01" } ``` **Limit sell order with TP/SL (CFD):** ```json { "apiKey": "wh_key_your_api_key_here", "accountId": "your_account_id", "symbol": "cfd.eur_usd", "side": "sell", "orderType": "limit", "price": "1.0900", "quantity": "1000", "leverage": "10", "takeProfit": "1.0800", "stopLoss": "1.0950", "timeInForce": "gtc" } ``` ### Manage webhook API keys [#manage-webhook-api-keys] To view or manage your webhook API keys, navigate to **Settings** > **TradingView Webhooks**. The following information is provided about each key: | Column | Description | | ----------- | ----------------------------------------------- | | **Name** | The name assigned to the key at creation | | **Status** | Current key status: Active, Revoked, or Expired | | **Created** | The date and time the key was generated | | **Expires** | The date and time the key expires | To revoke a key, click the **Revoke** button next to the key entry. ### Rate limits [#rate-limits] Webhook requests are limited to 5 requests per second per user. If this limit is exceeded, the request returns a `429` error code and the order isn't placed. ### Troubleshooting [#troubleshooting] The following table describes common error scenarios and their solutions: | Issue | Cause | Solution | | -------------------------------- | ------------------------------------------------------------ | --------------------------------------------------- | | `Invalid API key` | The API key is incorrect or wasn't copied in full | Generate a new key and update the TradingView alert | | `API key expired` | The key has passed its 1-year validity period | Generate a new key | | `API key revoked` | The key was manually revoked | Generate a new key | | `Invalid symbol format` | The symbol is missing a market type prefix | Add the prefix: `spot.`, `cfd.`, or `perp.` | | `Price required for limit order` | A `limit` or `stop_limit` order is missing the `price` field | Add the `price` field to the alert message | | `Rate limit exceeded` | More than 5 requests were sent within 1 second | Reduce the alert frequency in TradingView | | `Account not found` | The `accountId` doesn't exist or isn't accessible | Verify the account ID in the terminal | A market can be assigned one of the following statuses: * **Open**: The market is operating properly and accepts orders via Trading terminal and API. Market data for charts is persisted. * **Paused**: The market stops accepting incoming orders via Trading terminal and API (previously placed Limit orders still await execution). Market data for charts is persisted. * **Halted**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is persisted. * **Disabled**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is not persisted. * **Archived**: The market is retired from regular operations. It doesn't accept trading activity, isn't included in market synchronization responses, and its historical chart data is deleted. ## Market and Limit orders [#market-and-limit-orders] Orders can be assigned one of the following statuses: * **Started**: The order has passed preliminary checks. * **Pending**: For Limit orders: the order is waiting for a price trigger. * **Working**: The order is being executed. * **Completed**: The order has been executed in its full amount. * **Cancelled**: The order has been cancelled by a trader. * **Rejected**: The order has been rejected by the system and has never been assigned the *Working* status. * **Expired**: The order has been cancelled due to [Time in force](time-in-force) settings. Some part of it may have already been executed. The status is applicable for GTD and Day orders only. ## Stop orders [#stop-orders] Orders can be assigned one of the following statuses: * **Waiting for activation**: The order awaits the Activation price trigger. * **Activated**: The Activation price has been reached, a new Market or Limit order has been placed. * **Rejected**: The Activation price has been reached, but an issue occurred with placing of a new Market or Limit order. The following order types are supported: * **Market**: An instruction to instantly buy or sell a certain asset amount at a currently best price on the market. Such orders are not listed in the order book. * **Limit**: An instruction to buy or sell a certain asset amount at a specified price. Limit orders are placed in the order book and executed only after the market price reaches the specified limit price (or at a better price). * **Stop Market**: Such an order is not placed unless the current market price meets a specified stop (or trigger) price, after which the order is placed as a regular Market order due to be executed or cancelled, depending on its Time in force. * **Stop Limit**: The order is similar to the Stop Market order in the sense that you need to indicate the stop price at which the order must be placed, after which it becomes a regular Limit order awaiting execution at a specified limit price. For Stop buy orders, the stop price should be above the best ask price; for Stop sell orders, the stop price should be below the best bid price (otherwise, the orders will be activated instantly). Stop Market and Stop Limit orders are accepted while a market is closed according to its trading calendar. The order is stored with the standard **Waiting for activation** status and is evaluated against the first available price when the session opens. Market and Limit orders are still rejected while the market is closed. The market's own status must still be Open — a Paused or Halted market rejects every order type. Refer to [Time in force](time-in-force) to learn about execution parameters that can be specified for different order types. When trading on CFD or Perpetual markets, the following triggers can be enabled to manage investments and mitigate risks: * **Take profit**: A take-profit order is used to sell or buy an asset automatically once it hits a predefined price, ensuring the trader locks in profits. For example, if a trader buys ETH at $2,000 and sets the Take profit at $2,100, the platform will sell the ETH automatically when the market price reaches $2100, securing the trader's profit. * **Stop loss**: A stop-loss order is a tool to limit potential losses. It automatically sells an asset when its price falls to a predetermined level. For example, if a trader buys ETH at $2,000 and sets the Stop loss at $1,900, the asset will be sold if the price drops to $1,900, capping the loss to $100 per ETH. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified percentage. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. For example, a trader buys ETH at $2,000 and sets the Trailing stop at $1900 with a 10% adjustment. If ETH rises to $2,200, the Trailing stop increases to $2,090. A drop to $2,090 triggers the sale, locking in gains. The triggers are applicable to all order types: Market, Limit, Stop Market, and Stop Limit. Multiple triggers can be applied simultaneously. The triggers can be adjusted anytime until a position is fully closed. The Take profit, Stop loss, and Trailing stop always operate with the current position volume. For **buy** orders, the triggers are activated by the top-of-the-book **bid** price. For **sell** orders, the triggers are activated by the top-of-the-book **ask** price. Triggers do not activate if a position is in the *Stop out* state. However, if the position persists after the *Stop out*, triggers can then be activated. The following time-in-force settings can be specified for orders: * **FOK** (fill-or-kill): Such orders are either filled instantly or killed (cancelled). In other words, a fill-or-kill order must be fulfilled instantly or not executed at all. FOK orders are used when partial delivery of assets isn't acceptable for any reason. * **IOC** (immediate-or-cancel): This setting implies that any part of an order that can't be filled instantly must be cancelled. Upon placing an IOC order, an attempt will be made to instantly execute it (in full or in part) at the best possible price, after which any remaining, unfilled part will be cancelled. If no amount is available at a specified price upon placing such order, it's cancelled instantly. * **GTC** (good-‘til-cancelled): The default setting applied to all limit orders. Open GTC orders are awaiting execution until they are cancelled explicitly by a trader or filled. * **GTD** (good-‘til-date): Can be applied to limit and stop limit orders. Such orders remain listed in the order book until a specified date or until they are cancelled by a trader. By that time the order can be partially executed. * **DAY**: Can be applied to limit and stop limit orders. Such orders remain listed in the order book until 23:59 of the current day or until they are cancelled by a trader. By that time the order can be partially executed. * **Retry**: Can be applied to market orders only. A Retry order aims to fill your full volume by repeatedly filling the unfilled remainder at current market prices. The average price may be worse than shown, and in thin markets a remainder may stay unfilled. The order expiration time is defined by the time settings specified for the BP, without taking into account the time settings of the devices from which the BP is accessed. ## iOS v1.35 [#ios-v135] This version includes: * **Account Analytics** A new **Account Analytics** screen displays an equity curve and detailed trading statistics for your account. Select a time period and granularity level to filter performance data, and switch between accounts using the built-in account selector. * **AI Assistant** A new **AI Assistant** widget provides AI-powered market analysis for each instrument, including trade recommendations, market sentiment, signal drivers, suggested actions, and key metrics. * **Quick order from the chart** You can now place orders directly from the **Price chart** by tapping a price pin. The **Quick Order** panel opens pre-filled at the selected price level for faster order placement. * **Customizable workspace** You can now reorder and show or hide bottom tabs in **Settings**, allowing you to tailor the terminal layout to your trading preferences. * **Adaptive interface by market type** Tabs, **Margin Level**, and perpetual funding indicators are now automatically hidden for accounts that do not have access to the corresponding market types, providing a cleaner and more focused interface. * **Landscape mode for the chart** Tapping the **Expand** button on the **Price chart** now automatically rotates the chart to landscape mode for a wider view. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.34 [#ios-v134] This version includes: * **Drag Take Profit and Stop Loss on the chart** **Take Profit** and **Stop Loss** levels can now be adjusted by dragging their lines directly on the **Price chart**. Changes are applied to the order immediately, with automatic rollback if an error occurs. * **Demo accounts** Demo trading accounts are now supported, allowing you to practice trading strategies and explore the platform without risking real funds. * **Favourite markets** You can now mark markets as favourites for quick access. Favourite markets appear as chips in the market list and are indicated with an icon in the terminal. * **Credit in margin details** A dedicated **Credit** row has been added to the margin details section, providing visibility into credit amounts allocated to your trading account. * **Comments for orders, positions, and trades** You can now add a comment when placing an order or managing a position. The comment is visible throughout the trading lifecycle — on open orders, open positions, and in trade history. * **Margin Level display** When **Margin Level** data is unavailable, the field now displays "–" instead of 0% for clearer data visibility. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.33 [#ios-v133] This version includes: * **Navigate to market from alerts** You can now open the market chart directly from the **All Alerts** screen, providing faster access to price data for monitored instruments. * **Quick market navigation from trading widgets** Tapping a market name in **Open orders**, **Stop orders**, **Order history**, **Open positions**, or **Closed positions** now switches to that market directly, enabling faster navigation between instruments. * **Hide zero balances settings relocated** The **Hide zero balances** toggle has been moved to the **Assets** tab for more intuitive access. * **Improved backend error messages** Backend error messages are now mapped to user-friendly descriptions, providing clearer feedback when issues occur. * **Improved RAT rounding** All Rate to RAT and margin-related values now display according to the root asset scale rules, ensuring consistent and accurate financial data across the app. * **Corrected Stop Market order calculations** **Value** and **Amount** calculations for **Stop Market** orders have been updated for improved accuracy. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.32 [#ios-v132] This version includes: * **Quick close button for open positions** The **Open positions** widget now features a quick **Close** button on each position card, allowing you to close individual positions with a single tap without opening position details. * **Quick cancel button for open orders** The **Open orders** widget now features a quick **Cancel** button on each order card, enabling faster order cancellation directly from the list view. * **Click-to-fill price from Order book** Tapping a price level in the **Order book** widget now automatically fills the selected price into the **Place order** form, streamlining the order placement process. * **Hide zero balances** A new **Hide zero balances** toggle has been added to the **Assets** widget, allowing you to filter out assets with zero balance for a cleaner portfolio overview. * **Deposit and transfer options** A new **Deposit** button has been added to the account screen, providing quick access to deposit and transfer options. The available actions depend on your platform configuration. * **Redesigned account selection header** The account selection section in the terminal header has been redesigned for improved navigation and a cleaner appearance. * **Updated closed positions design** The **Closed positions** widget has been updated with a refreshed layout for better readability and consistency with other trading widgets. * **Confirmation bottom sheet** Order and position actions now display a confirmation bottom sheet, helping to prevent accidental trades and providing a clearer review step before execution. * **Settings button relocated** The **Settings** button has been moved from the **Price chart** widget to the terminal header for easier access across all views. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.31 [#ios-v131] This version includes: Experience an advanced trading workflow with the introduction of our new **tiered leverage system**, offering dynamic leverage based on position size and enhanced margin visibility. This update also brings improved commission transparency with a dedicated Fees tab, enhanced market info, a new deposit shortcut, and updated screens for tiered commissions. We've also refined formatters to respect your selected app language for a more consistent experience. *** ## iOS v1.30 [#ios-v130] This version includes: * **Notifications widget** A new **Notifications** widget has been implemented providing quick access to system notifications related to price changes, Margin calls, Stop outs, Take profit and Stop loss triggers. * **Closing open positions from the Price chart** Open positions can now be closed directly on the **Price chart** screen ensuring quick reaction to volatile market conditions and efficient trade management. This feature is available if the **Display positions** setting is activated for the Price chart. * **Closing all open positions** The **Open positions** tab now features the **Close all** button that liquidates all open positions at once. This allows you to react immediately to sharp price moves, limiting losses, and removes the necessity to close positions individually. * **Canceling all active orders** The **Open orders** tab now features the **Cancel all** button allowing to close all *Pending* and *Working* orders at once. This reduces reaction time in volatile markets and removes the necessity to close orders individually. * **Market details in Place order** The market name and last price values have been added to the **Advanced** mode of the **Place order** widget. The price is updated in real time. * **Asset balance in RAT** The **Assets** list now displays **Available** and **Total** balance equivalents in RAT for better portfolio overview and value tracking. * **Simplified Markets list** The market full names have been removed from the **Markets** list for cleaner appearance. * **Trading session status** The **Trading session status** in the **Position details** is now accompanied by an info icon and an explanatory tooltip. * **Automatic horizontal scrolling for tabs** The horizontal auto scroll has been added to tabs. Active tabs are now automatically centered for optimal visibility and better accessibility to all available tabs. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.29 [#ios-v129] This version includes: * **Perpetual Futures (PF) trading now available in the app** PF trading is now supported in the app, introducing a new market type and expanding trading opportunities. To support this, the following features have been added for perpetual markets: * The **Funding**/**Countdown** information, including a countdown timer and current funding rate, helping traders stay informed about upcoming settlements. * A new **Funding** tab that displays the current funding rate, a historical chart, and detailed rate and settlement information. * **Updated account creation process** When creating a trading account in the app, the **account type** can now be selected: **Hedging** or **Netting**, enabling traders to plan and adjust their trading strategies to maximize profit or reduce risk. Depending on the platform settings, the option may be prefilled or require manual selection. The account type can’t be changed after the account is created. * **Support for Take Profit, Stop Loss, and Trailing Stop** The **Take Profit**, **Stop Loss**, and **Trailing Stop** triggers are now supported in the app for CFD and PF trading. They can be applied to Market, Limit, and Stop orders, as well as to currently open positions. * **Support for price alerts** Price alerts are now fully supported in the app: * Multiple alerts can be added to monitor different price levels for any instrument. * Configure alerts based on a fixed price or a percentage change. * View a list of all configured alerts for each instrument. * Adjust or delete existing alerts as needed. * Triggered alerts are automatically removed to keep the list up to date. * **Enhanced Price chart widget** Several visual enhancements have been added to the Price chart widget to provide greater clarity and deeper trading insights: * Active **Limit** and **Stop orders** that aren’t yet in final status are now visually represented using horizontal lines – green for buy orders and red for sell orders. This enables traders to view active orders in real time on the chart, relative to current market price movements. This feature can be turned on or off in the Price chart settings. * **Executed orders** are now visually represented using arrow icons – green for buy orders and red for sell orders. This feature is available for the **Line** and **Candles** chart display options and can also be turned on or off in the Price chart settings. * **Stop Loss** (SL) and **Take Profit** (TP) levels are now visually displayed as color-coded horizontal lines, labeled with their abbreviations. Tap on a line to reveal the exact price on the Y-axis and access the option to delete the level. * **Improved filtering** To help traders quickly find the necessary data, advanced filtering options have been added to the following widgets: **Open positions**, **Closed positions**, **Open orders**, **Stop orders**, and **Order history**. New filters include: * **Market options**, such as All Markets, Current Market, Spot, CFD, and Perpetual. * **Time period** selectors specific to each widget. * **Status** filters for the Order history widget. * **Admin-managed orders and positions** On the **Open positions**, **Closed positions**, and **Order history** widgets, if BP Admins have managed positions or orders, this is now indicated in the **Reason** field within the position or order details. Admins may manage these to assist traders upon request, address suspicious activity, mitigate risks, or resolve outstanding positions before account termination. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.28 [#ios-v128] This version includes: * **Performance upgrade** Streamlined top-of-the-book ask and bid prices in the Place Order widget are now received through a dedicated socket for faster obtaining and display. * **Mobile and Web Consistency** Unified colors and naming for a consistent experience across platforms. * **User experience enhancements** Placeholders are now displayed for empty fields and widgets for improved UX clarity. * **Internal improvements** Enhanced system logs for better diagnostics. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. ## Android v3.0.0 [#android-v300] This version includes: * **Lite Mode** A new **Lite Mode** offers a simpler way to trade: a streamlined home screen with your balance, an asset list with **Favourites**, and one-tap access to **Deposit** and **Convert**. **Convert** swaps one asset for another, showing a live price chart and the conversion rate before you confirm. **Lite Mode** supports **Spot** markets only. * **AI Chat** A new in-app **AI Chat** assistant answers questions about your portfolio and the markets, and can prepare trading actions — including multi-step plans — for your approval. * **AI Summary in Market Info** The **Market Info** screen now includes an **AI Summary** tab with an AI-generated overview of key metrics and signal insights. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.12.0 [#android-v2120] This version includes: * **AI Assistant** A new **AI Assistant** provides AI-powered market analysis for each market, including trade recommendations, a 12-month price forecast, market sentiment, signal drivers, suggested actions, and key metrics. * **Account Analytics** A new **Account Analytics** screen displays an equity curve and detailed trading statistics for your account. * **Account status indicators** Account statuses such as **Halted** and **Frozen** are now shown with badges and a warning banner, and the related trading actions are restricted accordingly. * **Quick order from the chart** You can now place orders directly from the **Price chart**, enabling faster reaction to market movements. * **Take Profit / Stop Loss on the chart** **Take Profit** and **Stop Loss** levels can now be set by dragging their lines directly on the **Price chart**, with support for trailing Stop Loss. * **Cross-price limit order warning** A warning is now displayed before you place a **Limit** order whose price crosses the top of the **Order book**. This warning can be enabled or disabled in **Settings**. * **Customizable trading terminal** You can now customize the trading terminal layout and tab order from the new **Workspace** settings. * **Adaptive interface by market type** Margin- and perpetual-related tabs and indicators are now hidden for accounts with access to **Spot** markets only, providing a cleaner interface tailored to the account type. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.11.0 [#android-v2110] This version includes: * **Comment field in Place Order** An optional **Comment** field has been added to the **Place order** form in **Advanced Mode**. The field supports up to 100 characters and is available for all order types across Spot, CFD, and Perpetual markets. * **Full-screen chart mode** The **Price chart** widget now supports full-screen mode. Tap the **Expand** button to switch to a landscape view for a more detailed chart analysis. * **Credit information in margin details** A **Credit** row has been added to the margin section, providing visibility into credit amounts allocated to trading accounts. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.10.0 [#android-v2100] This version includes: * **Quick close button for open positions** The **Open positions** widget now features a quick **Close** button on each position card, allowing you to close individual positions with a single tap without opening position details. * **Demo accounts** Demo trading accounts are now supported in the app, allowing you to practice trading strategies and explore the platform without risking real funds. * **Favourite markets** You can now mark markets as favourites for quick access. Favourite markets are synchronized between the web and mobile terminals. * **Click-to-fill price from Order book** Tapping a price level in the **Order book** widget now automatically fills the selected price into the **Place order** form, streamlining the order placement process. * **Hide zero balances** A new **Hide zero balances** toggle has been added to the **Assets** widget, allowing you to filter out assets with zero balance for a cleaner portfolio overview. * **Deposit and transfer options** A new **Deposit** button has been added to the account screen, providing quick access to deposit and transfer options. The available actions depend on your platform configuration. * **Navigate to market from alerts** You can now open the market chart directly from the **All Alerts** screen, providing faster access to price data for monitored instruments. * **Quick market navigation from trading widgets** Tapping a market name in **Open orders**, **Stop orders**, **Order history**, **Open positions**, or **Closed positions** now switches to that market directly, enabling faster navigation between instruments. * **Improved RAT rounding** All Rate to RAT and margin-related values now display according to the root asset scale rules, ensuring consistent and accurate financial data across the app. * **Improved market status display** The **Market Closed** label is now automatically removed once live data starts updating, providing a more accurate representation of market availability. * **Corrected Stop Market order calculations** **Value** and **Amount** calculations for **Stop Market** orders have been updated for improved accuracy. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.9.0 [#android-v290] This version includes: This update introduces the new **tiered leverage system**, enhanced fee transparency and fully redesigned Fees tab, quick Deposit/Trade shortcuts on account cards for faster navigation and various UI improvements across the app. *** ## Android v2.8.0 [#android-v280] This version includes: * **Asset balance in RAT** The **Assets** list now displays **Available** and **Total** balance equivalents in RAT for better portfolio overview and value tracking. * **Simplified Markets list** The market full names have been removed from the **Markets** list for cleaner appearance. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.7.0 [#android-v270] This version includes: * **Key position parameters on the TP/SL editing** Key position parameters, such as **Name**, **Side**, **Amount**, **Open price**, **Current price**, and **Leverage** are displayed at the top of the Take Profit/Stop Loss configuration screen to give you immediate, accurate context and reduce input errors. Values are updated in real time. * **Closing positions on the Price chart** You can now close positions directly on the **Price chart** widget, by tapping a position indicator. * **Canceling all active orders** The **Open orders** widget now features the **Cancel all** button allowing to close all *Pending* and *Working* orders at once. This reduces reaction time in volatile markets and removes the necessity to close orders individually. * **Closing all open positions** The **Open positions** widget now features the **Close all** button allowing to liquidate all open positions at once. This allows you to react immediately to sharp price moves, limiting losses, and removes the necessity to close positions individually. * **Closed position details** The **Order type** and **Time in force** values are now displayed for every closed position to improve trade execution transparency. * **Price chart settings saved** The **Price chart** widget now remembers your preferred timeframe and chart type settings. Each time you open the terminal, it displays the chart with your last selected settings. * **Market details in Place order** The market name and last price values have been added to the **Advanced** mode of the **Place order** widget. The price is updated in real time. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.6.0 [#android-v260] This version includes: * **Perpetual Futures (PF) trading now available in the app** PF trading is now supported in the app, introducing a new market type and expanding trading opportunities. To support this, the following features have been added for perpetual markets: * The **Funding/Countdown** information, including a countdown timer and current funding rate, helping traders stay informed about upcoming settlements. * A new **Funding** tab that displays the current funding rate, a historical chart, and detailed rate and settlement information. * **Improved filtering** To help traders quickly find the necessary data, advanced filtering options have been added to the following widgets: **Open positions**, **Closed positions**, **Open orders**, **Stop orders**, and **Order history**. New filters include: * **Market options**, such as All Markets, Current Market, Spot, CFD, and Perpetual. * **Time period** selectors specific to each widget. * **Status** filters for the Order History widget. * **Enhanced Price chart widget** Several visual enhancements have been added to the Price chart widget to provide greater clarity and deeper trading insights: * Active **Limit** and **Stop orders** that aren’t yet in final status are now visually represented using horizontal lines – green for buy orders and red for sell orders. This enables traders to view active orders in real time on the chart, relative to current market price movements. This feature can be turned on or off in the Price chart settings. * **Executed orders** are now visually represented using arrow icons – green for buy orders and red for sell orders. This feature is available for the **Line** and **Candles** chart display options and can also be turned on or off in the Price chart settings. * **Stop Loss** (SL) and **Take Profit** (TP) levels are now visually displayed as color-coded horizontal lines, labeled with their abbreviations. Tap on a line to reveal the exact price on the Y-axis and access the option to delete the level. * Expanded capabilities for account administration and risk management for Brokers have been added. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.5.0 [#android-v250] This version includes: * **Stop Loss and Take Profit on the Price chart widget** * Introduction of Stop-Loss (SL) and Take-Profit (TP) lines on the Price chart for enhanced trading insights. * TP and SL are displayed as color-coded lines with only abbreviations visible. * Tap to view prices on the Y-axis and access deletion options. * **Full support for price alerts in the app** * Alerts can be set for specific price levels. * Alerts can be configured based on either a set price or a percentage change. * A list of configured alerts is available for each instrument. * Options to delete or adjust alerts are provided. * Triggered alerts are automatically removed from the list. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.4.0 [#android-v240] This version includes: * **New mobile features** * Introduction of Take Profit, Stop Loss, and Trailing Stop functionalities in the Mobile app. * Support for Netting accounts in the Mobile app. * **Mobile and Web consistency** Unified colors and naming for a consistent experience across platforms. * **User experience enhancements** For order lists, the All/Spot/CFD filter is only displayed when there are both Spot and CFD orders, for improved UX clarity. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. ## August 26, 2026 [#august-26-2026] ### New features [#new-features] #### Sound notification settings [#sound-notification-settings] You can now independently control two notification sounds in terminal settings: the existing **price alert sound** (on by default) and a new **trade executed sound** (off by default). Your preference persists across sessions and devices. #### Edit pending orders in place [#edit-pending-orders-in-place] Resting **Stop** and **Limit** orders can now be modified directly — adjust price, size, or price triggers without cancelling and recreating the order. #### Account status indicators [#account-status-indicators] Trading accounts can now show one of four statuses — **Active**, **Halted**, **Frozen**, or **Archived**. When trading, deposits, or withdrawals are restricted on an account, you now see a clear status badge and an explanatory message instead of a silent failure. ## July 30, 2026 [#july-30-2026] ### New features [#new-features-1] #### Retry time-in-force for market orders [#retry-time-in-force-for-market-orders] A new **Retry** time-in-force is now available for market orders alongside **IOC**. A Retry order aims to fully execute the requested volume by resubmitting or filling the remainder rather than leaving it open. Closing a **CFD** or **Perpetual Futures** position now uses Retry by default, so a large position closes completely in one action. #### AI Assistant: external market data [#ai-assistant-external-market-data] The **AI Assistant** widget can now surface external market statistics (price, market cap, 24-hour volume, all-time high/low) and recent third-party news for the asset behind a market, alongside its existing platform-data analysis. *** ### Improvements [#improvements] #### Guest mode layout redesign [#guest-mode-layout-redesign] The default **Guest mode** layout has been redesigned with a cleaner 5-widget arrangement (chart, AI Assistant, place order, order book, depth) and refined chart defaults. *** ### Resolved issues [#resolved-issues] * Resolved an issue where **Guest mode**'s default chart showed incorrect data for **Gold (XAU/USD)**; the default chart is now **BTC/USD**. * Resolved an issue that could delay instant withdrawal processing. ## June 10, 2026 [#june-10-2026] ### New features [#new-features-2] #### Guest mode [#guest-mode] A new **Guest mode** lets you explore the Trading terminal without signing in. As a guest you can browse markets and market categories, follow live price streams and interactive charts, and open the **AI Assistant** widget for market analysis. A dedicated guest workspace is provided, and the [Place order](../widgets/place-order) panel opens in the advanced view by default. A **Sign in** action is always available so you can switch to a full trading session at any time. ## June 2, 2026 [#june-2-2026] ### Improvements [#improvements-1] #### Full account history in Trading reports [#full-account-history-in-trading-reports] You can now generate [Trading reports](../get-started/settings) for your entire account history. The previous **92-day** limit has been removed, and a new **All data** range has been added to the report period selector alongside the existing presets. #### Stop orders during closed market sessions [#stop-orders-during-closed-market-sessions] You can now place **Stop** orders while a market is closed according to its trading schedule. The order is accepted and activates automatically once the market reopens, instead of being rejected at placement. #### More accurate unrealized PnL [#more-accurate-unrealized-pnl] Unrealized PnL is now calculated using the correct order book side for each position direction, improving the accuracy of the PnL shown across your widgets. #### Limit price crossing warning [#limit-price-crossing-warning] When you place a limit order at a price that crosses the current top of book, the terminal now shows a warning, helping you avoid an unintended immediate execution. ## April 9, 2026 [#april-9-2026] ### New features [#new-features-3] #### Trading credit [#trading-credit] Your broker can now grant you **trading credit** — a promotional bonus balance you can use for trading. Credit appears as a separate **Credit Balance** alongside your own funds and becomes available for placing trades immediately upon issuance. You are notified when credit is granted or revoked. Trading credit is a trading-only bonus and cannot be withdrawn as cash, so it is excluded from your withdrawable balance. *** ### Improvements [#improvements-2] #### Fee-aware 100% allocation [#fee-aware-100-allocation] The **100%** button in the [Place order](../widgets/place-order) widget now accounts for commissions and margin requirements when allocating funds, so the calculated amount reflects what is actually available for the trade. #### Faster price updates [#faster-price-updates] The price update frequency in terminal widgets has been increased, providing more responsive market data across your workspace. ## March 18, 2026 [#march-18-2026] ### New features [#new-features-4] #### Webhook API for TradingView alerts [#webhook-api-for-tradingview-alerts] A new **Webhook API** has been added, enabling you to connect **TradingView** alerts to your trading workflow. You can generate and copy authentication tokens directly from the Trading terminal to configure webhook-based alerts in **TradingView**. *** ### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. ## March 3, 2026 [#march-3-2026] ### New features [#new-features-5] #### Long-term trading data history [#long-term-trading-data-history] The three-month limit on trading data history has been removed. You can now access the full history of your orders, positions, and trades without time restrictions, enabling deeper analysis of past trading activity. #### AI Assistant widget [#ai-assistant-widget] A new **AI Assistant** widget is now available in the Trading terminal. The widget provides AI-powered market analysis for the selected instrument, including: * A recommendation gauge displaying a score from **Strong Sell** to **Strong Buy** * A 12-month price forecast with target price and percentage change * A market sentiment bar showing the bullish/bearish ratio * Signal drivers section with technical, on-chain, and sentiment factors * Suggested trading actions and key market metrics The widget can be added to any workspace like other terminal widgets. *** ### Improvements [#improvements-3] #### Updated order cancellation confirmation [#updated-order-cancellation-confirmation] The order cancellation confirmation dialog now includes a **Don't ask again** checkbox when canceling triggers from the **TradingView** chart. This allows you to skip the confirmation step for future trigger cancellations, streamlining the trading workflow. *** ### Resolved issues [#resolved-issues-2] There have been no customer-facing issues reported in this release. ## February 25, 2026 [#february-25-2026] ### New features [#new-features-6] #### Redesigned Market Depth widget [#redesigned-market-depth-widget] The [Market Depth](../widgets/market-depth) widget has been completely redesigned with an updated visual layout. Bid and ask labels are now displayed when hovering over a price level, providing better visibility into the order book at a glance. #### Redesigned widget adding experience [#redesigned-widget-adding-experience] The process of adding widgets to workspaces has been redesigned with a more intuitive and streamlined flow. The new interface makes it easier to customize your trading workspace layout by providing a clearer visual selection of available widgets. #### Order and position comments [#order-and-position-comments] A new **Comment** field has been added to orders, positions, and trades throughout the Trading terminal. You can now attach notes directly to your trading activities, making it easier to annotate trading decisions and keep records of your reasoning. #### Favorites [#favorites] You can now mark instruments as favorites for quick access across the Trading terminal. The [Favorite markets](../get-started/customizing-your-terminal#favorite-markets) feature integrates with the instrument selection panel, making it faster to locate and trade your preferred instruments. #### Multi-language support [#multi-language-support] The Trading terminal now supports additional languages: **Chinese (Simplified)**, **Spanish**, **Portuguese**, **French**, **Turkish**, and **Farsi**. Existing translations have also been updated to reflect the latest interface changes. *** ### Improvements [#improvements-4] #### Updated order calculations [#updated-order-calculations] The **Value** and **Amount** calculation logic has been improved for more accurate order handling: * For **Stop Market** orders, the estimated values are now calculated using updated formulas that align with the actual execution logic. * For **Spot** market orders, the **Slippage Rate** is now correctly applied only to buy orders and has been removed from sell order calculations. * The **Slippage Rate** attribute has been removed from **CFD** and **PF** market forms and information displays, as it is not applicable to these market types. #### Improved TP/SL trigger management [#improved-tpsl-trigger-management] Removing Take Profit and Stop Loss triggers is now easier in the TradingView charting widget. Instead of opening a dialog and unchecking the trigger, you can now click the close button directly on the trigger to remove it immediately. #### Updated default columns [#updated-default-columns] The default columns displayed in the [Open positions](../widgets/open-positions) and [Open orders](../widgets/open-orders) widgets have been updated to show the most relevant information by default, reducing the need for manual customization. #### Account margin value formatting [#account-margin-value-formatting] Account margin values such as **Balance**, **Equity**, **Margin**, and **Free margin** in the [Margin](../widgets/margin) widget are now formatted according to the **Root Asset Scale**. This ensures that numerical precision matches the asset's defined scale, eliminating misleading decimal places. #### Updated Settings experience [#updated-settings-experience] The [Settings](../get-started/settings) experience has been improved: * The **Action Confirmation** section text has been rewritten for clarity. The description now reads: "Choose which actions will require additional confirmation," making the toggle behavior immediately clear. * The **One-click trading** configuration has been updated with improved toggle controls and clearer options for enabling or disabling confirmation dialogs on trading actions. #### Improved order validation [#improved-order-validation] Order validation logic has been updated across the Trading terminal, providing clearer feedback on invalid inputs and reducing errors during order placement and management. #### Workspace tab styling [#workspace-tab-styling] Visual improvements have been applied to workspace tabs: gaps have been added between tabs for better visual separation, tab padding has been corrected, and hovered tabs now display a proper card-style fill matching the updated design system. ## December 19, 2025 [#december-19-2025] ### New features [#new-features-7] #### Volume-based tiered commissions [#volume-based-tiered-commissions] You can now benefit from **volume-based commission tiers** that automatically reduce your trading fees as your monthly volume grows. **Key points**: * **Trade more, pay less**: For markets with tiered fees, your 30‑day trading volume (in the root asset, for example USD) is tracked across all markets included in the same group. As you move into higher tiers, your commission percentage decreases. * **Clear fee overview**: Open [Market info](../get-started/customizing-your-terminal#market-info-panel) and switch to the **Fees** tab to see your **Current volume** for the month, the configured **Min. fee**, and the full **Commission tiers** table with volume ranges and fee %. A check mark highlights the tier you are currently in. * **Grouped volume**: Your traded volume is aggregated across markets to which the dynamic commission is applied. * **No surprises**: Orders on markets without tiered fees continue to use the existing flat commission model. Tiered markets simply adjust your fee according to the tier that matches your current trading volume. #### New settings [#new-settings] The [Settings](../get-started/settings) menu has been enriched with the following configuration options: * **Widgets**: This updated section now provides access to multiple widgets’ display settings. Along with existing [Price chart](../widgets/price-chart), you can now configure: * One-click trading for [Open positions](../widgets/open-positions): When enabled, single and bulk position closing are executed immediately, without going through additional confirmation dialogs. * One-click trading for [Open orders](../widgets/open-orders): When enabled, single and bulk order cancellations are executed immediately, without going through additional confirmation dialogs. * **API token management**: This new section allows you to generate and manage tokens for accessing the [Trading API](https://api-docs.b2trader.b2broker.com/). Up to 10 tokens can be generated per account. The validity period for each token is one year. The tokens can be revoked or deleted anytime. *** ### Improvements [#improvements-5] #### Responsive widget layout [#responsive-widget-layout] Widget content now adapts dynamically to the available space, ensuring that key information such as primary values, titles, and critical actions remains visible even when widgets are resized or minimized. Layouts have been refined to avoid unnecessary empty areas while preventing clipping of important elements, delivering a more readable and informative experience across all widget sizes. #### Clearer margin level display [#clearer-margin-level-display] The [Margin](../widgets/margin) widget has been updated to provide a clearer signal. Now, whenever no margin is used (for example, when you have no open positions), the **used margin** value displays **–** instead of 0%. This aligns with common brokerage practices and helps you better understand the current risk state at a glance. #### Smarter default filters for Assets and Account margin [#smarter-default-filters-for-assets-and-account-margin] Certain default filters are now applied automatically when the Trading terminal is opened for the first time. In the [Assets](../widgets/assets) widget, **Hide zero balances** is enabled by default, so assets with zero balance are not shown. In the [Account margin](../get-started/settings#account-margin) settings, **Hide zero balances** and **Hide assets with zero margin ratio** are enabled by default, hiding assets that carry no margin or balance. If you change any of these filters, the platform remembers their states. #### Improved quick trade panels [#improved-quick-trade-panels] The **Market quick trade panel** has been moved not to cover the important controls of the [Price chart](../widgets/price-chart). Additionally, it now displays the **cross icon** to quickly close the panel if needed. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## November 7, 2025 [#november-7-2025] ### New features [#new-features-8] #### Tiered leverage system [#tiered-leverage-system] With this release, we're excited to introduce the **tiered leverage system** that provides more sophisticated leverage options based on your position sizes, offering better risk management. **Key points:** * **Dynamic leverage tiers**: Markets can now offer tiered leverage where your maximum available leverage decreases as your position size increases. This allows you to access higher leverage on smaller positions while maintaining appropriate risk controls on larger trades. * **Enhanced market information**: Markets with tiered leverage now display comprehensive leverage information in the **Market info** panel. A new **Leverage** tab shows all available tiers, including the notional value ranges and maximum leverage for each tier. * **Improved position tracking**: Your open positions now display both the leverage you selected when opening the position (**Requested leverage**) and the actual leverage being applied (**Leverage**). Detailed tooltips explain how these values are calculated, giving you better visibility into your margin usage. * **Smart leverage selection**: When placing orders on markets with tiered leverage, the system automatically calculates your margin requirements across all applicable tiers. You can see the exact margin required before placing your order. **How it works** For markets with dynamic leverage, your position is allocated across different tiers based on its notional value. Each tier has its own maximum leverage limit, typically starting with higher leverage for smaller positions and decreasing as position size grows. This allows you to maintain appropriate risk management. **Order placement** When trading on tiered markets, you can still select your preferred leverage (up to the maximum allowed for the first tier), and the system will automatically apply the appropriate leverage limits. The margin calculator shows you the exact requirements before you place your order. All existing positions continue to operate normally with no changes to your current trading experience. Markets without tiered leverage continue to work exactly as before. *** ### Improvements [#improvements-6] #### Improved documentation experience [#improved-documentation-experience] The documentation window is now fully resizable, allowing traders to adjust both vertical and horizontal dimensions independently. All screenshots can now be zoomed, making detailed interface elements clearly visible. #### Streamlined market selection [#streamlined-market-selection] The market selection control is now displayed as the **chevron icon** directly next to the market name in widgets. The magnifying glass icon has been removed. Both the market name and chevron are now clickable and open the market selector. #### Reorganized market information access [#reorganized-market-information-access] The market info popover has been relocated under the **info icon** in the widget header to maintain accessibility while keeping the market name area focused solely on selection functionality, creating a cleaner and more consistent user interface. #### Enhanced workspace tab design [#enhanced-workspace-tab-design] A clear distinction between active and inactive workspace tabs has been achieved due to intuitive styling. Workspace option buttons are now hidden by default to reduce visual clutter and only appear when tabs are active or being hovered over. This applies to both default and custom workspace tabs, creating a cleaner interface while maintaining full functionality when needed. *** ### Resolved issues [#resolved-issues-4] There have been no customer-facing issues reported in this release. ## October 9, 2025 [#october-9-2025] ### New features [#new-features-9] #### Placing orders from the Price chart [#placing-orders-from-the-price-chart] The [Price chart](../widgets/price-chart) widget now supports direct order placement with two new quick trading panels. The **Market quick trade panel** provides a persistent interface for instant buy/sell orders, while the **Limit quick trade panel** allows hover-based order placement at specific price levels. When enabled through **Price chart settings**, both panels offer configurable amount presets and leverage ratio selection for margin trading (when applicable), creating a seamless trading experience without leaving the chart view. #### Bulk order canceling [#bulk-order-canceling] The [Open orders](../widgets/open-orders) widget introduces a **Cancel all** button that closes all active orders simultaneously. This feature provides better risk management capabilities during volatile market conditions. #### In-platform documentation [#in-platform-documentation] User documentation is now integrated directly within the Trading terminal interface. This eliminates the need to switch between applications when accessing help materials or reference guides, keeping essential information readily available during trading sessions. #### New market subtype [#new-market-subtype] The new **Commodities** subtype has been added for CFD markets, enhancing the market categorization system. *** ### Improvements [#improvements-7] #### Enhanced position tracking [#enhanced-position-tracking] A new **Direction** column has been added to **Trades** info in the [Open positions](../widgets/open-positions) and [Closed positions](../widgets/closed-positions) widgets. It indicates whether a position size increased (In) or decreased (Out) as a result of each trade. This enhancement provides clearer visibility into position movement patterns. #### Cross rates calculation precision [#cross-rates-calculation-precision] Accuracy for cross-rate calculations has been improved by introducing a new cross-rate scale parameter. It has a default value of 8 and can be adjusted in configuration files. This addresses the previous limitation where cross rates were rounded to the root asset type scale (typically 2 decimal places), causing incorrect zero values in certain scenarios. The improvement ensures accurate cross-rate calculations across all currency and cryptocurrency pairs, regardless of their relative values. #### Redesigned Settings interface [#redesigned-settings-interface] The **Settings** menu has been restructured with a new tabbed popup interface. Related configuration options are now logically grouped, making settings easier to navigate and manage. #### Pre-filled Limit order price [#pre-filled-limit-order-price] Limit order placement now includes automatic price pre-population using the best bid or ask price from the order book. This static pre-fill reduces manual entry requirements and helps prevent pricing errors during order submission. #### Updated sorting of open positions [#updated-sorting-of-open-positions] [Open positions](../widgets/open-positions) are now sorted chronologically with the newest positions displayed at the top, improving visibility of recent trading activity. #### Improved messages [#improved-messages] User communications have been updated throughout the platform, including improved Introduction tour messaging for better onboarding and clearer system notifications. #### UI enhancements [#ui-enhancements] UI improvements for this release include: * **Support for dynamic resizing of the trading interface layout**: The trading interface now features a responsive layout system that dynamically adjusts to browser window resizing. Widgets automatically scale and reposition to maintain optimal viewing regardless of screen size changes. * **Loader**: [Order history](../widgets/order-history) and [Closed positions](../widgets/closed-positions) widgets now display loading indicators when fetching additional data. * **Improved PnL representation**: When displayed on charts, the PnL values are now accompanied by "+" or "–" signs for immediate profit/loss recognition. * **Improved scrollbars**: Scrollbar positioning has been refined to prevent overlay of table content, ensuring all data remains visible and accessible. *** ### Resolved issues [#resolved-issues-5] There have been no customer-facing issues reported in this release. ## July 2, 2025 [#july-2-2025] ### New features [#new-features-10] #### Trading reports [#trading-reports] We've implemented a new feature enabling you to generate trading reports for a specific period of time and download them as zipped CSV files to your computer. The report includes a detailed information on: * **Trade history** * Closed positions * Executed orders * Trades * **Transfers history** * **Account statistics** * Total balance * Realized PnL * Swaps * Funding * Commissions The data is available for any period within the last **92 days** (UTC time). The following timeframe presets have been implemented for your convenience: * Today * Current: week, month, quarter * Previous: week, month, quarter Access the new **Trading report** menu under the **Settings** icon on the topbar of the Trading terminal. *** ### Improvements [#improvements-8] #### Admin-managed orders and positions [#admin-managed-orders-and-positions] In the [Open positions](../widgets/open-positions), [Closed positions](../widgets/closed-positions), and [Order history](../widgets/order-history) widgets, if BP Admins have managed positions or orders, this is now indicated in the Reason field within the position or order details. Admins may manage these to assist traders upon request, address suspicious activity, and mitigate risks. *** ### Resolved issues [#resolved-issues-6] There have been no customer-facing issues reported in this release. ## May 30, 2025 [#may-30-2025] ### New features [#new-features-11] #### PF trading [#pf-trading] We are excited to introduce **Perpetual Futures (PF) trading** on our platform. These contracts feature a funding fee mechanism based on the Mark price and Funding rate. A positive rate means Long positions pay Shorts, and a negative rate means the reverse. You can see the countdown to the next funding fee settlement in the [Market summary](../widgets/market-summary) widget. This update also includes a new market type — Perpetual — enhancing your trading opportunities. *** ### Improvements [#improvements-9] #### Price chart setting [#price-chart-setting] The [Price chart](../widgets/price-chart) widget now supports displaying of open positions, as well as open and executed orders. Click the **gear icon** in the topbar to access Price chart settings and enable desired options. #### Close all positions [#close-all-positions] The [Open positions](../widgets/open-positions) widget now features a new **Close all** option, offering enhanced management capabilities. This update provides a more efficient way to handle multiple positions by allowing you to simultaneously close: * All open positions * All open positions with positive PnL * All open positions with negative PnL #### Enhanced price control [#enhanced-price-control] The following enhancements have been implemented for the [Price control](../widgets/price-control) widget: * **Editable price alerts**: You can now adjust existing price alerts by clicking a price. * **Enhanced market additions**: Price and percentage fields now automatically open for editing when a new market is added to the widget. * **Visual indicators**: Arrows near price triggers aren’t shown if the price feed is unavailable, reducing clutter and potential confusion. #### Historical data limits [#historical-data-limits] The [Order history](../widgets/order-history) and [Closed positions](../widgets/closed-positions) widgets now provide historical data with a limit of **92 days**. *** ### Resolved issues [#resolved-issues-7] There have been no customer-facing issues reported in this release. ## April 17, 2025 [#april-17-2025] ### New features [#new-features-12] #### Netting account type [#netting-account-type] With this release, a new **Netting** account type has been enabled. It intelligently consolidates all orders placed on the same market into a single position. Previously, the system supported only Hedging, where each order opens a separate position. **Key points of netting** * **Reduced margin requirements**: Instead of calculating margin requirements separately for each position, netting combines them, lowering overall capital needs. * **Lower trading costs**: By holding opposing positions, traders often incur double position swaps. Netting treats these positions as one, reducing unnecessary costs. * **Streamlined position management**: Managing multiple positions manually can become complicated, especially when balancing between different trade sizes, directions, leverages and margin requirements. Netting helps with it by combining positions into a single one. **Netting VS Hedging** Netting may sometimes lack the flexibility required for complex hedging strategies. In contrast, hedging excels by allowing traders to hold both long and short positions simultaneously without offsetting them. This enhances the ability to track and adjust individual trades easily while permitting precise margin management for separate positions. The Hedging type is perfectly suited for traders seeking detailed control over their positions. On the other hand, the Netting type ensures simplicity and reduced margin requirements, making it the perfect choice for straightforward trading strategies. **Workflow changes** When opening a new trading account, you must now choose its type: either Hedging or Netting. This choice is permanent and influences all future trades in the account. In the account selection interface, each account displays its type: `H` for Hedging or `N` for Netting. All existing accounts are automatically assigned to the Hedging type. *** ### Improvements [#improvements-10] #### Improved widget control [#improved-widget-control] With this release, you now have enhanced control over the viewing experience: * **Configuring widget columns**: Certain widgets allow you to configure widget columns in a way that best suits your needs, offering you the flexibility to select which columns you wish to display or hide. Additionally, you can arrange the order of these columns for your convenience, ensuring that the information you prioritize is always at your fingertips. * **Rearranging widget tabs**: All widgets now feature drag-and-drop functionality for rearranging tabs effortlessly. This user-friendly feature offers a more customized and organized interface, making it easier than ever to personalize your widget experience. #### Enhanced Order book [#enhanced-order-book] The Order book widget has been upgraded with new customizable settings. This update introduces intuitive controls, empowering you to adjust the widget view according to your preference: * **Full view**: Shows both buy and sell orders along with the market spread. * **Buy only view**: Displays only buy orders and the market spread. * **Sell only view**: Displays only sell orders and the market spread. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. ## January 15, 2025 [#january-15-2025] ### New features [#new-features-13] #### Take profit, Stop loss, Trailing stop [#take-profit-stop-loss-trailing-stop] With this release, the following new triggers for open positions have been implemented on the platform: * **Take profit**: A take-profit trigger is used to close a position automatically once the market hits a predefined price, ensuring the trader locks in profits. * **Stop loss**: A stop-loss order is a trigger to limit potential losses. It automatically closes a position when its price changes to a predetermined level. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified value. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. These settings can be used when trading on CFD markets and can be applied to Market, Limit, and Stop orders, as well as for currently open positions. The new settings can be enabled when placing an order via the [Place order](../widgets/place-order) widget (Advanced mode). Until a position is fully closed, they can also be adjusted or canceled via the [Open positions](../widgets/open-positions) widget. The information about applied settings is also available in the corresponding widgets: [Closed positions](../widgets/closed-positions), [Open orders](../widgets/open-orders), and [Order history](../widgets/order-history). *** ### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December, 2024 [#december-2024] #### New features [#new-features-14] ##### CFD trading [#cfd-trading] With this release, we're excited to announce the support for CFD (Contract for Difference) trading on our brokerage platform. This empowers you to trade with dynamic leverage, using your funds as collateral to secure positions confidently. Enjoy the flexibility to go both long and short, capitalizing on both bullish and bearish markets. Our CFD trading support boasts an intuitive interface, robust risk management tools, and real-time data. ##### Innovative market approach and instrument picker [#innovative-market-approach-and-instrument-picker] * **Market type**: Markets are now classified into Spot and CFD, reflecting their differing parameters. A panel indicating CFD or Spot is now included in all widgets. * **Market parameters and trading schedule**: Click a market name to access its key parameters and scheduled trading sessions. * **Market categories**: Now accessible via the top bar, offering a hierarchical view for easier selection and switching between markets. ##### Account margin settings [#account-margin-settings] Access the new [Account margin settings](../get-started/settings) to monitor your balances and configure assets to be used as collateral for CFD trading. ##### Reworked Place order widget [#reworked-place-order-widget] Place any order with a [single widget](../widgets/place-order) now. Choose Quick IOC Market or Stop with adjusted leverage — all conveniently in one place, along with an order summary. ##### Positions [#positions] Discover two new widgets for position monitoring: * [Open positions](../widgets/open-positions): Offers real-time monitoring of currently open positions with price changes, PnL, used margin, and other parameters. * [Closed positions](../widgets/closed-positions): Provides historical data on position details, prices, and realized PnL. ##### Risk management [#risk-management] You now have three essential widgets to maintain control: * [Margin](../widgets/margin): Monitor your margin account parameters in real time and respond swiftly to changes. * [Price control](../widgets/price-control): Set price alerts tailored to your specific needs and parameters. * [Messages](../widgets/messages): Receive system notifications and price alerts directly. ##### Market data [#market-data] Two new widgets have been introduced to enhance market monitoring: * [Market summary](../widgets/market-summary): Provides detailed information and updates on price changes for a specific market. * [All markets](../widgets/all-markets): Displays price change statistics across all markets simultaneously. #### Improvements [#improvements-11] * Performance has increased significantly, allowing each trader to hold up to 1,000 CFD positions open. * Limits have been increased to 3,000 requests per second. #### Resolved issues [#resolved-issues-10] There have been no customer-facing issues reported in this release. *** ### June 20, 2024 [#june-20-2024] #### Improvements [#improvements-12] * Account selection is now available from the topbar of the Trading terminal. Once you change your account, all the widgets will automatically adjust to show relevant information for the selected account. * Tabs are now available in the Trading terminal. You can place up to 10 tabs to open multiple workspaces simultaneously for better information organization. You can utilize pre-configured layouts for your workspaces or create custom ones. *** ### June 13, 2024 [#june-13-2024] #### New features [#new-features-15] ##### iOS mobile application [#ios-mobile-application] With this release, our team is thrilled to announce the launch of the brand-new iOS mobile app. The mobile app is closely integrated with B2CORE mobile. Along with single sign-on implemented, it allows you to seamlessly navigate between the apps, without re-entering credentials. In the mobile app, just like in the web version of the Trading terminal, you can access all of your BP accounts, place orders, monitor market data, and so on. For your convenience, it all can be done in a very similar way as in the web version. A consistent and user-friendly interface makes using the app easy and intuitive. Among the key features and services that the new BP mobile offers: * The account list with detailed balances, to always keep your funds under control. Creation and renaming of accounts, to keep your funds well organized. * Asset balances screen, with the amounts of free and frozen funds specified and with the possibility to hide assets with zero balances. * The Order book and price chart, to monitor and analyze trading data and make buy or sell decisions, with a quick and easy jump to the order placing screen. * Candles and line charts, with easy switching and the possibility to scroll the data for historical values. * Limit & Market order placing, with all time in force options supported in the Web version (Market: IOC, FOK; Limit: IOC, FOK, GTC, GTD, Day). * Open and history orders lists, with easy access to order parameters and details, quick canceling or repeating an order. * Light and dark themes and many more. ### October 18, 2023 [#october-18-2023] #### New features [#new-features-16] With this initial release, our team is happy to announce the launch of our new Trading terminal. ##### Placing orders [#placing-orders] The platform currently supports placing Market, Limit, Stop Market, and Stop Limit orders (refer to [Order types](../knowledge-base/order-types)). You can also choose from various [Time in force](../knowledge-base/time-in-force) options such as FOK, IOC, GTC, GTD, and DAY. ##### Widgets [#widgets] The platform provides you with enhanced widgets that are specifically designed for convenient trading. These widgets allow you to easily place orders, access the Order book, monitor open orders and order history, and much more. Refer to [Place order](../widgets/place-order) and the other pages of the Widgets section for more information. ##### Dashboard [#dashboard] The customizable dashboard allows you to personalize the layout to suit your needs and keep you focused on what's important. Refer to [Interface overview](../get-started/customizing-your-terminal) to learn more about workspace customization. ## Summary [#summary] This widget provides AI-powered market analysis and trading recommendations for the selected market. AI Assistant The widget is organized into the following sections: * [AI Recommendation](#ai-recommendation): Overall recommendation score. * [Forecast](#forecast): Price target and market sentiment. * [Signal Drivers](#signal-drivers): Technical, on-chain, and sentiment signals. * [Suggested Actions](#suggested-actions): AI-generated trading suggestions. * [Key Metrics](#key-metrics): Market data overview. ## AI Recommendation [#ai-recommendation] Displays a numeric score from 0 to 100 representing the overall AI assessment of the market, along with a label such as **Strong Buy**, **Buy**, **Neutral**, **Sell**, or **Strong Sell**. A higher score indicates a more favorable outlook. ## Forecast [#forecast] **1Y Price Target** The forecasted price in one year and the expected percentage change from the current price. *** **Market Sentiment** A visual bar showing the ratio between bullish and bearish sentiment among market participants. ## Signal Drivers [#signal-drivers] Signals that influence the AI recommendation, categorized into three types: * **Technical**: Signals based on technical analysis indicators such as RSI and Moving Averages. * **On-Chain**: Signals based on blockchain data such as ETF inflows, active addresses, and total value locked (TVL). * **Sentiment**: Signals based on community and analyst opinions. Each signal includes a description and an impact assessment: **Bullish**, **Bearish**, or **Neutral**. ## Suggested Actions [#suggested-actions] A list of AI-generated trading suggestions based on the current market conditions. These are informational recommendations, not automated trading signals. ## Key Metrics [#key-metrics] The following market data is displayed: **All-Time High** The highest price ever recorded for the asset (in USD) and the percentage difference from the current price. *** **All-Time Low** The lowest price ever recorded for the asset (in USD) and the percentage difference from the current price. *** **24h Volume** The total trading volume over the last 24 hours in USD. *** **Market Cap** The total market capitalization of the asset in USD. ## In Guest mode [#in-guest-mode] The widget works in Guest mode too, with the same sections, so you can read the analysis for any instrument your broker offers before you have an account. AI-generated insights are for informational purposes only. The AI Assistant widget can be enabled or disabled by the platform administrator. If the widget isn't available in the **Add Widget** menu, contact your broker. ## Summary [#summary] Use this widget to monitor price data on all markets available on the platform. The widget is dynamic and is continuously updated in real time. All markets ## Fields [#fields] The following information is provided about each market: **Market** The market type (Spot, CFD, or Perpetual), market ticker and full name of the market. *** **Current price** The current market price, in the quote asset and in the platform root asset. This value is green if the price is rising and red if it's falling. *** **24h change** The price change over the last 24 hours, in absolute and percentage values. This value is calculated as *Current price* – *Price 24h ago*. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. ## Summary [#summary] This widget displays the list of all asset balances on your account. Assets ## Settings [#settings] ### Hide zero balances [#hide-zero-balances] Use this option to hide all assets with zero balances from the list. It's enabled by default. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each asset: **Asset** The alphabetical code of the asset. The first asset in the list is the **root asset** of the platform. *** **Caption** The asset name. *** **Available** The balance at your disposal, meaning the difference between your total assets and a sum of all limit orders placed by this time. This value is calculated as *Total – Halted*, where *Halted* is the asset amount frozen on the account for execution of placed Limit orders. *** **Available, \{RAT}** The available balance, in conversion to the platform root asset. *** **Total** The overall amount of the asset available in your wallet, including locked funds. *** **Total, \{RAT}** The total balance, in conversion to the platform root asset. ## Summary [#summary] This widget displays a list of your closed positions on the selected account. The entire history of your closed positions is available. Closed positions The widget lists only closed positions. For a list of currently open positions, use the [Open positions](open-positions) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists closed positions for the last three months. To display positions closed during a specific time period, use the **Select date range** field. The most recently closed positions appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ### View related orders [#view-related-orders] Click the **chevron icon** in a position row to expand a list of position-closing orders. As positions can be partially closed, there may be more than one line. For each executed position-closing order, a separate line is added. ## Fields [#fields] The following information is provided about each position: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Position ID** The position identifier. *** **Side** The position side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Pos. closed size** The closed volume, in lots, which is equivalent to the corresponding filled order volume. *** **Open price** The volume-weighted average price (VWAP) at which the position was opened. *** **Close price** The volume-weighted average price (VWAP) of trades related to a position-closing order. *** **Close order ID** The identifier of an order closing the position. *** **Realized PnL, \{RAT}** The actual profit or loss earned, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Close price* – *Open price*). For **Short** positions, this value is calculated as *Position size* × (*Open price* – *Close price*). *** **\{RAT} notional** The equivalent of the closed volume in the platform root asset. *** **History rate to \{RAT}** The rate to the platform root asset at the moment of position closing. *** **Reason** The reason for closing a position. Possible values: * **Trader**: The position was closed by you. * **Admin**: The position was closed by an Admin. * **Stop-out**: The position was automatically closed by the system, as a result of Stop out. * **Stop loss**: The position was closed by the [Stop loss](../knowledge-base/price-triggers) trigger. * **Take profit**: The position was closed by the [Take profit](../knowledge-base/price-triggers) trigger. * **Webhook alert**: The position was closed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). *** **Comment** The text note inherited from the opening order. Up to 100 characters. The comment can't be edited after the order is placed. *** **Open date, time** The date and time when a position was opened. *** **Closed date, time** The date and time when a position-closing order was last updated (fully executed). ## Summary [#summary] This widget helps you monitor margin parameters and statistics. Margin ## Fields [#fields] All values are in displayed in conversion to the platform root asset: **Your margin level** The ratio of your funds to a used collateral, in percents. This value is calculated as *Equity* / *Used margin* × 100%. Possible values: * **Empty**: No open positions. * **Low risk**: Everything is ok. * **Margin call**: Your margin level fell below the set Margin call value. You received a notification urging you to increase the margin level to avoid a Stop out. Remember that if you ignore this warning, the margin level may continue to decrease. During the Margin call, you can only close existing positions; opening new positions isn’t possible. * **Stop out level**: Your margin level fell below the set Stop out value; the platform started a process of liquidating your positions. This process continues until the margin level exceeds this required value. **ANY** currently open position can be closed regardless of its side and volume. *** **Margin balance** The total amount of your funds that can be used as a collateral for CFD trading. It’s calculated as Σ(*TotalAmountX* × *MarginRatioX* × *Rate X/RAT*), where: * *TotalAmountX* is the the total amount of the asset X, including both available and locked funds. * *MarginRatioX* is the Margin ratio set for the asset X. * *Rate X/RAT* is the constantly updated rate of the asset X to the platform root asset. The Margin balance is continually recalculated based on price fluctuations. An increase in the prices of assets boosts available Balance & Free margin. Conversely, a decrease in asset prices may reduce the available Balance and Free margin. Additionally, a decline in the prices of assets with open positions may trigger Margin calls and Stop outs. *** **Credit** A promotional bonus granted by your broker for margin (CFD and Perpetual) trading, shown in the platform root asset (RAT). When you have no credit, this row shows 0. Credit increases your Equity and Free margin and can be used as collateral to open positions. It becomes available immediately when granted and never expires. However, credit cannot be withdrawn as cash, so it is excluded from your withdrawable balance. Your broker can revoke credit at any time, and the row updates in real time when this happens. The row includes an info tooltip that reads: *Promotional credit for margin trading only. Cannot be withdrawn.* *** **Equity** The potential balance of your account if all your positions were closed right now. This value is calculated as *Margin balance* + *Credit* + *Unrealized PnL*. *** **Used margin** The amount of funds that is used for maintaining all your open positions. Is opposed to the *Free margin*. The Used margin for positions on a specific market is calculated using the maximum value between the total margin of long positions and the total margin of short positions: MAX(*MarketPositionLong*, *MarketPositionShort*). **Example** **Step 1: Initial balance** * Margin balance: $10,000 * Opened positions: 0 * Free margin: $10,000 * Used margin: $0 **Step 2: Open a long position (Leverage 1:100)** * Market: CFD EUR/USD * Position size: 1 lot (100,000 units) * Current price: $1.001 * Required margin: $(100,000 × 1.001) / 100 = $1,001 * After opening: * Free margin: $8,999 * Used margin: $1,001 **Step 3: Open a long position (Leverage 1:20)** * Market: CFD EUR/USD * Position size: 1 lot (100,000 units) * Current price: $1.001 * Required margin: $(100,000 × 1.001) / 20 = $5,005 * After opening: * Free margin: $3,994 * Used margin: $6,006 **Step 4: Open a short position (Leverage 1:100)** * Market: CFD EUR/USD * Position size: 9 lots (900,000 units) * Current price: $1 * Required margin: $(900,000 × 1.001) / 100 = $9,009. The system verifies that upon opening this position, the MarketUsedMargin remains valid by satisfying the condition: **MarketUsedMargin** = MAX(*MarketPositionLong*, *MarketPositionShort*) = MAX(6,006, 9,009) = 9,009. Since the condition is met, the position opens. * After opening: * Free margin: $991 * Used margin: $9,009 As a result, you can open multiple opposite positions without significantly increasing the Used margin. Furthermore, closing positions never increases the Used margin. *** **Free margin** The amount of funds that can be used for opening new positions. *** **Unrealized PnL** The total potential profit or loss earned from all open positions. This value is calculated as *Σ(Unrealized PnL for Long positions + Unrealized PnL for Short positions)*, where: * *Unrealized PnL for Long positions* = *Position size* × (*Current price* – *Open price*) * *Unrealized PnL for Short positions* = *Position size* × (*Open price* – *Current price*) ## Summary [#summary] Use this widget to assess the current market depth indicating the actual liquidity of an asset, which is evaluated based on the number of currently open orders to buy and sell it as well asset prices and volumes at various price levels. Market depth The widget is dynamic and is continuously updated in real time. The widget displays a chart indicating the overall volume of buy (green) and sell (red) orders at various price levels awaiting execution at the moment. You can hover the mouse pointer over the chart to learn the exact price and volume of an asset traded at a specific price level. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ## Summary [#summary] Use this widget to monitor statistics on a specific instrument. The widget is dynamic and is continuously updated in real time. Market summary To monitor multiple instruments at a time, use the [Watch list](watch-list) widget. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the first column. To change the market, click the market symbol and select a different one from the list. ## Fields [#fields] The following information is provided about each instrument: **Market** The market type (Spot, CFD, or Perpetual), market ticker and full name of the market. *** **Current price** The current top-of-the-book price, in the quote asset. *** **Current price, \{RAT}** The current top-of-the-book price, in conversion to the platform root asset. *** **24h change** The price change over the last 24 hours. This value is calculated as *Current price* – *Price 24h ago*. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h change, %** The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h high** The highest trade price over the last 24 hours. This value is always green. *** **24h low** The lowest trade price over the last 24 hours. This value is always red. *** **Info icon** Click this icon to view market details and trading sessions schedule. ## Summary [#summary] This widget displays a list of received notifications, both system and configured via the [Price control](price-control) widget. Messages ## Settings [#settings] ### Mark as read [#mark-as-read] Unread alerts are marked with a red dot in the list: * Click the dot to mark the notification as read. * Click **Mark all as read** to mark all new notifications as read at once. * Click the **three dots** icon in the upper right corner of the widget to access the **Hide read notifications option**. The counter of unread alerts is also displayed on the **bell icon** in the topbar. ## Summary [#summary] This widget displays a list of Limit orders that have been placed from this specific account and are currently open and assigned one of the following [statuses](../knowledge-base/order-statuses): *Started*, *Pending*, or *Working*. Open orders The widget lists only open orders, that are currently not filled or partially filled. For a list of orders in the final statuses, use the [Order history](order-history) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the orders for all the time. To display orders for a specific time period, use the **Select date range** field. The most recent order appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Filled** The order amount that has been filled so far. *** **Fee** The total commission paid for executing an order and the currency in which the commission was paid. *** **Remaining** The order amount that hasn’t yet been filled. *** **Limit price** For Limit orders, the Limit price set when placing the order. *** **Avg execution price** The order execution price, as an average price of all trades executed while filling the order. *** **Take profit** The [Take profit](../knowledge-base/price-triggers) value, if set. *** **Stop loss** The [Stop loss](../knowledge-base/price-triggers) value, if set. *** **Used leverage** For margin trading, the leverage ratio used when placing an order. *** **Status** The current order [status](../knowledge-base/order-statuses): *Started*, *Pending*, or *Working*. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Valid until** The date and time when an order expires. *** **Order ID** The system identifier of an order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Reason** The reason for placing the order: * **Trader**: The order was placed by you. * **Admin**: The order was placed by an Admin. * **Stop-out**: The order was placed by the system, to close positions as a result of Stop out. * **Webhook alert**: The order was placed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). ## Cancel orders [#cancel-orders] To cancel an order, click the **×** in the corresponding row. To cancel all active orders at once, click the **Cancel all** button in the widget header. ## Summary [#summary] This widget displays a list of your positions currently open on the selected account. Open positions The widget lists only open positions. For a list of closed positions, use the [Closed positions](closed-positions) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists open positions for all the time. To display positions opened during a specific time period, use the **Select date range** field. The most recent position appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ### View related trades [#view-related-trades] Click the **chevron icon** in a position row to expand a list of related trades. ### Close positions [#close-positions] To close a position, hover over it and click the **CLOSE** button that appears. To close all/multiple positions at once, click **Close all** and select the desired option: close all positions or close positions with positive/negative PnL. ## Fields [#fields] The following information is provided about each position: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Position ID** The position identifier. *** **Side** The position side: Buy or Sell. *** **Position size** The current position volume, in lots. *** **Open price** The volume-weighted average price (VWAP) at which the position was opened. *** **Current price** The current market price of the base asset: bid for Long positions and ask for Short positions. *** **Stop loss** The [Stop loss](../knowledge-base/price-triggers) value, if set when placing the order. If the value wasn't set, you can use the **Add** button to configure it. *** **Take profit** The [Take profit](../knowledge-base/price-triggers) value, if set when placing the order. If the value wasn't set, you can use the **Add** button to configure it. *** **Unrealized PnL, DAY, \{RAT}** The potential profit or loss earned for a current day, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *First bid price for today*). For **Short** positions, this value is calculated as *Position size* × (*First ask price for today* – *Current ask price*). If a position was opened today, then the *Open VWAP* is used instead of the *First price for today*. *** **Unrealized PnL, DAY, %** The potential profit or loss earned for a current day, in percents. *** **Unrealized PnL, Total, \{RAT}** The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *Open VWAP*). For **Short** positions, this value is calculated as *Position size* × (*Open VWAP* – *Current ask price*). *** **Unrealized PnL, Total, %** The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to the platform root asset, in percents. *** **Used margin, \{RAT}** The amount of your funds used for maintaining a position, in conversion to the platform root asset. *** **Leverage** The actual leverage ratio used for opening a position. *** **Req. leverage** The leverage ratio you requested when opening a position. *** **\{RAT} notional** The current position size equivalent in the platform root asset. *** **Rate to \{RAT}** The current exchange rate of a quote asset to the platform root asset. *** **Open date, time** The date and time when a position was opened. *** **Updated date, time** The date and time of the latest position-related trade. *** **Reason** The reason for opening a position: * **Trader**: The position was opened by you. * **Admin**: The position was opened by an Admin. * **Webhook alert**: The position was opened via a [TradingView webhook](../get-started/settings#tradingview-webhooks). *** **Comment** The text note inherited from the opening order. Up to 100 characters. The comment can't be edited after the order is placed. ## Summary [#summary] This widget displays a list of currently open buy and sell limit orders for a selected asset along with the current bid-ask spread. Order book The widget is dynamic and is continuously updated in real time. It provides three different sections displaying the following information: * Open sell orders are highlighted in red and listed in the top section. The best ask, which is the sell order with the lowest price, is displayed at the bottom of this list. * Open buy orders are highlighted in green and listed in the bottom section. The best bid, which is the buy order with the highest price, is displayed at the top of this list. * The middle section displays the current bid-ask spread indicating the gap between the best ask and bid prices declared for an asset. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Display only asks/bids [#display-only-asksbids] In the upper part of the widget, you can choose how to display the Order book: * Full view. * Buy orders only + spread. * Sell orders only + spread. ## Fields [#fields] Each row of the Order book provides the following information about a selected market: **Price, \{QUOTE}** The price, in the quote asset. *** **Amount, \{BASE}** The total amount of the base asset available at a corresponding price level. *** **Total** The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. In addition, you can use the [Market depth](market-depth) widget to evaluate the liquidity of a specific asset based on the overall volume of orders traded at various price levels. For Spot markets, hover over Order book rows to view additional information and buy or sell assets in click: **Average price** The average price, in the quote asset. *** **Total volume** The total amount of the base asset available at a corresponding price level. *** **Grand total** The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. *** **Buy** / **Sell** Click the button to instantly place a Market order to buy or sell the asset at the selected price level. ## Summary [#summary] This widget provides up-to-date information about the orders executed on a selected market partially or in full, as well as the orders that were canceled, rejected, and expired. The entire order history of your account is available. Order history The widget lists only the orders to which final statuses are assigned. For a list of orders that are still being executed, use the [Open orders](open-orders) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the orders with the *Completed* status for the last three months. To display orders for a specific time period, use the **Select date range** field. To display orders with specific statuses, select one or more from the dropdown above the list. The most recent order appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Filled** The order amount that has been filled. *** **Fee** The total commissions paid for executing an order and the currency in which the commission was paid. *** **Remaining** The order amount that wasn't filled. *** **Avg execution price** The order execution price, as an average price of all trades executed while filling the order. *** **Used leverage** For CFD trading, the leverage ratio used when placing an order. *** **Status** The current order [status](../knowledge-base/order-statuses): *Completed*, *Cancelled*, *Rejected*, or *Expired*. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Order ID** The system identifier of an order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Reason** The reason for placing the order: * **Trader**: The order was placed by you. * **Stop-out**: The order was placed by the system, to close positions as a result of Stop out. * **Stop loss**: The order was placed by the [Stop loss](../knowledge-base/price-triggers) trigger. * **Take profit**: The order was placed by the [Take profit](../knowledge-base/price-triggers) trigger. * **Webhook alert**: The order was placed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). ## Summary [#summary] Use this widget to place new orders. Place order The widget has two states: ### The PRO toggle is disabled [#the-pro-toggle-is-disabled] In this state, you can quickly place **IOC Market** and **GTC Limit** orders by selecting the order side (Buy/Sell) and type (Market/Limit), and specifying the order size (in lots) and price (for Limit orders). You can also place orders on CFD markets with the maximum leverage automatically applied. ### The PRO toggle is enabled [#the-pro-toggle-is-enabled] In this state, you get access to more precise order settings, such as: * **Stop orders** * **Time in force** * **Leverage** * **Take profit, Stop loss, Trailing stop** * **Comment** * **Complete order information** The **Comment** field allows you to attach a text note to the order (up to 100 characters). The comment is inherited by the resulting position and can't be edited after the order is placed. ## Settings [#settings] ### Select a market [#select-a-market] The market on which the order will be placed is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Place an order [#place-an-order] To place an order, fill in the parameters, review order details and preliminary calculated values, and then confirm the order by clicking the **Place** button. For a Limit order whose price crosses the current top-of-book — Buy at or above the best ask, or Sell at or below the best bid — the platform shows a confirmation dialog before submission. The dialog shows the entered price and the current best bid/ask, and lets you confirm or cancel the order. This warning is enabled by default; you can disable it from the dialog (**Do not show this warning again**) or from the **Limit order cross-TOB warning** toggle in [Settings](../get-started/settings#action-confirmation). ### Set price triggers [#set-price-triggers] If using **Take profit, Stop loss, Trailing stop**, set the prices in consideration of the current highest market bid/ask or a specified Limit price: These values can be adjusted any time until the position is fully closed via the [Open positions](open-positions) widget. During non-trading hours, according to the trading calendar schedule, you can place only Stop Market and Stop Limit orders. The **Place** button stays enabled when the order type is Stop and is disabled for Market and Limit. A Stop order placed outside trading hours is accepted immediately and starts watching for its stop price when the market reopens. For details, see [Stop orders](stop-orders). The order controls are disabled when the selected account is Halted or Frozen. For more information, see [Account status](../get-started/customizing-your-terminal#account-status). You will not be able to place an order if the execution of the order causes your margin level to fall below the *Margin call* level. The same conditions apply to withdrawal operations. ## Summary [#summary] This widget displays a price chart showing fluctuation of prices for a selected market over a certain time period. Price chart The horizontal axis (X-axis) represents the time scale, and the vertical axis (Y-axis) indicates the price level. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Customization [#customization] Multiple customization options are provided, allowing you to configure the chart according to your preferences. You can switch between bar, candle, Heikin Ashi, line, area and baseline views, as well as specify the time period for which data should be displayed. The chart supports numerous financial indicators, such as moving averages and regressions, and can feature a variety of custom shapes, including arrows and lines, pitchforks, and various ranges, allowing you to perform an in-depth market analysis. ### Display options [#display-options] The widget supports displaying of open positions, price triggers, open and executed orders. Click the **gear icon** in the topbar and access [Price chart settings](../get-started/settings#price-chart) to enable desired options. ## Placing orders [#placing-orders] ### Enable placing orders [#enable-placing-orders] To enable placing orders directly from the Price chart, you need to activate the corresponding settings: 1. Click the **gear icon** in the topbar and access [Price chart settings](../get-started/settings#price-chart). 2. Activate the **Market quick trade panel** or **Limit quick trade panel** toggle, or both. 3. If needed, adjust the amount presets. These amounts will be available for quick selection when placing an order. ### Market quick trade panel [#market-quick-trade-panel] If the corresponding setting is activated, the draggable **Market quick trade panel** is constantly displayed on the Price chart. ### Limit quick trade panel [#limit-quick-trade-panel] If the corresponding setting is activated, the **+** will appear when hovering over price levels on the chart. Clicking it will open the **Limit quick trade panel**: * in the upper half of the chart — to sell; * in the lower half of the chart — to buy. ### Place a new order [#place-a-new-order] To place a new Market or Limit order from the Price chart, when a corresponding panel is displayed: 1. Select the **amount** from configured presets. 2. Select a **leverage** ratio, if trading on CFD or PF markets. 3. Click **Buy** or **Sell**. The order will be placed according to the selected type. ## Summary [#summary] Use this widget to configure alerts that will be delivered to the [Messages](messages) widget when an instrument price reaches the specified level. Price control ## Settings [#settings] ### Configure a new alert [#configure-a-new-alert] To configure a new alert: 1. Click the **Add market** button to select a required market from the list. 2. Click the **+** icon below the instrument name to add a new alert trigger. 3. In the displayed fields, specify the exact price or the price change in percents (positive or negative). The other value will be calculated automatically. 4. Click the **check mark icon** to add the trigger. Now you will receive a notification in the [Messages](messages) widget, once the instrument price hits the specified level. You can configure multiple triggers for each instrument. ### Edit alerts [#edit-alerts] Click the price to edit the existing alert. ### Remove alerts [#remove-alerts] Click the **×** button on the trigger panel to remove it and stop receiving corresponding notifications. Click the **×** button in the instrument row to remove it from the list and stop monitoring. ## Summary [#summary] This widget displays a list of untriggered Stop orders created on the selected account. Once a market price reaches your predetermined Stop price, the Stop order is activated and submitted as either a Market or Limit order. It's then removed from this widget. You can now find it in either the [Open orders](open-orders) or [Order history](order-history) widget, depending on its current status. Stop orders ## Stop orders outside trading hours [#stop-orders-outside-trading-hours] You can place Stop Market and Stop Limit orders while a market is closed according to its trading calendar, so you can prepare an entry or a protective level before the session opens. This applies to every channel: the Trading terminal, the REST API, the FIX API, and TradingView. An order placed this way behaves as follows: * It is accepted right away and appears in this widget with the standard **Waiting for activation** status. No new status was introduced for orders placed outside trading hours. * It is validated at placement against the price and amount scales and the market minimum amount. The stop price is also checked against the best bid and ask whenever a price is available — while the market is closed there may be no live price to check it against. * No balance or margin is reserved at placement. The margin check happens when the order triggers. * It stays Waiting for activation across sessions until it triggers, you cancel it, or it expires under its [Time in force](../knowledge-base/time-in-force). A Stop order placed on Friday evening is still there on Monday, and an unexpected holiday does not cancel it. * You can view and cancel it while the market is still closed. When the session opens, the order is evaluated against the first available price. If the market gapped past your stop price while it was closed, the order triggers at the open. For an order placed while no price was available, the first incoming price is used to finalise the order's internal pricing before it can trigger, so activation can take one extra price update. If the margin check fails when the order triggers, the order is cancelled and you receive the failure reason — it is never dropped silently. Market and Limit orders are still rejected while the market is closed. Only the two Stop order types are accepted — and the market itself must still be Open: a Paused or Halted market accepts no orders at all, Stop orders included. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the Stop Market and Stop Limit orders for all the time. The most recent order appears at the top of the list. To display orders for a specific time period, use the **Select date range** field. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types): Stop Market or Stop Limit. *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Stop price** The stop price specified when creating an order. When the market reaches this price, the Stop order will be placed (as a Market or Limit order. *** **Limit price** The price of a Limit order that will be placed when the Stop price is triggered. *** **Used leverage** For CFD trading, the leverage ratio used when placing an order. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Order ID** The system identifier of an order. ## Summary [#summary] Use this widget to monitor statistics on multiple instruments at a time. The widget is dynamic and is continuously updated in real time. Watch list ## Settings [#settings] ### Add/remove instruments [#addremove-instruments] Click the **Add market** button to select a required market from the list. Click the **×** button in the instrument row to remove it from the list and stop monitoring. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each instrument: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Last price** The price of the last trade. *** **24h change, %** The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h low** The lowest trade price over the last 24 hours. *** **24h high** The highest trade price over the last 24 hours. Welcome to **B2TRANSLATE**, a comprehensive web-based localization tool integrated with B2BROKER products. This tool enables you to efficiently translate your product's web user interfaces (WebUIs) into multiple languages, ensuring global accessibility for your applications. B2TRANSLATE organizes translations using a clear hierarchy that makes managing complex localization projects intuitive: 1. **Project types**: Your B2BROKER products. 2. **Projects**: Individual WebUIs within each product, such as test and production websites. 3. **Keys and translations**: Specific UI elements and their localized texts. Let's explore each component in more detail. ## Project types [#project-types] **Project types** correspond directly to your purchased B2BROKER products. They're automatically added to your B2TRANSLATE. If you have multiple products, all of them can be accessed on a single page for your convenience. Each product may have one or more WebUIs, for example if you have several instances. In this case, the project type encompasses different **projects** that represent these WebUIs. If you need any adjustments in the project types, contact your account manager. ## Projects [#projects] **Projects** are separate WebUIs of your products. Each project type includes a **DEMO** project, featuring a full set of categories, languages, and translations. The keys in this project aren't associated with any specific WebUI and serve only for demonstration. While you can't modify translations within the DEMO project, you can copy them to your other projects. Besides DEMO, each project type includes one or more "real" projects. These projects are linked to the WebUIs of your product and are under your full control. You can set and edit translations for the keys within such projects. If you need any adjustments in the projects, contact your account manager. ## Keys and translations [#keys-and-translations] **Keys** are identifiers that reference specific UI elements. **Translations** are text strings in various languages that are assigned to these keys. For example, the key `MyProject.CreateNewDeposit` can be assigned the English translation "Deposit funds", which will appear as the caption for the related UI element in the WebUI. The key list is product-specific and may be updated with product releases. B2TRANSLATE provides you with flexible filters to detect new and empty keys, ensuring your WebUIs remain up-to-date. Refer to [Filter keys](../user-guide/filter-keys) to learn more. ### Default and custom translations [#default-and-custom-translations] Each key has the following translation fields: * **Source** (read-only): A pre-defined translation to English, provided by B2TRANSLATE. This field can't be edited. * **B2TRANSLATE** (read-only): A pre-defined translation to a selected language (if distinct from English), provided by B2TRANSLATE. This field can't be edited. * **Custom translation** (user-editable): A user-provided custom translation to a selected language. This value is initially empty and can be edited anytime. Refer to [Add or modify translations](../user-guide/manage-translations/add-or-modify-translations) to learn more about customizing translations. ### Display logic in WebUI [#display-logic-in-webui] B2TRANSLATE follows an intelligent fallback system for displaying translations: 1. Custom translation (if exists) ↓ (if empty) 2. Default translation in a selected language (if exists) ↓ (if empty) 3. Source English translation ↓ (if explicitly set to empty) 4. No translation (blank) * **Key**: `MyProject.Button.BuyNow` * **Language**: Spanish * **Source English translation**: Buy Now * **Default Spanish translation**: Comprar Ahora * **Custom Spanish translation**: ¡Comprar Ya! → **Display result**: ¡Comprar Ya! (Custom Spanish translation) *** * **Key**: `MyProject.Button.BuyNow` * **Language**: Spanish * **Source English translation**: Buy Now * **Default Spanish translation**: Comprar Ahora * **Custom Spanish translation**: – → **Display result**: Comprar Ahora (Default Spanish translation) *** * **Key**: `MyProject.Button.BuyNow` * **Language**: Spanish * **Source English translation**: Buy Now * **Default Spanish translation**: – * **Custom Spanish translation**: ¡Comprar Ya! → **Display result**: ¡Comprar Ya! (Custom Spanish translation) *** * **Key**: `MyProject.Button.BuyNow` * **Language**: Spanish * **Source English translation**: Buy Now * **Default Spanish translation**: – * **Custom Spanish translation**: – → **Display result**: Buy Now (Source English translation) ### Categories [#categories] **Categories** represent separate functional modules of products and are used to group keys. You can filter keys by a specific category. Each project includes the **default** category that contains the keys used throughout the product, such as error messages or names of UI elements. These keys are translated into English and any other languages selected during purchase. The set of categories depends on the product and can't be edited. ## Main features [#main-features] B2TRANSLATE offers you a comprehensive toolkit for efficient translation management. ### Progress tracking and quality control [#progress-tracking-and-quality-control] * **Completion monitoring**: Track translation progress by language or project. * **Smart filtering**: Identify new keys and missing translations instantly. * **Quality assurance**: Ensure complete coverage across all WebUI elements. ### Efficiency and automation tools [#efficiency-and-automation-tools] * **Translation reuse**: Copy translations between projects to reduce redundant work. * **AI-powered translations**: Integrate with ChatGPT for automated translation assistance (contact your account manager for access). * **Bulk operations**: Export/import via CSV for large-scale editing workflows. ### Advanced localization features [#advanced-localization-features] * **Plural form handling**: Support complex grammatical rules for accurate translations. * **Real-time updates**: Changes reflect immediately in connected WebUIs. * **Collaborative workflows**: Team-friendly interface for multi-user translation projects. ### Support and feedback [#support-and-feedback] * **Integrated feedback system**: Submit suggestions and report issues directly within the platform. * **Dedicated support**: Contact your account managers for technical assistance. Ready to start translating? Explore the **User guide** to master B2TRANSLATE's translation management capabilities. Your personal controls in B2TRANSLATE are grouped in two places: * The **Account** page, opened from the gear icon in the sidebar, where you change your password and manage personal API tokens. * The control row at the bottom of the sidebar, where you switch the interface language, open your notifications, and sign out. The B2TRANSLATE sidebar with navigation items, the Account entry, and the footer controls ## Open your account settings [#open-your-account-settings] To open your account settings, click **Account** (the gear icon) in the sidebar. The **Settings** page opens with two tabs: * **Personal API tokens** — create and revoke tokens for programmatic API access. * **Change password** — update the password you use to sign in. These settings apply to your own account only. ## Change your password [#change-your-password] ### Open the password form [#open-the-password-form] Go to **Account** > **Change password**. ### Enter your passwords [#enter-your-passwords] Enter your **Current password**, and then enter and confirm your **New password**. A strength meter indicates how strong the new password is. ### Save the change [#save-the-change] Click **Save**. You'll use the new password the next time you sign in. The new password must meet the following requirements: * At least eight characters long * At least one letter, one digit, and one special character * Different from your current password If the **Current password** you enter is incorrect, B2TRANSLATE reports an error and the password isn't changed. The Change password tab on the Settings page ## Manage personal API tokens [#manage-personal-api-tokens] Personal API tokens are an authentication method for programmatic access to the B2TRANSLATE API, useful for integrations and automation workflows. A token acts on your behalf, so you don't need to share your sign-in credentials. Personal API tokens have moved from the former profile menu to **Account** > **Personal API tokens**. The Personal API tokens tab listing existing tokens ### Create a token [#create-a-token] ### Open the tokens tab [#open-the-tokens-tab] Go to **Account** > **Personal API tokens**, and then click **Create Token**. ### Name the token and set the expiration [#name-the-token-and-set-the-expiration] Enter a **Token name** that helps you recognize where the token is used. Set an **Expiration date** with the calendar, or click one of the quick options — **30 days**, **60 days**, or **90 days**. ### Copy the token [#copy-the-token] Click **Create Token**. The token value appears once. Copy it and store it in a safe place. The token value is shown only once and can't be retrieved later. If you lose it, delete the token and create a new one. The Create Token dialog with a name field and expiration date ### Revoke a token [#revoke-a-token] To revoke a token you no longer need, find it in the list on the **Personal API tokens** tab and click **Delete**. Any integration that uses the token stops working immediately. ## View your notifications [#view-your-notifications] B2TRANSLATE keeps you informed about background events — such as a finished AI translation, a ready export, or a completed import — through the notification bell at the bottom of the sidebar. * A red badge on the bell shows the number of unread notifications. * To see your most recent notifications, click the bell. * Mark a notification as read to clear it, or click **Mark all as read** to clear them all at once. * When you have more than five notifications, click **All notifications** to open the full history. Besides the in-app bell, notifications can also be delivered to **Email**, **Slack**, or **Telegram**. A workspace administrator configures these delivery channels and chooses who receives each type of event. The notifications panel opened from the sidebar bell ## Change the interface language [#change-the-interface-language] B2TRANSLATE is available in multiple languages. To change the language of the interface, click the language selector (the globe icon) at the bottom-left of the sidebar, and then select a language from the list. Your choice is saved for the next time you sign in. ## Sign out [#sign-out] To sign out, click the log-out icon at the bottom of the sidebar. B2TRANSLATE ends your session and returns you to the **Sign in** page. The credentials for signing in to B2TRANSLATE are sent to you after setting up the product you have purchased. To access your B2TRANSLATE account, go to the **Sign in** page, enter your email and password, and click **Sign in**. If you forgot your password, click the **Forgot password?** link and follow the instructions. **Two-factor authentication (2FA)** For security purposes, 2FA using codes generated by an authenticator app is obligatory for all B2TRANSLATE accounts. * If 2FA is enabled for your B2TRANSLATE account, complete the sign-in process by entering a 2FA code from an app, such as **Google Authenticator** or **Twilio Authy**. * If 2FA hasn't yet been enabled for your account, you'll be prompted to set it up during sign-in. Follow the on-screen instructions to install an authenticator app on your phone and set it up to generate 2FA codes for B2TRANSLATE. To filter keys, while on the **Translations** page, click the **Filters** button in the upper-right page corner. Filters You can filter keys by the following parameters: **Filter by** Select one of the following: * **Empty keys**: To filter keys for which empty translations are saved. For such keys, an empty string is displayed in the WebUI. * **No translation**: To filter keys with no custom translations. For such keys, a default translation is displayed in the WebUI. * **New keys in the last 2 weeks**: To filter keys that have been added within the previous 2 weeks. * **New keys in the last 4 weeks**: To filter keys that have been added within the previous 4 weeks. *** **Created between** Pick up a date range to filter keys added during it. *** **Updated between** Pick up a date range to filter keys modified during it. *** **Category** Select a category to filter keys included in it. *** **Key** Enter a key identifier or a keyword to filter keys with matching identifiers. *** **Source** Enter a translation or a keyword to filter keys with the matching default English translations. *** **Custom translation** Enter a translation or a keyword to filter keys with matching custom translations. *** Click **Apply** to filter keys. To reset filters, click **Clear all**. Apply filters On this page, you can view a list of languages available for your projects. Languages View the following information about each language: **Language** The name of a language. *** **Code** The two-letter code of a language, as per ISO 639-1. *** **Projects** The number of projects where the language is added and used. ## Project list [#project-list] On this page, you can view a list of your projects. Projects are grouped under project types, that are displayed as tabs above the project list. Projects The following information is provided about each project: **Name** The project name. Click it to navigate to the list of project categories. *** **Languages** The number of languages available for a project. *** **All keys** The total number of keys in a project, both translated and untranslated. *** **UUID** The system identifier of a project, in the UUID format. *** **Actions** Click the **three dots** in a project row to access [Download and upload translations](manage-translations/download-and-upload-translations) functionality. ## Translations [#translations] To open the translation view for a project, click its name in the project list. Keys and translations ### Available controls [#available-controls] Above the table, you can find: * The **environment** dropdown: For the *Customer* role, only `production` is available. * The **language** dropdown: Use it to quickly switch between languages available for you project. * The **quick search** field: Click the **magnifying glass icon** to search keys by identifier or translations. * The **Filters** button: Click it to open filter panel. For more details, refer to [Filter keys](filter-keys). For certain project types, the platforms are available above the table, such as *Web*, *iOS*, *Android*, and so on. In the upper‑right page corner, you can find: * The **Import keys** button: Use it to [copy translations from another project](manage-translations/copy-translations). * The **Upload CSV** button: Use it to [upload translations as a CSV file](manage-translations/download-and-upload-translations). * The **Settings** button: Use it to choose which languages are shown in the translation view (**Languages**) and their display order (**Language order**). Pagination controls and the **Rows** selector are available at the bottom of the page. ### Translations table [#translations-table] Each row in the table represents a single key and its translations: **Key** * The **category** badge. * The **key identifier**. * The **Copy** button to quickly copy the key identifier to the clipboard. * The **Created** / **Updated** info: the date the key was created or, once its **Custom translation** has been edited, the date it was last changed. Key *** **Translations** * **Source**: The pre-defined translation to English. This column is read‑only and helps you understand the meaning and context of the key. * **B2TRANSLATE**: The pre-defined translation to a selected language, if distinct from English. This column is read-only. * **Custom translation**: The custom translation to a selected language. This field is initially empty and editable at any time. For keys containing plural forms, this value displays [the Other form](manage-translations/handle-plural-forms#the-other-form). Each column displays a badge with the corresponding language code. Refer to [Display logic in WebUI](../get-started/introduction-to-b2translate#display-logic-in-webui) to understand the translation priorities. For step-by-step instructions on managing translations, refer to the [Manage translations](manage-translations) section of this guide. Translations *** **Actions** * **Translate with AI**: Translate the source English translation to a selected language using ChatGPT. For details, refer to [Translate with AI](manage-translations/translate-with-ai). * **Reset to source translation**: Revert the custom translation to a pre-defined one — either to a selected language (if the default translation for this language is provided) or to English. * **Save as empty**: Explicitly set an empty translation for this key. * **Show history**: View the change history of the translation. Saving an explicitly empty custom translation results in no text being displayed in the WebUI. Use this option carefully and only when this behavior is intentional. Actions *** **Details** Click the **three dots** to open details: * **Info** tab: It's displayed for any key and contains information on when the custom translation was added and when it was last modified. * **Pluralization** tab: It's displayed for keys containing plural forms. Refer to [Handle plural forms](manage-translations/handle-plural-forms) to learn how to properly configure quantity-dependent content based on grammatical requirements of the selected language. Details On this page, you can view a full list of bonuses credited to clients, monitor bonus statuses, and manually credit bonuses to clients as needed. For details of the process of awarding bonuses to clients, refer to [Introduction to bonuses](./#introduction-to-bonuses). ## General information [#general-information] The following information is provided about each bonus: **ID** The bonus identifier. *** **Client ID** The client identifier. *** **Client name** The client’s name. *** **Client email** The client’s email address. *** **Tags** The tags assigned to a client, which are used to sort the client list displayed to [Back Office administrators](../system/users/users). *** **Account** The number of a trading account to which a bonus is credited. *** **Current amount** The current bonus amount. *** **Initial amount** The initial bonus amount. *** **Bonus name** The bonus name, displayed to a client in the B2CORE UI. For temporary bonuses, the default name is the name of a temporary bonus program from which a bonus was claimed. To display a different name in the B2CORE UI, enter the desired name in the **Caption** field within the [bonus details](#details). For manually credited bonuses, the bonus name is the value specified in the **Caption** field when [manually adding bonuses to clients](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients). *** **State** The bonus status: * `Queued` — a bonus was awarded to a client trading account, but hasn’t yet been added to the account as credit. * `Pending` — a bonus was added to a client trading account as credit, and the required volume that must be traded by the client was calculated. * `Processing` — a bonus is currently being processed for burning. * `Completed` — bonus requirements were successfully met, indicating that the required volume was achieved by the client within the specified number of days, and the bonus credit has been received on the account balance. * `On completing` — the bonus credit is being added to the account balance. * `Expired` — bonus requirements weren’t met, resulting in the bonus credit being revoked from the account. * `Error` — an error occurred while processing a bonus. *** **Created by** The email address and ID of a Back Office user who created a bonus for a client. Clicking the ID opens the profile of the respective Back Office user. *** **Created at** The date and time when a bonus was credited to a client trading account. To view bonus details, click view-button (**View**). If any transaction related to crediting or deducting a specific bonus on the client's trading account fails, the respective bonus row is highlighted, and the **exclamation** icon appears next to the **View** button. You can view the bonus transaction history on the [Bonus transactions tab](#bonus-transactions) in the bonus details. *** **Expired at** The date and time when a credited bonus is scheduled to expire or has already expired. ## Details [#details] The details page is divided into two tabs: * [Bonus details](#bonus-details) * [Bonus transactions](#bonus-transactions) ### Bonus details [#bonus-details] On the details tab, you can view the bonus setting and requirements that a client must meet to receive a bonus credit on their account balance. Additionally, you can reactivate bonuses that have the `Expired` status and revoke bonuses with the `Pending` status. To do this, click the **Actions** button in the upper-right page corner and select the appropriate option in the dropdown. The following information is provided on the tab: **Created at** The date and time when a bonus was credited to a client trading account. *** **Amount** The bonus amount. *** **State** The bonus status. *** **Volume closed** The volume of closed positions counted towards the required volume that a client must achieve to receive a bonus credit on their account balance. *** **Temporary Bonus**\ *Applicable for temporary bonuses only* The name of a temporary bonus program from which a bonus was claimed. *** **Activated at** The date and time when a bonus amount was added to a client trading account as credit. *** **Client** The client’s email address. *** **Account** The number of a trading account to which a bonus was credited. *** **Fictive Volume** This field is used for reactivation of the expired bonus. *** **Caption** The bonus name, displayed to a client in the B2CORE UI. If this field is empty: * For temporary bonuses, the name of a temporary bonus program from which a bonus was claimed will be displayed to the client in the B2CORE UI. * For manually credited bonuses, the name of the platform associated with the account receiving a bonus will be displayed to the client in the B2CORE UI. *** **Lifetime (days)** The number of days to fulfill the bonus requirements. After the bonus amount is added to a client trading account as credit, the client must trade the required volume within the specified number of days to receive the bonus credit on the account balance. *** **Lot per unit** The ratio applied to the bonus amount to determine the volume that must be traded by a client to receive the bonus credit on their account balance: `Required volume = Bonus amount / Lot per unit` Suppose that the bonus amount is 100 USD and the **Lot per unit** option is set to 2. In order to receive the bonus credit of 100 USD to their account balance, a client must trade the following volume: `100 / 2 = 50 lots`. *** **Set credit immediately** * If **Enabled**, when a client claims bonuses from multiple programs at a time using the same trading account, all claimed bonuses are immediately added to their account as credit, enabling the client to use credit funds for trading. * If **Disabled**, when a client claims bonuses from multiple programs at a time using the same trading account, the claimed bonuses are added to their account one after another. Only after the first claimed bonus is processed and assigned the final status (`Completed` or `Expired`), the second claimed bonus is added to the client trading account as credit, and so on. *** **Ignored open/close interval (sec)** The minimum duration, in seconds, for which a client must keep a position open for it to be counted towards the traded volume of the bonus program. *** **Autoenable trading if balance > 0** When the account balance changes from zero or negative to positive, the permission named `Trade Enabled` is either automatically restored for the account or not, depending on this setting: * If **Enabled**, when the account balance becomes positive, the `Trade Enabled` permission is automatically restored, enabling the client to resume trading on their account, including the use of the bonus credit. * If **Disabled**, when the account balance becomes positive, the `Trade Enabled` permission isn’t automatically restored. *** **Ignored symbol groups** One or more symbol groups in which trades aren't counted towards the traded volume of the bonus program. For cTrader, individual symbols must be selected in this field instead of symbol groups, even though symbol groups are available on the cTrader platform. This field is optional and can be empty. ### Bonus transactions [#bonus-transactions] On the transactions tab, you can view the history of transactions related to crediting or deducting a specific bonus on the client's trading account, check their statuses, and retry failed transactions if necessary. For failed transactions with the `Error` status, retry button (**Retry**) is displayed. Click the button to attempt processing the transaction again. The **Retry** button is available only to the Back Office users who are assigned the [permission](../system/users/groups) to `Retry bonus operation`. If you don't have this permission, the button will be hidden. To update the transaction information displayed on the tab, click refresh button (**Refresh**) displayed in the upper-right corner. The following information is provided on the tab: **Operation ID** The identifier assigned to the bonus transaction. *** **Oder ID** The identifier of the order associated with the bonus transaction, if applicable. *** **Amount** The bonus amount. *** **Status** The transaction status: * `New` — the transaction has been initiated. * `In progress` — the transaction is being processed. The `New` and `In progress` statuses are intermediate and appear only for a very brief moment. * `Success` — the transaction was successfully executed. * `Error` — the transaction failed due to an issue. *** **Num of attempts** The number of attempts made to execute the transaction. *** **Last attempt date** The date and time of the most recent attempt to process the transaction. *** **Comment** A description identifying the transaction: * **Credit accrued** — the bonus amount is added to the client’s trading account as credit. * **Credit cleared** — the credited bonus is deducted from the account once the bonus requirements have been met. This occurs just before adding the bonus amount to the account balance. * **Balance accrued** — the credited bonus is added to the account balance after the bonus requirements have been met. * **Credit expired** — the credited bonus has expired and is deducted from the account. * **Bonus cancelled** — the credited bonus is revoked when funds are withdrawn from the account. *** **Error message** For transactions with the `Error` status, this field displays details about the error. *** **Creation date** The date and time when the transaction was initiated. **See also** [How to manually credit bonuses to clients](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients) [How to automatically credit bonuses to clients upon deposits](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits) On this page, you can manage existing bonus presets and create new ones. **Bonus presets** include pre-configured settings that streamline bonus configuration in the following scenarios: * for temporary bonus programs, eliminating the need to manually specify all bonus program settings (for details, refer to [How to create a temporary bonus program](../../how-to-articles/manage-bonuses/how-to-create-a-temporary-bonus-program)) * for manual bonuses when the admin awards bonuses to clients on the [Bonus distribution](bonus-distribution) page (for details, refer to [How to manually credit bonuses to clients](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients)) * for the automatic process of crediting bonuses to clients upon deposits (for details, refer to [How to automatically credit bonuses to clients upon deposits](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits)) ## General information [#general-information] The following information is provided about each preset: **ID** The identifier of a bonus preset. *** **Platform** The [trading platform](../products/platforms) to which a bonus preset can be applied. *** **Name** The name of a bonus preset. *** **Priority** The priority index assigned to the bonus preset. Multiple presets can be created for each trading platform that supports bonuses, such as **MT4/5** and **cTrader**. The preset with **lowest** index, created for a specific platform, will be used for automatic crediting of bonuses to clients upon deposits. *** **Lifetime** The number of days within which a client must fulfill the bonus requirements. After a bonus amount is added to a client trading account as credit, the client must trade the required volume within the specified number of days to receive the bonus credit on the account balance. *** **Lot per unit** The ratio applied to a bonus amount to determine the volume that must be traded by a client to receive the bonus credit on their account balance: `Required volume = Bonus amount / Lot per unit` Suppose that the bonus amount is 100 USD and the **Lot per unit** option is set to 2. In order to receive the bonus of 100 USD on their account balance, a client must trade the following volume: `100 / 2 = 50 lots`. *** **Set credit immediately** * If **Enabled**, when a client claims bonuses from multiple programs at a time using the same trading account, all claimed bonuses are immediately added to their account as credit, enabling the client to use credit funds for trading. * If **Disabled**, when a client claims bonuses from multiple programs at a time using the same trading account, the claimed bonuses are added to their account one after another. Only after the first claimed bonus is processed and assigned the final status (`Completed` or `Expired`), the second claimed bonus is added to the client trading account as credit, and so on. *** **Ignored open/close interval** The minimum duration, in seconds, for which clients must keep positions open for them to be counted towards the traded volume. *** **Ignored symbol groups** One or more symbol groups in which trades aren't counted towards the traded volume. For cTrader, individual symbols must be selected in this field instead of symbol groups, even though symbol groups are available on the cTrader platform. This field is optional and can be empty. *** **Autoenable trading if balance > 0** When the account balance changes from zero or negative to positive, the permission named `Trade Enabled` is either automatically restored for the account or not, depending on this setting: * If `Enabled`, when the account balance becomes positive, the `Trade Enabled` permission is automatically restored, enabling the client to resume trading on their account, including the use of the bonus credit. * If `Disabled`, when the account balance becomes positive, the `Trade Enabled` permission isn’t automatically restored. ## Details [#details] On the details page, you can modify parameters of a selected bonus preset and apply restrictions to it. To apply restrictions, click the **Actions** button in the upper-right page corner. The following types of restrictions can be applied to the bonus preset, either individually or in combination: * **Country restrictions** — to make the preset available only to client from specific countries. * **Client type restrictions** — to make the preset available only to clients of selected types, such as Corporate or Individual. * **Verification level restrictions** — to make the program available only to clients with specific verification levels. * **Jurisdiction restrictions** — to make the preset available only to clients under selected jurisdictions. * **Introducing broker restrictions** — to make the preset available only to clients who are referrals of the specified IBs. * **Product restrictions** — to make the preset available for use only with specific [products](../products/products). For example, you can use this restriction to prevent a preset from being applied to products that manage cent trading accounts. If the preset is used for automatic bonuses upon deposits, these bonuses won’t be credited to cent accounts. However, the preset can still be applied to other products that meet the restriction criteria. If a client or product doesn't meet the restriction criteria, the preset can't be used to credit bonuses. This also applies to the [automatic process of crediting bonuses upon deposits](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits) if the preset is used for automatic bonuses. **See also** [How to create a bonus preset](../../how-to-articles/manage-bonuses/how-to-create-a-bonus-preset) ## Introduction to bonuses [#introduction-to-bonuses] Bonuses offer additional financial incentives and benefits to clients actively involved in trading. They can also serve as a tool for attracting new clients, retain existing ones, or encouraging trading using specific instruments. Bonuses are supported for **MetaTrader 4/5** and **cTrader**. The process of awarding bonuses to clients involves two steps: 1. Initially, a bonus amount is added to a client trading account as credit funds. These credit funds increase the client’s trading capital, allowing the client to trade on the account with positions of larger sizes. 2. The ultimate goal for the client is to convert the bonus amount from credit funds to their account balance, which represents real funds that can be withdrawn from the account. To achieve this, the client must fulfill specific bonus requirements and trade the required volume within a specified period. If the client fails to meet the bonus requirements, the bonus credit is revoked from the client account. On this page, you can view a list of created temporary bonus programs and create new ones. **Temporary bonus programs** are time-limited offers that are displayed to clients on the **Bonuses** page in the B2CORE UI, where clients can claim bonuses from desired programs. For details of the process of awarding bonuses to clients, refer to [Introduction to bonuses](./#introduction-to-bonuses). ## General information [#general-information] The following information is provided about each temporary bonus program: **ID** The bonus program identifier. *** **Name** The bonus program name displayed to clients in the B2CORE UI. *** **Amount** The bonus amount. *** **Currency** The bonus program currency. Only trading accounts denominated in the specified currency can be used to claim the bonus from the given program. *** **Lot per unit** The ratio applied to the specified bonus amount to determine the volume that must be traded by a client: `Required volume = Bonus amount / Lot per unit` Suppose that the **Amount** field is set to 100 USD and the **Lot per unit** option is set to 2. In order to receive the bonus of 100 USD on their account balance, a client must trade the following volume: `100 / 2 = 50 lots`. *** **Created at** The date and time when a bonus program was created. *** **Expired** The end date and time of the bonus program, after which clients are no longer able to claim bonuses from the program. To view bonus program details, click the **Edit** button. ## Details [#details] On the details page, you can view the additional program settings and requirements: **Platform** The [trading platform](../products/platforms) on which the bonus program is available. Only trading accounts opened on the specified platform can be used to claim the bonus from the given program. *** **Name** The bonus program name displayed to clients in the B2CORE UI. *** **Amount** The bonus amount. *** **Currency** The bonus program currency. Only trading accounts denominated in the specified currency can be used to claim the bonus from the given program. *** **Expired** The end date and time of the bonus program, after which clients are no longer able to claim bonuses from the program. *** **Platform Groups** One or more groups created on the trading platform, in which trades are counted towards the traded volume of the bonus program. *** **Lifetime (days)** The number of days to fulfill the program requirements. After the bonus amount is claimed and added to a client trading account as credit, the client must trade the required volume within the specified number of days to receive the bonus credit on the account balance. *** **Lot per unit** The ratio applied to the specified bonus amount to determine the volume that must be traded by a client to receive the bonus credit on their account balance. *** **Set credit immediately** * If **Enabled**, when a client claims bonuses from multiple programs at a time using the same trading account, all claimed bonuses are immediately added to their account as credit, enabling the client to use credit funds for trading. * If **Disabled**, when a client claims bonuses from multiple programs at a time using the same trading account, the claimed bonuses are added to their account one after another. Only after the first claimed bonus is processed and assigned the final status (`Completed` or `Expired`), the second claimed bonus is added to the client trading account as credit, and so on. *** **Ignored open/close interval (sec)** The minimum duration, in seconds, for which a client must keep a position open for it to be counted towards the traded volume of the bonus program. *** **Autoenable trading if balance > 0** When the account balance changes from zero or negative to positive, the permission named `Trade Enabled` is either automatically restored for the account or not, depending on this setting: * If **Enabled**, when the account balance becomes positive, the `Trade Enabled` permission is automatically restored, enabling the client to resume trading on their account, including the use of the bonus credit. * If **Disabled**, when the account balance becomes positive, the `Trade Enabled` permission isn’t automatically restored. *** **Ignored symbol groups** One or more symbol groups in which trades aren't counted towards the traded volume of the bonus program. For cTrader, individual symbols must be selected in this field instead of symbol groups, even though symbol groups are available on the cTrader platform. This field is optional and can be empty. *** To apply restrictions to a selected temporary bonus program, click the **Actions** button in the upper-right page corner. The following types of restrictions can be applied to bonus programs, either individually or in combination: * **Country restrictions** — to make the program available only to client from specific countries. * **Client type restrictions** — to make the program available only to clients of selected types, such as Corporate or Individual. * **Verification level restrictions** — to make the program available only to clients with specific verification levels. * **Jurisdiction restrictions** — to make the program available only to clients under selected jurisdictions. * **Introducing broker restrictions** — to make the program available only to clients who are referrals of the specified IBs. If a client doesn't meet the restriction criteria, the temporary bonus program won't be visible to that client in the B2CORE UI, and the client won't have the option to claim the bonus. **See also** [How to create a temporary bonus program](../../how-to-articles/manage-bonuses/how-to-create-a-temporary-bonus-program) On this page, you can find a complete list of client accounts. To view the accounts of a specific client, go to the [Accounts tab](general/accounts-tab) on the client details page. ## General information [#general-information] The following information is provided about each client account: **Account ID** The identifier of an account in the system. *** **Account number** The account number. *** **Display Number** The account number displayed to a client in the B2CORE UI. *** **Client ID** The identifier of an account owner. *** **Client name** The name of an account owner. *** **Client status** The [current status](../references/client-statuses) of an account owner’s profile in the B2CORE UI. *** **Email** The email address of an account owner. *** **Tags** The tags assigned to an account owner that are used to navigate the client list displayed to [Back Office administrators](../system/users/). *** **Country** The account owner’s [country](../system/countries). *** **Company** The account owner’s company. *** **Product** The [product](../products/products) specified for an account. *** **Platform** The [platform](../products/platforms) on which an account is opened. *** **Type** The account type: * **Personal** * **Trade** * **Demo** * **Partner** * **External** *** **Currency** The account currency. *** **Leverage** The account leverage. *** **Balance** The total balance on an account, in the account currency. *** **Balance (USD)** The total balance on an account, in USD. *** **Balance (EUR)** The total balance on an account, in EUR. *** **Credit** The credit funds available on an account. *** **Hold amount** The amount of locked funds on an account. *** **Free funds** The amount of available funds on an account. *** **Equity** For MetaTrader accounts, the account equity. *** **Equity (excl. Credit)** For MetaTrader accounts, the account equity excluding credit funds. *** **Equity (excl. Credit) in USD** For MetaTrader accounts, the account equity excluding credit funds, in USD. *** **Free margin** For MetaTrader accounts, the account available margin. *** **Created** The date and time when an account was created. *** **Internal client type** For internal use: the internal category assigned to a client. *** **Client verification level** The verification level obtained by an account owner. ## Actions [#actions] To create a new account for a client, click the **Create** button in the upper-right corner of the page. *** To deposit funds to multiple client accounts at once, click the **+Update balances** button in the upper-right corner of the page, and then upload a CSV file including the required data (for details, refer to [How to update balances](../../how-to-articles/manage-finances/how-to-update-balances)). *** To export data from the page, click the **Export** button in the upper-right corner of the page, and then select the desired file format. The exported file will reflect your current visibility settings as well as any applied sorting and filtering criteria. Balances of both live and demo trading accounts may not be as up-to-date as those shown on the respective trading platforms. To view the account details, select an account and click the **Edit** button. ## Details [#details] The detail page contains the following tabs: * **Account** — on this tab, you can find the details about an account, assigned access permissions and the account owner * **Transactions** — on this tab, you can filter transactions by their type (the fields displayed on this tab are described in the corresponding sections of this guide) To learn about transactions made on a specific client account, go to the [Transactions tab](general/transactions-tab) on the client details page. On this page, you can create, view, and manage jurisdictions to which clients can be automatically assigned after registration. Jurisdictions help segment clients by region or regulatory needs, ensuring efficient operations and compliance. Jurisdiction-based restrictions can be used to control access to specific products, deposit and withdrawal methods, or verification levels, making them available to clients from certain jurisdictions while restricting access for others. Jurisdictions are assigned to clients based on a combination of the client’s **country** and **client type**. ## Key points [#key-points] * If a client registers with a country and client type that match an existing jurisdiction, the jurisdiction is assigned to the client automatically. * If no matching country and client type combination is found during registration, the jurisdiction isn’t assigned to the client. * If a client isn’t required to select their country during registration, the jurisdiction is assigned automatically after the country is set through the KYC process, taking the client type into account. * When the client’s country changes, the jurisdiction is automatically updated if a matching one exists, taking the client type into account. * Jurisdictions can also be manually assigned or changed in the client details without changing the country. The following information is provided about each jurisdiction: **ID** The jurisdiction identifier. *** **Caption** The jurisdiction name. *** **Description** The description providing additional details about the jurisdiction. *** **Countries** The list of countries included in the jurisdiction. *** **Client types** The list of [client types](types) associated with the jurisdiction. *** **Tags** One or more [client tags](../system/users/client-tags) associated with the jurisdiction. These tags are automatically assigned to clients along with the respective jurisdiction. **See also** [How to create a jurisdiction](../../how-to-articles/manage-clients/how-to-create-a-jurisdiction) [How to edit a jurisdiction](../../how-to-articles/manage-clients/how-to-create-a-jurisdiction#how-to-edit-a-jurisdiction) On this page, you can find a list of all managers and add new ones. Managers are users with access to the Back Office, responsible for organizing work and communicating with clients registered in B2CORE. Upon registration, clients are automatically distributed among the existing managers according to country restrictions. Additionally, you can configure managers to view only specific clients, for example, those assigned to them using [client tags](../system/users/client-tags). ## General information [#general-information] The following information is provided about each manager: **Name** The manager’s name. *** **Email** The manager’s email address. *** **Title** The manager’s title (such as `Mr` or `Mrs`). *** **Enabled** The status of a manager’s profile. Clients can be assigned only to `Enabled` managers. *** **Default** If a manager is set as the default, all new clients will automatically be assigned to that manager, considering country restrictions. Only one manager can be set as the default at a time. It is also possible to have no default manager. In this case, new clients will be assigned to existing managers sequentially, still considering country restrictions. If no manager meets the country restrictions for a client, the client won't be assigned a manager. For more information on the assignment process, refer to [Example](#example) below. To view details of the manager's profile, click the **Edit** button. ## Details [#details] On the details page, you can additionally view the manager's phone number and edit their profile. To apply country restrictions to a selected manager, click the **Actions** button in the upper-right page corner and select **Country restrictions** in the dropdown: * **Deny only** — the manager can be assigned to all clients, except for those from the selected countries. * **Allow only** — the manager can only be assigned to clients from the specified countries. * **Rules** — a list of countries to which either the **Deny only** or **Allow only** rule is applied. ## Example [#example] This example illustrates the process of assigning new clients to managers. Suppose we have the **Default manager** with the country restriction **Allow only** set to `Vietnam`, meaning that the **Default manager** can be assigned only to clients from Vietnam. In addition to the **Default manager**, there are two non-default managers: * **Manager 1** with the country restriction **Deny only** set to `Germany`, meaning that this manager can be assigned to all clients except for those from Germany. * **Manager 2** without country restrictions. The assignment process works as follows: A client from `Vietnam` — the client will be assigned to the **Default manager** since the country restriction is met in this case. A client from `Germany` — the client can't be assigned to the **Default manager** due to the country restriction and can't be assigned to **Manager 1** either due to the same reason. Therefore, the client will be assigned to **Manager 2**. A client from `China` — the client can't be assigned to the **Default manager** due to the country restriction. The client will be randomly assigned to **Manager 1** or **Manager 2**. In this case, suppose the client is assigned to **Manager 1**. A client from `UAE` — the client can't be assigned to the **Default manager** due to the country restriction. Sequentially, the client will be assigned to **Manager 2** as the previous client was assigned to **Manager 1**. **See also** [How to add a manager](../../how-to-articles/manage-system-settings/how-to-add-a-manager) When your client creates a new request, it appears in the request list. All incoming requests are assigned the **Pending** status and must be resolved on an individual basis (approved or rejected). By default, only pending requests are listed on this page. The **bell** icon displayed in the top panel indicates the total number of pending requests. You can export page data to a CSV or XLSX file. To do this, click the **Export** button in the upper-right page corner, choose a file format, and then select whether to download the data to your computer or deliver it to an email address from your profile. The data in a resulting file matches both the current visibility settings and the applied sorting and filtering parameters. ## General information [#general-information] The following information is provided about each client request: **№** The sequence number of a request. *** **Client ID** The identifier of a client who submitted a request. *** **Client name** The name of a client who submitted a request. *** **Client email** The email address of a client who submitted a request. *** **Tags** The tags assigned to a client that are used to sort the client list displayed to [Back Office administrators](../system/users/). *** **Type** The request type: * **Account** — a request to create an account (when such a request is required for a specific product) * **Address** — a request to update the **Residential** address of an `individual` client. * **Archive** — a request to archive a trading account * **Avatar** — a request to upload a client profile picture * **Deleting Account** — a request to delete an account * **Deposit** — a request to deposit funds * **Exchange** — a request to exchange funds (when such a request is required for a specific currency pair) * **Payout** — a request to withdraw funds * **Profile** — a request to update client profile information * **Transfer** — a request to transfer funds between accounts of the same client * **Internal transfer** — a request to transfer funds from one client to another within the same B2CORE system * **Verification** — a request to update a client’s verification level based on submitted documents * **Client tests** — a request to check the results of a client accreditation test * **Introducing brokers** — a request to join an IB program * **PaymentSystem Deposit Assistance** and **PaymentSystem Withdrawal Assistance** — requests created when the status of a deposit or withdrawal initiated through [PSS-connected](../../integrations/payment-systems#payment-system-service-pss) methods can’t be determined automatically. In such cases, the transaction is assigned the `Assistance` status in the B2CORE Back Office. The admin must review the transaction details and decide whether to continue syncing the status with the external payment system or mark it as failed (for details, refer to [How to process transactions with the Assistance status](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status)). * **Static Deposit Assistance** — a request created when the status of a deposit made through a [static deposit](../finance/static-deposit) method can’t be determined automatically *** **Internal client type** For internal use: the internal category assigned to a client. *** **Status** The current status of a request: * **Pending** — the request was submitted but has not yet been resolved by the administrator * **Approved** — the request was approved by the administrator * **Rejected** — the request was rejected by the administrator * **Canceled** — the request was canceled *** **Verification Level** The verification level obtained by a client. *** **Date** The date and time when a request was submitted. *** **Processing date** The date and time when a request was resolved (approved or rejected), helping you evaluate the processing time by comparing it to when the request was created. *** **Processed by** The email address of the [Back Office user](../system/users/users) who resolved the request. *** **Country** The client's country. *** **Account number** The identifier of a client’s account. *** **Amount** The transaction amount. *** **Currency** The transaction currency. *** **Method** The method used to [deposit](../system/deposit-system#deposit-methods) or [withdraw](../system/payout-system#payout-methods) funds. *** **Transaction ID** The transaction identifier in the system. *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **Dealing approved** An internal status indicating whether a transaction was approved by the Finance Department. *** **Compliance approved** An internal status indicating whether a withdrawal has passed a compliance check. To view request details, click the **Edit** button. ## Details [#details] In the request details, you can view all relevant information associated with the specific request type. The **Transaction monitoring** section displays the results (`green` or `red`) of the KYT check for deposits and withdrawals, performed via **SumSub**. To use this feature, you must have an active **SumSub** account with **Fraud Prevention** enabled and properly configured, along with the corresponding **SumSub** external connection enabled in the B2CORE Back Office. The following actions are available in the request details: Click the **Add comment** button to add a comment to a request. Click the **Options** button to set the color with which a request is highlighted in the list. The admins with the `Update requests` permission can also check a transaction by clicking the **Audit** button. The system will then summarize all incoming transactions on a corresponding account and show a notification if a significant discrepancy is found on the balance. For some payment systems, it is also possible to change the amount to be deposited or withdrawn directly, by editing a corresponding request. To resolve a request, click **Approve** or **Reject**. **See also** [Resolutions](../system/requests#resolutions) [How to create a request resolution type](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution-type) [How to create a request resolution](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution) [How to enable requests for exchanges in specific currency pairs](../../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs) [How to update rates in exchange requests](../../how-to-articles/manage-currencies/how-to-update-rates-in-exchange-requests) On this page, you can view and manage the categories which can be assigned to clients. The following data is provided about each client category: **ID** The category identifier. *** **Name** The category name. *** **Caption** The category description. *** **Enabled** If `Yes`, this client category is available for selection. *** **Default** If `Yes`, this is the default category that is assigned to new clients. *** **Num. of clients** The total number of clients in this category. On this page, you can view a list of created product groups and create new ones. Product groups help organize multiple [products](products) into categories and determine how they are displayed to clients in the B2CORE UI, ensuring a structured presentation. ## General information [#general-information] The following information is provided about each product group: **ID** The identifier of the product group. *** **Priority** The priority index assigned to the product group. *** **Caption** The product group caption. This caption will be assigned to the product group in the Back Office and will be visible to clients in the B2CORE UI. To view product group details, click the **Edit** button. ## Details [#details] On the details page, you can view the following additional information: **Description** The description of the product group. *** **Type** The type of the product group. The possible types include the `Default`, `Payment account` types, and others. On this page, you can view a list of configured platforms and create new ones. Platforms in B2CORE facilitate connections to external systems and trading platforms, enabling seamless data transmission and request processing, ensuring that data in B2CORE stays synchronized with the data on the respective external platform. ## General information [#general-information] The following information is provided about each platform: **ID** The platform identifier. *** **Caption** The platform name displayed on other Back Office pages. *** **Name** The unique platform name used in the Back Office. *** **Platform** The name of the platform to which the connection is configured. *** **Status** The platform status: `Enabled` or `Disabled`. To view platform details, click the **Edit** button. ## Details [#details] The following information is provided on the details page: **Name** The unique platform name used in the Back Office. *** **Caption** The platform name displayed on other Back Office pages. *** **Short caption** The short name of the platform. This field is optional. *** **Status** The platform status: `Enabled` or `Disabled`. *** **Demo** Indicates if the platform is intended for demo or live accounts: * `Yes` — the platform is intended for *demo* accounts. Clients can open demo accounts via the B2CORE UI using the products created based on the given platform. * `No`— the platform is intended for *live* accounts. Clients can open live accounts via the B2CORE UI using the products created based on the given platform. *** **Income transfer request** Specifies if client requests for transfers to platform accounts via the B2CORE UI are enabled: * `Yes` — client requests for transfers to platform accounts via the B2CORE UI are enabled. * `No` — transfers to platform accounts via the B2CORE UI are made without requests. *** **Outcome transfer request** Specifies if client requests for transfers from platform accounts via the B2CORE UI are enabled: * `Yes` — client requests for transfers from platform accounts via the B2CORE UI are enabled. * `No`— transfers from platform accounts via the B2CORE UI are made without requests. *** Depending on the platform, either the **Settings** or **External connection** section is displayed. Both sections are used to establish connections to respective platforms. The set of connection parameters depend on the platform. **External connection** In this section, you can click the **Set connection** button to select for the platform a connection that has been previously configured in **Systems** > **External connections**, or use the **Click to edit connection** button to navigate to the connection configuration and modify the connection parameters. *** **Settings** In this section, specify the connection parameters required for the platform. *** **Test connection** Click the **Test connection** button to validate the connection settings. The green button indicates that the connection has been configured properly. The red button indicates that some connection settings aren’t valid. The errors displayed below the button specify the connection issues that need to be addressed. ## MetaTrader 4/5 [#metatrader-45] Connections to MT4 and MT5 are established within B2CORE via the internal WEBAPI service, eliminating the need to create connections in **System** > **External Connections**. The following settings must be specified in the platform details for MT4 and MT5: ### MetaTrader connection [#metatrader-connection] **Host** The IP address and port number for accessing the MT server. *** **Login** The login used to access the MT Manager. *** **Password** The password used to access the MT Manager. *** ### WEBAPI connection [#webapi-connection] The WEBAPI connection settings are provided by your account manager. **Host** The domain name and port number for accessing WEBAPI. *** **Access token** The token used to access WEBAPI. *** ### **Settings** [#settings] **Max inactivity days** The number of days after which a trading account will be archived if no activity is detected during that period. *** **Use number settings** The setting is disabled by default. *** **Web Terminal URL** The URL of the web trading terminal. When specified, the **Trade** button will appear on account cards for the respective platform in the B2CORE UI and mobile app, enabling clients to navigate to trading with a single click (for details, refer to [How to enable one-click trading access from the B2CORE UI and mobile app](../../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals)). *** **Use reporting on the platform** The setting is enabled by default. If enabled, the MT4/5 account will be created with the **Send reports** option activated on the respective platform. If disabled, this option will be inactive for accounts created via B2CORE. **See also** [How to integrate MetaTrader 4/5](../../how-to-articles/manage-platforms/how-to-intergate-mt) On this page, you can view a list of all products and general information about them. Products in B2CORE define the process of creating wallets and trading accounts in B2CORE and on respective external platforms, while also specifying the settings applied to those accounts. Each product is linked to a [platform](platforms) in B2CORE, which in turn connects to an external platform, such as MetaTrader 4/5, cTrader, or other supported platforms, ensuring seamless data synchronization. ## General information [#general-information] The following information is provided about each product: **ID** The product identifier that is automatically generated by the system. *** **Name** The product name used in the Back Office. *** **Caption** The product name that is displayed in the B2CORE UI. *** **Platform** The [platform](platforms) on which the product is available. *** **Group** The [group](groups) in which the product is included. *** **Type** The type of the product. The product can be of one of the following types: * **Personal** * **Trade** * **Demo** * **Partner** * **External** *** **Currency** One or more currencies added for the product. *** **Status** The product status: * **Disabled** — the product is inactive and is not displayed in the B2CORE UI. Product-associated accounts cannot be created. All new products are assigned this status upon creating. * **Present** — the product is not displayed in the B2CORE UI. Product-associated accounts can be created only in the Back Office. * **Hidden** — the product is not displayed in the B2CORE UI. Product-associated accounts can be created only in the Back Office. * **Enabled** — the product is active. * **Default** — the product is displayed in the B2CORE UI. Product-associated accounts can be created in the Back Office or in the B2CORE UI. To view the product details, click the **Edit** button. When creating a product, you also specify the **Factory** value: set it to `100` to denominate product-associated accounts in currency subunits (for example, cents); otherwise, set it to `1`. The **Factory** value of `100` can't be used with platforms that don't support accounts in currency subunits, such as **eWallets**, **PrimeXM**, **Centroid**, and **OneZero**. ## Details [#details] The details page is grouped into three tabs: **Info**, **Currencies**, and **Detailed information**. ### Info tab [#info-tab] The tab contains general product settings: **Leverage** One or more leverage ratios assigned to the product. *** **Default leverage** The default leverage ratio assigned to product-associated accounts that are created after the **Autocreation on login** option is triggered. *** **Group rights** A group of permissions for the selected users. *** **Rights** and **Default account rights** Permissions assigned to accounts opened based on the product. The default rights are applied to accounts that are automatically created when clients sign in to the B2CORE UI for the first time. To create accounts upon initial sign-in to the B2CORE UI, enable the option **Autocreation on login**. For a list of possible permissions, refer to [Product permissions](../references/product-permissions). *** **Max accounts** The maximum number of accounts that a client can create for each currency added to the product. For example, if `USD` and `EUR` are added as currencies to a product and the **Max accounts** option is set to **1**, the client can create one account in `USD` and one account in `EUR` based on this product. * To apply no limits on the number of accounts that can be created based on the product, enter **-1**. * To forbid clients to create accounts, specify **0**. The **Max accounts** limit is applied independently to each product and doesn't overlap with limits set for other products. *** **Mail** The settings for email notifications. Possible option: * **Default** or **Send** — to automatically send email notifications to clients when new trading accounts are created, including credentials and details needed to start trading. * **Don't send** — to disable email notifications for new accounts. For example: * For **MT** products, use **Default** and the `accountCreated` template in the **Mail template** field. * For **cTrader** products use **Don't send** to prevent email notifications when creating cTrader accounts through B2CORE. This is because all cTrader accounts are linked to a single cTrader ID, with one password for that ID. *** **Mail template** The email notification template. *** **Start amount**\ *Applicable only for demo accounts* The initial balance on demo accounts. *** **Priority** The sequence number of the product in the list. *** **Agreement link** A link to a document to which a client must consent in order to open an account via the B2CORE UI. *** **Link info** A link to a resource providing additional information about a product, which a client can click when creating an account via the B2CORE UI. *** **Request required** If `Yes`, an administrator approval in the Back Office is required to open a new account in the B2CORE UI. *** **Min deposit amount (USD)** The minimum deposit amount, in USD, required for accounts opened based on the product. A client can deposit the entire amount at once or can make several deposits to add the required amount to the account. After the minimum deposit requirement is met, the account becomes available to the client. *** **Autocreation on login** If `Yes`, a product-associated account is created automatically for each client upon initial sign-in to the B2CORE UI. *** **Account number prefix**\ *Applicable only for DXtrade products* The prefix added to the beginning of DXtrade account numbers, which helps distinguish, for example, live and demo accounts or accounts belonging to different brands within one DXtrade infrastructure. The maximum prefix length is 14 characters. The prefix is applied only to new accounts created based on the product. Existing accounts remain unchanged. *** **First transfer activation**\ *Applicable only for MT5 products* If `Enabled`, MT5 accounts are created without the **Trade enabled** permission. This permission is granted to clients upon the first successful transfer to the account. *** **Agent account**\ *Applicable only for MT products* The number of the agent account associated with the product. An agent account is a special non-trading account on MT4/5 used for IB and partner commission calculations, when IB logic is managed on the MT4/5 server instead of using [B2CORE IB](https://docs.ib.b2core.b2broker.com/). When specified in the product settings, the agent account will be applied to and displayed in accounts created based on the product on the corresponding MT4/5 platform. *** **Account type**\ *Applicable only for cTrader products* The account type: Hedged or Netted. *** **Margin calculation type**\ *Applicable only for cTrader products* The type of total margin requirements per symbol applied to cTrader accounts upon creation. This type can’t be changed after the account has been created. Possible options: * **Max** — total margin requirements per symbol are the maximum margin requirements from all long and short positions of that symbol * **Sum** — total margin requirements per symbol are the sum of all margin requirements of all positions of that symbol * **Net** — total margin requirements per symbol are the difference between the margin requirements of all long and short positions of that symbol If no margin calculation type is selected, the default cTrader type will be applied. *** The fields **Min account number**, **Max account number**, and **Last number** aren't available for product configuration by default. They can be enabled upon request through your account manager and the B2CORE development team. **Min account number**\ *Applicable only for MT products* The minimum account number that can be assigned to accounts created on the corresponding MT4/5 platform via B2CORE, whether through the Back Office, B2CORE UI, or mobile app. *** **Max account number**\ *Applicable only for MT products* The maximum account number that can be created on the corresponding MT4/5 platform, via B2CORE, whether through the Back Office, B2CORE UI, or mobile app. Together, the **Min account number** and **Max account number** options define the range within which account numbers are assigned to new accounts created on the corresponding MT4/5 platform via B2CORE. *** **Last number**\ *Applicable only for MT products* Displays the number of the most recently created account on the corresponding MT4/5 platform via B2CORE. This value is updated automatically as new accounts are created through B2CORE until the specified **Max account number** is reached. Use this field to track the current position in the account numbering sequence. You can edit the **Last number** filed to specify the correct last account number if one or more accounts were created directly on the platform rather than via B2CORE. When new accounts are created via B2CORE, the account number is calculated as `Last number + 1` to avoid using an already existing number. If the generated number already exists, B2CORE will attempt to increment it by one and retry, up to **four times**. After four failed attempts, an error will be displayed, which must be resolved manually. ### Currencies tab [#currencies-tab] The tab contains a list of product currencies for multi-currency accounts: **ID** The product currency identifier. *** **Currency** The alphabetic code of the currency *** **Caption** The currency name displayed in the B2CORE UI. *** **Status** The currency status in the product: **Enabled** or **Disabled**. ### Actions [#actions] Click the **Actions** button in the upper-right page corner to set the following restrictions for the product account: **Country restrictions** Grant or restrict access to the product account by country: * Select **Type** — **Deny only** or **Allow only**. * From the **Rules** dropdown, select the name of the country from which the access to the account is allowed or restricted. * Click **Save**. *** **Client type restriction** Grant or restrict access to the product account by client type: * Select **Type** — **Deny only** or **Allow only**. * From the **Rules** dropdown, select the client type. * Click **Save**. *** **Verification Auto-Create** Grant or restrict access to the product account by the verification level: * Select **Type** — **Deny only** or **Allow only**. * From the **Rules** dropdown, select the client verification level. * Click **Save**. *** **Introducing broker restrictions** Grant or restrict access to the product for the clients of a particular IB partner: * Select **Enabled** — **Yes** or **No**. * Select **Type** — **Allow only** or **Deny only**. * In the **Rules** field, specify the client identifier assigned to the IB partner. You can add one or more clients to the list. * Click **Save**. If you select the **Allow only** option, you *grant* access to the product only to the IB clients of the specified partners. The IB clients of other partners cannot access this product. If you select the **Deny only** option, you *restrict* access to the product only for the IB clients of the specified partners. The IB clients of other partners can access this product. **See also** [How to create a wallet](../../how-to-articles/manage-products/how-to-create-a-wallet) On the **Rights** page, you can view a list of permission groups configured for products, and create new groups. A permission group includes a set of permissions that can be assigned to [products](products). When configuring product settings, select a permission group to assign the product all the permissions included in this group. ## General information [#general-information] The following information is provided about each permission group: **ID** The identifier of the permission group. *** **Name** The name of the permission group. *** **Status** If **Enabled**, the permission group can be selected in the **Group rights** field on the product details page. To view permission group details, click the **Edit** button. ## Details [#details] The following additional information is provided about each permission group: **Rights** A list of the permissions included in the permission group. ## Providers [#providers] On this page, you can view a list of connections to SMTP service providers and configure new connections. It's important to select SMTP providers that offer unrestricted daily email sending, such as [Mailchimp](https://mailchimp.com/), [SendGrid](https://sendgrid.com/), or [Mailgun](https://www.mailgun.com/). **Unsuitable SMTP providers** Providers that impose daily email sending limits aren't suitable for SMTP configuration. These services are typically designed for personal or small-scale usage and can't meet the demands of extensive mailing lists. Examples of such providers include: Gmail, Yahoo Mail, Outlook (Hotmail), iCloud Mail, AOL Mail, Zoho Mail (free version), Yandex Mail, Proton Mail, GMX Mail, or Mail.ru. ### General information [#general-information] The following information is provided about each SMTP connection: **ID** The identifier assigned to the connection. *** **Caption** The named assigned to the connection in the Back Office. *** **Driver** The driver used for sending emails (smtp). *** **Host** The SMTP host. *** **Port** The SMTP port number. *** **Username** The SMTP username that is used for authentication. *** **Send from** The sender’s email address displayed to your email recipients. *** **Send from name** The sender’s name displayed to your email recipients. **See also** [How to configure SMTP](../../how-to-articles/manage-mailing-options/how-to-configure-smtp) *** **Encryption** The encryption protocol used to securely communicate with the SMTP service provider. Possible options: * TSL * SSL *** **Enabled** The connection status. If `true`, the connection is enabled; otherwise, `false`. If the only connection to an SMTP service provider is configured, it can’t be disabled. To view the connection details, click the **Edit** button. ### Details [#details] On the details page, the masked **Password** field is displayed in addition to the general information. To validate the connection settings, click the **Test connection** button. A green checkmark displayed on the button indicates that the connection has been configured properly. ## Queue [#queue] On this page, you can view the queue of unsent emails and delete them if necessary. **ID** The email identifier in the system. *** **Email** The email address. *** **Subject** The email subject. *** **Last attempt date** The date of the last attempt to send the email. *** **Next attempt date** The date of the next attempt to send the email. *** **Attempts count** The number of attempts to send the email. *** **Status** The status indicating the result of an email send attempt. *** **Reason** The reason for an unsuccessful attempt. ## Templates [#templates] On this page, you can view a list of email templates used for system mailing and override them if necessary. **Name** The template name. *** **Template ID** The template identifier in the system. *** **Recipient** The recipient type for which the template is used. *** **Enabled** Indicates whether the template is enabled. *** **Status** Indicates whether the default template is used or has been overridden. *** **Last Modified** The date and time when the template was last modified. To customize a template, click the **Override** button. ## Template Chunks [#template-chunks] On this page, you can view a list of reusable email template parts — layouts and chunks (such as the header and footer) — that are shared across email templates, and override them if necessary. **Name** The name of a layout or chunk. *** **Type** The type of the template part: `Layout` or `Chunk`. *** **Status** Indicates whether the default template part is used or has been overridden. *** **Last Modified** The date and time when the template part was last modified. To customize a layout or chunk, click the **Override** button. ## Log [#log] On this page, you can view the mailing log. **ID** The email identifier in the system. **Active queue ID** The identifier of the queue in which the email is included. **Email** The client email address. **Subject** The email subject. **Attempt date** The date and time of the last attempt to send the email. **Status** The email delivery status (the available options: IN PROGRESS, FAIL, and SUCCESS). **Reason** The reason why the email delivery failed. On this page, you can view all configured announcements and create new ones. Announcements can be **required**, blocking further interaction with the B2CORE UI until clients perform the required action, or **optional**, which are displayed when clients clicks the **Announcements** icon in the topbar of the B2CORE UI. ## General information [#general-information] The following information is provided about each announcement: **ID** The announcement identifier. *** **Type** The announcement type indicating whether the announcement requires client action: * **Required** — an announcement includes a button and blocks further interaction with the B2CORE UI until the client clicks the button. * **Optional** — an announcement is displayed upon clicking the **Announcements** icon in the topbar of the B2CORE UI and doesn't require client action. *** **Title** The announcement title. *** **Text** The announcement body text. *** **Button Text**\ *Applicable only to announcements of the Required type* The button label. *** **Targeted Emails** A list of client email addresses to whom the announcement will be shown. *** **Enabled** If set to `Yes`, the announcement is active and displayed to targeted clients. To view the announcement details, click the **Edit** button. ## Details [#details] On the details page, you can view and edit the announcement fields, including: **Button Text** The text displayed on the button shown in the announcement. *** **Button URL** The URL to which clients are redirected after clicking the button displayed in the announcement. For announcements of the **Optional** type, the **Close** button is shown. If a button URL is specified, clients will be redirected to that URL when they click the **Close** button. *** **Due to Date** The date until which the announcement is displayed to clients. Detailed information also contains the additional **Announcement reactions** section. This section lists clients who interacted with the announcement, including: * Clients who clicked the button (for announcements of the **Required** type). * Clients who opened the announcement by clicking the **Announcements** icon in the topbar of the B2CORE UI (for announcements of the **Optional** type). * The date and time of each interaction. **See also** [How to create an announcement](../../how-to-articles/manage-advertising-options/how-to-create-an-announcement) On this page, you can view a list of configured banners and create new ones. Use banners for advertising or informing your clients about important news, events, or service updates. You can create multiple banners and display them on various pages of the B2CORE UI and in the mobile app or mobile browsers. You can add a button containing a URL to an external resource onto a banner. Upon clicking the button, the specified URL is opened. Banners can be configured to display to clients based on selected **countries**, **verification levels**, **client types**, and **jurisdictions**. ## General information [#general-information] The following information is provided about each banner: **ID** The banner identifier. *** **Caption Light** The banner title specified for the light theme. *** **Caption Dark** The banner title specified for the dark theme. Specifying banner titles is optional. You can leave these fields empty and create a banner without a title. *** **Created at** The date and time when a banner was created. *** **Created by** The email of a Back Office user who created a banner. *** **Banner URL** The URL tail defining a page on which a banner is displayed in the B2CORE UI (for example, `/dashboard`, `/wallets`, `funds/deposit`, or other). In the mobile app, all banners will be displayed at the top of the **Home** screen. *** **Banner Priority** The order in which banners are displayed in the B2CORE UI or mobile app if more than one banner is configured. *** **Banner Type** The banner type: **Desktop** or **Mobile**. *** **Enabled** If `Yes`, a banner is displayed to clients in the B2CORE UI or mobile app; otherwise, `No`. To view banner details, click the **Edit** button. ## Details [#details] On the details page, you can switch between the following tabs: **Banner** On this tab, you can adjust banner settings. The settings available for desktop and mobile banner types are different. *** **Light** On this tab, you can adjust banner settings for the light theme. *** **Dark** On this tab, you can adjust banner settings for the dark theme. To apply country or verification level restrictions to the banner, click the **Actions** button in the upper-right page corner, and then select one of the following options: * **Country restrictions** — to display the banner only to clients from specific countries. * **Verification level restriction** — to display the banner only to clients with specific verification levels. **See also** [How to create a banner](../../how-to-articles/manage-advertising-options/how-to-create-a-banner) [How to restrict banner display by country and verification level](../../how-to-articles/manage-advertising-options/how-to-create-a-banner#how-to-restrict-banner-display) On this page, you can view a list of available widgets and customize their display on the **Dashboard** page of the B2CORE UI. **ID** The identifier of the widget in the system. *** **Caption** The widget name. *** **Order** The sequence number of the widget in the B2CORE UI. *** **Sort Actions** The arrow buttons in this column are used to change the order of the widgets (using sequence numbers in the **Order** column). *** **Show by default** Indicates whether a widget is displayed on the client dashboard by default. *** **Delete** If the toggle is on, the widget in the B2CORE UI has a close button to temporarily close the widget (until the page is refreshed or the **Dashboard** is reset). **See also** [How to configure the default Dashboard](../../how-to-articles/manage-advertising-options/how-to-configure-the-default-dashboard) [How to add Ticker Widget symbols to the Dashboard](../../how-to-articles/manage-advertising-options/how-to-add-ticker-widget-symbols-to-the-dashboard) On this page, you can customize the menu displayed to your clients in the B2CORE UI, including the option to add custom menu items used to redirect clients to third-party external resources or web pages for additional functionality. To view a list of available menu items, click the **eye** icon located in the **General** row. ## General information [#general-information] The following information is provided about each menu item: **ID** The identifier of a menu item. *** **Name** The menu item name used in the Back Office. *** **Caption** The menu item name displayed in the B2CORE UI. *** **Type** The type of a menu item: * **default** — a pre-defined menu item associated with specific B2CORE functionality. These items can't be removed but can be hidden from the menu in the B2CORE UI or mobile app. * **custom** — a custom menu item that redirects clients to a specified URL for additional functionality. These items can be removed or hidden from the menu in the B2CORE UI and mobile app. *** **New** If `Yes`, a menu item is marked with the "New" label in the B2CORE UI. *** **Visible** Indicates whether a menu item is visible or hidden in the B2CORE UI: * The **active toggle** means that a menu item is visible in the B2CORE UI menu. * The **inactive toggle** means that a menu item is hidden from the B2CORE UI menu. To change the order in which menu items are displayed in the B2CORE UI, drag and drop them in the required order. To view menu item details, click the **Edit** button. ## Details [#details] On the details page, you can configure the following options: **Verification level allowance** A list of [verification levels](../verification/levels), indicating that a menu item is visible only to clients that obtained the specified levels. *** **Client Type Allowance** A list of [client types](../clients/types), indicating that a menu item is visible only to clients that are assigned the specified types. **See also** [How to configure a menu in the B2CORE UI](../../how-to-articles/manage-advertising-options/how-to-configure-a-menu-in-the-b2core-ui) [How to add custom menu items](../../how-to-articles/manage-advertising-options/how-to-add-custom-menu-items) The following statuses can be assigned to client requests: * **Pending** — identifies that a request was sent by a client but hasn't yet been processed by the admin. * **Approved** — identifies that a request was approved by the admin. * **Rejected** — identifies that a request was rejected by the admin. The following statuses can be assigned to client profiles: * **Active** — identifies a normal state. A client can sign in to the B2CORE UI. * **Inactive** — identifies registration issues. A client cannot sign in to the B2CORE UI. * **Banned** — identifies that a client is prohibited to sign in to the B2CORE UI. * **Deleted** *(deprecated)* — this status is no longer in use and shouldn’t be assigned. The following is a list of pre-configured email types used to notify clients and [Back Office users](../system/users/users), such as admins or managers, about specific system events. Each type is linked to an email template that can be customized in multiple languages and is used to send notifications via email. For every email type, usage conditions are specified in the **Description** column. For email types related to notifications about events on B2COPY, refer to the [B2COPY product documentation](https://docs.b2copy.b2broker.com/admin-guide/configure-b2copy/use-email-templates-to-notify-clients-about-important-events). ## To clients [#to-clients] The following is a list of email types used to notify clients: ## To Back Office users [#to-back-office-users] The following is a list of email types used to notify Back Office users, such as admins or managers: The following is a list of event types supported for delivering [event notifications](../system/event-notifications) to [Back Office users](../system/users/) via email, SMS, Slack, or Telegram. If pre-configured templates for sending notifications via email, Slack, or Telegram are available for a specific event type, the template names are indicated in the **Template** column. For event types without pre-configured templates, custom templates should be created. Following is a list of permissions that can be assigned to [products](../products/products) when configuring product settings in the Back Office. * **Enabled** — if selected, the accounts created based on the product are enabled. * **Trade enabled** — if selected, clients can trade on the accounts. * **Deposit** — if selected, clients can make deposits to the accounts. * **Withdraw** — if selected, clients can make withdrawals from the accounts. * **Visible** — if selected, the accounts are displayed in the B2CORE UI or in the mobile app. * **Transfer deposit** — if selected, clients can transfer funds to the accounts. * **Transfer withdraw** — if selected, clients can transfer funds from the accounts. * **Exchange** — if selected, clients can make exchanges on the accounts. * **Create from TR denied** — if selected, clients can’t create accounts in the B2CORE UI or in the mobile app; however, they can use the accounts that were created automatically after their first sign in to the B2CORE UI or created for them by the admin via the Back Office. The following is a list of cryptocurrency payment methods supported in B2CORE. In method names consisting of two codes separated by a dash, such as `USDT-ETH`, the first code indicates a cryptocurrency in which transactions are made and the second code indicates a blockchain on which transactions are initiated and stored. For each method, you can find an icon that can be displayed as the icon of a deposit or payout method in the B2CORE UI. The icons are used to easily identify payment methods. To add an icon to a [deposit](../system/deposit-system#deposit-methods) or [payout method](../system/payout-system#payout-methods), enter the icon name, such as `usdt-eth`, in the **Icon** field when configuring the method. ## Coins [#coins] | Icon | Method | Icon name | | -------------------------------------------------- | -------- | ------------ | | | BCH | bch | | | BTC | btc | | | DASH | dash | | | DOGE | doge | | | ETH | eth-etherium | | | ETH-ARB | eth-arb | | | ETH-BASE | eth-base | | | LTC | ltc | | | TRX | trx | | | XLM | xlm-stellar | | | XMR | xmr | | | XRP | xrp | | | ZEC | zec | ## Stablecoins [#stablecoins] | Icon | Method | Icon name | | --------------------------------------------------- | ------------- | ------------- | | | BUSD-BSC | busd-bsc | | | BUSD-T-BSC | busd-t-bsc | | | BUSD-ETH | busd-eth | | | DAI-BSC | dai-bsc | | | DAI-ETH | dai-eth | | | USDC-ARB | usdc-arb | | | USDC-AVAX | usdc-avax | | | USDC-BSC | usdc-bsc | | | USDC-ETH | usdc-eth | | | USDC-SOL | usdc-sol | | | USDC-TRX | usdc-trx | | | USDP-BSC | usdp-bsc | | | USDP-ETH | usdp-eth | | | USDT-ARB | usdp-arb | | | USDT-AVAX | usdt-avax | | | USDT-BNB | usdt-bnb | | | USDT-BSC | usdt-bsc | | | USDT-ETH | usdt-eth | | | USDT-OMNI | usdt-omni | | | USDT-Optimism | usdt-optimism | | | USDT-SOL | usdt-sol | | | USDT-TON | usdt-ton | | | USDT-TRX | usdt-trx | | | UST-BSC | ust-bsc | | | UST-ETH | ust-eth | | | TUSD-ETH | tusd-eth | ## Tokens [#tokens] | Icon | Method | Icon name | | ------------------------------------------------ | ---------- | ---------- | | | 1INCH-BSC | 1inch-bsc | | | 1INCH-ETH | 1inch-eth | | | AAVE-ETH | aave-eth | | | AKRO-ETH | akro-eth | | | ALPHA-ETH | alpha-eth | | | ALPHA-BSC | alpha-bsc | | | AMP-ETH | amp-eth | | | AUDIO-ETH | audio-eth | | | AXS-ETH | axs-eth | | | BADGER-ETH | badger-eth | | | BAL-ETH | bal-eth | | | BAND-BSC | band-bsc | | | BAND-ETH | band-eth | | | BAT-BSC | bat-bsc | | | BAT-ETH | bat-eth | | | BZRX-ETH | bzrx-eth | | | CAKE-BSC | cake-bsc | | | CEL-ETH | cel-eth | | | CHR-ETH | chr-eth | | | CHZ-ETH | chz-eth | | | COMP-ETH | comp-eth | | | CRV-ETH | crv-eth | | | ENJ-ETH | enj-eth | | | FET-ETH | fet-eth | | | FTM-BSC | ftm-bsc | | | FTM-ETH | ftm-eth | | | FTT-ETH | ftt-eth | | | GRT-ETH | grt-eth | | | HOT-ETH | hot-eth | | | LEO-ETH | leo-eth | | | LINK-BSC | link-bsc | | | LINK-ETH | link-eth | | | LRC-ETH | lrc-eth | | | MANA-ETH | mana-eth | | | MATIC-ETH | matic-eth | | | MKR-BSC | mkr-bsc | | | MKR-ETH | mkr-eth | | | NU-ETH | nu-eth | | | OCEAN-ETH | ocean-eth | | | OMG-ETH | omg-eth | | | QNT-ETH | qnt-eth | | | RARI-ETH | rari-eth | | | REEF-BSC | reef-bsc | | | REEF-ETH | reef-eth | | | REN-ETH | ren-eth | | | REV-ETH | rev-eth | | | RSR-ETH | rsr-eth | | | SAND-ETH | sand-eth | | | SHIB-ETH | shib-eth | | | SNX-BSC | snx-bsc | | | SNX-ETH | snx-eth | | | SRM-ETH | srm-eth | | | SUSHI-BSC | sushi-bsc | | | SUSHI-ETH | sushi-eth | | | SXP-BSC | sxp-bsc | | | SXP-ETH | sxp-eth | | | TEL-ETH | tel-eth | | | UNI-BSC | uni-bsc | | | UNI-ETH | uni-eth | | | YFI-BSC | yfi-bsc | | | YFI-ETH | yfi-eth | | | ZRX-ETH | zrx-eth | The tables below list the crypto- and fiat currencies supported in B2CORE. The ISO code, Alpha code, decimal precision, and icon (if available) are specified for each currency. The icons are used for graphical representation of currencies in the B2CORE UI. ## Fiat [#fiat] | Icon | ISO code | Alpha code | Precision | Name | | ----------------------------------------------------------- | -------- | ---------------- | --------- | ---------------------------------------------------------- | | | 8 | ALL | 2 | Albanian lek | | | 12 | DZD | 2 | Algerian dinar | | | 32 | ARS | 2 | Argentine peso | | | 36 | AUD | 2 | Australian dollar | | | 44 | BSD | 2 | Bahamian dollar | | | 48 | BHD | 3 | Bahraini dinar | | | 50 | BDT | 2 | Bangladeshi taka | | | 51 | AMD | 2 | Armenian dram | | | 52 | BBD | 2 | Barbados dollar | | | 60 | BMD | 2 | Bermudian dollar | | | 64 | BTN | 2 | Bhutanese ngultrum | | | 68 | BOB | 2 | Boliviano | | | 72 | BWP | 2 | Botswana pula | | | 84 | BZD | 2 | Belize dollar | | | 90 | SBD | 2 | Solomon Islands dollar | | | 96 | BND | 2 | Brunei dollar | | | 104 | MMK | 2 | Myanmar kyat | | | 108 | BIF | 0 | Burundian franc | | | 116 | KHR | 2 | Cambodian riel | | | 124 | CAD | 2 | Canadian dollar | | | 132 | CVE | 0 | Cape Verde escudo | | | 136 | KYD | 2 | Cayman Islands dollar | | | 144 | LKR | 2 | Sri Lankan rupee | | | 152 | CLP | 0 | Chilean peso | | | 156 | CNY (alias: CNH) | 2 | Chinese yuan | | | 170 | COP | 2 | Colombian peso | | | 174 | KMF | 0 | Comoro franc | | | 188 | CRC | 2 | Costa Rican colon | | | 191 | HRK | 2 | Croatian kuna | | | 192 | CUP | 2 | Cuban peso | | | 203 | CZK | 2 | Czech koruna | | | 208 | DKK | 2 | Danish krone | | | 214 | DOP | 2 | Dominican peso | | | 222 | SVC | 2 | Salvadoran colón | | | 230 | ETB | 2 | Ethiopian birr | | | 232 | ERN | 2 | Eritrean nakfa | | | 238 | FKP | 2 | Falkland Islands pound | | | 242 | FJD | 2 | Fiji dollar | | | 262 | DJF | 0 | Djiboutian franc | | | 270 | GMD | 2 | Gambian dalasi | | | 292 | GIP | 2 | Gibraltar pound | | | 320 | GTQ | 2 | Guatemalan quetzal | | | 324 | GNF | 0 | Guinean franc | | | 328 | GYD | 2 | Guyanese dollar | | | 332 | HTG | 2 | Haitian gourde | | | 340 | HNL | 2 | Honduran lempira | | | 344 | HKD | 2 | Hong Kong dollar | | | 348 | HUF | 2 | Hungarian forint | | | 352 | ISK | 0 | Icelandic króna | | | 356 | INR | 2 | Indian rupee | | | 360 | IDR | 2 | Indonesian rupiah | | | 364 | IRR | 2 | Iranian rial | | | 365 | IRT | 2 | Iranian Toman | | | 368 | IQD | 3 | Iraqi dinar | | | 376 | ILS | 2 | Israeli new shekel | | | 388 | JMD | 2 | Jamaican dollar | | | 392 | JPY | 0 | Japanese yen | | | 398 | KZT | 2 | Kazakhstani tenge | | | 400 | JOD | 3 | Jordanian dinar | | | 404 | KES | 2 | Kenyan shilling | | | 408 | KPW | 2 | North Korean won | | | 410 | KRW | 0 | South Korean won | | | 414 | KWD | 3 | Kuwaiti dinar | | | 417 | KGS | 2 | Kyrgyzstani som | | | 418 | LAK | 2 | Lao kip | | | 422 | LBP | 2 | Lebanese pound | | | 426 | LSL | 2 | Lesotho loti | | | 430 | LRD | 2 | Liberian dollar | | | 434 | LYD | 3 | Libyan dinar | | | 440 | LTL | 2 | Lithuanian Litas | | | 446 | MOP | 2 | Macanese pataca | | | 454 | MWK | 2 | Malawian kwacha | | | 458 | MYR | 2 | Malaysian ringgit | | | 462 | MVR | 2 | Maldivian rufiyaa | | | 478 | MRO | 1 | Mauritanian ouguiya | | | 480 | MUR | 2 | Mauritian rupee | | | 484 | MXN | 2 | Mexican peso | | | 496 | MNT | 2 | Mongolian tögrög | | | 498 | MDL | 2 | Moldovan leu | | | 504 | MAD | 2 | Moroccan dirham | | | 512 | OMR | 3 | Omani rial | | | 516 | NAD | 2 | Namibian dollar | | | 524 | NPR | 2 | Nepalese rupee | | | 532 | ANG | 2 | Netherlands Antillean guilder | | | 533 | AWG | 2 | Aruban florin | | | 548 | VUV | 0 | Vanuatu vatu | | | 554 | NZD | 2 | New Zealand dollar | | | 558 | NIO | 2 | Nicaraguan córdoba | | | 566 | NGN | 2 | Nigerian naira | | | 578 | NOK | 2 | Norwegian krone | | | 586 | PKR | 2 | Pakistani rupee | | | 590 | PAB | 2 | Panamanian balboa | | | 598 | PGK | 2 | Papua New Guinean kina | | | 600 | PYG | 0 | Paraguayan guaraní | | | 604 | PEN | 2 | Peruvian Sol | | | 608 | PHP | 2 | Philippine peso | | | 634 | QAR | 2 | Qatari riyal | | | 643 | RUB | 2 | Russian ruble | | | 646 | RWF | 0 | Rwandan franc | | | 654 | SHP | 2 | Saint Helena pound | | | 678 | STD | 2 | São Tomé and Príncipe dobra | | | 682 | SAR | 2 | Saudi riyal | | | 690 | SCR | 2 | Seychelles rupee | | | 694 | SLL | 2 | Sierra Leonean leone | | | 702 | SGD | 2 | Singapore dollar | | | 704 | VND | 0 | Vietnamese đồng | | | 706 | SOS | 2 | Somali shilling | | | 710 | ZAR | 2 | South African rand | | | 728 | SSP | 2 | South Sudanese pound | | | 748 | SZL | 2 | Swazi lilangeni | | | 752 | SEK | 2 | Swedish krona/kronor | | | 756 | CHF | 2 | Swiss franc | | | 760 | SYP | 2 | Syrian pound | | | 764 | THB | 2 | Thai baht | | | 776 | TOP | 2 | Tongan pa’anga | | | 780 | TTD | 2 | Trinidad and Tobago dollar | | | 784 | AED | 2 | United Arab Emirates dirham | | | 788 | TND | 3 | Tunisian dinar | | | 800 | UGX | 0 | Ugandan shilling | | | 807 | MKD | 2 | Macedonian denar | | | 810 | RUR | 2 | Russian ruble | | | 818 | EGP | 2 | Egyptian pound | | | 826 | GBP | 2 | Pound sterling | | | 834 | TZS | 2 | Tanzanian shilling | | | 840 | USD | 2 | United States dollar | | | 858 | UYU | 2 | Uruguayan peso | | | 860 | UZS | 2 | Uzbekistan som | | | 882 | WST | 2 | Samoan tala | | | 886 | YER | 2 | Yemeni rial | | | 901 | TWD | 2 | New Taiwan dollar | | | 931 | CUC | 2 | Cuban convertible peso | | | 932 | ZWL | 2 | Zimbabwean dollarA/10 | | | 933 | BYN | 2 | Belarusian ruble | | | 934 | TMT | 2 | Turkmenistan manat | | | 936 | GHS | 2 | Ghanaian cedi | | | 937 | VEF | 2 | Venezuelan bolívar | | | 938 | SDG | 2 | Sudanese pound | | | 940 | UYI | 0 | Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code) | | | 941 | RSD | 2 | Serbian dinar | | | 943 | MZN | 2 | Mozambican metical | | | 944 | AZN | 2 | Azerbaijani manat | | | 946 | RON | 2 | Romanian leu | | | 947 | CHE | 2 | WIR Euro (complementary currency) | | | 948 | CHW | 2 | WIR Franc (complementary currency) | | | 949 | TRY | 2 | Turkish lira | | | 950 | XAF | 0 | CFA franc BEAC | | | 951 | XCD | 2 | East Caribbean dollar | | | 952 | XOF | 0 | CFA franc BCEAO | | | 953 | XPF | 0 | CFP franc (franc Pacifique) | | | 955 | XBA | | European Composite Unit(EURCO) (bond market unit) | | | 956 | XBB | | European Monetary Unit (E.M.U.-6) (bond market unit) | | | 957 | XBC | | European Unit of Account 9(E.U.A.-9) (bond market unit) | | | 958 | XBD | | European Unit of Account 17(E.U.A.-17) (bond market unit) | | | 959 | XAU | 2 | Gold (one troy ounce) | | | 960 | XDR | | Special drawing rights | | | 961 | XAG | 3 | Silver (one troy ounce) | | | 962 | XPT | 2 | Platinum (one troy ounce) | | | 963 | XTS | | Code reserved for testing purposes | | | 964 | XPD | 2 | Palladium (one troy ounce) | | | 965 | XUA | | ADB Unit of Account | | | 967 | ZMW | 2 | Zambian kwacha | | | 968 | SRD | 2 | Surinamese dollar | | | 969 | MGA | 1 | Malagasy ariary | | | 970 | COU | 2 | Unidad de Valor Real (UVR) (funds code) | | | 971 | AFN | 2 | Afghan afghani | | | 972 | TJS | 2 | Tajikistani somoni | | | 973 | AOA | 2 | Angolan kwanza | | | 975 | BGN | 2 | Bulgarian lev | | | 976 | CDF | 2 | Congolese franc | | | 977 | BAM | 2 | Bosnia and Herzegovina convertible mark | | | 978 | EUR | 2 | Euro | | | 979 | MXV | 2 | Mexican Unidad de Inversion (UDI) (funds code) | | | 980 | UAH | 2 | Ukrainian hryvnia | | | 981 | GEL | 2 | Georgian lari | | | 984 | BOV | 2 | Bolivian Mvdol (funds code) | | | 985 | PLN | 2 | Polish złoty | | | 986 | BRL | 2 | Brazilian real | | | 990 | CLF | 4 | Unidad de Fomento (funds code) | | | 994 | XSU | | SUCRE | | | 997 | USN | 2 | United States dollar (next day) (funds code) | | | 999 | XXX | | No currency | ## Crypto [#crypto] | Icon | ISO code | Alpha code | Precision | Name | | --------------------------------------------------------------- | -------- | ----------------- | --------- | --------------------------------------------------------- | | | 1000 | BTC (alias: XBT) | 8 | Bitcoin | | | 1002 | ETH | 18 | Ethereum | | | 1003 | LTC | 8 | Litecoin | | | 1004 | ETC | 8 | Ethereum Classic | | | 1005 | DASH (alias: DSH) | 8 | DASH | | | 1006 | BCH | 8 | Bitcoin Cash | | | 1007 | XMR | 8 | Monero | | | 1009 | PZM | 8 | Prizm | | | 1010 | XRP | 6 | Ripple | | | 1012 | XEM | 8 | XEM | | | 1015 | TFT | 8 | ThreeFold Token | | | 1018 | ADA | 8 | ADA | | | 1019 | DOGE | 8 | Dogecoin | | | 1020 | ZEC | 8 | Zcach | | | 1021 | XLM | 7 | Stellar | | | 1022 | EOS | 8 | EOS | | | 1023 | BWK | 8 | Bulwark | | | 1025 | NSD | 8 | Nasdacoin | | | 1026 | TRX | 8 | Tron | | | 1027 | FUT | 8 | FutPlayCoin | | | 1029 | MPC | 8 | MediaPlayCash | | | 1995 | XTZ | 8 | Tezos | | | 1996 | WAVES | 8 | Waves | | | 1997 | ICX | 8 | Icon | | | 1999 | BSV | 8 | Bitcoin SV | | | 2000 | B2B (alias: B2BX) | 18 | B2BX | | | 2005 | USDT | 8 | Tether | | | 2006 | EURT | 8 | Tether EUR | | | 2007 | R | 8 | Revain | | | 2008 | OMG | 8 | OmiseGO | | | 2009 | IOST | 8 | IOSToken | | | 2010 | VIU | 8 | Viuly | | | 2011 | EOS Token | 8 | EOS Token | | | 2012 | SRNT | 18 | Serenity | | | 2014 | NEO | 8 | NEO | | | 2016 | BXN | 8 | BITTXN | | | 2018 | DTC | 8 | DateCoin | | | 2020 | OLXA | 2 | OLXA | | | 2021 | PAX | 8 | PAX | | | 2022 | TUSD | 8 | TrueUSD | | | 2023 | GUSD | 8 | Gemini Dollar | | | 2024 | USDC | 8 | USD Coin | | | 2025 | BNB | 8 | Binance Coin | | | 2030 | XGT | 8 | XGT | | | 2032 | HDP | 4 | HedPay | | | 2033 | NADM | 8 | NeoAdam | | | 2034 | NOAH | 18 | NOAHCOIN | | | 2035 | TC | 8 | Titan Coin | | | 2036 | GGC | 18 | GG World Lottery | | | 2037 | SIM | 18 | Simmitri | | | 2038 | CTC | 18 | Catholic Coin | | | 2039 | MYX | 8 | Myoho | | | 2040 | CRAFTR | 18 | CraftR | | | 2041 | XRX | 8 | Global Property Register | | | 2042 | USDQ | 18 | USDQ | | | 2043 | ELLEX | 18 | Ellex Coin | | | 2044 | ANX | 8 | COINANX | | | 2045 | BNX | 8 | BTCNEXT Coin | | | 2046 | BFCL | 18 | BFCL Token | | | 2047 | ERN | 8 | EURON | | | 2048 | NWX | 8 | NIWIX Token | | | 2049 | C3W | 8 | C3 Wallet | | | 2050 | QDAO | 18 | Q DAO | | | 2051 | SPD | 18 | SPINDLE | | | 2053 | ZTX | 18 | Zulu Republic Token | | | 2054 | ITM | 8 | ITADAKI-MASU Coin | | | 2055 | DEC | 8 | Darico Ecosystem Coin | | | 2056 | KRWQ | 8 | KRWQ Stablecoin by Q DAO v1.0 | | | 2057 | NZE | 8 | Nagezeni | | | 2058 | NIOX | 8 | NIOX | | | 2060 | VEST | 8 | VestChain | | | 2061 | BKZ | 8 | Bitkruz Token | | | 2066 | FMT | 8 | Free Market Token | | | 2068 | DAI | 8 | Dai Stablecoin | | | 2070 | AZ | 8 | AZ Token | | | 2071 | B21 | 8 | B21 Token | | | 2075 | PDATA | 8 | PDATA | | | 2077 | BUSD | 8 | Binance USD | | | 2078 | ZVC | 8 | Zeven Coin | | | 2081 | ARBIS | 8 | ARBIS | | | 2083 | BII | 8 | Bitcoin 2 | | | 2084 | BDS | 8 | Bitcoin Dollar Stable | | | 2086 | BWON | 8 | Bitcoin BWON | | | 2087 | BYUN | 8 | Bitcoin BYUN | | | 2088 | NEX | 8 | NEX | | | 2090 | TEX | 8 | TEX | | | 2106 | AKRO | 18 | Akropolis | | | 2107 | ALPHA | 18 | Alpha Finance Lab | | | 2110 | BZRX | 18 | bZx Protocol | | | 2111 | CHR | 6 | Chromia | | | 2113 | MANA | 18 | Decentraland | | | 2114 | FTT | 18 | FTX Token | | | 2115 | LRC | 18 | Loopring | | | 2117 | COMP | 18 | Compound | | | 2121 | RSR | 18 | Reserve Rights | | | 2122 | SRM | 6 | Serum | | | 2123 | SHIB | 18 | SHIBA INU | | | 2126 | SNX | 18 | Synthetix | | | 2128 | SAND | 18 | The Sandbox | | | 2132 | BAND | 18 | Band Protocol | | | 2133 | BAT | 18 | Basic Attention Token | | | 2136 | SUSHI | 18 | SushiSwap | | | 2141 | YFI | 18 | yearn.finance | | | 2146 | FTM | 18 | Fantom | | | 2147 | AXS | 18 | Axie Infinity | | | 2153 | CHZ | 18 | Chiliz | | | 2160 | 1INCH | 18 | 1inch | | | 2161 | OCEAN | 18 | Ocean Protocol | | | 2947 | CAKE | 18 | PancakeSwap | | | 2949 | CRV | 18 | Curve DAO Token | | | 2956 | REN | 18 | Ren | | | 2957 | CEL | 4 | Celsius | | | 2959 | ENJ | 18 | Enjin Coin | | | 2962 | GRT | 18 | The Graph | | | 2964 | AAVE | 18 | Aave | | | 2968 | COVIP | 8 | COVIP | | | 2969 | SCAMUNKNOWN | 8 | Scam ALERT: UNKNOWN status. Audit made by Q DeFi Rating | | | 2970 | SCAMMEDIUMRISK | 8 | Scam ALERT: Medium Risk. Audit made by Q DeFi Rating | | | 2971 | SCAMHIGH | 8 | Scam ALERT: HIGH probability. Audit made by Q DeFi Rating | | | 2972 | NOAHARK | 8 | NOAH’s DeFi ARK v.1 Governance Token | | | 2973 | FLR | 8 | Spark | | | 2974 | FXRP | 8 | Spark | | | 2975 | XYM | 8 | XYM | | | 2976 | QDEFI | 8 | Q DeFi Rating & Governance token v2.0 Token | | | 2977 | T34 | 8 | Platinum Software TECHNOLOGIES | | | 2978 | CNYQ | 8 | CNYQ Stablecoin by Q DAO | | | 2979 | JPYQ | 8 | JPYQ Stablecoin by Q DAO | | | 2980 | MILK2 | 8 | MILK2 Coin | | | 2981 | SHAKE | 8 | SHAKE Coin | | | 2982 | MATIC | 8 | Matic Network | | | 2983 | ERG | 8 | Ergo | | | 2984 | LTCP | 8 | Litecoin PoS | | | 2985 | ZRX | 8 | 0x | | | 2986 | BIP | 8 | Minter | | | 2987 | ATOM | 8 | Cosmos | | | 2988 | GRAM | 8 | Telegram Open Network IOU | | | 2989 | JPYQ | 8 | JPYQ | | | 2990 | NOAHP | 8 | NOAH.platinum | | | 2991 | CC | 8 | Custom Coin | | | 2993 | SPD | 8 | Spindle | | | 2994 | OWC | 8 | ODUWA Coin | | | 2995 | NCER | 0 | NIWIX Certificate | | | 2996 | NWX | 8 | NIWIX Token | | | 2997 | ERN | 8 | EURON | | | 2998 | BFCL | 8 | BFCL Token | | | 2999 | ABBC | 8 | ABBC | | | 3007 | UMA | 18 | UMA Voting Token v1 | | | 3099 | ALICE | 6 | ALICE | The following statuses can be assigned to transactions such as deposits, withdrawals, transfers, internal transfers, and exchanges: * **New** — a transaction was created but hasn’t yet been processed. * **Pending** — indicates either that a transaction request awaits approval from the admin or that some technical issues occurred. * **Hold** *(applicable for withdrawals only)* — a requested withdrawal amount is being put on hold on a client account. * **Hold failed** *(applicable for withdrawals only)* — an error occurred when putting on hold a requested withdrawal amount. * **Refund** *(applicable for withdrawals only)* — after putting on hold a requested withdrawal amount, a transaction wasn’t further processed and the amount was successfully refunded to a client. * **Refund failed** *(applicable for withdrawals only)* — a requested withdrawal amount put on hold on a client account failed to be refunded due to technical issues. * **In progress** — a transaction is being processed. * **Done** — a transaction was successfully completed. * **Partial** — transaction processing wasn’t finished due to technical issues. Such transactions need to be addressed on the [Finance > Transactions](../finance/transactions) page (for details, refer to [How to process transactions with the Partial status](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-partial-status)). * **Assistance** — indicates that the transaction status couldn't be determined automatically and the transaction requires manual action. This status may apply only to deposits and withdrawals initiated through methods connected via [PSS](../../integrations/payment-systems#payment-system-service-pss). The admin must decide whether to continue syncing the status with the external payment system used to process the transaction or mark it as failed (for details, refer to [How to process transactions with the Assistance status](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status)). * **Failed** — a transaction failed due to incorrect parameters. * **Rejected** — a transaction request was rejected by the admin. * **Canceled** — a transaction was canceled by a client. ## Introduction to Savings [#introduction-to-savings] Savings programs offer clients a way to invest their idle funds and earn interest by holding them on savings accounts. These programs provide a passive method to grow their crypto or fiat assets, similar to traditional bank savings accounts. ## Key points [#key-points] * Savings programs can operate based on `Fixed` and `Flexible` strategies. * In a `Fixed` strategy, clients must invest a predefined amount and earn a fixed interest rate throughout the program’s duration. These programs have a set period during which clients must hold their funds, and interest is accrued and paid according to the payment period set in a program. * The `Flexible` strategy allows clients to deposit the minimum required amount or more and make additional deposits. The interest rate is flexible and determined by tiers, which assign rates based on the invested amount. Programs with flexible strategies aren’t limited by time, and interests are accrued daily and paid to clients on the first day of each month. * To subscribe to a savings program, clients must have wallets denominated in the program currency. Earned interests are then paid to the same client wallets. * When clients subscribe to savings programs and invest the required amounts, individual savings plans are created for them, including lists of interest payments. * For both strategies, partial withdrawals are prohibited. Clients can only withdraw the full amount of invested funds, which leads to the termination of their respective savings plans. On this page, you can view a list of savings plans that are created for clients after they subscribe to savings programs. ## General information [#general-information] The following information is provided about each plan: **ID** The plan identifier. *** **Status** The plan status. *** **Strategy** The savings strategy: * `Fixed` — a fixed interest rate * `Flexible` — a flexible interest rate *** **Preset** The identifier of a preset containing settings of the savings program to which a client subscribed. Click the identifier to navigate to the preset details page and view the program settings. *** **Client** The client identifier. Click the identifier to navigate to the client details page and view information about the client. *** **Wallet account number** The identifier of a client wallet to which earned interest is paid. *** **Details** The essential settings (such as the currency, investment amount, admission fee, and cancellation penalty) of the savings program to which a client subscribed. *** **Created** The date and time when a client subscribed to a savings program. To view payment plan details, click view-button. ## Details [#details] On the details page, you can view settings of the savings program to which a client subscribed. Additionally, a list of interest payments is displayed. For `Fixed` strategies, the payments list includes scheduled payments as well as payments that have been already made to a client wallet. For `Flexible` strategies the list displays only payments made to a client. To view all interest payments made to all clients, go to [Finance > Transactions](../finance/transactions) and filter the **Type** column by **Savings Payment**. The payments in the **Done** status are listed in the **Transactions**. The following information is provided about each interest payment on the details page: **ID** The identifier of a payment transaction. *** **Amount** The interest amount. *** **Due date**\ *Applicable only for Fixed strategies* The date and time when a payment is scheduled to be made. *** **Status** The payment status: * `Scheduled` — indicates that a payment is scheduled but hasn’t yet been made * `Paid` — indicates that a payment has been made to a client * `Cancelled` — indicates that a payment was cancelled because the client decided to withdraw the investment amount before the end of the plan length (for `Fixed` strategies) or before the end of the penalty period (for `Flexible` strategies). *** **Paid date** Only for interest payments to which the `Paid` status is assigned. The date and time when interest was paid to a client. On this page, you can view a list of presets with savings program settings, modify them, and create new ones. Presets can’t be deleted but can be disabled by changing their status to **Inactive**. ## General information [#general-information] The following information is provided about each savings program: **ID** The identifier of a savings program. *** **Name** The unique name of a savings program, which is displayed to clients in the B2CORE UI. *** **Strategy** The savings strategy: * `Fixed` — a fixed interest rate * `Flexible` — a flexible interest rate *** **Currency** The currency of a savings program. To subscribe to the program, your clients must have wallets denominated in the program currency. *** **Status** The status of a savings program. * If **Active**, the card showing details of a savings program is displayed in the B2CORE UI, and clients can subscribe to the program. * If **Inactive**, the card of a savings program isn’t displayed in the B2CORE UI. *** **Created** The date and time when a savings program was created. *** **Last update** The date and time when a savings program was last updated. To view savings program details, click the **Edit** button. ## Details [#details] On the details page, you can view and modify the following program settings: **Name** The unique name of a savings program, which is displayed to clients in the B2CORE UI. *** **Status** The status of a savings program. * If **Active**, the card showing details of a savings program is displayed in the B2CORE UI, and clients can subscribe to the program. * If **Inactive**, the card of a savings program isn’t displayed in the B2CORE UI. *** **Admission fee** The fee amount that a client must pay for participation in a savings program. When subscribing to the program, the admission is deducted from a client wallet denominated in the program currency. The field is optional. If you don’t want to charge the admission fee, enter 0 (zero). *** **Description** The description of a savings program, which is displayed to clients in the B2CORE UI. ### Flexible Preset Details [#flexible-preset-details] **Minimum investment amount** The minimum amount of the initial investment. When subscribing to a program, clients must invest the specified minimum or more. *** **Minimum additional investment amount** The minimum amount that clients can add to the initial investment. The minimum investment and additional investment amounts can be specified as integer or decimal values. *** **Payment period** The frequency of interest payments to a client wallet. Always, `The first day of each month` and can’t be changed. *** **Penalty period (days)** The period, in days, during which a client can’t withdraw their invested funds without a penalty. *** **Penalty type** Defines how the penalty is calculated when a client withdraws invested funds before the end of the penalty period: * **Fixed** — a fixed amount is deducted as a penalty. * **Percentage** — a percentage of the total invested funds is deducted as a penalty. *** **Redeem penalty** For the **Fixed** penalty type, specifies the exact penalty amount charged to a client. The amount must be an integer or decimal value and must be lower than the minimum investment amount. For the **Percentage** penalty type, specifies the percentage of the total invested funds deducted as a penalty. Partial withdrawals *aren't* allowed. Clients are only allowed to withdraw the full amount of their invested funds, which results in the termination of their savings plans. If a client withdraws their invested funds during the the penalty period, the amount that the client can return to their wallet is calculated as follows: `Total invested amount - Penalty amount` ### Tiers [#tiers] In this section, you can view the number of added tiers that are used to apply flexible interest rates. For each tier, the following parameters are specified: **Tier from** The minimum amount that clients must invest to get an interest rate assigned to that tier. This amount indicates the tier’s starting point and the previous tier’s end point. *** **Annual percentage rate** The annual interest rate, in percentage, applied to the tier. There is the tier with the **Tier From** value equal to 0 (zero), which can’t be removed. For example, suppose you have the following tiers configured: * Tier 1: the **Tier from** is 0 and the **Annual percentage rate** is 1% * Tier 2: the **Tier from** is 2,000 and the **Annual percentage rate** is 2% If a client invests 500, that client receives an interest rate of 1%. If the client adds 1,499, bringing the total invested amount to 1,999, the interest rate remains at 1%. Once the client adds more funds and reaches a total investment of 2,000 or more, the interest rate increases to 2%. When modifying tiers, you can select the **Update Savings Plans Tiers** to apply the modified tiers to the savings plans that have already been created based on the selected preset (for details, refer to [Modify tiers for savings programs with Flexible strategies](../../how-to-articles/manage-savings-programs/how-to-create-a-savings-program/configure-the-flexible-strategy-settings#modify-tiers-for-savings-programs-with-flexible-strategies)). ### Fixed Preset Details [#fixed-preset-details] **Plan length (days)** The holding period, in days, during which the investment amount contributed to a savings program must be held. The plan length can be specified with an interval of 30 days, such as 30, 60, 90, and so on. At the end of the plan length, the investment amount is refunded to the client wallet. *** **Payment period (days)** The payment period, in days, indicating how often interest is accrued and paid to a client wallet. The payment period can be specified with an interval of 30 days, such as 30, 60, 90, and so on. *** **Investment amount** The amount that must be contributed to a savings program. When subscribing to the program, the investment amount is deducted from a client wallet denominated in the currency of the savings program. If a client has more than one wallet denominated in the program currency, the client can select a wallet from which the investment amount should be deducted. *** **Interest rate (percent)** The percentage of the investment amount, which is used to calculate interest earned at the end of each payment period. *** **Penalty type** Defines how the penalty is calculated when a client withdraws invested funds before the end of the plan length: * **Fixed** — a fixed amount is deducted as a penalty. * **Percentage** — a percentage of the invested funds is deducted as a penalty. *** **Cancellation penalty** For the **Fixed** penalty type, specifies the exact penalty amount charged to a client. The amount must be an integer or decimal value and must be lower than the investment amount. For the **Percentage** penalty type, specifies the percentage of the investment amount deducted as a penalty. Partial withdrawals *aren't* allowed. Clients are only allowed to withdraw the full investment amount, which results in the termination of their savings plans. If a client withdraws their invested funds during the the penalty period, the amount that the client can return to their wallet is calculated as follows: `Investment amount - Penalty amount` **See also** [How to create a savings program](../../how-to-articles/manage-savings-programs/how-to-create-a-savings-program/) On this page, you can view a list of withdrawal addresses that clients added to their whitelists. After clients enable the **Address Management** option in the B2CORE UI, they can withdraw funds only to the wallet addresses that they added to their whitelists. If the **Address Management** option is disabled, clients can withdraw funds to any wallet address. The following information is provided about each whitelisted withdrawal address: **Client ID** The identifier of a client who added a withdrawal address to their whitelist. *** **Client Email** The client email address. *** **Wallet address** A string value identifying the address of a wallet that is used for withdrawing funds. *** **Destination tag** The destination tag used to identify a transaction recipient. It is applicable only for certain currencies (XRP, XLM, BNB, and XEM). *** **Currency** The currency in which a wallet for withdrawing funds is denominated. On this page, you can view a list of existing black lists and create new ones. **Black lists** block specific IP addresses from accessing certain API endpoints. This feature helps quickly block unwanted traffic or potential attackers at the application level. Blacklisting is an emergency measure and is not as reliable as blocking attackers at the server level. Contact your system administrators. ## General information [#general-information] The following information is provided about each black list: **ID** The identifier of the black list. *** **Route** The API endpoint to which access is prohibited. *** **IP** The blacklisted IP address or subnet mask. *** **Active** The status of the black list. *** **Comment** The reason for blacklisting. *** **Created at** The date and time when the black list was created. *** **Updated at** The date and time when the black list was last updated. ## Examples [#examples] * **Block access to all API endpoints under a certain path** To block access to all endpoints under `/api` for a given IP address, specify `/api/*` in the **Route** field. * **Block access only to specific API endpoints under a certain path** To block access to specific endpoints under a path while allowing access to others, specify the more detailed path in the **Route** field. For example, by specifying `/api/v2/accounts/*`, you can block access to the endpoints, such as `/api/v2/accounts/:accountId` and `/api/v2/accounts/:accountId/balance`, but still allow access to `/api/v2/accounts` for a given IP address. On this page, you can view a list of clients who are temporarily blocked because of, for example, exceeded login attempts limit (for details, refer to [System > Settings](../system/settings)). You can unblock these clients here. **Client ID** The client identifier. *** **Client email** The email address of the client. *** **IP** The IP address from which the client logged in to the B2CORE UI. *** **Blocked at** The date and time when the client was blocked. *** **Expired at** The date and time when the blocking is set expire. *** **Reason** The reason for the blocking. On this page, you can view and manage blacklisted email domains. If a domain is blacklisted, clients can’t use email addresses from that domain to register in the B2CORE UI. For example, if `examplemail.com` is blacklisted. The email addresses such as `@examplemail.com` are blocked from registering in the B2CORE UI. If the **Ban existing users** checkbox is enabled for a blacklisted domain, the existing clients with email addresses from that domain will lose access to the B2CORE UI. The following information is provided on the page: **ID** The identifier assigned to the blacklisted email domain. *** **Domain** The name of the blacklisted email domain. *** To view details or modify a blacklisted email domain, click the **Edit** button. In the displayed popup, you can check the status of the **Ban existing users** checkbox, enable or disable it, or edit the domain name. If you made any edits, click **Save** to apply the changes. To remove an email domain from the blacklist, click the **Delete** button. You can export data from the page in CSV or XLSX format by clicking the respective buttons in the upper-right page corner. The file in the selected format will be automatically downloaded to your computer. On this page, you can view a list of logins to the system. **Client ID** The client identifier. *** **Client** The client’s name. *** **Client email** The email address of the client. *** **IP** The IP address from which the client logged in to the B2CORE UI. *** **Auth date** The date and time when the client logged in to the B2CORE UI. *** **Status** The authorization result. Above the table, you can enable the **Hide IP Duplicates** option to group entries by unique email + IP pairs and hide repeated entries. On this page, you can check client transactions, view risk scores, trace the origin of the funds, and examine all key signals associated with each transaction. ## General information [#general-information] The following information is provided about each transaction: **Client ID** The identifier of the user who created the transaction. *** **Transaction ID** The identifier of the transaction. *** **Transaction Type** The transaction type: deposit or withdrawal. *** **Created date** The date and time of the transaction. *** **Email** The email address of the client. *** **Source amount** The transaction amount in the source currency. *** **Source currency** The transaction currency. *** **Provider** The name of the risk monitoring provider (**SumSubstance** available at the moment). *** **Review Result** The transaction check result from the risk monitoring provider: red, green, or error. *** **Risk Score** The risk score of the transaction from the risk monitoring provider. To view the details, click the **Edit** button. ## Details [#details] The detailed information includes additional transaction signals, such as the source of the funds, any potential risk of theft, the money laundering (ML) risk level of the exchange, and more. On this page, you can view a list of existing white lists and create new ones. **White lists** can be used to restrict access to specific URLs, allowing access only from whitelisted IP addresses. The following information is provided about each white list: **ID** The identifier of the white list. *** **Route** The URL to which access is granted. *** **IP** The whitelisted IP address or subnet mask. *** **Active** The status of the white list. *** **Comment** The reason for whitelisting. *** **Created at** The date and time when the white list was created. *** **Updated at** The date and time when the white list was last updated. On this page, you can view a list of available currencies, add new currencies, and configure their settings. **Code** The numeric code that is used as a unique currency identifier. *** **Caption** The currency name displayed in the B2CORE UI. *** **Alpha** The alphabetic code of a currency (which is set by an admin when adding a currency to the system). *** **Markup: Sell** The sell commission markup specified as a percentage. *** **Markup: Buy** The buy commission markup specified as a percentage. *** **Precision** The number of decimal places displayed when representing amounts in a currency. You can set the same sell/buy markup for all currencies by clicking the **Change options** button in the upper-right page corner and specifying the required values. To modify currency settings, navigate to the currency details by clicking the **Edit** button located in the currency row. **See also** [How to add a currency](../../how-to-articles/manage-currencies/how-to-add-a-currency) On this page, you can view a list of available currency pairs and add new pairs. **From currency** The alphabetic code of a base currency. *** **To currency** The alphabetic code of a quote currency. *** **Enabled for client** If `Yes`, a currency pair can be exchanged by clients in the B2CORE UI; otherwise, `No`. By default, this option is set to `Yes`. *** **Rates Custom Priority** The order in which exchange rates are obtained from exchange rate providers for this currency pair. *** **Updated** The date and time when a currency pair was last updated. *** **Max amount** The maximum allowed amount per exchange operation in a currency pair. *** **Step** The minimum increment by which an amount can be changed at a time. *** **Enabled for admin** If `Yes`, a currency pair can be exchanged via the Back Office; otherwise, `No`. By default, this option is set to `Yes`. *** **Request required** * If `Yes`, requests for admin approval are created when clients initiate exchanges in a currency pair in the B2CORE UI. After approval, exchanges are executed using the rates specified in the approved requests. * If `No`, exchanges in this currency pair are executed without admin approval. By default, this option is set to `No`. **See also** [How to add an exchange currency pair](../../how-to-articles/manage-currencies/how-to-add-an-exchange-currency-pair) [How to set priorities for exchange rate providers](../../how-to-articles/manage-currencies/how-to-set-priorities-for-exchange-rate-providers) [How to enable requests for exchanges in specific currency pairs](../../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs) This page displays the configured exchange rate providers used to ensure accurate currency conversions during transaction processing when required. ## General information [#general-information] The following information is displayed for each rate provider: **Priority** The priority index assigned to the rate provider. The order of receiving exchange rates depends on the priority indexes assigned to providers. A lower index means higher priority. For example, a provider with index `1` is used first to receive rates. You can change the priority in the rate provider details or by dragging and dropping providers into the required order. *** **Provider** The name of the rate provider: * B2BINPAY * BTC-Alpha * CBRF * CoinGecko * CoinMarketCap * Coinsbuy * CryptoCompare * CryptoWatch * ECB Rates * Fixer * WazirX * Xe * custom *** **Name** The name assigned to the exchange rate configuration, which is used in the Back Office. *** **From currencies** One or more base currencies for which the rates are configured. *** **To currencies** One or more quote currencies to which the rates apply. *** **Enabled** If **Yes**, the rate provider is enabled and can be used for supplying rates. To view the rate provider details, click the **Edit** button. ## Details [#details] On the details page, you can view and configure additional settings required for the provider. **Options** This section includes the connection settings required for establishing a connection with specific providers. *** When using the **custom** provider, the following settings are displayed: * **Rate** — the fixed rate that is used for conversions. * **Base currency** — the currency that serves as the base for all conversions using the specified fixed rate. **See also** [How to configure currency exchange rates](../../how-to-articles/manage-currencies/how-to-configure-currency-exchange-rates) On this page, you can view a list of configured tests for client accreditation. When configuring [verification levels](levels), you can specify accreditation tests that your clients must pass before submitting documents for obtaining a higher level. ## General information [#general-information] The following information is provided about each test: **ID** The identifier of a test. *** **Caption** The test’s title displayed to clients in the B2CORE UI. *** **Visible** If **Yes**, a test is available to clients in the B2CORE UI; otherwise, **No**. To view the details about an existing test or modify it, click the **Edit** button located in a corresponding row. ## Details [#details] The details page contains the following tabs: On this tab, the **Caption** and **Visibility** fields can be modified. In the **Details** field, you can specify a test’s description or any other helpful information that clients should know before they start passing the test. Such information will be displayed under the test’s title in the B2CORE UI. On this tab, you can add questions of different types and answer options to a test. The following question types are available: * **open** — an open-ended question that can be answered in a free form. * **close** — a close-ended question that can be answered by choosing a single or multiple correct answers from a given list of options. * **questionnaire** — a multiple-choice question that can be answered by choosing one or more answers from a given list of options. * **poll** — a multiple-choice question that can be answered by choosing a single answer from a given list of options. **See also** [How to create a client accreditation test](../../how-to-articles/manage-verification-options/how-to-create-a-client-accreditation-test) On this page, you can view a list of created document groups and create new ones. ## General information [#general-information] The following information is provided about each document group: **Priority** The priority index assigned to the document group. *** **Name** The document group name. *** **Caption** The document group name displayed in the B2CORE UI. *** **Type** The type of the document group. *** **Enabled** If `Yes`, this group can be used for verification. To view the details, click the **Edit** button. ## Details [#details] The detailed information includes: **Name** The document group name. *** **Type** The type of the document group. *** **Caption** The document group name displayed in the B2CORE UI, which can be localized for different interface languages. *** **Description** The document group description displayed in the B2CORE UI, which can be localized for different interface languages. *** **Enabled** If `Yes`, this document group can be used for verification. *** **Priority** The priority index assigned to the document group. On this page, you can view a list of created document types and create new ones. ## General information [#general-information] The following information is provided about each document type: **Priority** The priority index assigned the document type. *** **Name** The document type name used in the Back Office. *** **Caption** The document type name displayed in the B2CORE UI. *** **Status** If `Enabled`, this document type can be used for verification. To view document type details, click the **Edit** button. ## Details [#details] The detailed information includes: **Name** The document type name used in the Back Office. *** **Caption** The document type name displayed in the B2CORE UI, which can be localized for different interface languages. *** **Description** The document type description displayed in the B2CORE UI, which can be localized for different interface languages. *** **Status** If `Enabled`, this document type can be used for verification. *** **Example** An example of the file that can be submitted for this document type. *** **Group** One or more [document groups](document-groups) in which this document type is included. *** **Max files** The maximum number of files that can be uploaded for this document type. *** **Priority** The priority index assigned to the document type. On this page, you can view a list of all documents submitted by clients for verification. ## General information [#general-information] The following information is provided about each document: **ID** The document identifier. *** **Type** The [document type](document-types). *** **Status** The current [status of the client request](../references/client-request-statuses) for document approval. *** **Client ID** The identifier of the client who submitted the document. *** **Client Name** The name of the client who submitted the document. *** **Email** The email address of the client who submitted the document. *** **Request ID** The identifier of a client’s document approval request. *** **Uploaded by** Indicates who uploaded the document. *** **Uploaded at** The date and time when the document was uploaded. To view document details, click the **Edit** button. ## Details [#details] The detailed information includes: **Type** The [document type](document-types). *** **Files** The link to the document file. On this page, you can view a list of the verification levels available in the Back Office, create new levels and configure their settings. ## General information [#general-information] The following information is provided about each verification level: **Index** The index assigned to a verification level. The zero (`0`) index is always assigned to the default verification level. For the other verification levels, the index must be greater than zero. *** **Caption** The localized level name displayed in the B2CORE UI and mobile app. *** **Desktop Description** The localized level description displayed in the B2CORE UI. The description for the B2CORE UI can be specified in the HTML format. Additionally, you can specify a level description for displaying in the mobile app by navigating to verification level details and filling in the **Mobile Description** field. The description for the mobile app can be specified in the JSON format. *** **Default** If `Yes`, a verification level is the default one and granted to all newly registered clients; otherwise, `No`. *** **Visible** If `Yes`, a verification level is displayed to clients in the KYC flow in the B2CORE UI; if set to `No`, it's hidden. Use the **Visibility** set to `No` to create hidden levels (for example, levels with specific transaction limits) that can be assigned to clients manually via the Back Office. Once assigned, the client can view the level and its description, including limits and other relevant information, on the **Verification** page available through the **Profile** menu in the B2CORE UI. For all other clients who aren't assigned this level, it remains hidden. To view verification level details, click the **Edit** button related to a selected level. ## Details [#details] The following additional information is provided about each verification level: **Wizard** The name of a wizard used to run a verification procedure in the B2CORE UI, enabling clients to process to the next verification level. Possible options: * **SnsWizardSDK** — opens the SumSub popup in the B2CORE UI for verification instructions and document upload. * **ShuftiProSDK** — opens the ShuftiPro popup in the B2CORE UI for verification instructions and document upload. * **DocumentsWizard** — uses the built-in KYC provider and displays in the B2CORE UI a form for document upload based on the specified document groups. *** **Next level** The next verification level that clients can be granted after obtaining this verification level. *** **Mobile Description** The localized level description displayed in the mobile app. The description for the mobile app can be specified in the JSON format. *** **Mail description** The level description used in email notifications. *** **Assigned Client Right** The [permission set](../system/client-rights) specifying which actions clients are allowed to perform in the B2CORE UI after obtaining this verification level. *** **Client Tests** One or several accreditation tests that clients must pass before submitting documents required for obtaining this verification level (to learn more, refer to [How to create a client accreditation test](../../how-to-articles/manage-verification-options/how-to-create-a-client-accreditation-test)). *** **Document Groups** One or several [groups](document-groups) which include the documents that must be submitted by clients to obtain this verification level. *** **Limits** The transaction limits specified in USD for this level (to learn more, refer to [How to set up deposit, withdrawal and transfer limits by verification levels](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels)). **See also** [How to create verification levels](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-create-verification-levels) On this page, you can view a list of client cryptocurrency wallets. To view the wallets of a particular client, go to the [Finance tab](../clients/general/finance-tab) on the client details page, and then select **Deposit wallets**. The following information is provided about each deposit wallet: **ID** The identifier of a wallet in the system. *** **Client ID** The identifier of a wallet owner. *** **Client** The name of a wallet owner. *** **Tags** The tags assigned to a wallet owner that are used to sort the list of wallets displayed to [Back Office administrators](../system/users/). *** **Address** The public wallet address. *** **Destination tag** Applicable only for certain currencies (XRP, XLM, BNB, and XEM). *** **Blockchain** The blockchain network on which a wallet is created. *** **Method** The link to the details of a [method](../system/deposit-system#deposit-methods) used to deposit funds. *** **Currencies** The currencies enabled for a wallet. On this page, you can view all deposits made to client accounts and wallets, which allows you to track, review, and manage deposit activity. To view deposits for a specific client, go to the [Transactions tab](../clients/general/transactions-tab) on the client details page. ## General information [#general-information] The following information is provided about each deposit: **Deposit number** The sequence number assigned to a deposit in B2CORE. Click it to open the deposit details. *** **Client ID** The client identifier. *** **Client** The client’s name. *** **Email** The client’s email address. *** **Tags** The tags assigned to a client, used to sort a list of deposits displayed to [Back Office administrators](../system/users/users). *** **Country** The client’s [country](../system/countries) (if specified during registration or KYC verification process). *** **Jurisdiction** The [jurisdiction](../clients/jurisdictions) to which the client is assigned. *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **Account number** The number of a client account or wallet to which funds are deposited. *** **Payment method** The [method](../system/deposit-system#deposit-methods) used to deposit funds. *** **Payment name** The deposit method name used in the B2CORE Back Office. *** **Groups of method** The [group](../system/deposit-system#deposit-groups) to which a deposit method belongs. *** **KYT status** The Know Your Transaction status returned by **SumSub Fraud Prevention**, indicating whether the transaction has passed compliance checks, shown as either `green` or `red`. Deposit monitoring is performed; however, because deposits are processed via external payment systems, transactions may still be completed successfully regardless of whether the SumSub response is `green` or `red`. *** **Amount** The deposit amount. *** **Currency** The currency in which a deposit amount is specified. *** **Vendor Commission** The commission charged by a broker. *** **Provider Commission** The commission charged by a payment system. *** **Commission currency** The currency in which commissions are charged. *** **Final amount** The deposit amount (less commissions), in the final currency. *** **Final currency** The currency in which a deposit amount is processed and credited to a client account or wallet. *** **Exchange rate** The actual rate used to convert a deposit amount into the final currency at the moment of transaction execution. This rate may differ from the one displayed to the client in the B2CORE UI before the transaction is submitted. The rate displayed in the B2CORE UI is indicative and may not reflect the final value applied during deposit execution. *** **Rate currency** The currency in which the deposit is processed. *** **Rate (USD)** The exchange rate applied to convert a deposit amount to USD. *** **Final amount (USD)** The deposit amount (less commissions), in USD. *** **Created** The date and time when a deposit was initiated. *** **Processed** The date and time when a deposit was processed. *** **Status** The current [transaction status](../references/transaction-statuses). *** **Fin verified** For internal use only. The result of a check made by the Finance Department. *** **Account type** The [type of a product](../products/products) based on which a client account or wallet was created. *** **Internal client type** For internal use only. The internal client profile category. *** **Invoice** The unique identifier of a payment operation in the related payment system. *** **Transaction** The unique address of a transaction on a blockchain. *** **Internal comment** For internal use only. An optional note about a deposit. To view deposit details, click the **Edit** button or the number displayed in the **Deposit number** column. ## Details [#details] The details page shows the **Trader room** tab, which contains the deposit details listed below. For deposits via [PSS-connected](../../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss) methods, an additional **Payment system** tab is available and provides extended [payment details](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status#payment-details-structure). **ID** The sequence number assigned to a deposit in B2CORE (the same as the one displayed in the **Deposit number** column). **Status** The current [transaction status](../references/transaction-statuses). *** **Invoice** The unique identifier of a payment operation in the related payment system. *** **Deposit method** The [method](../system/deposit-system) used to deposit funds. *** **Date** The date when a deposit was initiated. *** **Invoice date** The date when an invoice was created. *** **Result date** The date when a deposit was credited. *** **Fin verified** For internal use only. The result of a check made by the Finance Department. *** **Amount** The deposit amount. *** **Currency** The currency in which a deposit amount is specified. *** **Vendor Commission** The commission charged by a broker. *** **Provider Commission** The commission charged by a payment system. *** **Final amount** The deposit amount (less commissions), in the final currency in which the deposit is processed and credited to a client account or wallet. *** **Transaction** The unique address of a transaction on a blockchain. *** **Rate (USD)** The exchange rate applied to convert a deposit amount to USD. *** **Internal comment** An optional note about a deposit. Enter a note or edit the existing one, and then click **Save**. ### Info [#info] This section displays information about a client account or wallet to which funds are deposited. **Account number** The number of a client account or wallet to which funds are deposited. *** **Account balance** The current balance on an account or a wallet. *** **Account type** The [type of a product](../products/products) based on which the account or wallet is created. *** **Client** The client’s name. *** **Email** The client’s email address. ### Transaction monitoring [#transaction-monitoring] This section displays the results (`green` or `red`) of the KYT check performed via **SumSub**. To use this feature, you must have an active **SumSub** account with **Fraud Prevention** enabled and properly configured, along with the corresponding **SumSub** external connection enabled in the B2CORE Back Office. If no results are displayed, click the **Check transaction** button. This button is unavailable if the transaction has already been checked. **See also** [How to create a deposit](../../how-to-articles/manage-finances/how-to-create-a-deposit) On this page, you can view a list of exchange transactions made on client accounts. To view exchanges made on accounts of a particular client, go to the [Transactions tab](../clients/general/transactions-tab) on the client details page. The following information is provided about each exchange transaction: **Transaction ID** The identifier of an exchange transaction in the system. *** **Client ID** The client identifier. *** **Client** The client’s name. *** **Email** The client’s email address. *** **Jurisdiction** The [jurisdiction](../clients/jurisdictions) to which the client is assigned. *** **Tags** The tags assigned to a client that are used to sort a list of exchange transactions displayed to [Back Office administrators](../system/users/). *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **From account** The number of a source account from which the exchanged asset amount is withdrawn. *** **Source amount** The amount that was exchanged, in the currency of a source account. *** **Source currency** The currency in which a source account is denominated. *** **To account** The number of a destination account to which the exchanged asset amount is deposited. *** **Destination amount** The amount that was exchanged, in the currency of a destination account. *** **Destination currency** The currency in which a destination account is denominated. *** **Commission** The amount earned from an exchange transaction as a result of the markup applied to the base exchange rate. This reflects the profit generated by adding a markup percentage to the rate. *** **Rate** The final exchange rate applied to a transaction, including the added markup percentage. *** **Status** The current [transaction status](../references/transaction-statuses). *** **Created** The date and time when an exchange transaction was made. *** **Exchanged By** Indicates if an exchange was made by a client in the B2CORE UI or by an admin in the Back Office. **See also** [How to exchange funds](../../how-to-articles/manage-finances/how-to-exchange-funds) On this page, you can view all withdrawals made from client accounts and wallets, which allows you to track, review, and manage withdrawal activity. To view withdrawals for a specific client, go to the [Transactions tab](../clients/general/transactions-tab) on the client details page. ## General information [#general-information] The following information is provided about each withdrawal: **Withdrawal number** The sequence number assigned to a withdrawal in B2CORE. Click it to open the withdrawal details. *** **Client ID** The client identifier. *** **Client** The client’s name. *** **Email** The client’s email address. *** **Tags** The tags assigned to a client, used to sort a list of withdrawals displayed to [Back Office administrators](../system/users/users). *** **Country** The client’s [country](../system/countries) (if specified during registration or KYC verification process). *** **Jurisdiction** The [jurisdiction](../clients/jurisdictions) to which the client is assigned. *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **Account** The number of a client account or wallet from which funds are withdrawn. *** **Method** The [method](../system/payout-system#payout-methods) used to withdraw funds. *** **Name** The withdrawal method name used in the B2CORE Back Office. *** **Groups of method** The [group](../system/payout-system#payout-groups) to which a withdrawal method belongs. *** **KYT status** The Know Your Transaction status returned by **SumSub Fraud Prevention**, indicating whether the transaction has passed compliance checks, shown as either `green` or `red`. *** **Amount** The withdrawal amount. *** **Currency** The currency in which a withdrawal amount is specified. *** **Vendor Commission** The commission charged by a broker. *** **Provider Commission** The commission charged by a payment system. *** **Commission currency** The currency in which commissions are charged. *** **Final amount** The withdrawal amount (less commissions), in the final currency. *** **Final currency** The currency in which the withdrawal is processed. *** **Exchange rate** The actual rate applied to convert a withdrawal amount into the final currency at the moment of transaction execution. This rate may differ from the one displayed to the client in the B2CORE UI before the transaction is submitted. The rate displayed in the B2CORE UI is indicative and may not reflect the final value applied during withdrawal execution. *** **Rate currency** The currency to which a withdrawal amount is converted during processing. *** **Rate (USD)** The exchange rate applied to convert a withdrawal amount to USD. *** **Final amount (USD)** The withdrawal amount (less commissions), in USD. *** **Status** The current [transaction status](../references/transaction-statuses). *** **Created** The date and time when a withdrawal was initiated. *** **Processed** The date and time when a withdrawal was processed. *** **Account type** The [type of a product](../products/products) based on which a client account or wallet was created. *** **Internal client type** For internal use only. The internal client profile category. *** **Invoice** The unique identifier of a payment operation in the related payment system. *** **Transaction** The unique address of a transaction on a blockchain. *** **Blockchain fee** The blockchain commission. *** **Wallet** The public address of a wallet to which funds are withdrawn. *** **Destination Tag** Applicable only to XRP, XLM, BNB, and XEM. *** **Dealing approved** For internal use only. The result of a check made by the Finance Department. *** **Compliance approved** For internal use only. The result of a check made by the Legal Department. *** **Internal comment** For internal use only. An optional note about a withdrawal. To view withdrawal details, click the **Edit** button or the number displayed in the **Withdrawal number** column. ## Details [#details] The details page shows the **Trader room** tab, which contains the withdrawal details listed below. For withdrawals via [PSS-connected](../../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss) methods, an additional **Payment system** tab is available and provides extended [payment details](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status#payment-details-structure). **ID** The sequence number assigned to a withdrawal in B2CORE (the same as the one displayed in the **Withdrawal number** column). *** **Status** The current [transaction status](../references/transaction-statuses). *** **Invoice** The unique identifier of a payment operation in the related payment system. *** **Date** The date when a withdrawal was initiated. *** **Invoice date** The date when an invoice was created. *** **Result date** The date when a withdrawal was debited. *** **Method** The [method](../system/payout-system) used to withdraw funds. *** **Amount** The withdrawal amount. *** **Currency** The currency in which a withdrawal amount is specified. *** **Vendor Commission** The commission charged by a broker. *** **Provider Commission** The commission charged by a payment system. *** **Final amount** The withdrawal amount (less commissions), in the final currency in which the withdrawal is processed. *** **Transaction** The unique address of a transaction on a blockchain. *** **Exchange rate** The actual rate applied to convert a withdrawal amount into the final currency at the moment of transaction execution. *** **USD Exchange Rate** The exchange rate applied to convert a withdrawal amount to USD. *** **Internal comment** An optional note about a withdrawal. Enter a note or edit the existing one, and then click **Save**. *** **Dealing approved** For internal use only. The result of a check made by the Finance Department. *** **Compliance approved** For internal use only. The result of a check made by the Legal Department. ### Request info [#request-info] This section displays information related to a client withdrawal request that requires approval or rejection by the [Back Office administrator](../system/users/users). **Request ID** The identifier of a client request to withdraw funds. Click it to open the request details. *** **Resolution** The [request status](../references/client-request-statuses). *** **Reason** For rejected requests, the reason the request was rejected. ### Info [#info] This section displays information about a client account or wallet from which funds are withdrawn. **Account** The number of a client account or wallet from which funds are withdrawn. *** **Account balance** The current balance on an account or a wallet. *** **Account type** The [type of a product](../products/products) based on which the account or wallet is created. *** **Client** The client’s name. *** **Email** The client’s email address. ### Transaction monitoring [#transaction-monitoring] This section displays the results (`green` or `red`) of the KYT check performed via **SumSub**. To use this feature, you must have an active **SumSub** account with **Fraud Prevention** enabled and properly configured, along with the corresponding **SumSub** external connection enabled in the B2CORE Back Office. If no results are displayed, click the **Check transaction** button. This button is unavailable if the transaction has already been checked. **See also** [How to create a payout](../../how-to-articles/manage-finances/how-to-create-a-payout) On this page, you can view a list of configured reports as well as create new reports. ## General information [#general-information] The following information is provided about each report: **ID** The report identifier. *** **Interval** The report schedule. Possible options: * **Daily** — the report is run and sent every day * **Weekly** — the report is run and sent once a week * **Monthly** — the report is run and sent once a month *** **Date slice** The period for which data is included in the report, as per the Back Office server time: * **Day** — the previous day from 00:00 to 23:59 * **Week** — the previous week from Monday 00:00 to Sunday 23:59 * **Month** — the previous month from the first day of the month 00:00 to the last day 23:59 * **Curweek** — the previous 7 days from the first day 00:00 to yesterday 23:59 * **Overall** — from the very beginning to yesterday 23:59 * **Curmonth** — from the first day of the current month 00:00 to yesterday 23:59 *** **File format** The file format in which the report is generated. Possible options: * HTML * XLSX * CSV *** **Name** The name assigned to the report. *** **Mail to** The email addresses to which a link to download the report is sent. *** **Last run** The date and time when the report was last run and sent to a specified email address. *** **Active** The report status: * **Active** — indicates that the report is run and sent on schedule * **Inactive** — indicates that the report is disabled To view the report details, click the **Edit** button. ## Details [#details] The following additional fields are displayed on the details page: **Class** The report type. One or more report types can be selected. Possible options: * **Client Finance Report** — shows the amount of deposits, withdrawals and net deposits (the difference between total deposits and total withdrawals) made by each client over a specified time period, in corresponding currencies and in conversion to USD. The report includes the following fields: **Email**, **Verification Level**, **Currency**, **Deposit**, **Withdraw**, **(D - W)**, **(Deposit, USD)**, **(Withdraw, USD)** and **(Deposit - Withdrawal, USD)**. * **Transaction Finance Report** — contains detailed information on all transactions executed over a specified time period. The report includes various fields, such as **ID**, **Account ID**, **Operation ID**, **Email**, **Transaction Type**, **Method**, **Source Currency**, **Source Amount**, **Type Commission**, **Final Amount**, **Target Amount**, **Target Currency**, **Transaction Exchange Rate**, **% Markup**, **Profit Markup**, **Markup Currency** and others. * **Method Finance Report** — contains detailed information on methods used for execution of deposit and withdrawal operations over a specified time period. The data is grouped by currencies (such as fiat and crypto) and includes information about the commissions and profit earned from each operation. The report includes various fields, such as **Method**, **Currency**, **Deposit**, **Withdraw**, **Source Commission**, **Final Deposit amount**, **Final Withdrawal amount**, **Profit Markup**, **Counterparty Commission**, **Profit (Counterparty commission)** and others. * **Currency Finance Report** — shows the amount of deposits, withdrawals and net deposits (the difference between total deposits and total withdrawals) made over a specified time period in a particular currency and in conversion to USD. The report includes the following fields: **Currency**, **Deposit**, **Withdraw**, **(D - W)**, **(Deposit, USD)**, **(Withdraw, USD)** and **(Deposit - Withdrawal, USD)**. * **Balances Report** — shows balance changes on client accounts over a specified time period. The data is grouped by each currency and also includes the total balance change on all client accounts in conversion to USD. The report includes the following fields: **ID**, **Email**, **Client Name**, **Internal Client Type**, **Verification Level**, **Company Name**, **Currency**, **Balance**, **Hold**, **Rate**, **(Balance, USD)**, **Previous Balance** and **(Previous Balance, USD)**. * **User In Out** — this report is similar to the **Client Finance Report**, while also containing additional fields, such as **Transfers (D-W)** and **Manual (D-W)**. * **IB Balances Report** — shows the reward amounts earned by IB partners over a specified time period, as well as the total reward amount in conversion to USD. The report includes the following fields: **ID** (the identifier assigned to an IB partner), **Email**, **Client Name**, **Internal Client Type**, **Verification Level**, **Company Name**, **Currency**, **Balance**, **Rate** and **(Balance, USD)**. * **Balances Simplified Report** — shows balances on client accounts in each currency along with the total balance on all client accounts in conversion to USD. The report includes the following fields: **Email**, **Internal Client Type**, **Currency** and **Balance**. * **LegalEntityBalancesReport** — shows balances on all live accounts of the clients that are served by a specific legal entity. *** **Start hour** The hour at which the report is run and sent to a specified email, as per the Back Office server time. The value must be in the 0 — 23 range. *** **GMT offset** The GMT offset of the local time zone to run and send the report. **See also** [How to create a report](../../how-to-articles/manage-finances/how-to-create-a-report) **Static deposits** provide a reusable and persistent way for clients to fund their wallets in B2CORE. Unlike regular one-time deposits, static deposits allow clients to use the same **static payment details** (also called **identities**) multiple times, eliminating the need to generate new payment pages with payment details for each transaction. Currently, the **B2BINPAY v3** and **Coinsbuy v3** payment systems can be configured to use static payment details. for details, refer to [How to integrate B2BINPAY](../../how-to-articles/manage-payment-methods/how-to-integrate-b2binpay-v3). ## Difference between regular deposits and static deposits [#difference-between-regular-deposits-and-static-deposits] ### Regular deposits [#regular-deposits] A **regular deposit** is a one-time transaction initiated by a client. Each deposit requires generating a new, temporary payment page with payment details. The process for regular deposits is as follows: 1. On the **Deposit** page in the B2CORE UI, the client selects their wallet, deposit currency, specifies the deposit amount, and chooses an available deposit method. 2. The client fills in the required additional fields, depending on the selected method. 3. After initiating the deposit, the client is redirected to a payment page or shown a QR code. The page has an expiration time. 4. Once the deposit is completed or expires, the payment page and its payment details can't be reused. ### Static deposit [#static-deposit] A **static deposit** uses persistent payment details generated by a client. These details remain available for repeated use and are permanently associated with that client. This approach is especially useful for crypto and bank payments, where clients may want to reuse the same crypto address or bank requisites for multiple deposits. The process for static deposits is as follows: 1. On the **Deposit** page in the B2CORE UI, the client selects their wallet, deposit currency, and chooses a deposit method that supports static deposits. 2. The client fills in the required additional fields, depending on the selected method, and generates payment details (for example, a crypto address or bank requisites). 3. The generated payment details are saved and can be reused for future deposits with different amounts. 4. The payment details don't expire and remain active as long as they exist within the selected payment system. ### Key points [#key-points] * Static payment details can be reused multiple times to deposit different amounts. * Each set of payment details is permanently associated with a specific client. * Payment details don't expire and remain valid unless explicitly deactivated. * Multiple payment details can be generated for the same payment method, allowing the client to choose which one to use. ## Unresolved requests [#unresolved-requests] On this page, you can view a list of **unresolved requests** that are created when issues occur during **static deposit** processing and the static deposit fails to be created. These requests allow the admin to track errors, identify their causes, and take actions to resolve static deposit issues. The following information is provided about each unresolved request: ### General information [#general-information] **ID** The unique identifier of the unresolved request. *** **Status** The request status: * **Unresolved** — indicates that the static deposit couldn't be created and an unresolved request was generated. * **Resolved** — indicates that the request was reviewed and manually resolved by the admin. *** **Driver** The static deposit driver via which the deposit was initiated. *** **Error code** The reason why the unresolved request was created. The table below lists possible error codes related to static deposit processing, along with their causes and configuration scenarios in which they may occur. *** **Creation date** The date and time when the request was created. To view the request details, click the **eye** icon. ### Details [#details] The details page displays extended information about the static deposit and the related error. Once the issue has been addressed, the request can be manually closed by clicking the **Resolve** button. On this page, you can find a full list of all transactions, including deposits, withdrawals, transfers, exchanges, IB rewards, and savings payments, along with their current statuses. The following information is provided about each transaction: **ID** The transaction identifier. *** **Client ID** The client identifier. *** **Type** The transaction type: * **Deposit** — adding funds to client accounts. * **Payout** — withdrawing funds from client accounts. * **Transfer** — moving funds between accounts belonging to the same client. * **Internal transfer** — transferring funds between different clients within the same B2CORE system. * **Exchange** — exchanging one currency for another between client accounts. * **Rewards** — crediting rewards from IB programs. * **Savings Payment** — interest payments from [savings programs](../savings). If you filter the **Transactions** page by type (for example, **Deposit**, **Payout**, or **Exchange**), the resulting list will match the corresponding list in [Finance > Deposits](deposits), [Finance > Payouts](payouts), or [Finance > Exchange](exchange), provided no additional filters are applied. Filtering by **Transfer** and **Internal transfer** (if enabled) will display the same list as in [Finance > Transfers](transfers), provided no additional filters are applied. *** **Source** The identifier of the source account. *** **Source account number** The number of the source account. *** **Source currency** The currency in which the source account is denominated. *** **Source amount** The transaction amount in the source currency. *** **Source commission** The commission amount charged for a transaction, in the source currency. *** **Destination** The identifier of the destination account. *** **Destination account number** The number of the destination account. *** **Destination currency** The currency in which the destination account is denominated. **Destination amount** The transaction amount in the destination currency. *** **Destination commission** The commission amount charged for a transaction, in the destination currency. *** **Status** The current [transaction status](../references/transaction-statuses). *** **Date** The date and time when a transaction was created. **See also** [How to process transactions with the Partial status](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-partial-status) [How to process transactions with the Assistance status](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status) On this page, you can view a list of transfers made between client accounts. To view transfers made between accounts of a particular client, go to the [Transactions tab](../clients/general/transactions-tab) on the client details page. ## General information [#general-information] The following information is provided about each transfer transaction: **Operation ID** The identifier of a transfer transaction in the system. *** **Client ID** The identifier of a client from whose account funds are transferred followed by the identifier of a client to whose account funds are transferred (for example, `296 -> 296` or `118 -> 274`). *** **Client Name** The client’s name. *** **Client Email** The client’s email address. *** **Internal client type** For internal use only. The internal client profile category. *** **Jurisdiction** The [jurisdiction](../clients/jurisdictions) to which the client is assigned. *** **Type** The type of a transfer transaction: * `Transfer` – funds are transferred between accounts of the same client. * `Internal transfer` – funds are transferred from one client to another within the same B2CORE system. *** **Tags** The tags assigned to a client that are used to sort a list of transfer transactions displayed to [Back Office administrators](../system/users/). *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **From account** The number of a source account from which funds are transferred. *** **Source platform** The [platform](../products/platforms) on which a source account is opened. *** **Source type** The [type of a product](../products/products) to which a source account belongs. *** **Source amount** The transfer amount, in the currency of a source account. *** **Source currency** The currency in which a source account is denominated. *** **To account** The number of a destination account to which funds are transferred. *** **Destination platform** The [platform](../products/platforms) on which a destination account is opened. *** **Destination type** The [type of a product](../products/products) to which a destination account belongs. *** **Destination amount** The transfer amount, in the currency of a destination account. *** **Destination currency** The currency in which a destination account is denominated. *** **Status** The current [transaction status](../references/transaction-statuses). *** **Created** The date and time when a transfer was made. *** **Processed** The date and time when a transfer was processed. To view transaction details, click the **Edit** button or the number displayed in the **Operation ID** column. ## Details [#details] The following additional information is provided about each transfer transaction: **Internal client type** For internal use only. The internal client profile category. *** **Source commission** The commission, in the currency of a source account. *** **Destination commission** The commission, in the currency of a destination account. *** The following information about a client request is provided if your clients are required to submit requests for a fund transfer, which are resolved on an individual basis (approved or rejected): **Request ID** The identifier of a client request to transfer funds. *** **Resolution** The [request status](../references/client-request-statuses). *** **Reason** The reason why a request was rejected. **See also** [How to create a transfer](../../how-to-articles/manage-finances/how-to-create-a-transfer) You can add custom items to the menu displayed in both the B2CORE UI and mobile app. In the mobile apps, these items appear in the **Services** section. This functionality is supported starting from **iOS** v1.29 and **Android** v2.6.0. To be able to add custom menu items, you should be granted the `Update menu` permission (for details, refer [How to add a user group and grant permissions](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions)). To add a custom menu item: Navigate to **Promotion** > **Menu**. To view a list of available menu items, click the **eye** icon located in the **General** row. Custom menu items can be added under the **General** menu tree or within any existing menu item. To navigate inside an existing item, click the eye **icon** in the respective row. Click **+Create** in the upper-right page corner. In the displayed popup, fill in the following required fields: * In the **Name** field, enter a unique name for the menu item. * On the **Caption** field, enter a caption for the menu item that will be displayed to clients in the B2CORE UI menu or the **Services** section of the mobile app. * In the **External URL** field, specify the URL to an external resource or web page to which clients will be redirected when they click the menu item. * In the **Icon** field, specify the URL of an image that will be used as the menu icon in the B2CORE UI. The image must meet the following requirements: * **Format**: SVG * **Size**: 16×16 pixels * **Style**: monochrome (single color, typically black or white: #000000/ #FFFFFF) * **Background**: transparent (recommended) Optionally, apply restrictions to the menu item: * To make the menu item available only to clients with specific verification levels, select the appropriate levels in the **Verification Level Allowance** dropdown. * To make a menu item available only to clients that are assigned specific types, select the corresponding types in the **Client Type Allowance** dropdown. If no options are selected in these dropdowns, the menu item will be available to all clients without any restrictions. To mark the menu item as "New" in the B2CORE UI, enable the **New** checkbox. To mark the menu item visible in the B2CORE UI and mobile app, enable the **Visible** checkbox; otherwise, it will be hidden. Click **Save** to add the custom menu item. The custom menu item will appear in the menu tree. To adjust its position, simply drag and drop it to the desired location. If needed, specify the localization properties for the item caption by clicking the button located on the right side of its caption in the **Caption** field. You can add the **Contact Us** section under the main menu in the B2CORE UI to display your support email or other contact details, making it easier for clients to reach you. This can be configured through B2TRANSLATE. For more information about B2TRANSLATE, refer to the [product documentation](https://docs.b2translate.b2broker.com/). To complete the steps below, you must be registered on B2TRANSLATE and have access to the project linked to your B2CORE. To add the **Contact Us** section: Navigate to **System** > **Settings** to locate the UUID of the B2TRANSLATE project linked to your B2CORE and copy it. Sign in to B2TRANSLATE. In B2TRANSLATE, go to **Projects** and find the related project by UUID. Locate the key `B2Core.Shared.ModelTranslates.EmailTranslateKeys.Email1` in the **default** category. If the **padlock** icon near the **Translation** field is locked, unlock it. In the **Translation** field, enter the contact details. HTML formatting is supported (for details, refer to [Add or modify translations](https://docs.b2translate.b2broker.com/user-guide/manage-translations/add-or-modify-translations) in the B2TRANSLATE documentation). Example: ```html

Contact Us

Send email ```
The changes are saved automatically. Leave the **padlock** icon unlocked.
With the above provided HTML example, the **Contact Us** section will be displayed under the main menu in the B2CORE UI followed by the **Send email** link, which clients can use to quickly send messages. This method allows you to add important details to your B2CORE UI, such as contact information, support links, or other messages. To add Ticker Widget symbols: Navigate to **Promotion** > **Dashboard**. On the **Widgets List** page, select either **Ticker Widget MT4** or **Ticker Widget MT5**, and then click the **Edit** button located in the **Actions** column. To add a symbol, click the **+Create** button displayed on the **Edit** page. In the displayed **Add ticker instrument** popup, specify the following information: * In the **Symbol** field, type a symbol that you want to add. * In the **Show** dropdown, select either of the two options: * **Yes** – to display the symbol in the corresponding widget on the **Dashboard** in the B2CORE UI. * **No** – to allow selecting the symbol from the drop-down list and adding it to the corresponding widget on the **Dashboard** in the B2CORE UI. Click **Save** to apply the changes. You can customize the menu displayed to your clients in the B2CORE UI. To be able to customize the menu, you should be granted the `Update menu` permission (for details, refer [How to add a user group and grant permissions](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions)). To customize the B2CORE UI menu: Navigate to **Promotion** > **Menu**. To view a list of available menu items, click the **eye** icon located in the **General** row. To display or hide a menu item in the B2CORE UI, toggle the switch located in the **Visible** column. To change the order in which menu items are displayed in the B2CORE UI, drag and drop them in the required order. Click the **Edit** button related to a selected menu item and configure the following options: * In the **Caption** field, specify a menu item name that you want to display to clients in the B2CORE UI. * To make a menu item visible only to clients who obtained specific verification levels, select the corresponding levels in the **Verification level allowance** dropdown. By default, all verification levels configured in the Back Office are displayed in this field. * To make a menu item visible only to clients that are assigned specific types, select the corresponding types in the **Client Type Allowance** dropdown. * To mark a menu item as "New" in the B2CORE UI, enable the **New** checkbox. Click **Save** to apply the changes. When clients sign in to the B2CORE UI for the first time, they see the default **Dashboard**. As an admin, you can change the widgets and the layout of the default **Dashboard** to show the most important information for your clients. The default dashboard configuration is restored by clicking the **Reset** button. To set up the default dashboard configuration, do the following: Navigate to **Promotion** > **Dashboard**. For widgets that you want to show on the **Dashboard**, enable the switches located in the **Show by default** column. To allow clients to close widgets shown on the **Dashboard**, enable the switches located in the **Delete** column. For such widgets, the **Close** (⨯) button will be available in the B2CORE UI. To set up a widget size and location on the **Dashboard**, select a widget from the list, and then click the **Edit** button located in the **Actions** column. On the **Edit** page, specify the widget size in points by entering integer values in the **Width** and **Height** fields. The dashboard width is limited by 50 points, and the width of a widget cannot exceed this value. The minimum width as well as the minimum and maximum height vary for each widget and depend on the data it displays. If the values that you have specified are not accepted, a corresponding error message is displayed. Locate the widget on the **Dashboard** by specifying the coordinates in the **Position X** and **Position Y** fields. Only positive values are accepted. Positions X and Y indicate the coordinates of the upper-left corner of the widget. To locate the widget on the **Dashboard** properly, the sum of the values specified in the **Width** and **Position X** fields must be less than or equal to the **Dashboard** width, which is 50 points. `Width + Position X <= 50` Click **Save**. You can create banners that will be displayed to your clients in the B2CORE UI, mobile app, or mobile browser. ## How to create a desktop banner [#how-to-create-a-desktop-banner] To create a banner that will be displayed to your clients in the B2CORE UI: Navigate to **Promotion** > **Banners**. Click **+Create** in the upper-right page corner. In the **Create Banner** popup that appears, fill in the following fields: * In the **Caption** field, enter a title for your banner. You can leave this field empty and create a banner without a title. * In the **Banner URL** field, enter a URL tail defining a page on which your banner will be shown in the B2CORE UI (for example, `/dashboard`, `/wallets`, `/funds/deposit`, or other). * In the **Banner priority** field, enter an integer value defining the order for displaying banners if there is more than one banner created. For example, a banner with the priority set to 1 will be shown first on a web page; a banner with the priority set to 2 will be shown following the first banner, and so on. * From the **Banner Type** dropdown, select **Desktop**. Click **Save** to create the banner. Click the **Edit** button in the banner row to configure banner settings. On the **Edit banner** page, fill in the following fields: ### Banner tab [#banner-tab] * In the **Button link** field, enter a URL path to an external resource. This URL will be opened upon clicking a button displayed on your banner. ### Light and Dark tabs [#light-and-dark-tabs] * The **Caption** field displays the title you entered when creating your banner. You can change the title font color and weight for the themes by inserting the following HTML code: `Banner Title` * In the **Button** field, enter the text to be displayed as the button label. * In the **Text** field, enter the text that will be displayed under your banner title. You can change the text font color and weight for the themes by inserting the following HTML code: `Text that will be displayed on your banner` * In the **Banner Background** field, specify the URL of an image that you want to use as a background for the selected theme. * To apply localization settings, click the buttons located on the right side of the **Caption**, **Button**, and **Text** fields and enter translations for the required languages. Click **Save** to apply the changes. After configuring the banner settings, set the **Enabled** dropdown to **Yes** on the **Banner** tab to display the banner in the B2CORE UI. ## How to create a banner for the mobile app [#how-to-create-a-banner-for-the-mobile-app] To create a banner that will be displayed to your clients in the mobile app or when accessing B2CORE via a mobile browser: Navigate to **Promotion** > **Banners**, and click **+Create** in the upper-right corner of the page. In the **Create Banner** popup that is displayed, fill in the following fields: * In the **Caption** field, enter a title for your banner. You can leave this field empty and create a banner without a title. * In the **Banner URL** field, enter `/dashboard`. All banners will be displayed at the top of the **Home** screen in the app. * In the **Banner Priority** field, specify an integer value defining the order for displaying banners if there is more than one banner created. * From the **Banner Type** dropdown, select **Mobile**. * Click **Save**. On the **Banner** tab, specify the following settings: * The **Title** field displays the banner title that was specified at Step 2. You can leave this field empty and create a banner without a title. * In the **Sub Title** field, enter a banner subtitle. You can leave this field empty and create a banner without a subtitle. * From the **Vertical Align** and **Horizontal Align** dropdowns, select the appropriate values to align both the title and subtitle vertically and horizontally. * In the **Button Link** field, specify a URL to an external resource. This URL is opened after tapping a banner in the mobile app. * In the **Button Title** field, specify a button caption. You can leave this field empty and create a banner without a button. * In the **Preview Text** field, specify a description for the preview that is displayed after clicking a banner. You can leave this field empty and create a banner without a preview text. * Set the **Preview Enabled** option to **Yes** to make a banner preview available in the mobile app. * In the **Padding** field, specify a number of points to define the padding area for all four sides of a text block. * To make the banner available to your clients in the mobile app, set the **Enabled** field to **Yes**, and then click **Save**. To specify background images for the light and dark themes of your banner, switch to the **Light** or **Dark** tab. In the **Image URL** field, specify the URL of an image that you want to use as a background image for your banner. The recommended banner size for the mobile app is 840 × 360 px (aspect ratio 21:9). The supported image format is PNG. Click **Save** to apply the changes. ## How to restrict banner display [#how-to-restrict-banner-display] You can control which clients see a banner by applying restrictions based on **country**, **verification level**, **client type**, or **jurisdiction**. You can also combine these restrictions for more precise targeting. To apply restrictions to a banner: Navigate to **Promotion** > **Banners**. Select the banner and click the **Edit** button. ### Country restrictions: [#country-restrictions] * On the **Edit banner** page, click the **Actions** button in the upper-right page corner, and then select **Country restrictions** in the dropdown. * In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — the banner will be displayed to all clients except for those from the selected countries. * **Allow only** — the banner will be displayed only to clients from the selected countries. * In the **Rules** dropdown list, select one or more countries. ### Verification level restrictions: [#verification-level-restrictions] * On the **Edit banner** page, click the **Actions** button in the upper-right page corner, and then select **Verification level restriction** in the dropdown. * In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — the banner will be displayed to all clients except for those with the selected levels. * **Allow only** — the banner will be displayed only to clients with the selected levels. * In the **Rules** dropdown list, select one or more verification levels. ### Client type restrictions: [#client-type-restrictions] * On the **Edit banner** page, click the **Actions** button in the upper-right page corner, and then select **Client type restrictions** in the dropdown. * In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — the banner will be displayed to all clients except for those with the selected client types. * **Allow only** — the banner will be displayed only to clients with the selected client types. * In the **Rules** dropdown list, select one or more client types. ### Jurisdiction restrictions [#jurisdiction-restrictions] * On the **Edit banner** page, click the **Actions** button in the upper-right page corner, and then select **Jurisdiction restrictions** in the dropdown. * In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — the banner will be displayed to all clients except for those with the selected jurisdictions. * **Allow only** — the banner will be displayed only to clients with the selected jurisdictions. * In the **Rules** dropdown list, select one or more jurisdictions. Click **Save** to apply the restrictions. To create an announcement: Navigate to **Promotion** > **Announcements**. Click **+Create**. Select the announcement **Type**: * **Required** — includes a button and blocks interaction with the B2CORE UI until the client clicks the button. * **Optional** — doesn't require client action and is displayed when the client clicks the **Announcements** icon in the topbar of the B2CORE UI. Enter the announcement **Title**. Click **Save** to create the announcement. Newly created announcements are disabled by default. Click **Edit** in the announcement row to configure its settings. Fill in the following fields: * Add localized versions of the **Title**, if needed. * Set **Enable** to **Yes**. * **Button text** *(applicable only to Required announcements)* — enter the label of the action button. * **Targeted emails** — enter client emails to limit the announcement to specific recipients. You can also upload a CSV file with emails. * **Text** — enter the announcement message and add localized versions, if needed. * **Button URL** — specify the URL to which clients will be redirected after clicking the button displayed in the announcement. * **Due to Date** — set the expiration date. After this date, the announcement will no longer be displayed in the B2CORE UI. Click **Save** to activate the announcement. You can configure cashback reward programs for clients who trade on MT4/5. The cashback is earned for each lot traded on a client’s MT account over a day, based on closed positions, and deposited to the client the following day. The cashback is deposited to clients with the deposit method that uses the **cashback** provider (for details, refer to [How to create a deposit method for rewarding cashback](how-to-configure-cashback-programs-for-mt4-and-mt5#how-to-create-a-deposit-method-for-rewarding-cashback)). To configure a cashback program: Navigate to **Cashback** > **MetaTrader Volume**. Select the MT platform for which you want to configure the cashback program: **MetaTrader 4** or **MetaTrader 5**. On the **Preferences** tab, configure the following settings: * In the **Cashback value** field, enter the fixed rate rewarded per each traded lot. The cashback value can be denoted as an integer or decimal value. The cashback amount is calculated as follows: `Cashback amount = Cashback value * Number of traded lots` * In the **Cashback currency** dropdown, select the cashback program currency. * In the **Account destination type** dropdown, select the type of the account to which the cashback is rewarded: * **Trade** — the cashback is rewarded to the client’s MT trading account on which the volume taken for cashback calculations has been traded. * **Personal** — the cashback is rewarded to a client’s account of the `personal` type, such as a wallet, denominated in the cashback program currency. * In the **Ignored symbols groups** dropdown, select the symbols that you want to exclude from cashback calculations. * In the **Accounts platform groups allowance** dropdown, select the MT account groups. By default, all the account groups configured on the MT platform are selected. * If the **Accounts number allowance** field is empty, all the MT trading accounts included in the groups selected in **Accounts platform groups allowance** field are rewarded the cashback. * In the **Accounts number allowance** field, enter MT account numbers separated by commas. * If one or more MT account numbers are listed in this field, only the listed accounts are rewarded the cashback and the **Accounts platform groups allowance** option is ignored. To enable the cashback program, select **Enabled**. Click **Save** to apply the changes. After saving the changes, the **Updated** field displays the date when the cashback program was configured or last modified. ## How to add cashback reward tiers [#how-to-add-cashback-reward-tiers] You can add one or several tiers that determine the increased cashback rates for clients who have traded certain volumes over a day. Add a cashback reward tier: Navigate to **Cashback** > **MetaTrader Volume**. Select the MT platform for which you want to configure cashback reward tiers: **MetaTrader 4** or **MetaTrader 5**. Access the **Tier** tab, and click **+Create**. In the **Name** field, enter the tier name. In the **Cashback value** field, enter the increased cashback rate that is used instead of the rate specified on the **Preferences** tab if the volume traded on an MT account over a day has reached the required tier volume. In **Trading volume, lots** field, enter the number of lots that must be traded in order to receive the increased cashback. Click **Save** to apply the changes. If during a day a client has traded on their MT account the volume that matches the tier volume or more, the cashback for this MT account is calculated against the increased cashback rate. ## How to create a deposit method for rewarding cashback [#how-to-create-a-deposit-method-for-rewarding-cashback] The cashback is rewarded to clients with the deposit method that uses the **cashback** provider. This method is used only for depositing the cashback and isn’t available to clients in the B2CORE UI. Create the deposit method for rewarding the cashback: Navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create**, and fill in the following fields: * In the **Name** field, enter the deposit method name used in the Back Office. * In the **Caption** field, enter the deposit method caption used in the Back Office. * In the **Provider** dropdown, select **cashback**. * In the **Currency** dropdown, select the same currency as in the **Cashback currency** field of the configured cashback program for MT4 or MT5. * In the **Connection** dropdown, select **Not selected**. Click **Save** to add the method. On the **Settings** tab, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * The **Group** field is set to **Not selected** by default. This deposit method can’t be included in any deposit method group. Click **Save** to apply the changes. Access the **TR Currencies** tab, and make sure that the added transaction currency matches the cashback program currency and is enabled. If the transaction currency isn’t enabled, click **Edit**, and select **Yes** in the **Enabled** dropdown. Click **Save** to apply the changes. ## How to identify clients who received cashback rewards [#how-to-identify-clients-who-received-cashback-rewards] Get a list of clients who have already received the cashback and view transaction details: Navigate to **Finance** > **Deposits**. To get a list of cashback transactions, select the name of the deposit method used for rewarding the cashback in the dropdown displayed under the **Payment method** column. To view the details of a specific transaction, click the **Edit** button located in the transaction row. You can configure B2CORE to use the [Twilio](https://www.twilio.com/) communication platform to deliver 2FA codes via SMS or make phone calls to your clients via the B2CORE Back Office. ## Key points [#key-points] * For phone calls, you can select which active Twilio number to use if your account has multiple numbers. This allows you to choose the most suitable local number, increasing the chances of successful contact and enhancing client trust. * Outgoing calls made from the B2CORE Back Office via Twilio can also be recorded, with the recordings saved in your Twilio account for later playback. The following information is required to configure a connection to Twilio via the Back Office: * Twilio account SID * Twilio authentication token * Twilio phone number * TwiML App SID ## How to sign up with Twilio [#how-to-sign-up-with-twilio] This instruction describes how to sign up with Twilio and obtain the required information to connect to Twilio via the Back Office. This instruction is created based on the latest version of Twilio as of this writing. Due to possible changes to the procedures described here, we suggest that you consult the official [Twilio Help Center](https://help.twilio.com/) or contact their support in case you have any questions. Go to the [Twilio](https://www.twilio.com/) website and sign up to create a new account. By default, a free trial account is created. Sign in to your account and upgrade it to go live by clicking the **Upgrade** link. Once the account is upgraded, your Twilio account SID and authentication token are generated automatically. Obtain a Twilio phone number by following the instructions provided in these articles: * [How to Search for and Buy a Twilio Phone Number from Console](https://support.twilio.com/hc/en-us/articles/223135247-How-to-Search-for-and-Buy-a-Twilio-Phone-Number-from-Console) * [Twilio Phone Number Types and Their Capabilities](https://support.twilio.com/hc/en-us/articles/223135367-Twilio-Phone-Number-Types-and-Their-Capabilities) Create a TwiML App by following these steps: * Go to the [TwiML Apps page](https://console.twilio.com/?frameUrl=/console/voice/twiml/apps). This page is available after signing in to your Twilio account. * Click **Create new TwiML App**. * Fill out the TwiML App form: * In the **Friendly Name** field, specify a name for your app. **Voice Configuration** * In the **Request URL** field, specify a URL for your voice app webhook, such as: `api.company.name.com/api/v1/voice/twilio-webhook` * In the **Request Method** dropdown, select **HTTP POST**. **Messaging Configuration** * In the **Request URL** field, specify a URL for your messaging app webhook, which is a URL of your B2CORE Back Office. * In the **Request Method** dropdown, select **HTTP POST**. Click **Create** to create the app. Once the app is created, your TwiML App SID is generated automatically. Use the obtained Twilio account SID, authentication token, phone number and TwiML App SID to configure a connection to Twilio via the B2CORE Back Office. ## How to configure Twilio as a 2FA SMS provider [#how-to-configure-twilio-as-a-2fa-sms-provider] You can configure Twilio to deliver 2FA codes to your clients via SMS. Before configuring Twilio as a 2FA SMS provider, make sure that you have obtained the following required information: * Twilio account SID * Twilio authentication token * Twilio phone number To learn how to obtain the required information, refer to [How to sign up with Twilio](how-to-configure-twilio#how-to-sign-up-with-twilio). To configure Twilio as a 2FA SMS provider: Navigate to **System** > **SMS Providers**. and then click **+Create** in the upper-right corner of the page. Click **+Create** in the upper-right page corner. In the displayed popup, fill in the following fields: * In the **Name** field, enter a name that you want to use for the configuration (such as `twilio_sms`). * In the **Caption** field, enter a caption that will be applied to the configuration in the Back Office (such as `Twilio SMS`). * In the **Provider** dropdown, select **Twilio**. Click **Save** to save the configuration. On the **Edit provider** page, specify the following connection settings: * In the **API sid** field, specify your Twilio account SID. * In the **API secret** field, specify your Twilio authentication token. * In the **Sender phone number** field, specify your Twilio phone number. Make sure that the **Enabled** field is set to **Yes**. Click **Save**. Twilio can now be used to deliver 2FA codes via SMS. To learn more, refer to [How to set up 2FA with SMS](../manage-system-settings/how-to-set-up-2fa#how-to-set-up-2fa-with-sms). ## How to configure Twilio as a phone service provider [#how-to-configure-twilio-as-a-phone-service-provider] Twilio can be configured to make phone calls to your clients via the Back Office. Before configuring Twilio as a phone service provider, make sure that you have obtained the following required information: * Twilio account SID * Twilio authentication token * Twilio phone number * TwiML App SID To learn how to obtain the required information, refer to [How to sign up with Twilio](how-to-configure-twilio#how-to-sign-up-with-twilio). To configure Twilio to make phone calls: Navigate to **System** > **External Connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name that you want to use for the connection. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **TwilioVoice**. Click **Save** to save the connection. The **Twilio** connection will appear in the list of external connections. Click the **Edit** button to open the connection details. On the **Edit connection** page, fill in the following settings: * In the **Account SID** field, specify your Twilio account SID. * In the **Auth token** field, specify your Twilio authentication token. * In the **TwiML App SID** field, specify your TwiML App SID. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** dropdown), set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. Twilio can now be used to make phone calls to your clients via the Back Office. ## How to test the Twilio phone service operation [#how-to-test-the-twilio-phone-service-operation] After you have configured a connection to Twilio for making phone calls via the Back Office, you can make a call to one of your clients to test the connection. To make a call: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. Go to the **Contacts** tab. Click the phone button phone-button displayed in the **Phones** section to dial a specified client's phone number using Twilio. If you have several active Twilio numbers, you can select the number you want to use for calling in the displayed popup. If no error message is displayed in the Back Office, the Twilio connection is configured properly. To deliver event notifications to Back Office users through Telegram, you must specify a user’s personal Telegram identifier or the identifier of a group or channel to which notifications will be sent. To get a user’s Telegram identifier, the user should do the following: In Telegram, send a message to [@getidsbot](https://t.me/getidsbot?do=open_link) and get the response containing the user’s Telegram identifier. Copy the obtained identifier and paste it to the **Telegram chat Id** field available on the[ Back Office user details page](../../back-office-guide/system/users/users#details). To get the identifier of a Telegram group or channel in which a user is the admin, the user should do the following: Navigate to a Telegram group or channel whose identifier the user wants to get. Add [@getidsbot](https://t.me/getidsbot?do=open_link) to the selected group or channel and get the response containing the group or channel identifier. Copy the obtained identifier and paste it to the **Group Id** field displayed under the enabled **Telegram** option when configuring event notifications. **See also** [How to set up event notifications](../manage-system-settings/how-to-set-up-event-notifications) Use integration with [Twilio SendGrid](https://sendgrid.com/) to automatically sync client data from B2CORE and use it in SendGrid for managing email lists, sending transactional and marketing emails, and tracking email performance. Before proceeding with the instructions, you must have signed up for SendGrid and have an active account. ## How to configure a connection to SendGrid [#how-to-configure-a-connection-to-sendgrid] To configure a connection to SendGrid in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **SendGrid**. Click **Save** to create the connection. The **SendGrid** connection will appear in the list of external connections. Click **Edit** to enter the connection details and complete the following fields: * In the **API URL** field, enter the base URL for your SendGrid region: * `https://api.sendgrid.com/v3/` — for SendGrid accounts registered in the **US region**. * `https://api.eu.sendgrid.com/v3/` — for SendGrid accounts registered in the **EU region**. You can find your **Base URL** in SendGrid by navigating to **Settings** > **Account Details**. * In the **API key** field, enter your SendGrid API key. The **API key** can be generated in SendGrid by navigating to **Settings** > **API Keys** and creating a key with the required permissions: * **Full access** — access to all SendGrid functionalities. * **Restricted access** — limited access only to selected functionalities, for example, access to **Marketing Campaigns** or contact lists. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. After configuring the connection, all clients listed under **Clients** > **General** in the B2CORE Back Office will be automatically synced with SendGrid and added as contacts. Any further updates to their personal details will also be synced with SendGrid. ## Overview of client data synced with SendGrid [#overview-of-client-data-synced-with-sendgrid] The following required and optional client fields can be synced from B2CORE to SendGrid contacts: ### Required fields [#required-fields] The following required client fields are always synced from B2CORE to SendGrid: * **Email** * **First name** * **Last name** ### Optional fields [#optional-fields] The following optional fields, which can be useful for business processes, are synced from B2CORE to SendGrid if they are specified in the client details in the B2CORE Back Office: * **Address** * **City** * **State** * **Postal code** * **Country** * **Phone** — if multiple phone numbers are specified for a client in the B2CORE Back Office, the confirmed number is sent to SendGrid; if none is confirmed, the most recently updated number is used. ## How to add custom fields for syncing from B2CORE to SendGrid [#how-to-add-custom-fields-for-syncing-from-b2core-to-sendgrid] You can sync additional fields from B2CORE to SendGrid, such as a client’s **Status**, **Client type**, **Verification level**, and **Jurisdiction** to reflect them in SendGrid contacts. In **SendGrid**, add these fields: Sign in to your SendGrid account. In the **Marketing Campaigns** section, click **Marketing** > **Contacts** > **Custom Fields**. Click **Create Custom Field**. Enter the field name, select the appropriate field type, and specify other parameters. Save the changes to add the new custom field. In the **B2CORE Back Office**, set up field mapping: Navigate to **System** > **External connections**. Find the connection configured for SendGrid and click **Edit** to open the connection details. Set up the field mapping by selecting the corresponding fields created in SendGrid for **Status**, **Client type**, **Verification level**, and **Jurisdiction**. Set up field mapping Click **Save** to apply the changes. Once the fields are added and mapped, the client’s **Status**, **Client type**, **Verification level**, and **Jurisdiction** are automatically synced from B2CORE and displayed in SendGrid contacts. If one or more fields aren't mapped, they won't be synced to SendGrid contacts. ## How to sync clients from B2CORE to specific lists in SendGrid [#how-to-sync-clients-from-b2core-to-specific-lists-in-sendgrid] Lists in SendGrid are the Marketing Campaigns feature that helps you organize contacts and manage email campaigns. In SendGrid, create one or more lists: Sign in to your SendGrid account. Go to **Marketing** > **Contacts** > **Lists & Segments** Click **Create List**. Enter the list name. Click **Save** to create the list. In the B2CORE Back Office, select the list for syncing: Sign in to the B2CORE Back Office. Navigate to **System** > **External connections**. Find the connection configured for SendGrid and click **Edit** to open the connection details. In the **List** dropdown, select the desired list created in SendGrid. This will ensure all synced clients from B2CORE are added to that list. If no list is selected, synced clients won't be added to any list. Select the SendGrid list to sync clients from B2CORE Click **Save** to apply the changes. Once the list added and mapped, all clients from B2CORE will be automatically synced to the specified list in SendGrid. Any new registrations or updates to existing clients will also reflect in the same list. Use integration with [ActiveCampaign](https://www.activecampaign.com/) to streamline your marketing efforts by automatically syncing client data from B2CORE to ActiveCampaign, managing targeted email campaigns, sending notifications, and enhancing client engagement. Follow the instructions below to configure the ActiveCampaign connection in the B2CORE Back Office and set up the required parameters. Before proceeding with the instructions, you must have signed up for ActiveCampaign and have an active account. ## How to configure a connection to ActiveCampaign [#how-to-configure-a-connection-to-activecampaign] To configure a connection to ActiveCampaign in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **ActiveCampaign**. Click **Save** to create the connection. The **ActiveCampaign** connection will appear in the list of external connections. Click **Edit** to enter the connection details and complete the following fields: * In the **API URL** field, provide the API URL as specified in your ActiveCampaign account. * In the **API Token** field, specify your ActiveCampaign API key. Both the API URL and key can be found in your ActiveCampaign account under **Settings** > **Developer**. Locate the URL and Key fields in ActiveCampaign Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. After configuring the connection, all clients listed under **Clients** > **General** in the B2CORE Back Office will be synced with ActiveCampaign and displayed in the **Contacts** section of your ActiveCampaign account. ## Overview of client data synced with ActiveCampaign [#overview-of-client-data-synced-with-activecampaign] The following required client fields are always synced from B2CORE to ActiveCampaign: * **First name** * **Last name** * **Email** * **Phone** When the ActiveCampaign external connection is enabled in the B2CORE Back Office, any new client registration or update to an existing client's details (such as first name, last name, email, or phone number) will be automatically synced with ActiveCampaign. ## How to add more fields for syncing from B2CORE to ActiveCampaign [#how-to-add-more-fields-for-syncing-from-b2core-to-activecampaign] You can sync additional fields from B2CORE to ActiveCampaign, such as a client’s **Status**, **Country**, and **Client type**, to support client segmentation and targeted email marketing. In **ActiveCampaign**, add these fields: Sign in to your ActiveCampaign account. Go to **Contacts** > **Fields**. On the **Contacts** tab, Click **Add Field**. Enter the field name, select the appropriate field type, and specify other parameters. Click **Save** to add a new field in your ActiveCampaign account. The image below shows the added Status, Country, Client type, Jurisdiction, and Verification level fields in ActiveCampaign: Added fields in ActiveCampaign In the **B2CORE Back Office**, set up field mapping: Navigate to **System** > **External connections**. Find the connection configured for ActiveCampaign and click **Edit** to open the connection details. Set up the field mapping by selecting the corresponding fields created in ActiveCampaign for **Status**, **Country**, **Client type**, **Jurisdiction**, and **Verification level**. Set up field mapping Click **Save** to apply the changes. Once the fields are added and mapped, the client’s **Status**, **Country**, **Client type**, **Jurisdiction**, and **Verification level** are automatically synced from B2CORE and shown in the client details in ActiveCampaign. ## How to sync clients from B2CORE to specific lists in ActiveCampaign [#how-to-sync-clients-from-b2core-to-specific-lists-in-activecampaign] Lists in ActiveCampaign help you organize contacts so you can send them relevant information. By assigning clients to specific lists, you can target your email campaigns more effectively and deliver personalized messages to the right audience. In **ActiveCampaign**, create one or more lists: Sign in to your ActiveCampaign account. Go to **Contacts** > **Lists**. Click **Add a list**. Enter the list name and specify other parameters. For the **Marketing Channel**, select **Email**, as it is the only supported channel for this integration. Click **Save** to create the list. In the **B2CORE Back Office**, select the list for syncing: Sign in to the B2CORE Back Office. Navigate to **System** > **External connections**. Find the connection configured for ActiveCampaign and click **Edit** to open the connection details. In the **List** dropdown, select the desired list created in your ActiveCampaign account. This will ensure all synced clients from B2CORE are added to that list. If no list is selected, synced clients won't be added to any list. Select the ActiveCampaign list to sync clients from B2CORE Click **Save** to apply the changes. Once the list is selected and saved, all clients from B2CORE will be automatically synced to the specified list in ActiveCampaign. Any new registrations or updates to existing clients will also reflect in the same list. To be able to send [event notifications](../../back-office-guide/system/event-notifications) in Slack, set up a Slack bot and obtain a token for its managing. This instruction is created based on the latest version of Slack as of this writing. Due to possible changes to the procedures described here, we suggest that you consult the official [Slack documentation](https://slack.com/help) or contact their support in case you have any questions. To set up a Slack bot: Go to the Slack website and create a [Slack app](https://api.slack.com/apps?new_app=1). In the **Create an app** window, click **From scratch**, and then fill in the following fields: * In the **App name** field, enter a name for your Slack bot. The bot name can be changed afterwards. * Select a Slack workspace for which you want to create the bot. The workspace cannot be changed. Click **Create App**. In the main menu, click **App Home**. On the **App Home** page, click **Review Scopes to Add**. Navigate to the **Scopes** section, click **Add an OAuth Scope**, and then add the following permission scopes to your bot: * `chat:write` * `chat:write.public` * `users:read` * `users:read.email` For a list of all available permission scopes, refer to [Permission scopes](https://api.slack.com/scopes). Add Slack bot scopes Navigate to the **OAuth Tokens for Your Workspace** section and click **Install to Workspace**. After installing the app, copy the token for managing your Slack bot, which is displayed in the **Bot OAuth User Token** field. Copy a Slack bot token In the B2CORE Back Office, navigate to **Systems** > **Settings**. Paste the copied token into the **Bot token** field displayed under the **SlackBot** section. Click **Save** to apply the changes. **See also** [How to set up event notifications](../manage-system-settings/how-to-set-up-event-notifications) To be able to send [event notifications](../../back-office-guide/system/event-notifications) in Telegram chats, groups and channels, create a Telegram bot and obtain a token for its managing. This instruction is created based on the latest version of Telegram as of this writing. Due to possible changes to the procedures described here, we suggest that you consult the official [Telegram documentation](https://core.telegram.org/bots) or contact their support in case you have any questions. To create a Telegram bot: In Telegram, send the `/newbot` command to [@BotFather](https://t.me/botfather). Follow the instructions and specify the following information: * Enter a name for your Telegram bot. * Enter a username for your bot. It must end with “bot” (such as `NotificationsBot` or `notifications_bot`). Copy the displayed token that is required to authorize your bot and send requests to the Bot API. In the B2CORE Back Office, navigate to **Systems** > **Settings**. Paste the copied token into the **Bot API Token** field displayed under the **Telegram Bot** section. Click **Save** to apply the changes. **See also** [How to set up event notifications](../manage-system-settings/how-to-set-up-event-notifications) You can automatically credit bonuses to your clients for depositing funds to their trading accounts. In this case, the bonus amount is calculated as a percentage of the deposited amount. For details of the process of awarding bonuses to clients, refer to [Introduction to bonuses](../../back-office-guide/bonuses/#introduction-to-bonuses). To configure the automatic process of crediting bonuses upon deposits: * Configure settings for automatic bonus crediting on the **System** > **Settings** page (proceed to the steps listed below). * Create a bonus preset for each [trading platform](../../back-office-guide/products/platforms) where you want bonuses to be automatically credited upon deposits. The preset created for a specific platform must have the **lowest** priority index to be used for automatic bonuses (for details, refer to [How to create a bonus preset](how-to-create-a-bonus-preset)). If there is no preset for a specific trading platform, automatic bonuses won't be credited to client trading accounts on that platform. If any [restrictions](how-to-create-a-bonus-preset#how-to-restrict-the-use-of-a-bonus-preset) are applied to the preset used for automatic bonuses, they will be credited only to the clients who satisfy the restriction criteria. To configure settings for automatic bonus crediting upon deposits: Navigate to **System** > **Settings**. In the **Bonuses** section, specify the following settings: * Set **Autocreate from deposit** to **Enabled**. * In the **Autocreated bonus percent** field, enter the percentage of a deposit amount, which you want to credit as a bonus to your clients. * In the **Auto Bonus Limit** field, specify the maximum bonus amount that can be credited to a client trading account automatically. If the calculated bonus amount exceeds this limit, only the maximum allowed amount will be credited. * In the **Auto Bonus Minimum** field, specify the minimum amount that clients must deposit or transfer to their trading accounts to trigger automatic bonus crediting for each operation. This minimum amount isn’t related to the total sum of deposits made by a client. * In the **Enable "Burn if Equity \< Credit"** dropdown, select the platforms on which you want to enable the burning of a bonus credit if the account equity falls below the credited bonus amount. This option can be enabled for MT4/5 and isn't supported for cTrader. * Set the **Burn on Withdrawal** option to **Enabled** to burn the bonus credit when a client withdraws funds from their trading account. Click **Save** to apply the changes. ## Example [#example] This example illustrates how to interpret the requirements for automatic bonus crediting upon deposits, based on the settings configured on the **System** > **Settings** page and the bonus preset named `MT4`: Bonus preset Suppose that a client deposits funds to their trading account opened on the `MetaTrader4 Live` platform. Given that **Autocreate from deposit** is set to **Enabled** and the bonus preset for `MetaTrader4 Live` is available on the **Bonus presets** page, the client is eligible to receive a bonus for their deposit. The requirements for receiving the bonus are detailed below: You can create one or more bonus presets that include the settings required for configuring bonuses. To create a bonus preset: Navigate to **Bonuses** > **Bonus Presets**. Click **Create**, and then select the trading platform to which the bonus preset can be applied. On the **Create Bonus Preset** page, fill in the following fields: * **Name** — enter the name that you want to use for the preset in the Back Office. * **Priority** — specify the priority index of the preset. The preset with the lowest index on a given platform is used for automatic bonus crediting. * **Lifetime** — specify the number of days within which clients must fulfill the requirements of a bonus program. * **Lot per unit** — enter the ratio that is used to determine the volume that must be traded by clients. * The ratio is applied to a bonus amount, and the required volume is calculated as follows: `Required volume = Bonus amount / Lot per unit` * **Set credit immediately** — select either of the two values: * If **Enabled**, bonuses from different bonus programs are immediately added to a client trading account as credit, enabling the client to use credit funds for trading. * If **Disabled**, bonuses from different bonus programs are added to a client trading account one after another. Only after a bonus from the first bonus program is processed and assigned the final status (`Completed` or `Expired`), the second bonus is added to the client trading account as credit, and so on. * **Ignored open/close interval** — specify the minimum duration, in seconds, for which clients must keep positions open for them to be counted towards the traded volume. * **Autoenable trading if balance > 0** — select either of the two values: * If **Enabled**, when the account balance changes from zero or negative to positive, the `Trade Enabled` permission is automatically restored for the account, enabling the client to resume trading on their account, including the use of the bonus credit. * If **Disabled**, when the account balance changes from zero or negative to positive, the `Trade Enabled` permission isn’t automatically restored for the account. * **Ignored symbol groups** — optionally, select one or more symbol groups in which trades aren't counted towards the traded volume. For cTrader, individual symbols must be selected in this field instead of symbol groups, even though symbol groups are available on the cTrader platform. You can leave this field empty. Click **Save** to create the preset. The preset appears in the list of bonus presets. Check the priority index assigned to the preset. It's important if plan to use this preset for automatic crediting of bonuses to clients for depositing funds to their trading accounts (for details, refer to [How to automatically credit bonuses to clients upon deposits](how-to-automatically-credit-bonuses-to-clients-upon-deposits)). The preset with the **lowest** priority index, created for a specific platform, will be used for automatic bonuses. If needed, change the priority in the preset details. ## How to restrict the use of a bonus preset [#how-to-restrict-the-use-of-a-bonus-preset] You can restrict the use of a bonus preset based on a client's **country**, **client type**, **verification level**, **jurisdiction**, or **introducing broker (IB)**. You can also restrict a preset to be used only with specific [products](../../back-office-guide/products/products). Additionally, you can apply a combination of these restrictions to further narrow down eligibility for using the preset. If a client doesn't meet the restriction criteria, the preset can't be used to credit bonuses to that client, including through the [automatic process of crediting bonuses to clients upon deposits](how-to-automatically-credit-bonuses-to-clients-upon-deposits), if restrictions are applied to the preset used for automatic bonuses on a given platform. To restrict the use of a bonus preset: Navigate to **Bonuses** > **Bonus Presets**. Select the bonus preset and click the **Edit** button in the preset row. Click **Actions** in the upper-right page corner, and then select the restriction type: * **Country restrictions** — to make the preset available only to client from specific countries. * **Client type restrictions** — to make the preset available only to clients of selected types, such as Corporate or Individual. * **Verification level restrictions** — to make the program available only to clients with specific verification levels. * **Jurisdiction restrictions** — to make the preset available only to clients under selected jurisdictions. * **Introducing broker restrictions** — to make the preset available only to clients who are referrals of the specified IBs. * **Product restrictions** — to make the preset available for use only with specific [products](../../back-office-guide/products/products). In the **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option prevents the use of the preset when the selected rules are matched. * **Allow only** — this option allows the use of the preset only when the selected rules are matched. * In the **Rules** dropdown, elect one or more values that define the restriction — such as countries, client types, verification levels, jurisdictions, IBs, or products — depending on the restriction type you're applying. Click **Save** to apply the changes. The bonus preset now has usage restrictions applied. You can create temporary bonus programs in the Back Office. Once a bonus program is created, it’s immediately displayed on the **Bonuses** page in the B2CORE UI, enabling clients to claim bonuses from that program. To create a temporary bonus program: Navigate to **Bonuses** > **Temporary Bonuses**. Click **Create**, and then select the trading platform for which you want to create the bonus program. On the **Create Temporary Bonus** page, fill in the following fields: * In the **Name** field, enter the name of the bonus program, which will be displayed to clients in the B2CORE UI. * In the **Amount** field, specify the bonus amount. * In the **Currency** dropdown, select the currency for the bonus program. Only trading account denominated in the selected currency can be used to claim the bonus from the program. * In the **Expired** filed, set the end date and time for the bonus program. * In the **Platform Groups**, select one or more groups created on the trading platform, in which trades are counted towards the traded volume of the bonus program. * In the **Preset** dropdown, you can optionally select a preset to automatically fill in the remaining fields based on preset settings. Alternatively, you can leave the **Preset** field empty and fill in the remaining fields manually: * In the **Lifetime (days)** field, enter the duration, in days, during which clients must trade the required volume. * In the **Lot per unit** field, enter the ratio that is used to determine the volume that must be traded by clients. The ratio is applied to the specified bonus amount, and the required volume is calculated as follows: `Required volume = Bonus amount / Lot per unit` * In the **Set credit immediately**, select either of the two values: * **Enabled** — when a client claims bonuses from multiple programs at a time using the same trading account, all claimed bonuses are immediately added to their account as credit, enabling the client to use credit funds for trading. * **Disabled** — when a client claims bonuses from multiple programs at a time using the same trading account, the claimed bonuses are added to their trading account one after another. Only after the first claimed bonus is processed and assigned the final status (`Completed` or `Expired`), the second claimed bonus is added to the client trading account as credit, and so on. * In the **Ignored open/close interval (sec)** field, specify the minimum duration, in seconds, for which the client must keep positions open for them to be counted towards the traded volume of the bonus program. * In the **Autoenable trading if balance > 0** dropdown, select either of the two values: * **Enabled** — when the account balance changes from zero or negative to positive, the `Trade Enabled` permission is automatically restored for the account, enabling the client to resume trading on their account, including the use of the bonus credit. * **Disabled** — when the account balance changes from zero or negative to positive, the `Trade Enabled` permission isn’t automatically restored for the account. * In the **Ignored symbol groups** dropdown, select one or more symbol groups in which trades aren't counted towards the traded volume of the bonus program. For cTrader, individual symbols must be selected in this field instead of symbol groups, even though symbol groups are available on the cTrader platform. You can leave this field empty. Click **Save** to create the bonus program. The created bonus program is now listed on the **Bonuses** page in the B2CORE UI. ## Example [#example] This example illustrates how to interpret the requirements of the temporary bonus program with the following settings: The settings of a temporary bonus program To receive the bonus amount of 386 USD from the bonus program, a client needs to claim the bonus in the B2CORE UI using their active trading account opened on the `MetaTrader 5 Live` platform and denominated in USD. After claiming the bonus, the bonus is added to the client trading account as credit, enabling the client to use credit funds for trading. In order to receive the bonus credit on their account balance, the client must fulfill the following bonus program requirements: ## How to restrict the use of a temporary bonus program [#how-to-restrict-the-use-of-a-temporary-bonus-program] You can restrict the use of a temporary bonus program based on a client's country, client type, verification level, jurisdiction, or introducing broker (IB). Additionally, you can apply a combination of these restrictions for more granular access control. If a client doesn't meet the restriction criteria, the temporary bonus program won't be visible to that client in the B2CORE UI, and the client won't have the option to claim the bonus. To restrict the use of a temporary bonus program: Navigate to **Bonuses** > **Temporary Bonuses**. Select the bonus program and click the **Edit** button in the program row. Click **Actions** in the upper-right page corner, and then select the restriction type: * **Country restrictions** — to make the program available only to client from specific countries. * **Client type restrictions** — to make the program available only to clients of selected types, such as Corporate or Individual. * **Verification level restrictions** — to make the program available only to clients with specific verification levels. * **Jurisdiction restrictions** — to make the program available only to clients under selected jurisdictions. * **Introducing broker restrictions** — to make the program available only to clients who are referrals of the specified IBs. In the **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option prevents clients matching the selected rules from seeing the bonus program in the B2CORE UI and subscribing to it. * **Allow only** — this option allows only clients matching the selected rules to see the bonus program in the B2CORE UI and subscribe to it. * In the **Rules** dropdown, select one or more values that define the restriction — such as countries, client types, verification levels, jurisdictions, or IBs — depending on the restriction type you're applying. Click **Save** to apply the changes. The temporary bonus program now has usage restrictions applied. You can manually credit bonuses to clients by either creating a custom manual bonus or selecting a bonus from an existing temporary bonus program. To manually credit a bonus to a client: Navigate to **Bonuses** > **Bonus distribution**. Click **Create** in upper-right page corner, and then select either of the two options: * **Create** — to credit a custom manual bonus. * **Create Temporary Bonus** — to credit a bonus from an existing temporary bonus program. In the **Accounts** popup, locate the client account to which you want to credit the bonus, then click **Select** on the right side of the account row. You can search for the account by **Account ID**, **Account number**, **Currency**, or **Client name**. On the displayed page, fill in the fields based on the type of bonus: * In the **Amount** field (required), enter the bonus amount that you want to credit to the account. * In the **Caption** field (required), enter the bonus name, which will be displayed to the client in the B2CORE UI. * In the **Preset** dropdown, optionally select a preset to automatically fill in the remaining fields based on preset settings. Alternatively, leave the **Preset** field empty and fill in the remaining fields manually (refer to the [Bonus presets](../../back-office-guide/bonuses/bonus-presets) or field descriptions). * In the **Temporary bonus** dropdown, select the temporary bonus program from which the bonus will be credited. All settings of the select temporary bonus program will be applied to the bonus for the client. Click **Save** to credit the bonus. Depending on the **Set credit immediately** option and the presence of other credited bonuses, the bonus will be credited to the client account either immediately or after the previous bonus has been processed and assigned a final status (`Completed` or `Expired`). To add a currency: Navigate to **Currencies** > **Currencies**. Click **+Create** in the upper-right page corner. On the **Currency creation** page, fill in the following fields: * In the **Code** field, enter a numeric code for the currency that you want to add. * In the **Alpha** field, enter an alpha code for the currency. Both codes are provided by your account manager. In the **Caption** field, enter a currency name that will be displayed to clients in the B2CORE UI. Click **Save** to add the currency. Add currency pairs that will be available for exchange in the Back Office and B2CORE UI. You can add currency pairs one by one or add multiple pairs at once. ### How to add a currency pair [#how-to-add-a-currency-pair] To add a currency pair: Navigate to **Currencies** > **Currency pairs**. Click **+Create** in the upper-right page corner. On the **Create currency pair** page, fill in the following fields: * In the **From currency** dropdown, select a base currency. * In the **To currency** dropdown, select a quote currency. * The **Enabled for admin** and **Enabled for client** options are set to **Yes** by default, meaning that the currency pair will be available for exchange in the Back Office and B2CORE UI. * If you want to make the currency pair unavailable for exchange in the Back Office or B2CORE UI, or both, select **No** for the corresponding option. * In the **Max amount** field, enter the maximum allowed amount per exchange operation in the currency pair. * In the **Step** field, the minimum increment by which an amount can be changed at a time. * In the **Request required** dropdown, select: * **Yes** — to create requests for admin approval when clients initiate exchanges in the currency pair in the B2CORE UI. After approval, exchanges are executed using the rates specified in the approved requests. * **No** — to execute exchanges in the currency pair without admin approval. Click **Save** to add the currency pair. ### How to add multiple currency pairs [#how-to-add-multiple-currency-pairs] To add multiple currency pairs at once: Navigate to **Currencies** > **Currency pairs**. Click **+Create multiple** in the upper-right page corner. On the **Create currency pair** page, fill in the following fields: * In the **Currencies** dropdown, select two or more currencies to add them as currency pairs. Press **Enter** after each selected currency. For example, selecting `USD`, `EUR`, and `BTC` in the dropdown will create the following currency pairs: `USDEUR` and `USDBTC`\ `EURUSD` and `EURBTC`\ `BTCUSD` and `BTCEUR` * In the **Max amount** field, enter the maximum allowed amount per exchange operation in the specified currency pairs. * In the **Step** field, the minimum increment by which an amount can be changed at a time. * In the **Request required** dropdown, select: * **Yes** — to create requests for admin approval when clients initiate exchanges in the specified currency pairs in the B2CORE UI. After approval, exchanges are executed using the rates specified in the approved requests. * **No** — to execute exchanges in the currency pairs without admin approval. Click **Save** to add the currency pairs. You can configure exchange rates for currencies and set up rate providers to ensure accurate currency conversions when needed for transaction processing. To set up a rate provider: Navigate to **Currencies** > **Rates**. Click **+Create** in the upper-right page corner. On the displayed page, fill in the following fields: * In the **From currencies** and **To currencies** dropdowns, select the currencies for which you want to configure exchange rates. You can select one or multiple currencies in the dropdowns, or choose **All** to apply the configured rates to all currencies. * In the **Provider** dropdown, select the desired provider for currency rates. * In the **Name** field, enter a name for your exchange rate configuration. Click **Save** to create the provider. In the rates list, find the provider that you've created and click **Edit** to enter the provider details. If additional settings are required for the provider, the **Options** section is displayed, enabling you to configure connection details for the provider. If using the **custom** provider, fill in the following fields in **Options**: * In the **Rate** field, enter the fixed rate that will be used for conversions. * In the **Base currency** dropdown, select the currency that will serve as the base for all conversions using the specified fixed rate. In the **Enabled** dropdown, select **Yes**. Click **Save** to apply the changes. After setting up the rate provider, you can designate it as the preferred provider to supply exchange rates for [deposit](../../back-office-guide/system/deposit-system#deposit-methods) and [withdrawal methods](../../back-office-guide/system/payout-system#payout-methods). If a provider is assigned to a specific method, the system will prioritize requesting rates from this provider when the method is used. ## Example [#example] This example illustrates the settings for a custom exchange rate for `USD/EUR`: * `USD` is selected in the **From currencies** field and `EUR` in the **To currencies** field. * In the **Provider** dropdown, **custom** is selected. * The **Enabled** option is set to **Yes**. In the **Options** section: * The **Rate** field displays `0.86`, which is the specified custom exchange rate. * The **Base currency** is set to USD. Custom exchange rate settings Exchanges initiated by clients in specific currency pairs through the B2CORE UI can be configured to require admin approval. When clients create exchanges in these specific pairs, requests of the **Exchange** type are created and listed on the [Clients > Requests](../../back-office-guide/clients/requests) page. These exchanges are executed only after corresponding requests are approved by the admin, using the rates specified in the approved requests. To enable requests for exchanges in a specific currency pair: Navigate to **Currencies** > **Currency pairs**. Select the currency pair for which you want to enable exchange requests and click the **Edit** button. On the **Edit currency pair** page, select **Yes** for the **Request required** option. Click **Save** to apply the changes. You can set the priority of exchange rate providers for obtaining exchange rates for each currency pair. This may help to prevent exceeding request limits to exchange rate providers. Navigate to **Currencies** > **Currency pairs**. Select the currency pair for which you want to set the priority of exchange rate providers and click the **Edit** button. In the **Rates Custom Priority** field, drag and drop the exchange rate providers supported for this currency pair to set them in a desired order. Click **Save** to apply the changes. In exchange requests from clients, which haven’t yet been approved and have the `Pending` status, you can change the rates at which the exchanges will be executed. To change the rate in an exchange request: Navigate to **Clients** > **Requests**. By default, all requests on the page are filtered by the `Pending` status. To list only pending requests of the **Exchange** type, select `Exchange` in the filter field under the **Type** column. Select the request and navigate to request details. In the request details, the **Rate** field displays the rate valid at the moment when a client created the exchange in the B2CORE UI and the request was created in the Back Office. This rate includes the markups specified for the currencies in the currency pair. To update the rate, click **Change rate**. In the displayed **Change rate** popup, update the rate that will be applied to the exchange in one of the following ways: * Enter the desired rate in the **New rate (without markup)** field. * Refresh the rate by clicking the **Refresh** button on the right side of the **New rate (without markup)** field. This retrieves the current valid rate from an exchange rate provider and displays it in the **New rate (without markup)** field. In the **Verification code** field, enter the code obtained by solving a simple math problem to confirm the rate update. Click **Save** to apply the updated rate and close the popup. The markups are applied to the updated rate, and the recalculated value is displayed in the **Rate** field in the request details. After approving the request, the exchange is executed using the updated value in the **Rate** field. B2CORE requires an active SMTP service to send email notifications to your clients. For optimal performance, select an SMTP provider that offers high deliverability and doesn’t impose strict daily sending limits. ## SMTP providers to use and to avoid [#smtp-providers-to-use-and-to-avoid] Don't use **Gmail**, **Office 365**, **Outlook.com**, **Yahoo**, or similar providers. These services impose strict daily sending limits and aren't designed for bulk or transactional email delivery. For reliable performance and scalability, use dedicated SMTP providers such as [Mailchimp](https://mailchimp.com/), [SendGrid](https://sendgrid.com/), or [Mailgun](https://www.mailgun.com/). The following information is required to configure the SMTP service connection via the B2CORE Back Office: * SMTP hostname * SMTP port * SMTP username * SMTP password ## How to sign up with an SMTP service provider [#how-to-sign-up-with-an-smtp-service-provider] This instruction describes how to sign up with an SMTP service provider (using the [Mailgun](https://www.mailgun.com/) provider for illustration purposes). You can choose any SMTP service provider that you want to use and configure the SMTP settings by following your provider’s instructions. This instruction is created based on the latest version of Mailgun as of this writing. Due to possible changes to the procedures described here, we suggest that you consult the official [Mailgun Help Center](https://help.mailgun.com/hc/en-us) or contact their support in case you have any questions. Go to the [Mailgun](https://www.mailgun.com/) website and click **Get Started**. Fill in the required fields, including your full name, email address, and payment information, select a plan that you want to use for the SMTP service, and then click **Create Account**. On the main [Mailgun](https://www.mailgun.com/) web page, click **Log In** and log in to Mailgun with your credentials. Navigate to **Sending** > **Domains** and click **Add New Domain**. Fill in the following information: * In the **Domain name** field, enter your company domain. * Select a domain region. Click **Add Domain**. Navigate to **Sending** > **Domain settings**. Select your domain name in the **Domain** dropdown located at the top of the page, and then go to the **DNS records** tab. Add the following DNS records and assign to them the appropriate values via your DNS hosting provider. * two TXT records * two MX records * one CNAME record Copy the record names and values displayed in the **Hostname** and **Enter this value** columns on the **DNS records** tab and paste them in the corresponding fields when adding DNS records via the DNS hosting provider. Green checkmarks displayed on the left side of each record indicate that the record has been set up properly. Navigate to **Sending** > **Overview** > **SMTP** to view your SMTP hostname, port, username, and default password. Use this information to configure the Mailgun SMTP connection via the B2CORE Back Office. ## How to configure an SMTP service connection via the B2CORE Back Office [#how-to-configure-an-smtp-service-connection-via-the-b2core-back-office] Navigate to **Mailing** > **System** > **Providers**, and click **+Create** in the upper-right page corner. Configure the SMTP connection settings: * In the **Caption** field, enter a caption that you want to use for the SMTP configuration. * Make sure that the **Driver** field displays “smtp”. * In the **Host** field, enter an SMTP service hostname. * In the **Port** field, enter a port number to be used for the SMTP connection. * In the **Username** and **Password** fields, enter your SMTP service credentials. * In the **Sent from** field, enter an email address that will be displayed to your email recipients. * In the **Sent from name** field, enter a name that you want to display to your email recipients (for example, this may be your company name). * In the **Encryption** dropdown, select **TLS** or **SSL** to enable a secure connection when communicating with the SMTP service. Choose **Not selected** to disable encryption. * In the **Enabled** dropdown, select **enabled** to make the SMTP service connection active. Click **Test Connection** to confirm that you can connect to the SMTP service with the current settings. The **Test Connection** button is highlighted with green if the connection is successful. Click **Save**. The SMTP configuration is now added to the list of email providers. To quickly test the SMTP configuration that you have set up, go to the B2CORE UI **Sign In** page, and click **Sign up now!** to register a new account. If you already have an account, click **Forget your password?** and then enter your email address. In both cases, you should receive appropriate emails, indicating that your SMTP service connection is properly configured. To check the status of the recently sent emails, navigate to **Mailing** > **System** > **Log** in the Back Office. There may be several reasons why clients do not receive email notifications (for example, emails sent upon logging in to B2CORE UI or successful execution of deposit or withdrawal operations): * The required email template is not enabled. * There are issues with the email service operation. * There are issues with the SMTP server connection. To determine the reason for email delivery failure: Track an email delivery with the Email log. * Navigate to **Mailing** > **System** > **Log**. * In the search box located in the **Email** column, enter the email address to which the email should have been sent. If the Email log doesn’t contain a record of the required email having been sent to the specified email address, the reason for this may be that the corresponding email template has not been enabled. Check if an email template is enabled. * Navigate to **System** > **Templates** > **Email** > **Template types**. * Find the required email template in the list (for example, `DepositSuccessful` or `WithdrawDone`) and check if it is enabled. * If not, enable the template by clicking the **Edit** button located in the template row and selecting **Yes** from the **Enabled** drop-down list. If enabling the template doesn’t solve the issue, check the email service operation and SMTP settings. Check the email service operation by sending test emails to your email address. For example, you can request to withdraw funds from one of your accounts and check if the corresponding email notification has been sent to your email address. If you have received the email, this means there are issues with the email service operation on the client side. If you have failed to receive the email, this means that there are issues with the SMTP server connection. To solve the issues, check your [SMTP configuration settings](how-to-configure-smtp) or contact your SMTP service provider. On this page, you can view a list of images displayed throughout the Back Office. The following data is provided about each image: **Type** The user interface element for which an image is specified, such as: * the main menu logo * the logo on the login page * the background image on the login page *** **Path image** The path to an image. **See also** [How to change Back Office images](../../how-to-articles/manage-system-settings/how-to-change-back-office-images) On this page, you can view a list of executed bulk actions. Bulk actions allow you to perform specific actions affecting multiple clients at once. ## General information [#general-information] The following information is provided about each bulk action: **Name** The action name. *** **Action** The action type. The following action types are available: * ban clients * change a client type * change an internal client type * change a verification level * make a deposit * zero out balances *** **Status** The status of a bulk action, indicating whether it has been successfully executed. *** **Created at** The date and time when a bulk action was created and executed. *** **Updated at** The date and time when a bulk action was last modified. *** **User** The email address of a [Back Office user](users/) who executed a bulk action. To view bulk action details, click the **Edit** button. ## Details [#details] The following additional information is provided about each bulk action: **Description** The bulk action description. *** **Log message** A log message specifying the result of an executed bulk action. *** **System log** The log of operations made during bulk action execution. **See also** [How to create a bulk action](../../how-to-articles/manage-system-settings/how-to-create-a-bulk-action) On this page you can view and manage a folder tree with any nesting depth, pre-defined for all clients. Folders configured on this page will be displayed on the [Files tab](../clients/general/files-tab) in the client’s details. When renaming a folder on this page, it is automatically renamed on the Files tab in the client’s details. Admin users can create custom folders for a specific client on the [Files tab](../clients/general/files-tab), but the pre-defined folders cannot be edited or removed. If a system folder is created with the same name as that of an existing custom folder of some client, a `_Custom` postfix is added to the name of the custom folder, and a system folder with the same name is created next to it. **Key points about permissions** * You can assign access permissions to a folder, to specify which groups of users can view and edit it in the [Files tab](../clients/general/files-tab). * By default, nested folders inherit the access permissions from the parent folder. Their access permissions cannot be broader than that of the parent folder. * When access permissions assigned to a parent folder are revoked from a user group, access to all nested folders is automatically restricted for these users. * After access to a parent folder is granted to a user group, this group will NOT be automatically granted access to nested folders In the folders list you can see a list of created top-level folders: **Name** The folder name. *** **Created at** The date and time when the folder was created. *** **Updated at** The date and time when the folder was last modified. To see folder details, click the **Edit** button. Each folder has the following tabs: On this tab, you can view the folder path. On this tab, you can view a list of nested folders of the parent folder. Nesting depth is unlimited, and each folder can have its own subdirectories as well. Breadcrumbs are displayed at the top of the page for convenient navigation. On this tab, you can view a list of available Back Office user groups and toggle switches, which show whether the users from this group can view the folder and its content on the [Files tab](../clients/general/files-tab) in the client’s details. Note that you can use the **Turn on all** and **Turn off all** buttons to quickly provide or restrict access to folders. On this page, you can view the client labels available in your system and manage your own. Labels are markers attached to clients. They appear as colored chips in the [client list](../clients) and on a client's profile, and you can filter the client list by them. There are two kinds of label: **System** Maintained automatically by B2CORE. System labels are attached and removed for you as a client's situation changes, and they cannot be renamed, recolored, deleted, or assigned by hand. *** **Custom** Created by administrators for your own segmentation. You choose the name and color, and you decide which clients carry them. ## System labels [#system-labels] | Label | Attached when | | ------------- | ----------------------------------------- | | **Deposited** | The client completes their first deposit. | **Deposited** records something that happened, so it stays on the client once earned — it is never removed, even if the client makes no further deposits. It is attached only for a completed deposit. Internal transfers, bonus payouts and exchange top-ups do not count as deposits and do not attach it. Introducing-broker labels (**IB Partner**, **IB Client**) are planned but not part of this release. ## Information on this page [#information-on-this-page] **ID** The identifier of the label. *** **Name** The label name, shown on the chip. *** **Code** The machine name of the label. Integrations should match on the code rather than the name. *** **Kind** Either **System** or **Custom**. *** **Color** The chip color, as a hex value. ## Creating a custom label [#creating-a-custom-label] 1. Click **Create**. 2. Enter a **Name**. This is what the chip shows, and it must be unique. 3. Pick a **Color** from the palette. 4. Click **Save**. The **Code** is generated from the name and shown once the label exists. It never changes afterwards, so integrations that match on the code keep working when you rename a label. The color palette is fixed. Chips are drawn with white text, so a closed set of colors keeps them readable everywhere they appear. ## Editing and deleting a custom label [#editing-and-deleting-a-custom-label] Use the buttons in the first column of the row: * **Pencil** — change the name and color. The code stays as it is. * **Bin** — delete the label. It is removed from every client that carries it, so the chip disappears from the client list, from client profiles, and from the label filters. System labels have no buttons: they are maintained by B2CORE and cannot be changed or removed. ## Assigning labels to clients [#assigning-labels-to-clients] You can only assign custom labels. System labels are attached and removed automatically, so a manual change to them would be undone the next time the rule ran. ### One client at a time [#one-client-at-a-time] 1. Open the client's profile. 2. In **Custom Labels**, select the labels the client should carry, or remove the ones it should not. 3. Save the profile. If **Custom Labels** shows chips instead of a selector, your group can assign labels but not edit clients — use the client list instead, as described below. The **Client Labels** field beside it lists the system labels the client carries. It is read-only. ### Several clients at once [#several-clients-at-once] 1. In the [client list](../clients), switch on selection mode and tick the clients. 2. Open **Edit Selected Clients** and choose **Assign Client Labels**. 3. Select the labels to apply. 4. Leave **Replace the existing custom labels instead of adding to them** clear to add the labels to whatever the clients already carry, or tick it to replace their custom labels with exactly the set you selected. 5. Click **Save**. With **Replace the existing custom labels instead of adding to them** ticked and no labels selected, every custom label is removed from the selected clients. System labels are left alone. ## Filtering clients by label [#filtering-clients-by-label] The client list provides two independent label filters: * **Has all of labels** — keeps clients carrying every label you select. Selecting more labels narrows the results. * **Has none of labels** — keeps clients carrying none of the labels you select. A single one of them is enough to exclude a client. You can combine them in a single search. For example, selecting **Deposited** and a **VIP** label in **Has all of labels** and a **Watchlist** label in **Has none of labels** returns clients who have both deposited and been marked VIP, minus anyone on the watchlist. ## Access rights [#access-rights] Each part of the feature has its own permission, set per group in [Groups](users/groups): | Permission | Allows | | ------------------------------------------ | ---------------------------------------------------------------------------- | | **View client labels** | Seeing this page, the label chips, and the label filters on the client list. | | **Create custom client labels** | Adding a label to the list. | | **Update custom client labels** | Renaming and recoloring a label. | | **Delete custom client labels** | Removing a label, and with it every assignment of it. | | **Assign custom client labels to clients** | Attaching and detaching labels from the client list. | Support and account-manager groups can view labels and assign them out of the box. Managing the list itself is reserved for administrators until you grant it. The picker on a client's profile is part of the client form, so it also needs permission to edit clients (**Update clients** or **Edit tags**). A user who can assign labels but not edit clients sees the labels as read-only chips there and assigns them from the client list instead. With the default groups that applies to **B2B Account Manager** and **B2B L1 Support**. **Client Labels and Client Tags** Client Labels replace [Client Tags](users/client-tags). Both are available for now, and they are shown as separate columns on the client list, but Client Tags will be removed in a future release. Use Client Labels for segmenting and filtering clients. Keep using Client Tags only where you rely on tags to [restrict which clients a Back Office user can see](../../how-to-articles/manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) — labels do not control visibility. **See also** [Clients](../clients) [Client Tags](users/client-tags) On this page, you can create and edit permission levels indicating which operations clients are allowed to make in the B2CORE UI. Permission levels are associated with [verification levels](../verification/levels). When clients obtain a particular verification level, they are granted the permissions associated with this verification level. To grant specific permissions to a client, go to the [Settings tab](../clients/general/settings-tab) on the client details page, and then select the required permissions in the **Rights** section. ## General information [#general-information] The following information is provided about each permission level: **Caption** The description of a permission level. *** **Created At** The date and time when a level was created. *** **Updated At** The date and time when a level was updated. *** **Default (Y/N)** If `Y`, this permission level is the default one and is assigned to all clients that were granted the initial [verification level](../verification/levels). To view permission level details, click the **Edit** button. ## Details [#details] On the details page, you can view the following additional information and select the permissions that you want to grant to your clients at this level: **Name** The name of a level. *** **Caption** The description of a level. *** **Parent Role** The previous permission level that clients must obtain before they can get this level. This field is not applicable to the default permission level. The following permission options are available: * **Verification**\ If selected, clients are allowed to obtain a higher [verification level](../verification/levels) in the B2CORE UI. * **Converter**\ If selected, clients can exchange funds in the B2CORE UI. * **Deposits**\ If selected, clients can deposit funds in the B2CORE UI. * **Withdrawals**\ If selected, clients can withdraw funds in the B2CORE UI. * **Internal Transfers**\ If selected, funds can be transferred from one client to another within the same B2CORE system. On this page, you can view a list of countries that your clients can select when signing up to the B2CORE UI (if they are required to select a country during registration). A country is listed on the Registration form if a switch displayed in the **Enabled** column for this country is in the *active* state. A country is hidden on the Registration form if the switch is in the *inactive* state. You cannot add new countries or edit country-related data, you can only set visibility for the countries listed on this page. The **Enabled** switch applies globally: the country list on this page is shared across B2CORE, so disabling a country hides it everywhere, not only on the Registration form. To hide a country from a single registration form and keep it available elsewhere, use the **Countries Blacklist** section of the relevant registration profile in **System** > **Registration** instead — see [How to migrate to the new registration settings](../../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings). The following information is provided about each country: **ID** The identifier of a country in the system. *** **Name** The name of a country (for example, `Mexico`). *** **Full name** The official name of a country (for example, `the United Mexican States`). *** **Country code** The code assigned to a country in the system. *** **ISO 3166-2** The geocode assigned to a country (as per ISO 3166-2). *** **ISO 3166-3** The geocode assigned to a country (as per ISO 3166-3). *** **Capital** The capital city of a country. *** **Currency** The name of a national currency. *** **Currency symbol** The graphical representation of a national currency (for example, `$`). *** **Currency code** The Alpha code of a national currency. *** **Currency sub unit** The name of a fraction of the main currency unit (for example, `cent`). *** **Region code** The area code assigned to a country (as per UN M49). *** **Sub region code** The area subcode assigned to a country (as per UN M49). *** **Enabled** If the switch is in the *active* state, your clients can select this country when signing up to the B2CORE UI. You can download the list of countries to your computer as a CSV or XLSX file. To do this, click the **CSV** or **Excel** button located in the upper-right corner of the page. Custom fields let you collect additional client information beyond the standard profile fields. You define a field once and organize it into a group. You can then add it to a registration form, where clients fill it in during registration, and its value can always be filled in or edited by an admin on the client profile. You manage custom fields in the **System** > **Custom Fields** menu, which contains two pages: * **Groups** — sections that organize related fields. * **Fields** — the individual fields, each belonging to a group. Access to custom fields is controlled by the following permissions, which you grant to back-office user groups in **System** > **Users** > **Groups**. | Permission | Grants the ability to | | ------------------------------- | ----------------------------------------------- | | View Custom Fields | View the **Groups** and **Fields** pages. | | Create Custom Fields | Create groups, fields, and options. | | Update Custom Fields | Edit groups, fields, and options. | | Archive Custom Fields | Archive groups, fields, and options. | | View client custom field values | View custom field values on the client profile. | | Edit client custom field values | Edit custom field values on the client profile. | ## Groups [#groups] A group is a labeled section that holds related fields. On the client profile and in the registration form, fields are displayed under their group. The **Groups** page lists the existing groups with the following information. **Label (English)** The group name shown to clients and admins. You can localize this label through B2TRANSLATE (see [Translations](custom-fields#translations)). *** **Machine name** A unique identifier used in translation keys and the API. You set the machine name when you create the group, and it can't be changed afterward. *** **Sort order** The position of the group relative to other groups. Groups with a lower sort order appear first. *** **Archived** Indicates whether the group is archived. To create a group: Navigate to **System** > **Custom Fields** > **Groups**. Click **Create**. Specify the **Label (English)**, **Machine name**, and **Sort order**. Click **Save**. To edit a group, click the **Edit** button. You can change the **Label** and **Sort order**; the **Machine name** is fixed. To archive a group, click the **Archive** button. Archived groups are hidden from new registration forms, but they remain visible on client profiles where a stored value exists, so retiring a group never hides data already collected. ## Fields [#fields] A field is a single input, such as a text box, a dropdown, or a date picker. Each field belongs to one group. The **Fields** page lists the existing fields with their **Label (English)**, **Machine name**, **Type**, **Group**, and **Archived** status. ### Field types [#field-types] The following field types are supported. | Type | Description | | ----------- | ------------------------------------------- | | Text | A single-line text input. | | Multiline | A multi-line text area. | | Email | A text input validated as an email address. | | URL | A text input validated as a URL. | | Phone | A phone number input. | | Integer | A whole number. | | Decimal | A number with a fractional part. | | Boolean | A yes/no value. | | Select | A dropdown allowing a single option. | | Multiselect | A dropdown allowing multiple options. | | Date | A calendar date. | | Date & time | A calendar date with a time. | ### Create a field [#create-a-field] To create a field: Navigate to **System** > **Custom Fields** > **Fields**. Click **Create**. Specify the **Label (English)**, **Machine name**, **Type**, and **Group**. In the **Required / validation** section, configure the validation rules (see [Validation rules](custom-fields#validation-rules)). Click **Save**. When editing a field, you can change its **Label**, **Group**, and validation rules. The **Machine name** and **Type** are set at creation and can't be changed. To archive a field, click the **Archive** button. Like groups, archived fields stay visible on client profiles where a stored value exists. ### Validation rules [#validation-rules] The **Required / validation** section shows only the rules that apply to the selected field type. | Rule | Applies to | Description | | ------------- | --------------------------- | ------------------------------------------ | | Required | All types | The field must be filled in. | | Min length | Text, Multiline | The minimum number of characters. | | Max length | Text, Multiline, Email, URL | The maximum number of characters. | | Regex pattern | Text, Multiline | A regular expression the value must match. | | Min | Integer, Decimal | The minimum allowed value. | | Max | Integer, Decimal | The maximum allowed value. | | Min date | Date, Date & time | The earliest allowed date. | | Max date | Date, Date & time | The latest allowed date. | | Min options | Multiselect | The minimum number of selected options. | | Max options | Multiselect | The maximum number of selected options. | **Required** applies to the client registration form, where clients must fill in the field to continue. On the client profile, admins can save partial data even when a required field is empty; the format and option rules still apply to any value that is entered. ## Options for Select and Multiselect fields [#options-for-select-and-multiselect-fields] Fields of the **Select** and **Multiselect** types need a list of options. After you create such a field, open its edit page to manage the options at the bottom. Each option has the following parameters. **Value** The value stored when the option is selected. It must be unique within the field. *** **Label (English)** The text shown to the client. You can localize this label through B2TRANSLATE (see [Translations](custom-fields#translations)). *** **Machine name** An identifier used in translation keys. To add an option, fill in the fields in the option row and click **Add option**. To archive an option, click the **Archive** button next to it. ## Show custom fields during registration [#show-custom-fields-during-registration] You choose which custom fields appear in a registration form on the registration configuration edit page in **System** > **Registration**. Custom fields can only be added to the new registration flows configured in **System** > **Registration**. They are not available in the legacy [Wizards](wizards), where registration fields are set up through the [Registration wizard configuration](wizards#registration-wizard) and appear on the client's [Advanced tab](../clients/general/advanced-tab). The **Wizards** and their **Advanced** step are considered legacy. Once the migration to the **System** > **Registration** settings is complete, they will be removed. Open the registration configuration you want to edit. In the **Custom Fields** section, select the fields to show in the registration form. Click **Save**. Fields marked as **Required** must be filled in by the client before they can complete the registration. If no custom fields exist yet, the section links to the **Custom Fields** page where you can create them. ## Edit custom field values on a client profile [#edit-custom-field-values-on-a-client-profile] Open a client profile and go to the **Custom Fields** tab to view and edit the values collected for that client. Fields are grouped the same way as on the registration form. Viewing values requires the **View client custom field values** permission, and editing them requires the **Edit client custom field values** permission. Archived fields and groups remain visible on the tab as long as the client has a stored value for them, so retiring a field never hides previously collected data. ## Translations [#translations] Labels for groups, fields, and options are entered in English and can be localized through B2TRANSLATE. The registration form uses the following translation key patterns: * Fields — `Common.Registration.Form.Fields..Label` * Options — `Common.Registration.Form.Options..Label` To speed up localization, the registration configuration edit page provides a **Copy B2TRANSLATE keys JSON** button. It copies a JSON object that maps the translation keys to their English values for the custom fields currently selected in the form, their select and multiselect options, and the Terms & Conditions items. Paste the JSON into the **Common** tab in B2TRANSLATE. In this subsection, you can set up and manage supported deposit methods. ## Deposit methods [#deposit-methods] On this page, you can view a list of configured deposit methods and create new ones. ### General information [#general-information] The following information is provided about each deposit method: **ID** The identifier of the method in the system. *** **Priority** The priority index assigned to the deposit method. The order in which deposit methods are displayed to clients in the B2CORE UI depends on priority indexes assigned to methods. A lower index means a higher priority. For example, a method with the index `1` will appear at the top of the list in the B2CORE UI. The priority index can be changed on the [Settings tab](deposit-system#settings-tab) in the method details. *** **Caption** The name assigned to the method in the Back Office, which is also visible to clients in the B2CORE UI. *** **Name** The unique name for the method. It can only contain Latin letters, numbers, dashes, and underscores. *** **Group** One or more [groups](deposit-system#deposit-groups) in which the method is included, such as **Crypto**, **Fiat**, or other. *** **Provider** The name of the payment system. For [PSS-connected](../../integrations/payment-systems#payment-system-service-pss) payment systems, the following providers can be displayed: * **PaymentSystemsDeposit** — indicates a deposit method connected via PSS. * **PaymentSystemsStaticDeposit** — indicates a deposit method connected via PSS that supports static payment details. In such methods, previously issued payment information, such as crypto addresses or bank details, is saved for clients, allowing them to reuse it for deposits of different amounts at any time. Currently, the **B2BINPAY v3** and **Coinsbuy v3** payment systems can be configured to use static payment details. *** **Driver**\ *Applicable only to payment systems connected via [PSS](../../integrations/payment-systems#payment-system-service-pss)* The driver used to connect to a payment system. It reflects the name of the payment system and, in some cases, the supported payment method. *** **Currency** One or more currencies supported by the method. The method will be available for accounts denominated in the selected currencies. *** **Enabled** The method status: * **No** — the method is inactive and unavailable for deposits. * **Yes** — the method is active and available for deposits. *** **Status** exclamation icon — indicates that some method settings need to be configured. Hovering over the icon displays a list of required settings, which can be adjusted in the method details. If the column is empty, all required settings for the method have been specified. To view deposit method details, click the **Edit** button. ### Details [#details] The details page is divided into the following tabs: * [Settings tab](deposit-system#settings-tab) * [TR Currencies tab](deposit-system#tr-currencies-tab) * [PS Currencies tab](deposit-system#ps-currencies-tab) * [Commissions tab](deposit-system#commissions-tab) * [Restrictions tab](deposit-system#restrictions-tab) The set of displayed tabs may vary depending on the deposit method driver. For example, for methods connected via [PSS](../../integrations/payment-systems#payment-system-service-pss), the additional **Webhooks** and **Test configuration** tabs may be displayed. #### Settings tab [#settings-tab] On this tab, you can view or modify the general settings of the deposit method, as well as the connection settings of a payment provider. **Name** The unique name for the method. It can only contain Latin letters, numbers, dashes, and underscores. *** **Enabled** The method status: * **No** — the method is inactive and unavailable for deposits. * **Yes** — the method is active and available for for deposits. *** **Group** One or more [groups](deposit-system#deposit-groups) in which the method is included, such as **Crypto**, **Fiat**, or other. *** **Caption** The name assigned to the method in the Back Office, which is also visible to clients in the B2CORE UI. *** **Provider** The name of the payment system. *** **Result URL** The URL that receives callbacks with notifications about deposit status updates. *** **Time to fund** The hint text displayed to clients in the B2CORE UI, indicating the estimated processing time for deposits. Two standard options are available: * `Depending on the Blockchain` * `From 3 to 5 Days` It's possible to modify the hint text of the standard options or add new ones in **System** > **Key storage** > **Key storage values**. Use the `method_time` tag to locate the relevant keys and update the text. The hint text can be specified in HTML format, but using different formats may cause difficulties in displaying the hint on different devices. For example, while the HTML format renders correctly in the B2CORE UI, it may not work properly in mobile apps. *** **Precalculate** This field is deprecated and no longer in use. It can be ignored. *** **Icon** The method icon displayed to clients in the B2CORE UI for quick identification of the method. You can use predefined icons or specify a URL for a custom image. For a list of predefined icons and their names, refer to [Payment systems](../../integrations/payment-systems) and [Supported cryptocurrency payment methods](../references/supported-cryptocurrency-payment-methods). To use a predefined icon for the method, enter its name in the **Icon** field. If you prefer a custom icon, specify the URL of the image to be displayed as the method icon. *** **Priority** The priority index assigned to the deposit method. The order in which deposit methods are displayed to clients in the B2CORE UI depends on priority indexes assigned to methods. A lower index means a higher priority. For example, a method with the index `1` will appear at the top of the list in the B2CORE UI. *** **IP White list** A list of IP addresses from which it is allowed to make deposits. *** **Rates provider** The name of the rate provider configured on the [Currencies > Rates](../currencies/rates) page. This field is optional. If specified, the system will prioritize requesting rates from this provider when the deposit method is used. *** **Configuration**\ *Applicable to PSS methods* The deposit method configuration form. Its structure and available fields depend on the selected **Driver**. The **external connection** contains technical integration data required to connect to a specific payment system, while the **configuration** defines how the deposit process operates. As a result, you can configure two or more deposit methods with different configurations that all use the same external connection. If no configuration is available for the selected driver, the following message is displayed: `Configuration form is empty`. *** **Provider settings**\ *Applicable to non-PSS methods* The settings required to connect to a payment provider. The set of connection settings varies depending on the payment provider. After specifying the connection settings, it’s possible to check if the credentials used to access the payment provider are valid. To do this, click the **Check connection** button. Currently, the **Check connection** button is available only for the B2BINPAY and BridgerPay payment providers. * If the credentials are valid, the status `Success` will be displayed under the button. * If the credentials are invalid, the status `Fail` will be displayed, along with an explanation message. In this case, contact the Support team. **Custom fields** Applicable for the **Constructor** provider only. Configure a list of fields that clients should fill in when they make deposits using the **Constructor** method in the B2CORE UI (for details, refer to [How to add custom fields for the Constructor deposit or withdrawal method](../../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method)). #### TR Currencies tab [#tr-currencies-tab] On this tab, you can view and manage a list of transaction currencies added to the deposit method. The method will be available for accounts denominated in these currencies. The following information is provided about each currency: **ID** The identifier assigned to the currency added to the method. *** **Currency** The caption assigned to the currency. #### PS Currencies tab [#ps-currencies-tab] On this tab, you can view and manage a list of currencies supported by the payment provider for processing deposits. To enable the method to process deposits in a specific currency, ensure it is added to this list. The following information is provided about each currency: **ID** The identifier assigned to the currency added to the method. *** **Currency** The caption assigned to the currency. *** **Supported by PS** The `Supported` status indicates that the added currency is supported by the payment provider and can be used for making deposits. When adding a currency with a status that doesn't guarantee compatibility with the payment provider, the `Support is unknown` message is displayed. In this case, the currency can still be added to the tab, and the configuration can be saved. However, the currency might not be fully supported by the deposit method, so it should be used with caution. When adding a currency that isn't supported, the `Not supported` message appears. In this case, the currency can't be added to the tab, and saving the configuration isn't allowed. #### Commissions tab [#commissions-tab] On this tab, you can view and manage a list of commissions configured for the deposit method. The following information is provided about each commission: **ID** The commission identifier in the Back Office. *** **Currency** One or more commission currencies. *** **Commission** The commission rates that follow the formula: `Minimum commission amount <= Fixed rate + Percentage rate % <= Maximum commission amount` For details, refer to [How to configure commissions for deposit and withdrawal methods](../../how-to-articles/manage-payment-methods/how-to-configure-commissions-for-deposit-and-withdrawal-methods). *** **Type** The commission type: * **TR** (Vendor commission) — the commission that is calculated based on the currency and amount credited to the client's account after the deposit is successfully processed by the payment provider. If this commission type is configured, the client deposits one amount through the payment provider but receives to their account a smaller amount due to the deduction of the calculated commission. * **PSP** (Provider commission) — the commission that is calculated only for financial reports and doesn't affect the amount a client receives to their account when depositing funds. If this commission type is configured, it only applies to calculations for reports regarding completed deposits and is displayed in the **Provider commission** column in [Finance > Deposits](../finance/deposits). #### Restrictions tab [#restrictions-tab] On this tab, you can restrict the use of the deposit method by country, client type, verification level, jurisdiction, IB parent ID, or IB program type. The tab lists each restriction along with its status, type, and configured rules (for details, refer to [How to restrict the use of deposit and withdrawal methods](../../how-to-articles/manage-payment-methods/how-to-restrict-the-use-of-deposit-and-withdrawal-methods)). ## Deposit groups [#deposit-groups] Groups are used to organize deposit methods into categories, such as crypto and fiat methods, for easier management. **Priority** The priority index assigned to the group. *** **Name** The group name. *** **Caption** The group description. *** **Enabled** The group status: * **No** — the group is inactive and cannot be used to include deposit methods. * **Yes** — the group is active and can include deposit methods. On this page, you can set up event notifications to be sent via Slack, Telegram, email or SMS, as well as view a list of configured notifications. The following information is provided about each configured event notification: **ID** The notification identifier. *** **Event** The [event](../references/event-types-for-triggering-event-notifications-for-back-office-users) that triggers a notification. *** **Description** The notification description. *** **Users** The email addresses of the Back Office users added as notification recipients. *** **Channels** A list of channels through which notifications are delivered: * email * SMS * Slack (refer to [How to set up a Slack bot](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-slack-bot)) * Telegram (refer to [How to set up a Telegram bot](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-telegram-bot)) *** **Enabled** If **Enabled**, a notification is sent after the selected event occurs; otherwise, **Disabled**. To modify the existing notifications, click the **Edit** button located in the corresponding notification row. **See also** [How to set up event notifications](../../how-to-articles/manage-system-settings/how-to-set-up-event-notifications) On this page, you can configure event handlers to monitor specific system events and define the workflows that automatically run when they occur. ## General information [#general-information] The following information is provided about each event handler: **ID** The identifier of the event handler. *** **Short description** A brief description of the event handler. *** **Event** The event type. The following event types are supported: * [Account balance received](#account-balance-received) * [Transfer event](#transfer-event) * [Account created](#account-created) * [Successful operation](#successful-operation) *** **Event handler workflow** The workflow or action that will be executed when the event is triggered, such as sending an email notification or sending data to an external endpoint. *** **Enabled** If **Enabled**, the event handler is active and will process events that meet the configured conditions. To view or edit event handler details, select a handler and click the **Edit** button. ## Details [#details] On the details page, you can enable or disable the selected event handler and adjust its parameters. The following is the list of supported event handlers for which you can adjust their specific parameters: ### Account balance received [#account-balance-received] This event handler is triggered when B2CORE receives an updated balance from an external service provider connected to the Back Office (for example, **Twilio**). If the received balance meets the configured threshold, a notification is sent to the specified email addresses. **Send notification if account balance less or equals** The balance threshold that triggers the notification. *** **Available workflows** `SendNotificationWorkflow` — sends an email notification to the specified email addresses when the external service balance falls below or equals the configured threshold. *** **Emails** One or more email addresses to which the notification will be sent. *** **Template** The email template used for sending notifications, such as `balanceWarning`. The template can be selected from the list of available email templates in **System** > **Templates** > **Email** > **Templates**. ### Transfer event [#transfer-event] The event handler is triggered when a transfer occurs that matches the selected platforms and amount criteria. When this event occurs, an email notification is sent to the specified email addresses. **Available handlers** `Filter by platforms and amount` — filters transfer events based on the selected source and destination platforms and the minimum transfer amount. The handler triggers only when a transfer meets the specified conditions. *** **Destination Platform Id** The identifier of the destination platform to which a transfer is made. This is the required parameter. *** **Source Platform Id** The identifier of the source platform to which a transfer is made. This is the optional parameter. *** **Minimum Amount** The minimum transfer amount required to trigger the event. This parameter is optional. *** **Available workflows** `SendNotificationWorkflow` — sends an email notification to the specified email addresses when a transfer matching the configured criteria occurs. *** **Emails** One or more email addresses to which the notification will be sent. *** **Template** The email template used for sending notifications, such as `TransferEvent`. The template can be selected from the list of available email templates in **System** > **Templates** > **Email** > **Templates**. ### Account created [#account-created] The event handler is triggered when an account or wallet is created for a client. When this event occurs, a POST request is sent to the specified external URL. The request body includes account details formatted as either JSON or URL-encoded form data, depending on the selected content type. The examples below show how the POST request body is formatted for each supported content type: ```json title="JSON" { "client": { "id": 3651, "email": "client@example.com" }, "product": { "name": "ewallet", "group_type": "Default", "platform": { "id": 1, "name": "eWallet", "caption": "eWallet" } }, "account_number": "80759" } ``` ```bash title="URL-encoded form data" client%5Bid%5D=3650&client%5Bemail%5D=client%40example.com&product%5Bname%5D=ewallet&product%5Bgroup_type%5D=Default&product%5Bplatform%5D%5Bid%5D=1&product%5Bplatform%5D%5Bname%5D=eWallet&product%5Bplatform%5D%5Bcaption%5D=eWallet&account_number=80735 ``` *** **Available workflows** `SendToEndpoint` — sends a POST request with the details about the created account or wallet to the specified external endpoint. The request is sent immediately when the event is triggered. *** **External endpoint** The external URL to which the POST request will be sent. This parameter is required. *** **Content type** The format of the request body. The following values are supported: * `application/x-www-form-urlencoded` * `application/json` ### Successful operation [#successful-operation] The event handler is triggered when a deposit, withdrawal, transfer, or exchange is successfully completed. When this event occurs, a POST request is sent to the specified external URL. The request body includes transaction details formatted as either JSON or URL-encoded form data, depending on the selected content type. **Operations** One or more transaction types. This parameter is required. The following transaction types can be selected: * `payment` — deposits * `payout` — withdrawals * `transfer` — transfers * `exchange` — exchanges *** **Available workflows** `SendToEndpoint` — sends a POST request with the details about a successful transaction to the specified external endpoint. The request is sent immediately when the event is triggered. *** **External endpoint** The external URL to which the POST request will be sent. This parameter is required. *** **Content type** The format of the request body. The following values are supported: * `application/x-www-form-urlencoded` * `application/json` On this page, you can view a list of connections to external systems and service providers integrated with B2CORE, manage them, and create new connections. ## General information [#general-information] The following information is provided about each connection: **ID** The connection identifier. *** **Caption** The connection caption. *** **Name** The technical name of the connection. *** **Type** The type of integrated system, such as: * **Payment system** — indicates connections to payment systems. * **Mailing system** — indicates connections to mailing services. * **Platform** — indicates connections to trading platforms and hubs. * **Other** — indicates connections to other types of integrated systems, for example, customer support platforms, analytical tools, and more. *** **Provider** The name of the external system to which the connection is established. *** **Driver**\ *Applicable only to payment systems connected via [PSS](../../integrations/payment-systems#payment-system-service-pss)* The driver used to connect to a payment system. It reflects the name of the payment system and, in some cases, the supported payment method. *** **Enabled** Indicates whether the connection is enabled: **Yes** or **No**. *** **Created** The date and time when the connection was created. *** **Updated** The date and time when the connection was last updated. To view connection details, click the **Edit** button. ## Details [#details] In the details, you can enable or disable the connection. This page contains settings specific to the external system to which the connection is established. Each external system has its own set of connection settings, such as the service URL, credentials, and other configuration parameters. On this page, you can view a record of data imported to the Back Office as well as import new data. You can import data about clients, their accounts, or [IB programs](../introducing-brokers) into B2CORE from a third-party system using a CSV or TSV file. Your CSV or TSV file must meet the following requirements for data import: * The file size mustn't exceed 5MB. * The maximum number of lines in a file is 1,000, excluding the header line. If the number of lines exceeds 1,000, the file must be split into two or more files for proper import. * `Comma`, `semicolon`, or `tab` can be used as delimiter characters that separate data in the file. * The file must be properly structured and include the required fields specific to the imported data type (for details, refer to [How to import client-related data](../../how-to-articles/manage-system-settings/how-to-import-client-related-data)). * IB-related data can be imported only from a CSV file. ## General information [#general-information] The following information is provided about each data import operation: **Title** The name assigned to a data import operation. *** **Action** The type of data that was imported. The following types of data can be parsed: * `import-users` — used to import the following client-related data from a CSV or TSV file: * Email `required` * Last name `required` * First name `required` * Middle name * Date of birth * Country * Phone number * Address * City * Postal code * Verification level The imported data is displayed on the **Clients** > **General** page. * `import-accounts` — used to import the following data about client accounts from a CSV or TSV file: * Email `required` * Account number `required` * Product ID `required` * Product currency `required` The account data can be imported only for the existing clients that are listed on the **Clients** > **General** page. The imported data is displayed on the **Clients** > **Accounts** page and on the [Accounts tab](../clients/general/accounts-tab) in client details. * `import-ibs` — used to import the following data related to IB programs (this data can be imported only from a CSV file): * IB Email `required` — the email address of a partner who has joined an IB program * Client Email `required` — the email address of a client attracted by a partner * IB Type ID `required` — the identifier of an IB program The IB data can be imported only for the existing clients that are listed on the **Clients** > **General** page. The imported data is displayed on the **Introducing Brokers** > **Programs** > **Introducing Brokers** and **Introducing Brokers** > **Programs** > **Clients** pages. *** **Created At** The date and time when an import operation was initiated. *** **User** The email address of a Back Office user who initiated an import operation. *** **Status** The import operation status: * `New` — an import operation has been initiated but hasn't yet run. * `Awaiting confirmation` — during data validation in a CSV or TSV file, some invalid records are detected. The invalid records are displayed in the **Log message** field in the import operation details. You can select to continue the import while excluding the invalid records or cancel the import. * `In Progress` — an import operation is running. * `Success` — an import operation has been fully completed. * `Success with errors` — an import operation has been completed, but at least one error occurred during import. * `Failed` — an import operation failed due to critical errors. To view details of a selected data import operation, click the **Edit** button. ## Details [#details] On the details page, you can find the following fields: **Log messages** Lists the records and their corresponding line numbers from a CSV or TSV file that contain invalid data for import. You can click **Continue import** to proceed with importing all valid records while excluding those with invalid data or you can cancel import, or you can click **Cancel import**. After the import is complete, this field shows the import results for each record from the CSV or TSV file. **Error messages** Lists the records and their corresponding line numbers where errors occurred, causing the import operation to fail. **See also** [How to import client-related data](../../how-to-articles/manage-system-settings/how-to-import-client-related-data) [How to import data related to Back Office user groups](../../how-to-articles/manage-system-settings/how-to-import-data-related-to-back-office-user-groups) On this page, you can set values for parameters that are used in [Templates](templates/email), like colors, images, etc. ## Key storage values [#key-storage-values] On this page, you can view and manage all the key-value pairs, stored in the system. **ID** The identifier of the key-value pair. *** **Type** The value type: string, html, mail, or url. *** **Key** The key name, which is used in [Templates](templates/email). *** **Tags** The group to which the key-value pair belongs. *** **Value** The value assigned to the key. *** **Status** If `Enabled`, the key-value pair can be used in Templates. ## Key storage tags [#key-storage-tags] On this page, you can view and manage tags used for the semantic grouping of key-value pairs. **ID** The tag identifier. *** **Caption** The tag description. *** **Status** The tag status: enabled or disabled. On this page, you can view a list of supported languages and format settings specified for each language. The Back Office fields that support localization can be translated to the supported languages. ## General information [#general-information] The following information is provided about each language: **ID** The language identifier in the system. *** **Caption** The language name. *** **Fallback** The fallback language that is used if no translation to the given language is found. *** **Priority** The priority index assigned to the language. The priority indicates the order in which enabled languages are displayed in the languages list in the B2CORE UI. *** **Enabled** If `Yes`, the language is enabled and can be selected by clients in the languages list displayed in the B2CORE UI. By default, English serves as the fallback language for all the enabled languages. This means that if no translation or template in a specific language is found, the English version is used as a backup to ensure a seamless user experience across different languages. To view language details, select a language and click the **Edit** button. ## Details [#details] The following additional information is provided about each language: **Caption** The language name. *** **Locale** The locale identifier (such as `en_US`). *** **Language code** The language code (such as `en`). *** **Enabled** If `Yes`, the language is enabled and can be selected by clients in the languages list displayed in the B2CORE UI. *** **Default** If `Yes`, the language is applied by default in the B2CORE UI. The default language can’t be disabled. *** **Right to Left** If `Yes`, text strings in the given language are displayed in the right-to-left direction. *** **Priority** The priority index assigned to the language. The priority indicates the order in which enabled languages are displayed in the languages list in the B2CORE UI. *** **Formats** Format settings specified for the language, such as date and time formats, and others. **See also** [How to add or remove a language](../../how-to-articles/manage-system-settings/how-to-add-or-remove-a-language) On this page, you can find logs listing the actions made by the [Back Office users](users/users). The following information is provided about each logged action: **Actor Groups** The name of a [user group](users/groups) that includes a Back Office user who made an action. *** **Actor** The email address of a Back Office user who made an action. *** **Event Category** The action’s scope. Possible values: * **client** — the client-related data was affected * **operation** — the transaction data was affected *** **Event Action** The action type. Possible values: * `ADD` * `UPDATE` * `DELETE` *** **Event Name** The following client-related actions are tracked: * `Client Created` — a new client profile was registered * `Client Updated` — the data displayed on the [Client tab](../clients/general/client-tab) on the client details page was modified * `Client Info Updated` — the data displayed on the [Advanced tab](../clients/general/advanced-tab) on the client details page was modified * `Client Phone Created` — a new phone number was specified for a client on the [Contacts tab](../clients/general/contacts-tab) on the client details page * `Client Phone Deleted` — a phone number was removed from the [Contacts tab](../clients/general/contacts-tab) * `Client Address Created` — a new address was specified for a client on the [Contacts tab](../clients/general/contacts-tab) * `Client Address Updated` — an address was modified on the [Contacts tab](../clients/general/contacts-tab) * `Client Address Deleted` — an address was removed from the [Contacts tab](../clients/general/contacts-tab) The following transaction-related actions are tracked: * `Operation Created` — a deposit, withdrawal, transfer or exchange transaction was made. The transaction identifier and type are displayed in the **Details** column. *** **Details** The detailed information about an action that was made. *** **Created At** The date and time when an action was made. On this page, you can view a list of supported operation types. ### General information [#general-information] The following information is provided about each operation type: **ID** The operation type identifier. *** **Caption** The operation type description. *** **Name** The operation type name: * `deposit` — used for deposits * `payout` — used for withdrawals * `transfer` — used for transfers (when funds are transferred between accounts and wallets of the same client) * `internal_transfer` — used for internal transfers (when funds are transferred from one client to another within the same B2CORE system) * `exchange` — used for exchanges * `partners` — used for reward payments to IB partners *** **Class** The operation type class. *** **Status** The operation type status: `Enabled` or `Disabled`. When an operation type is disabled, clients can’t create the respective transactions in the B2CORE UI. To view operation type details, select an operation type and click the **Edit** button. ## Details [#details] On the details page, you can enable or disable a selected operation type as well as view and adjust its additional settings (if applicable). The following is a list of operation types for which you can adjust the addition settings: ### The `deposit` operation type [#the-deposit-operation-type] **Allowed operation status** A list of statuses that can be assigned to deposit transactions. These statuses are also displayed to clients in the B2CORE UI. ### The `payout` operation type [#the-payout-operation-type] **Auto withdrawal** If **Enabled**, clients can make automatic withdrawals, which don’t require the admin approval, in the B2CORE UI; otherwise, **Disabled**. Further, you can limit the maximum amount that clients can withdraw automatically (for details, refer to [How to set up deposit, withdrawal and transfer limits by verification levels](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels)). *** **Auto processing rules** Select **Crypto** or **Fiat**, or both. *** **Allowed operation status** A list of statuses that can be assigned to withdrawal transactions. These statuses are also displayed to clients in the B2CORE UI. ### The `transfer` and `internal_transfer` operation types [#the-transfer-and-internal_transfer-operation-types] The settings that can be adjusted for `transfer` and `internal_transfer` operation types are the same and include the following options: **Allowed statuses** A list of statuses that can be assigned to transfers or internal transfers. These statuses are also displayed to clients in the B2CORE UI. *** **Operation restriction** A list of transfer directions for which transfers or internal transfers are prohibited. For example, by selecting the **Trade to Wallet** option for the `internal_transfer` type, you can prohibit internal transfers from trading accounts to client wallets. ### The `exchange` operation type [#the-exchange-operation-type] **Allowed statuses** A list of statuses that can be assigned to exchanges. These statuses are also displayed to clients in the B2CORE UI. *** **Hedging Enabled** If **Yes**, exchange operations are hedged; otherwise, **No**. *** **Failed Hedging** * When **Allow Exchange** is selected, an exchange is processed if hedging has failed. * When **Deny Exchange** is selected, an exchange isn’t processed if hedging has failed. In this subsection, you can set up and manage supported withdrawal methods. ## Payout methods [#payout-methods] On this page, you can view a list of configured withdrawal methods and create new ones. ### General information [#general-information] The following information is provided about each withdrawal method: **ID** The identifier of the method in the system. *** **Priority** The priority index assigned to the withdrawal method. The order in which withdrawal methods are displayed to clients in the B2CORE UI depends on priority indexes assigned to methods. A lower index means a higher priority. For example, a method with the index `1` will appear at the top of the list in the B2CORE UI. The priority index can be changed on the [Settings tab](payout-system#settings-tab) in the method details. *** **Caption** The name assigned to the method in the Back Office, which is also visible to clients in the B2CORE UI. *** **Name** The unique name for the method. It can only contain Latin letters, numbers, dashes, and underscores. *** **Group** One or more [groups](payout-system#payout-groups) in which the method is included, such as **Crypto**, **Fiat**, or other. *** **Provider** The name of the payment system. For [PSS-connected](../../integrations/payment-systems#payment-system-service-pss) payment systems, **PaymentSystemsWithdrawal** is displayed as a provider. *** **Driver**\ *Applicable only to payment systems connected via [PSS](../../integrations/payment-systems#payment-system-service-pss)* The driver used to connect to a payment system. It reflects the name of the payment system and, in some cases, the supported payment method. *** **Currency** One or more currencies supported by the method. The method will be available for accounts denominated in the selected currencies. *** **Enabled** The method status: * **No** — the method is inactive and unavailable for withdrawals. * **Yes** — the method is active and available for withdrawals. *** **Status** exclamation icon — indicates that some method settings need to be configured. Hovering over the icon displays a list of required settings, which can be adjusted in the method details. If the column is empty, all required settings for the method have been specified. To view withdrawal method details, click the **Edit** button. ### Details [#details] The details page is divided into the following tabs: * [Settings tab](payout-system#settings-tab) * [TR Currencies tab](payout-system#tr-currencies-tab) * [PS Currencies tab](payout-system#ps-currencies-tab) * [Commissions tab](payout-system#commissions-tab) * [Restrictions tab](payout-system#restrictions-tab) The set of displayed tabs may vary depending on the withdrawal method driver. For example, for methods connected via [PSS](../../integrations/payment-systems#payment-system-service-pss), the additional **Webhooks** and **Test configuration** tabs may be displayed. #### Settings tab [#settings-tab] On this tab, you can view or modify the general settings of the withdrawal method, as well as the connection settings of a payment provider. **Name** The unique name for the method. It can only contain Latin letters, numbers, dashes, and underscores. *** **Enabled** The method status: * **No** — the method is inactive and unavailable for withdrawals. * **Yes** — the method is active and available for for withdrawals. *** **Group** One or more [groups](payout-system#payout-groups) in which the method is included, such as **Crypto**, **Fiat**, or other. *** **Caption** The name assigned to the method in the Back Office, which is also visible to clients in the B2CORE UI. *** **Provider** The name of the payment system. *** **Result URL** The URL that receives callbacks with notifications about withdrawal status updates. *** **Time to fund** The hint text displayed to clients in the B2CORE UI, indicating the estimated processing time for withdrawals. Two standard options are available: * `Depending on the Blockchain` * `From 3 to 5 Days` It's possible to modify the hint text of the standard options or add new ones in **System** > **Key storage** > **Key storage values**. Use the `method_time` tag to locate the relevant keys and update the text. The hint text can be specified in HTML format, but using different formats may cause difficulties in displaying the hint on different devices. For example, while the HTML format renders correctly in the B2CORE UI, it may not work properly in mobile apps. *** **Icon** The method icon displayed to clients in the B2CORE UI for quick identification of the method. You can use predefined icons or specify a URL for a custom image. For a list of predefined icons and their names, refer to [Payment systems](../../integrations/payment-systems) and [Supported cryptocurrency payment methods](../references/supported-cryptocurrency-payment-methods). To use a predefined icon for the method, enter its name in the **Icon** field. If you prefer a custom icon, specify the URL of the image to be displayed as the method icon. *** **Priority** The priority index assigned to the withdrawal method. The order in which withdrawal methods are displayed to clients in the B2CORE UI depends on priority indexes assigned to methods. A lower index means a higher priority. For example, a method with the index `1` will appear at the top of the list in the B2CORE UI. *** **IP White list** A list of IP addresses from which it is allowed to make withdrawals. *** **Rates provider** The name of the rate provider configured on the [Currencies > Rates](../currencies/rates) page. This field is optional. If specified, the system will prioritize requesting rates from this provider when the payout method is used. *** **Auto withdrawal enabled** * **Yes** — clients can make automatic withdrawals using this method, without the need for admin approval. * **No** — automatic withdrawals are disabled. In this case, each withdrawal request must be approved by the admin in the Back Office. The use of this option depends on the settings configured for the `payout` operation type in [System > Operation types](operation-types#the-payout-operation-type). Auto withdrawal can't be enabled for the method in the following cases: * If the **Auto withdrawal** option for the `payout` operation type is disabled, which indicates that automatic withdrawals are globally disabled. * If the [group](#payout-groups) associated with the method isn't listed in the **Auto processing rules** field, meaning that automatic withdrawals are prohibited for that group and all the withdrawal methods included in it. *** **Configuration**\ *Applicable to PSS methods* The withdrawal method configuration form. Its structure and available fields depend on the selected **Driver**. The **external connection** contains technical integration data required to connect to a specific payment system, while the **configuration** defines how the withdrawal process operates. As a result, you can configure two or more withdrawal methods with different configurations that all use the same external connection. If no configuration is available for the selected driver, the following message is displayed: `Configuration form is empty`. *** **Provider settings**\ *Applicable to non-PSS methods* The settings required to connect to a payment provider. The set of connection settings varies depending on the payment provider. After specifying the connection settings, it’s possible to check if the credentials used to access the payment provider are valid. To do this, click the **Check connection** button. Currently, the **Check connection** button is available only for the B2BINPAY payment provider. * If the specified credentials are valid, the status `Success` is displayed under the button. * If the credentials are invalid, the status `Fail` is displayed, followed by an explanation message. In this case, contact the Support team. *** **Custom fields** Applicable for the **Constructor** provider only. Configure a list of fields that clients should fill in when they make withdrawals using the **Constructor** method in the B2CORE UI (for details, refer to [How to add custom fields for the Constructor deposit or withdrawal method](../../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method)). #### TR Currencies tab [#tr-currencies-tab] On this tab, you can view and manage a list of transaction currencies added to the withdrawal method. The method will be available for accounts denominated in these currencies. The following information is provided about each currency: **ID** The identifier assigned to the currency added to the method. *** **Currency** The caption assigned to the currency. #### PS Currencies tab [#ps-currencies-tab] On this tab, you can view and manage a list of currencies supported by the payment provider for processing withdrawals. To enable the method to process withdrawals in a specific currency, ensure it is added to this list. The following information is provided about each currency: **ID** The identifier assigned to the currency added to the method. *** **Currency** The caption assigned to the currency. *** **Supported by PS** The `Supported` status indicates that the added currency is supported by the payment provider and can be used for making withdrawals. When adding a currency with a status that doesn't guarantee compatibility with the payment provider, the `Support is unknown` message is displayed. In this case, the currency can still be added to the tab, and the configuration can be saved. However, the currency might not be fully supported by the withdrawal method, so it should be used with caution. When adding a currency that isn't supported, the `Not supported` message appears. In this case, the currency can't be added to the tab, and saving the configuration isn't allowed. #### Commissions tab [#commissions-tab] On this tab, you can view and manage a list of commissions configured for the withdrawal method. The following information is provided about each commission: **ID** The commission identifier in the Back Office. *** **Currency** One or more commission currencies. *** **Commission** The commission rates that follow the formula: `Minimum commission amount <= Fixed rate + Percentage rate % <= Maximum commission amount` For details, refer to [How to configure commissions for deposit and withdrawal methods](../../how-to-articles/manage-payment-methods/how-to-configure-commissions-for-deposit-and-withdrawal-methods). *** **Type** The commission type: * **TR** (Vendor commission) — the commission that is calculated based on the currency and amount that a client specifies for withdrawal. If this commission type is configured, the client specifies an amount for withdrawal, which then will be reduced by the calculated commission. * **PSP** (Provider commission) — the commission that is calculated only for financial reports and doesn't affect the amount a client withdraws from their account. If this commission type is configured, it only applies to calculations for reports regarding completed withdrawals and is displayed in the **Provider commission** column in [Finance > Payouts](../finance/payouts). #### Restrictions tab [#restrictions-tab] On this tab, you can restrict the use of the withdrawal method by country, client type, verification level, jurisdiction, IB parent ID, or IB program type. The tab lists each restriction along with its status, type, and configured rules (for details, refer to [How to restrict the use of deposit and withdrawal methods](../../how-to-articles/manage-payment-methods/how-to-restrict-the-use-of-deposit-and-withdrawal-methods)). ## Payout groups [#payout-groups] Groups are used to organize withdrawal methods into categories, such as crypto and fiat methods, for easier management. **Priority** The priority index assigned to the group. *** **Name** The group name. *** **Caption** The group description. *** **Enabled** The group status: * **No** — the group is inactive and cannot be used to include withdrawal methods. * **Yes** — the group is active and can include withdrawal methods. On this page, you can view and manage registration profiles that define the client registration process in the B2CORE UI. The new registration settings replace [Registration wizards](wizards) and work together with [custom fields](custom-fields), allowing you to build a registration process tailored to your needs — from a simple form with an email address and a password to a multi-step process with custom fields. After enabling a registration profile, Registration wizards are automatically disabled. The following information is provided about each registration profile: **Type** The type of clients to which the registration profile applies: `Individual` or `Corporate`. *** **Caption** The name of the registration profile. *** **Enabled** Indicates whether the registration profile is enabled. To create a new registration profile, click the **Create** button. ## Pre-filling registration fields with a link [#pre-filling-registration-fields-with-a-link] You can share a sign-up link that opens the registration form with some fields already filled in — for example, the email address and the country you already know about the client. Every pre-filled value stays editable, so the client can correct it before submitting. Pre-filling works only with the **simplified registration flow** — the new registration flow in the B2CORE UI, built from the registration profiles described on this page. It has no effect on the form of the legacy [Registration wizards](wizards). ### Build the link [#build-the-link] Look up the machine name of each field you want to pre-fill. For custom fields, it is the **Machine name** on the **System** > **Custom Fields** > **Fields** page (see [Custom fields](custom-fields)). Standard fields use their own names, such as `email`. Take the sign-up URL of your B2CORE UI and add the ID of the registration flow to open, followed by one `init[]=` parameter per field: ``` https://example.com/auth/register/01936f7a-4b21-70c8-9d5e-6a1f2c3b4d5e?init[email]=john.doe@example.com&init[country]=196 ``` Replace `https://example.com` with the address of your B2CORE UI, `01936f7a-…` with the ID of your registration flow, and URL-encode the values. The ID makes the link open one specific registration form, so the client does not have to choose the client type first. You find it in the list of registration profiles on this page, in **System** > **Registration**. A link without the ID works as well: ``` https://example.com/auth/register?init[email]=john.doe@example.com&init[country]=196 ``` The client picks the client type first, and the parameters survive that step and reach the form. ### Values by field type [#values-by-field-type] | Field type | What the link can pass | | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Text, Multiline, Email, URL, Phone, Integer, Decimal, Date, Date & time | One value. If the parameter is repeated, the first value is used. | | Select | One value that matches an option configured for the field. A value that matches no option is ignored. | | Multiselect | Several matching option values, passed as repeated parameters (`init[hobbies]=chess&init[hobbies]=golf`), in the array form (`init[hobbies][]=chess&init[hobbies][]=golf`), or as a comma-separated list (`init[hobbies]=chess,golf`). | | Boolean | Only `true` selects the field. Any other value leaves the field as it is. | For **Select** and **Multiselect** fields, the link must carry the value of the option, not the label the client sees. For a field with a reference list, such as the country field, the option value is its numeric ID — for example, `init[country]=196`. Password fields, and any other fields that hold secret values, are never pre-filled — the value in the link is ignored. Read-only fields and names that do not exist in the form are ignored as well. ### Good to know [#good-to-know] * Pre-filled values are validated straight away, so a value that does not pass the field validation is highlighted as soon as the form opens. * In multi-step registration forms, values are applied to all steps at once, and stepping back and forth does not overwrite what the client has typed. * The parameters stay in the address bar: if the client reloads the page, the values from the link are applied again and any edits are lost. * Values are limited to 1,000 characters; anything longer is truncated. * A value that contains a comma is pre-filled only up to the comma, because commas separate multiple values. **See also** [How to migrate to the new registration settings](../../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings) In this subsection, you can define reject reasons for [client requests](../clients/requests). ## Resolutions [#resolutions] If you reject a client’s request, select a **resolution**, which is a reason for the rejection. On this page, you can view a list of available resolutions. **ID** The resolution identifier. *** **Caption** The resolution description. *** **Enabled** The resolution status. *** **Type** The [resolution type](requests#resolution-types). **See also** [How to create a request resolution](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution) ## Resolution types [#resolution-types] **Resolution types** are used to categorize and group different resolutions. On this page, you can view a list of available resolution types. **ID** The resolution type identifier. *** **Caption** The resolution type description. *** **Enabled** The resolution type status. **See also** [How to create a request resolution type](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution-type) ## Information Showing [#information-showing] Use the following settings to enable or disable specific options for clients in the B2CORE UI: **History IDs** If `Enabled`, clients can view identifiers of deals in their trading history in the B2CORE UI. *** **Profile IDs** If `Enabled`, clients can view identifiers assigned to their profiles in the B2CORE UI. *** **Change a nickname** If `Enabled`, clients can add and change their nicknames in the B2CORE UI. *** **Change a userpic** If `Enabled`, clients can add and change their profile pictures in the B2CORE UI. If you want requests to be created for adding or changing profile pictures, select `Yes` for the **Request required for avatar** option in [Client Settings](settings#client-settings). In this case, profile pictures are updated only after these requests are approved by the admin. *** **Show email** If `Enabled`, email addresses used by clients for signing-in are displayed in client profiles in the B2CORE UI. *** **Show nickname** If `Enabled`, the **Nickname** field is displayed in client profiles in the B2CORE UI. Nicknames are required only for clients when using [B2COPY](https://docs.b2copy.b2broker.com/). Client nicknames are displayed in the Leaderboard, allowing easy identification and distinction between accounts. ## Client Settings [#client-settings] **Unique phone** If `Enabled`, new clients must specify unique phone numbers during registration (if your registration procedure requires phone numbers) and can’t register with a phone number that has already been used by another client. *** **Request required for avatar** * If `Yes`, requests are created when clients adding or changing their profile pictures in the B2CORE UI. In this case, profile pictures are updated only after these requests are approved by the admin. * If `No`, client can add or change their profile pictures without admin approval. Both options relate to the **Change a userpic** option in [Information Showing](settings#information-showing). If **Change a userpic** is disabled, clients are not allowed to add or change their profile pictures. ## Client profile [#client-profile] **Address updating** Indicates whether clients can change their country and address in the **Profile** menu of the B2CORE UI. Address updating is available only for `individual` clients and applies only to **Residential** addresses. * **Disabled** — clients aren't allowed to change their country and address. * **KYC validation** — clients can change their country and address but are informed that their current verification level will be reset. They must complete the KYC procedure again and submit the required documents confirming the new address to restore their level. Select this option if your KYC procedure includes address verification. * **Request validation** — clients can change their country and address and must upload documents confirming the change. The **Address** request is then created and must be reviewed and approved by the admin in **Clients** > **Requests** in the Back Office. Select this option when your KYC procedure doesn't include address verification. *** ## Weblate [#weblate] **Project ID** Specify the identifier of a B2TRANSLATE project (formerly WEBLATE) used for maintaining translations to the supported languages in the B2CORE UI. For more information about B2TRANSLATE, refer to the [product documentation](https://docs.b2translate.b2broker.com/). ## Exchange [#exchange] **Quote lifetime (minutes)** Specify the interval, in minutes, during which the received quote rates are valid for making exchanges in the B2CORE UI. ## Slack Bot [#slack-bot] **Bot token** Specify a token for managing your Slack bot (for details, refer to [How to set up a Slack bot](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-slack-bot)). ## Telegram Bot [#telegram-bot] **Bot API Token** Specify a token for managing your Telegram bot (for details, refer to [How to set up a Telegram bot](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-telegram-bot)). ## Bonuses [#bonuses] Use the following options to configure the automatic process of crediting bonuses to clients for making deposits to their trading accounts. Bonuses are supported for trading accounts opened on MetaTrader 4/5 and cTrader. **Autocreate from deposit** * If `Enabled`, bonuses are automatically credited to clients once they deposit funds to their trading accounts (for details, refer to [How to automatically credit bonuses to clients upon deposits](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits)). To enable automatic bonus crediting upon deposits, create a bonus preset for each platform where this feature is needed. The preset with the **lowest** index on a given platform will be used for automatic bonus crediting (for details, refer to [How to create a bonus preset](../../how-to-articles/manage-bonuses/how-to-create-a-bonus-preset)). * If `Disabled`, automatic bonuses for making deposits to trading accounts aren’t credited. *** **Autocreated bonus percent** The percentage of a deposit amount, which is credited as a bonus to a client trading account. *** **Auto Bonus Limit** The maximum bonus amount that can be automatically credited to a client trading account for making a deposit. If a calculated bonus amount exceeds the specified limit, only the maximum allowed amount is credited to the account. *** **Auto Bonus Minimum** The minimum amount that a client must deposit to their trading account to trigger automatic bonus crediting. This amount applies to each deposit and transfer operation made to the account, and it doesn’t relate to an overall sum of deposits made by a client. *** **Enable "Burn if Equity \< Credit"**\ *Applicable for MT4/5 only* Select the platforms on which you want to enable this option. This option can be enabled for MT4/5 and isn't supported for cTrader. On the selected platforms, a bonus credited to a client trading account is burnt if the account equity falls below the credited bonus amount. *** **Burn on withdrawal** * If `Enabled`, when a client makes a withdrawal from their trading account, a bonus credited to that account is burnt. * If `Disabled`, withdrawals don’t affect the credited bonus. ## User Registration Settings [#user-registration-settings] **Enable User Registration** * If `Enabled`, new clients can register in the B2CORE UI. * If `Disabled`, the registration of new clients is unavailable. ## Two-factor authentication [#two-factor-authentication] **Enabled Two-factor auth providers** Select the 2FA methods that will be visible and available for clients to use in the B2CORE UI. You can enable both Google Authenticator and SMS confirmation, or only one of them. **Service name** Enter the name to be displayed in the Google Authenticator app, representing the B2CORE UI for which 2FA codes are generated. ## Mobile [#mobile] The options in this section are applicable if you have the mobile app deployed (for details, refer to [B2CORE Mobile](../../b2core-mobile/deploying-your-ios-app)). Clients can sign in to the B2CORE UI by scanning QR codes displayed on the **Sign In** page using the mobile app to which they have already been signed in. This allows them to sign in without re-entering their credentials. **QR-code lifetime, min** * To limit the QR code lifetime, specify the number of minutes a QR code is valid. The default limit is set to 2 minutes. * To hide QR codes from the **Sign In** page, specify **0** or leave this field empty. *** **Mobile application** Select the platforms for which you want to display the button for downloading the mobile app. The button will appear on the **Sign In** page of the B2CORE UI and at the top of the **Dashboard** after clients sign in (for details, refer to [How to configure settings for mobile app downloads](../../how-to-articles/manage-system-settings/how-to-configure-settings-for-mobile-app-downloads)). — By default, this field is empty. Possible options: * **iOS** — select this option to provide a link for downloading your iOS app from the Apple Store. * **Android** — select this option to provide a link for downloading your Android app from Google Play. * **Android APK Registry** — select this option to provide a link for downloading the Android APK. *** **iOS URL** If you selected **iOS**, specify the URL for downloading the iOS app from the Apple Store. *** **Android URL** If you selected **Android**, specify the URL for downloading the Android app from Google Play. *** **Android APK Registry ID** If you selected **Android APK Registry**, specify the universally unique identifier (UUID) of the Android APK. This UUID is used to generate the download link for the Android APK. *** ## Metatrader 4 and Metatrader 5 [#metatrader-4-and-metatrader-5] **Partner program enabled** If `Enabled`, IB programs are available on the respective platforms. ## Other settings [#other-settings] **Confirmation phone code lifetime** Specify the period, in seconds, during which a verification code sent to a client phone number is valid. *** **Sms limit for each recipient** Specify the maximum number of verification code messages that can be requested by a client per day. *** **User-admin session between 1 – 120 (min)** Specify the session time limit for [Back Office users](users/), in minutes. The default limit is set to 24 minutes. After reaching a specified time limit, users are automatically signed out of the Back Office. On this page, you can view a list of connected SMS providers. **Name** The name assigned to an SMS provider configuration. *** **Caption** The name of an SMS provider, used in the Back Office. *** **Provider** The name of an SMS provider. *** **Enabled** If **Yes**, an SMS provider is enabled and used for delivering SMS to your clients; otherwise, **No**. To view the configuration settings of an SMS provider, click **Edit**. **See also** [How to configure Twilio](../../how-to-articles/manage-communication-platforms/how-to-configure-twilio) The **Status Checks** page gives you an at-a-glance view of the health of important parts of your B2CORE instance. Each check runs automatically on a schedule and records its result, so you can spot problems, such as an unreachable trading platform or an incomplete setup, without leaving the Back Office. To open the page, go to **System** > **Status Checks** in the main menu. ## Failed checks indicator [#failed-checks-indicator] When one or more checks are failing, a warning icon appears in the topbar, next to the notifications bell, with a badge showing the number of failed checks. Click the icon to open a drop-down list of the currently failing checks. Each item shows: * The check name. * A short description of the problem. * A chip indicating how long ago the check last ran, for example, **5 minutes ago**. Select a check in the list to open the **Status Checks** page and jump to that check. Only checks with the **Failed** or **Error** status appear in the indicator. Checks with the **OK**, **Pending**, or **Unknown** status are not counted. ## Status timeline [#status-timeline] The page lists every registered check. For each check, a horizontal timeline shows how its status changed over time, with consecutive runs of the same status grouped into a single colored period. The timeline covers up to one month. For a recently deployed instance, it starts at the first recorded run instead, so the window stays meaningful. Each check also shows: * A badge with the current status. * The time of the last run, or **never run** if there are no recorded runs yet. * The rendered details of the most recent run, for example, the list of unreachable platforms. ## Statuses [#statuses] A check run can have one of the following statuses. *** **OK** The check passed. The monitored area is healthy. *** **Failed** The check detected a problem, for example, a trading platform is unreachable or a required setup is missing. *** **Error** The check could not complete because of an unexpected error. The recorded details include the error message. *** **Pending** A check run has started and is awaiting its result. *** **Unknown** The status could not be determined, for example, a run did not complete or the check was reset. Unknown results are not treated as failures. *** **No data** No check runs were recorded for that part of the timeline. ## Available checks [#available-checks] The following checks are available by default. *** **Live platforms connectivity** Verifies that every enabled live trading platform is reachable. *** **Demo platforms connectivity** Verifies that every enabled demo trading platform is reachable. *** **Visual customization** Verifies that the base resources, such as logos, favicons, and backgrounds, and a color scheme are configured on the [Visual customization](visual-customization) page. *** **New Registration settings** Verifies that client registration is enabled and that at least one registration configuration is enabled on the **System** > **Registration** page. Use the options in this section to customize the appearance of your B2CORE UI to reflect your brand’s unique style. ## Key points [#key-points] The available options enable you to: * Select whether you want to enable the light theme, dark theme, or both for your B2CORE UI, and choose which one should be set as the default. * Upload custom logos for both themes of your B2CORE UI. * Adjust the colors of various UI elements for both light and dark themes. * Set and update background images for the **Sign In** and **Sign Up** pages of the B2CORE UI. * Add custom scripts, for example, for chatbot integration and analytics tracking. ## Resources [#resources] On this page, you can upload or modify the logos displayed in your B2CORE UI, as well as background images for the **Sign Up** and **Sign In** pages , if needed. **Logo for light theme** The main logo displayed in the B2CORE UI when the light theme is enabled. The required format: SVG with transparent background, file size up to 10 MB. *** **Short logo for light theme** A compact version of the logo displayed when the main menu is collapsed in the light theme. The required format: SVG with transparent background, file size up to 10 MB. *** **Logo for dark theme** The main logo displayed in the B2CORE UI when the dark theme is enabled. The required format: SVG with transparent background, file size up to 10 MB. *** **Short logo for dark theme** A compact version of the logo displayed when the main menu is collapsed in the dark theme. The required format: SVG with transparent background, file size up to 10 MB. *** **Favicon (.ico)** The small icon shown in the browser tab. The required format: ICO, file size up to 10 MB. *** **Favicon (.svg)** The vector version of the favicon for browsers that support SVG. The required format: SVG, file size up to 10 MB. Will be used as a scalable icon. *** **Apple touch icon** The icon displayed on Apple devices when the B2CORE UI page is added to the home screen. The required format: PNG, 180×180 pixels, file size up to 10 MB. *** **Light theme background** The background image applied to the **Sign Up** and **Sign In** pages when the light theme is enabled. Adding a background image is optional. The recommended format: SVG, JPG, or PNG, file size up to 10 MB. *** **Dark theme background** The background image applied to the **Sign Up** and **Sign In** pages when the dark theme is enabled. Adding a background image is optional. The recommended format: SVG, JPG, or PNG, file size up to 10 MB. ### Admin Panel images [#admin-panel-images] In this section, you can upload the images displayed in the Back Office (the recommended format: JPG, PNG, or SVG, file size up to 10 MB): * **Logo menu** — the logo displayed in the Back Office main menu * **Login page logo** — the logo displayed on the Back Office sign-in page * **Login page background** — the background image applied to the Back Office sign-in page ## Color Scheme [#color-scheme] On this page, customize color settings for the light and dark themes of your B2CORE UI. In the **Brand Configuration** section, you can quickly set up your brand identity by specifying the **Brand color** and enabling the **Tinted backgrounds** option, which applies a subtle tint of the brand color to interface backgrounds. The color settings for individual interface elements described below are available in the **Advanced color settings** section. **Light theme enabled** Select the checkbox to enable the light theme for the B2CORE UI. Enable the **Default** option to set the light theme as the default if both themes are enabled. *** **Dark theme enabled** Select the checkbox to enable the dark theme for the B2CORE UI. Enable the **Default** option to set the dark theme as the default if both themes are enabled. If neither theme checkbox is selected, your B2CORE UI will use the predefined light and dark themes from the B2BDemo design, and all custom color settings listed below will be ignored. If both theme checkboxes are selected, both themes will be available to clients in the B2CORE UI, along with the applied custom color settings. Visual customization — Color Scheme The advanced color settings are organized into the **Semantic Tokens V1 (Light / Dark)** and **Semantic Tokens V2 (Light / Dark)** sections, allowing you to customize each color token separately for the light and dark themes. To reset the color tokens to the values derived from your brand color, click the **Reset colors from brand** button. Only 6- or 8-character hexadecimal color codes are supported. The **Semantic Tokens V1 (Light / Dark)** section includes the following token groups: * **Accent** — `accent`, `accentHover`, `accent40`, `accent10`, `demo` * **Status** — `positive`, `positive20`, `medium`, `medium20`, `negative`, `negative20` * **Surface** — `background`, `background96`, `card`, `field`, `disabled`, `overlay`, `tooltip`, `divider` * **Text** — `textMain`, `textSecondary`, `textSecondary40`, `textContrast` The **Semantic Tokens V2 (Light / Dark)** section includes the following token groups: * **Accent** — `brand`, `brandSubtle`, `brandMuted`, `alternative`, `alternativeSubtle`, `alternativeMuted`, `positive`, `positiveSubtle`, `positiveMuted`, `medium`, `mediumSubtle`, `mediumMuted`, `negative`, `negativeSubtle`, `negativeMuted`, `neutral`, `overlay`, `overlaySubtle`, `overlayMuted` * **Character** — `onSurface`, `onSurfaceSecondary`, `onSurfaceInverse`, `onBrand`, `onAlternative`, `onPositive`, `onMedium`, `onNegative`, `onNeutral`, `onOverlay`, `onSurfaceBrand`, `onSurfaceAlternative`, `onSurfacePositive`, `onSurfaceMedium`, `onSurfaceNegative`, `onSurfaceOverlay` * **Surface** — `surfaceLow`, `surface`, `surfaceHigh`, `surfaceHighest`, `surfaceInverse`, `backdrop` * **Outline** — `outline`, `outlineStrong` * **State** — `stateHovered`, `statePressed`, `stateHoveredInverse`, `statePressedInverse`, `stateDarken`, `stateDarkenStrong` **Additional light/dark theme variables (json)** Use this field to specify a JSON object with additional variables, such as those that define how a background image behaves in the respective theme: ```json { "optional-external-bg-position": "0 0", "optional-external-bg-size": "cover", "optional-external-bg-repeat": "no-repeat", "optional-external-bg-attachment": "fixed" } ``` `"optional-external-bg-position": "0 0"` Positions the background image at the **top-left corner**. *** `"optional-external-bg-size": "cover"` Scales the background image to cover the entire page. *** `"optional-external-bg-repeat": "no-repeat"` Prevents the background image from repeating (tiling) in any direction. *** `"optional-external-bg-attachment": "fixed"` Keeps the background image fixed in place when the page is scrolled. It won't move with the content. *** ## Fields [#fields] On this page, you can specify additional customization fields. **Project name** The name of your project displayed in the B2CORE UI. *** **Scripts (js-script)** Add your JavaScript (JS) scripts here. These scripts will be executed automatically when the **Sign Up** or **Sign In** page is opened by clients. On this page, you can view a list of added and configured wizards. **Wizards** are tools used to configure and modify workflows of specific procedures that run in the B2CORE UI, such as client registration, authorization, password recovery, and others. You can configure multiple wizards for each procedure. In such cases, you should select the default wizard that will be used to run a procedure in the B2CORE UI. Non-default wizards may outline procedures used by external systems to perform certain actions via API. ## General information [#general-information] The following information is provided about each wizard: **ID** The wizard identifier. *** **Name** The wizard name. *** **Type** The type indicating the procedure for which the wizard outlines the workflow. *** **Enabled** If `Yes`, the wizard is enabled and used for running a procedure; otherwise, `No`. *** **Default** If `Yes`, the wizard is used by default in the case when more than one wizard is configured for the same procedure; otherwise, `No`. To view wizard details, click the **Edit** button. ## Details [#details] The details page is divided into the following tabs: * **Wizard** tab — displays the main wizard parameters * **Workflow** tab — lists the required and additional steps included in a procedure workflow The required steps can’t be removed from a procedure workflow. To include additional steps in the workflow, click the **Add** button and select a step from the list of additional steps supported for a selected wizard. Both the required and additional steps are automatically assigned designated priority indexes that define the order in which the steps are executed when running a procedure in the B2CORE UI. The steps can’t be reordered. The following are some of the supported wizards, along with their full lists of required and additional steps that form the procedure workflows. Required steps are labeled as `required`. Additional steps can be added to or removed from procedure workflows as necessary. The order of the steps can’t be changed. ### Registration wizard [#registration-wizard] The wizard outlines the procedure of signing up new clients to the B2CORE UI. **See also** [How to add and configure the registration wizard](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard) [How to set up fields for the Basic Information step](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-set-up-fields-for-the-basic-information-step) [Fields supported in the Basic Information step](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/fields-supported-in-the-basic-information-step) [How to set up fields for the Advanced step](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-set-up-fields-for-the-advanced-step) [How to block registration for country](../../how-to-articles/manage-system-settings/how-to-block-registration-for-a-country) ### Authorization wizard [#authorization-wizard] The wizard outlines the procedure of signing in to the B2CORE UI. ### Password recovery wizard [#password-recovery-wizard] The wizard outlines the procedure of recovering client passwords for accessing the B2CORE UI. ### Password change wizard [#password-change-wizard] The wizard outlines the procedure of changing client passwords for accessing the B2CORE UI. ### Address change wizard [#address-change-wizard] The wizard outlines the procedure of changing the client address. ### Whitelist creation wizard [#whitelist-creation-wizard] The wizard outlines the procedure of creating a withdrawal whitelist and adding wallet addresses to that list. ### Whitelist delete wizard [#whitelist-delete-wizard] The wizard outlines the procedure of deleting wallet addresses from the withdrawal whitelist that was previously created by a client. ### Whitelist change wizard [#whitelist-change-wizard] The wizard outlines the procedure of disabling the withdrawal whitelist that was previously created by a client. ### Withdrawal wizard [#withdrawal-wizard] The wizard outlines the procedure of making withdrawals in the B2CORE UI. **See also** [How to change the wizard workflow](../../how-to-articles/manage-system-settings/how-to-change-the-wizard-workflow) Some actions taken by your clients in the B2CORE UI require a resolution (approval or rejection). To view pending requests quickly, click the **bell** icon in the top bar and navigate to the request details by clicking the desired request. Alternatively, you can view a list pending requests on the **Clients** > **Requests** page. To resolve a client request: Navigate to **Clients** > **Requests**. Select the request. You can filter the requests list by client email, request type, or other criteria to quickly find the needed request. Click the **Edit** button to view the request details. Note that for some providers it is also possible to edit the deposit or payout amount directly in the request. **Add comment** if required. This comment will be displayed only in the Back Office. Your client won't be notified about this. Use the **Options** button to set the color of the request in the list. Click **Audit** to check the transaction. The system will summarize all incoming transactions on the account and show a notification if there is a significant discrepancy in the balance. This step requires the `Update requests` permission. Click **Approve** or **Reject** to resolve the request. If **rejected**: Select **Resolution type** and **Resolution**. The type and resolution must be previously created in the system (for details, refer to [How to create a request resolution type](../manage-system-settings/how-to-create-a-request-resolution-type) and [How to create a request resolution](../manage-system-settings/how-to-create-a-request-resolution)). **Confirm** the rejection by solving a simple math problem and provide the result in the **Verification code** field. Click **OK** to save the changes. After that, an email notification about the request resolution will be sent to the client. Use client tags to organize and filter client data in the Back Office. By assigning tags to clients, you can enable Back Office users, such as admins or managers, to only see clients with specific tags, while hiding others. You can assign tags to clients manually (for details, refer to the instructions below [Assign tags to a single client](#assign-tags-to-a-single-client) and [Assign tags to multiple clients](#assign-tags-to-multiple-clients)). If you use [jurisdictions](../../back-office-guide/clients/jurisdictions), tags linked to a jurisdiction will be automatically assigned to clients, along with the jurisdiction, after registration, based on the selected country (for details, refer to [How to create a jurisdiction](how-to-create-a-jurisdiction)). ## Assign tags to a single client [#assign-tags-to-a-single-client] To assign tags to a client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. In the **Client Tags** dropdown, select one or several tags that you want to assign to this client. Press **Enter** after selecting each tag in the dropdown. To view a list of available client tags or add new tags, navigate to **System** > **Users** > **Client Tags**. Click **Save** to apply the changes. The tags assigned to the client are displayed in the **Tags** column on the **General** page. ## Assign tags to multiple clients [#assign-tags-to-multiple-clients] To assign tags to multiple clients at once: Navigate to **Clients** > **General**. Click the **Select** button in the upper-right page corner, and then select clients to which you want to assign tags by clicking client rows. * To select all clients, click **Select All**. * To unselect a client, click the corresponding client rows again. * To unselect all clients at once, click **Deselect**. Expand the **Edit selected clients** dropdown in the upper-right page corner, and then select **Assign Tags**. In the **Client Tags** dropdown, select one or several tags that you want to assign to the selected clients. Press **Enter** after selecting each client in the dropdown. To replace the existing client tags with the new ones, enable the option to **Overwrite current values**; otherwise, the new tags will be added to the existing ones. Click **Save** to apply the changes. The tags assigned to the clients are displayed in the **Tags** column on the **General** page. **See also** [How to make an admin user see only specific clients](../manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) To change a password for a client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the **View client** page, click the **Actions** button in the upper-right page corner, and then select **Change password**. In the **Change password** popup: * Enter a new password in the **Password** field. Alternatively, you can generate a secure password by clicking the **Generate** button on the right side of the **Password** field. * In the **Send mail** dropdown, select **Yes** to email the new password to the client. Click **Save** to change the password. To create a jurisdiction: Navigate to **Clients** > **Jurisdictions**. Click **+Create** in the upper-right page corner. On the **Create a jurisdiction** page, fill in the following fields: * In the **Caption** field, enter the name that you want to apply to the jurisdiction, for example: `Latin America`. * In the **Countries** dropdown, select countries that belong to the jurisdiction. Only the countries that are enabled on the [System > Countries](../../back-office-guide/system/countries) page are listed in the dropdown. * In the **Client types** dropdown, select client types to associate with the jurisdiction. Only the client types that are enabled on the [Clients > Types](../../back-office-guide/clients/types) page are listed in the dropdown. * In the **Tags** dropdown, optionally select one or more [tags](../../back-office-guide/system/users/client-tags) that will be automatically assigned to clients along with the jurisdiction. * In the **Description** field, enter the description or additional details about the jurisdiction. * Select the **Apply changes to all existing clients** checkbox to apply the jurisdiction to all existing clients whose country and client type match the combinations added to the jurisdiction. Leave the checkbox disabled to apply the jurisdiction only to clients who register after creating the jurisdiction. The existing clients won't be affected. Click **Save** to create the jurisdiction. Clients can now be automatically assigned to the jurisdiction after they complete the registration process, based on their countries and client types. The assigned jurisdiction is displayed in the **Additional Info** section in the client details, where it can also be changed manually. ## How to edit a jurisdiction [#how-to-edit-a-jurisdiction] To edit a jurisdiction: Navigate to **Clients** > **Jurisdictions**. Select the jurisdiction that you want to modify and click the **Edit** button. On the **Update jurisdiction** page, you can make the following changes: * In the **Countries** dropdown, add or remove countries associated with the jurisdiction. * In the **Client types** dropdown, add or remove types associated with the jurisdiction. * In the **Tags** dropdown, add or remove tags that will be assigned to clients belonging to this jurisdiction. * To apply the updated settings to the existing clients, select the **Apply changes to all existing clients** checkbox. Leave the checkbox disabled to apply the changes only to new clients who register after the changes are saved. The existing clients won’t be affected. Click **Save** to apply the updates to the jurisdiction settings. The changes will take effect based on whether the **Apply changes to all existing clients** checkbox is selected or disabled. If you have any jurisdiction-based restrictions applied to products, deposit and withdrawal methods, or verification levels, they will be in effect for clients according to the updated jurisdiction settings. ## Example 1 [#example-1] Suppose two jurisdictions are configured with the same countries but different client type settings: * The **Seychelles (SC)** jurisdiction: * **Countries**: UAE and Oman * **Client type**: Personal * The **Mauritius (MU)** jurisdiction: * **Countries**: UAE and Oman * **Client type**: Corporate When new clients are registered: * A client from **UAE** with **Personal** type is automatically assigned the **SC** jurisdiction. * A client from **UAE** with **Corporate** type is automatically assigned the **MU** jurisdiction. * A client from **Oman** with **Personal** type is assigned the **SC** jurisdiction. * A client from **Oman** with **Corporate** type is assigned the **MU** jurisdiction. * A client from a country not listed in either jurisdiction, or with a client type not matching the jurisdiction settings, isn't assigned any jurisdiction. ## Example 2 [#example-2] Suppose the **Seychelles (SC)** jurisdiction from the above example is updated: **Oman** is removed and **Saudi Arabia** is added: The **Seychelles (SC)** jurisdiction: * **Countries**: UAE and Saudi Arabia * **Client type**: Personal If the **Apply changes to all existing clients** checkbox is *enabled*: * The **SC** jurisdiction is removed from existing clients whose country is **Oman** and client type **Personal**. They aren't assigned any jurisdiction. * Existing clients from **Saudi Arabia** with **Personal** type are assigned the **SC** jurisdiction. * Existing clients from **UAE** remain unchanged. * The updated **SC** jurisdiction will also be assigned to newly registered clients based on the updated country list. If the **Apply changes to all existing clients** checkbox is *disabled*: * Existing clients remain unchanged. For example, clients from **Oman** with **Personal** type still have the **SC** jurisdiction even though **Oman** has been removed. * The updated **SC** jurisdiction only applies to clients who register after the changes are saved, based on the updated country list. **See also** [How to make an admin user see only specific clients](../manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) To disable two-factor authentication (2FA) for a client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the **View client** page, go to the **Settings** tab. In the **2FA** section, select `Disabled` in the dropdown for either **google** or **sms**, or both, depending on which 2FA method you want to turn off. Click **Save** to apply the changes. To enable internal transfers for a client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the **View client** page, go to the **Settings** tab. In the **Rights** section, enable the **Internal Transfers** checkbox. Click **Save** to apply the changes. To find the Back Office user who approved or rejected a specific client request: Navigate to **Clients** > **Requests**. Locate the needed request. By default, the list is filtered by the `Pending` status. Clear the **Status** filter to view all requests. To narrow your search, apply other filters such as **Client name**, **Client email**, **Country**, the request's **Type**, **Status** (`Approved` or `Rejected`), or a date range. Check the **Processed by** column to see the email address of the Back Office user who resolved the request. This same **Processed by** information is also displayed in the upper-right corner of the request details page. To register a new client and create their profile: Navigate to **Clients** > **General**. Click **+Create** in the upper-right page corner. In the displayed **Create client** popup, enter the client's email, first name, and last name. The required fields may vary depending on the configuration of the [Registration wizard](../../back-office-guide/system/wizards#registration-wizard). Click **Save** to create the client profile. Upon successful registration, the client will receive an email notification confirming the registration. The newly registered client is added to the clients list displayed on the **General** page. You can click the **Edit** button to access the client details and update their profile with further information. By default, the client profile is created without a password. The client needs to reset the password upon their first sign-in to the B2CORE UI. Alternatively, you can [set the password](how-to-change-a-client-password) for the client and send it via email. To upload one or more files to a client profile: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the **View client** page, go to the **Files** tab. Click **+Add file** to add a single file or **+Upload multiple files** to add several files at once. To upload one or several files to a folder, click **+Add directory** and specify the folder name in the **Caption** field. Go to the newly created folder and click **+Add file** or **+Upload multiple files**. Set **Caption** for the file. This caption will be displayed in the files list. When uploading multiple files, the caption automatically displays the list of file names. Select the file(s) to upload. Note that the uploaded file(s) must meet the following requirements: * Supported formats: DOC, DOCX, XLSX, CSV, PDF, JPG, PNG, PAGES, NUMBERS, ZIP, 7-Zip, and RAR * File size: up to 3 MB Click **Save** to upload the file. To check wallet addresses for deposits and withdrawals for a client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the **View client** page, click the **Finance** tab, and then select **Withdrawal wallets** or **Deposit wallets** in the dropdown. On the selected page, find the addresses in the **Address** column, which displays the alphanumeric strings representing the deposit or withdrawal addresses generated for the client. Enable one-click access to trading platform web terminals for your clients directly from the B2CORE UI and mobile apps for Android and iOS for a seamless trading experience. To enable clients to open web trading terminals from B2CORE UI and mobile app: In the Back Office, navigate to **Products** > **Platforms**. Select the platform and click the **Edit** button. On the **Edit platform** page, specify the URL of the web trading terminal for the selected platform in the **Web Terminal URL** field. Click **Save** to apply the changes. For the selected platform, the **Trade** button will appear on account cards in the B2CORE UI and mobile app, enabling clients to open the web terminal with a single click. For **cTrader**, the terminal will directly open the account from which the **Trade** button was clicked, eliminating the need for clients to search for the desired account. This instruction describes how to create a platform, product group, and products that are required for enabling B2TRADER functionalities via the the B2CORE Back Office. Before you start configuring the B2TRADER platform and product in the Back Office, make sure that a connection to B2TRADER has already been set up by your account manager who is assigned the permissions to manage external connections. ## How to create a platform for B2TRADER [#how-to-create-a-platform-for-b2trader] To create a platform for B2TRADER: Navigate to **Products** > **Platforms**. Click **Create** in the upper-right page corner, and then select **B2TraderBrokeragePlatform** in the dropdown. In the **Create platform** popup, fill in the following fields: * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. * In the **Available connection providers** dropdown, select **B2TraderBrokeragePlatform**. * In the **Connection** dropdown, select the previously configured B2TRADER connection. Click **Save** to proceed. On the **Edit platform** page, specify the following settings: * In the **Short caption** field, you can optionally specify a short platform name. * Make sure that **No** is selected in the **Demo** dropdown. * In the **Status** dropdown, select **Enabled**. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. After the connection settings have been successfully validated, click **Save**. ## How to create a product group for B2TRADER [#how-to-create-a-product-group-for-b2trader] To create a product group for B2TRADER: Navigate to **Products** > **Groups**. Click **+Create** in the upper-right page corner. On the **Create group** page, fill in the following fields: * In the **Caption** field, enter a caption that you want to use for the group. This caption will be assigned to the product group in the Back Office and will be visible to clients in the B2CORE UI. * In the **Description** field, enter a group description. * In the **Type** dropdown, select **Default**. Click **Save** to create the product group. ## How to create a product for B2TRADER [#how-to-create-a-product-for-b2trader] To manage both live and demo accounts, as well as **Hedging** and **Netting** types, separate products must be created for B2TRADER in the B2CORE Back Office. To create a product for B2TRADER: Navigate to **Products** > **Products**. Click **Create** in the upper-right page corner, and then select the caption assigned to the previously configured [B2TRADER platform](#how-to-create-a-platform-for-b2trader) in the dropdown. In the **Create product** popup, fill in the following fields: * In the **Platform group** dropdown, select the appropriate group existing on the B2TRADER platform. * In the **Currency** dropdown, select the currency for the product. The available currency options in B2CORE depend on the settings of the selected platform group. * In the **Account type** dropdown, select **Hedging** or **Netting**. * In the **Name** field, enter a unique name for the product. * In the **Group** dropdown, select the previously created [product group](#how-to-create-a-product-group-for-b2trader) to include the product into that group. * In the **Type** dropdown, select: * **Trade** — if you create a product for managing live accounts * **Demo** — if you create a product for managing demo accounts Click **Save** to proceed. On the **Edit product** page, specify the following product settings: * In the **Name** field, you can modify the product name. The name must be unique. * In the **Caption** field, enter a caption for the product. This caption will be assigned to the product in the Back Office and will be visible to clients in the B2CORE UI. * In the **Default** leverage field, enter the default leverage ratio that will be assigned to accounts created automatically when the **Auto creation on login** option is triggered. * In the **Leverage** field, enter one or more leverage ratios that client can select when creating accounts via the B2CORE UI. * In the **Rights** and **Default account rights** dropdowns, select the required permissions that will be applied to the product (such as `Enabled`, `Deposit`, `Withdraw`, `Visible`, `Transfer deposit`, `Transfer withdraw`, and `Exchange`). * In the **Max accounts** field, enter an integer value to define the maximum number of accounts that clients can create when using this product. * To set no limit on the number of accounts, specify **-1**. * To forbid clients to create accounts, specify **0**. * In the **Mail** dropdown, select: * **Send** or **Default** — to automatically send email notifications to clients when new accounts are created, providing them with the necessary details to start trading. * **Don't send** — to disable email notifications about new accounts. * In the **Mail template** dropdown, select the email template `accountCreated` that will be used to send notifications about new accounts. * In the **Start amount** field, specify the amount that will be automatically deposited to *demo* accounts upon their creation. * In the **Auto creation on login** dropdown, select: * **Yes** – to automatically create accounts based on the product settings when clients first sign in to the B2CORE UI. * **No** – to create accounts based on this product manually. * In the **Agreement link** field, specify a link to the document to which clients must consent in order to open accounts via the B2CORE UI. * In the **Link info** field, specify a link to a resource with additional product information, which clients can access when creating accounts via the B2CORE UI. * On the **Currencies** tab, you can review the currency associated with the product and add more currencies if necessary. The available currency options are limited by the settings of the platform groups configured on the B2TRADER platform. * After configuring the product settings, activate it by selecting **Enabled** in the **Status** dropdown. Click **Save** to create the product. B2TRADER accounts can now be created based on the product via the Back Office or B2CORE UI. Any changes to product settings will directly impact how the product is displayed and functions for clients in the B2CORE UI. This instruction describes how to create platforms, product groups, and products that are required for enabling DXtrade via the Back Office. To manage live and demo trading accounts, you must configure two separate platforms and products. However, if both live and demo accounts are located on the same DXtrade platform in your infrastructure and are separated only by groups, it isn’t necessary to create two platforms. In this case, create one platform and two products — one for live accounts and one for demo accounts — in the B2CORE Back Office. Before you start configuring DXtrade platforms and products in the Back Office, make sure that a connection to DXtrade has already been set up by your account manager who is assigned the permissions to manage external connections. ## How to create a platform for DXtrade [#how-to-create-a-platform-for-dxtrade] If both live and demo accounts are located on the same DXtrade platform in your infrastructure, create a single platform in the B2CORE Back Office. If they are located on separate platforms, create two separate platforms for DXtrade. To create a platform for DXtrade: Navigate to **Products** > **Platforms**. Click the **Create** in the upper-right page corner, and then select **DXtrade** in the dropdown. * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office (such as **DXtrade Live** or **DXtrade Demo**). * In the **Available connection providers** dropdown, select **DXtrade**. * In the **Connection** dropdown, select **DXtrade**. Click **Save** to proceed. On the **Edit platform** page, specify the following settings: * In the **Short caption** field, you can optionally specify a short platform name. * If you configure a demo platform for DXtrade, select **Yes** in the **Demo** dropdown; otherwise, make sure that **No** is selected. * In the **Status** dropdown, select **Enabled**. * In the **Web Terminal URL**, optionally specify the URL of the web trading terminal for DXtrade. If specified, the **Trade** button will be displayed on account cards in the B2CORE UI, enabling clients to open the web terminal by clicking the button. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. After the connection settings have been successfully validated, click **Save**. ## How to create a product group for DXtrade [#how-to-create-a-product-group-for-dxtrade] To create a product group for DXtrade: Navigate to **Products** > **Groups**. Click **+Create** in the upper-right page corner. On the **Create group** page, fill in the following fields: * In the **Caption** field, enter a caption that you want to use for the group. * In the **Description** field, enter a group description. * In the **Type** dropdown, select **Default**. Click **Save** to create the product group. ## How to create a product for DXtrade [#how-to-create-a-product-for-dxtrade] To separate live and demo accounts, two products must be created in the B2CORE Back Office — one for live accounts and one for demo accounts. To create a product for DXtrade: Navigate to **Products** > **Products**. Click the **Create** in the upper-right page corner, and then select the previously created [DXtrade platform](#how-to-create-a-platform-for-dxtrade) in the dropdown. In the **Create product** popup, fill in the following fields: * In the **Platform Group** dropdown, select **Default**. * In the **Currency** dropdown, select one or more currencies that you want to enable for the product. * In the **Account number prefix** field, enter a prefix to be added to DXtrade account numbers. This helps distinguish, for example, live and demo accounts or accounts belonging to different brands within one DXtrade infrastructure. The maximum prefix length is 14 characters. The prefix is applied only to newly created accounts. Existing accounts remain unchanged. * Set up the following DXtrade-specific settings: **Auto Execution**, **Commissions**, **Financing**, **Limits**, **Margining**, **Spreads**, and **Trading**, which are used to customize trading conditions on the DXtrade platform. After the product is created, the DXtrade-specific settings can't be modified. * In the **Name** field, enter a name that you want to use for the product. * In the **Group** dropdown, select the previously created [product group](#how-to-create-a-product-group-for-dxtrade). * In the **Type** dropdown, select: * **Trade** — if you create a product for managing live accounts * **Demo** — if you create a product for managing demo accounts Click **Save** to proceed. On the **Edit product** page, specify the following product settings: * In the **Rights** and **Default account rights** dropdowns, select the required permissions that will be applied to the product (such as `Enabled`, `Visible`, `Trade enabled`, `Transfer deposit`, and `Transfer withdraw`). * In the **Max accounts** field, enter an integer value to define the maximum number of accounts that clients can create when using this product. * To set no limit on the number of accounts, specify **-1**. * To forbid clients to create accounts, specify **0**. * In the **Mail** dropdown, **Don't send** must be selected. Upon creating the first account, a client receives an email with the credentials for the trading terminal. No emails are sent when subsequent accounts are created. * In the **Start amount** field, specify the amount that will be automatically deposited to demo trading accounts upon their opening. * In the **Auto creation on login** dropdown, select either of the two values: * **Yes** — to automatically create trading accounts based on the product settings for all clients upon their first sign in to the B2CORE UI. * **No** — to create trading accounts manually. * In the **Status** dropdown, select **Enabled**. * If you want to enable additional currencies for the product, add them on the **Currencies** tab. You may also want to configure the other product settings available on the **Edit product** page. Click **Save** to create the product. All settings changes made on the **Edit product** page will directly impact how the product is displayed and functions in the B2CORE UI for clients. This instruction describes how to create a platform and product that are required for enabling Match-Trader via the Back Office, as well as how to create Match-Trader trading accounts for your clients. For managing live and demo trading accounts, it is required to configure two separate platforms and products. Before you start configuring Match-Trader platforms and products in the Back Office, make sure that a connection to Match-Trader has already been set up by your account manager who is assigned the permissions to manage external connections. ## How to create a platform for Match-Trader [#how-to-create-a-platform-for-match-trader] To create a platform for Match-Trader: Navigate to **Products** > **Platforms**. Click the **Create** in the upper-right page corner, and then select **MatchTrader** in the dropdown. In the **Create platform** popup, fill in the following fields: * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office (such as **MatchTrader** or **MatchTrader Demo**). * In the **Available connection providers** dropdown, select **MatchTrader**. * In the **Connection** dropdown, select **MatchTrader**. Click **Save** to proceed. On the **Edit platform** page, specify the following settings: * In the **Short caption** field, you can optionally specify a short platform name. * If you configure a demo platform for Match-Trader, select **Yes** in the **Demo** dropdown; otherwise, make sure that **No** is selected. * In the **Status** dropdown, select **Enabled**. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. After the connection settings have been successfully validated, click **Save**. ## How to create a product for Match-Trader [#how-to-create-a-product-for-match-trader] To create a product for Match-Trader: Navigate to **Products** > **Products**. Click **Create** in the upper-right page corner, and then select: * **MatchTrader** — if you create a product for managing live accounts * **MatchTrader Demo** — if you create a product for managing demo accounts In the **Create product** popup, fill in the following fields: * In the **Platform Group** dropdown, select **Fiat**. * In the **Currency** dropdown, select one or more currencies that you want to enable for the product. * In the **Name** field, enter a name that you want to use for the product. * In the **Group** dropdown, select the appropriate group that has been previously configured in **Products** > **Groups**. * In the **Type** dropdown, select: * **Trade** — if you create a product for managing live accounts * **Demo** — if you create a product for managing demo accounts Click **Save** to proceed. On the **Edit product** page, specify the following product settings: * In the **Rights** and **Default account rights** dropdowns, select the required permissions that will be applied to the product (such as `Enabled`, `Visible`, `Trade enabled`, `Transfer deposit`, and `Transfer withdraw`). * In the **Max accounts** field, enter an integer value to define the maximum number of accounts that clients can create when using this product. * To set no limit on the number of accounts, specify **-1**. * To forbid clients to create accounts, specify **0**. * In the **Start amount** field, specify the amount that will be automatically deposited to demo trading accounts upon their opening. * In the **Auto creation on login** dropdown, select either of the two values: * **Yes** — to automatically create trading accounts based on the product settings for all clients upon their first sign in to the B2CORE UI. * **No** — to create trading accounts manually. * In the **Status** dropdown, select **Enabled**. * If you want to enable additional currencies for the product, add them on the **Currencies** tab. You may also want to configure the other product settings available on the **Edit product** page. Click **Save** to create the product. All settings changes made on the **Edit product** page will directly impact how the product is displayed and functions in the B2CORE UI for clients. ## How to create Match-Trader accounts for clients [#how-to-create-match-trader-accounts-for-clients] To create a Match-Trade trading account for a client via the Back Office: Navigate to **Clients** > **Accounts**. Click **+Create** in the upper-right page corner, and then select a client for whom you want to create the account. On the **Create account** page, specify the following settings: * In the **Product group** dropdown, select **Fiat**. * In the **Product** dropdown, select: * **MatchTrader** — to create a live trading account. * **MatchTrader Demo** — to create a demo account. * In the **Currency** dropdown, select a currency in which the account must be denominated. * In the **Leverage** dropdown, select a leverage ratio to be assigned to the account. To create an account in B2CORE using the trading account that already exists on the Match-Trade platform, select the option **Create account that already exists on external platform**, and then specify the existing Match-Trader account number in the **External account number** field. Click **Save** to create the account. The created Match-Trader account is available to the client upon navigating to **Platforms** > **MatchTrader** in the B2CORE UI. To start trading on the Match-Trader platform, deposit or transfer funds to the newly created Match-Trader account. This can be done by the admin via the Back Office (for details, refer to [How to create a deposit](../manage-finances/how-to-create-a-deposit), [How to create a transfer](../manage-finances/how-to-create-a-transfer), and [How to create a payout](../manage-finances/how-to-create-a-payout)) or by a client via the B2CORE UI. ## How to archive Match-Trader accounts [#how-to-archive-match-trader-accounts] Match-Trader trading accounts can be archived via the Back Office. Only the accounts with zero balances can be archived. If there are available funds on a trading account, transfer them to another client account denominated in the same currency as an archived account. To archive a Match-Trader account: Navigate to **Clients** > **Accounts**. Select a Match-Trader account that you want to archive and click the **Edit** button located in the account row. On the **Edit account** page, click the **Actions** button, and then select **Archive**. Click **Save** to apply the changes. The account has been marked with **A**, indicating that it is archived and hidden from the client in the B2CORE UI. The archived accounts are unavailable for trading and depositing. The archived accounts can be restored so that clients can use them again. To do this, click the **Actions** button, and then select **Unarchive**. This instruction describes how to configure platforms and products required for enabling OneZero and PrimeXM via the Back Office, as well as how to create OneZero and PrimeXM accounts for your clients. Before you start configuring OneZero or PrimeXM platforms and products in the Back Office, make sure that connections to these platforms have already been set up by your account manager who is assigned the permissions to manage external connections. ## How to create a platform for OneZero [#how-to-create-a-platform-for-onezero] To create a platform for OneZero: Navigate to **Products** > **Platforms**. Click **Create** in the upper-right corner of the page, and then select **OneZero** in the dropdown. In the **Create platform** popup, fill in the following fields: * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. Click **Save** to proceed. On the **Edit connection** page, specify the following settings: * In the **Service location** field, specify `https://onezero.b2broker.net/api/rest/`. * In the **Token endpoint** field, specify `https://onezero.b2broker.net/api/token`. * In the **Service user** and **Service password** fields, enter the login and password that are used for the service connection. * In the **REST Api version** field, specify **1.01**. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. In the **Status** dropdown, select **Enabled**. Click **Save** to create the platform. ## How to create a platform for PrimeXM [#how-to-create-a-platform-for-primexm] To create a platform for PrimeXM: Navigate to **Products** > **Platforms**. Click **Create** in the upper-right page corner, and then select **PrimeXM** in the dropdown. In the **Create platform** window, fill in the following fields: * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. Click **Save** to proceed. On the **Edit connection** page, specify the following settings: * In the **Pxm username** and **Pxm password** fields, specify the login and password that are used to connect to the PrimeXM server. * In the **Rabbitmq host** field, specify `xcore-api-ld4.primexm.com`. * In the **Rabbitmq port** field, specify **5673**. * In the **Rabbitmq user** and **Rabbitmq password** fields, specify the login and password that are used to connect to RabbitMQ. * In the **Rabbitmq vhost** field, specify `/primebrokerage_uk`. * In the **Rabbitmq exchange** field, specify `XServerAPI`. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. In the **Status** dropdown, select **Enabled**. Click **Save** to create the platform. ## How to create products for OneZero and PrimeXM [#how-to-create-products-for-onezero-and-primexm] To create products for OneZero and PrimeXM: Navigate to **Products** > **Products**. Click **Create** in the upper-right page corner, and then select either **OneZero** or **PrimeXM** in the dropdown. In the **Create product** popup, fill in the following fields: * In the **Platform Group** dropdown, select **Group**. * In the **Currency** dropdown, select one or more currencies that you want to enable for the product. * In the **Name** field, enter the name that you want to use for the product. * In the **Group** dropdown, select the appropriate group that have been previously configured in **Products** > **Groups**. * In the **Type** dropdown list, select **External**. Click **Save** to proceed. On the **Edit product** page, specify the appropriate settings for your product: * In the **Rights** and **Default account rights** dropdowns, select the required permissions that you want to apply to the product (such as `Enabled`, `Deposit`, `Withdraw`, `Visible`, `Transfer deposit`, `Transfer withdraw`, and `Exchange`). * In the **Status** dropdown, select **Enabled**. * If you want to enable additional currencies for the product, add them on the **Currencies** tab. You may also want to configure the other product settings available on the **Edit product** page. Click **Save** to create the product. All settings changes made on the **Edit product** page will directly impact how the product is displayed and functions in the B2CORE UI for clients. ## How to create OneZero and PrimeXM accounts for clients [#how-to-create-onezero-and-primexm-accounts-for-clients] OneZero and PrimeXM accounts are created in B2CORE based on the accounts that have already been registered on the corresponding external platforms. To create a OneZero or PrimeXM account for a client via the Back Office: Navigate to **Clients** > **General**. From the clients list, select a client for whom you want to create a OneZero or PrimeXM account, and then click **Edit**. Go to the **Accounts** tab, and then click **+Create** in the upper-right page corner. On the **Creating account** page, fill in the following fields: * In the **Product group** dropdown, select **External**. * In the **Product** dropdown, select the product previously created for OneZero or PrimeXM. * In the **Currency** dropdown, select the corresponding currency. * In the **Leverage** dropdown, select the leverage ratio. * Enable the option to **Create account that exists on external platform**. * In the **External account number** field, specify the ID of an account that has been already registered on the corresponding external platform. Click **Save** to create the account. After the account has been created, it is available to the client upon navigating to **Platforms** > **OZ/PXM** via the B2CORE UI. This instruction describes how to create a connection, platforms and products that are required for enabling TradeLocker functionalities via the the B2CORE Back Office. For managing live and demo trading accounts, you need to create one connection to TradeLocker, but configure two separate platforms and products. After creating user groups in TradeLocker, they aren't automatically available to systems where TradeLocker is integrated. To make them visible, please contact TradeLocker support with a corresponding request. ## How to configure a connection to TradeLocker [#how-to-configure-a-connection-to-tradelocker] To configure a connection to TradeLocker in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **TradeLocker**. Click **Save** to create the connection. The **TradeLocker** connection will appear in the list of external connections. Click **Edit** to enter the connection details and complete the following fields: * In the **API Base URL** field, specify `https://api.tradelocker.com`. * In the **API Key** field, specify your API key provided by TradeLocker. This key is used to authenticate requests to the API. * The **Trading Terminals** section displays the URLs of the TradeLocker live and demo terminals. In the B2CORE UI, when clients click the **Trade** button on the account card, they are redirected to the corresponding terminal, enabling them to start trading in one click. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. ## How to create a platform for TradeLocker [#how-to-create-a-platform-for-tradelocker] To manage live and demo trading accounts, create two separate platforms for TradeLocker in the B2CORE Back Office. To create a platform for TradeLocker: Navigate to **Products** > **Platforms**. Click **Create** in the upper-right page corner, and then select **TradeLocker** in the dropdown. In the **Create platform** popup, fill in the following fields: * In the **Name** field, enter a name that you want to use for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office (such as **TradeLocker** or **TradeLocker Demo**). * In the **Available connection providers** dropdown, select **TradeLocker**. * In the **Connection** dropdown, select the previously configured [TradeLocker connection](#how-to-configure-a-connection-to-tradelocker). Click **Save** to proceed. On the **Edit platform** page, specify the following settings: * In the **Short caption** field, you can optionally specify a short platform name. * If you configure a demo platform for TradeLocker, select **Yes** in the **Demo** dropdown; otherwise, make sure that **No** is selected. * In the **Status** dropdown, select **Enabled**. * In the **Settings** section, specify the name of your TradeLocker server in the **Trading Server name** field. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. After the connection settings have been successfully validated, click **Save**. ## How to create a product group for TradeLocker [#how-to-create-a-product-group-for-tradelocker] To create a product group for TradeLocker in the B2CORE Back Office: Navigate to **Products** > **Groups**. Click **+Create** in the upper-right page corner. On the **Create group** page, fill in the following fields: * In the **Caption** field, enter a caption for the product group. This caption will be assigned to the product group in the Back Office and will be visible to clients in the B2CORE UI. * In the **Description** field, enter a group description. * In the **Type** dropdown, select **Default**. Click **Save** to create the product group. ## How to create a product for TradeLocker [#how-to-create-a-product-for-tradelocker] To manage live and demo trading accounts, create two separate products for TradeLocker in the B2CORE Back Office. To create a product for TradeLocker: Navigate to **Products** > **Products**. Click the **Create** in the upper-right page corner, and then select: * **TradeLocker** — if you create a product for managing live accounts * **TradeLocker Demo** — if you create a product for managing demo accounts In the **Create product** popup, fill in the following fields: * In the **Platform Group** dropdown, select the appropriate group existing on your TradeLocker server. TradeLocker accounts created based on this product via B2CORE will be assigned to this group. * In the **Currency** dropdown, select one or more currencies that you want to enable for the product. * In the **Name** field, enter a name that you want to use for the product. * In the **Group** dropdown, select the previously configured [TradeLocker product group](#how-to-create-a-product-group-for-tradelocker). * In the **Type** dropdown, select: * **Trade** — if you create a product for managing live accounts * **Demo** — if you create a product for managing demo accounts Click **Save** to proceed. On the **Edit product** page, specify the following product settings: * In the **Name** field, you can modify the product name. The name must be unique. * In the **Caption** field, enter a caption for the product. This caption will be assigned to the product in the Back Office and will be visible to clients in the B2CORE UI. * Leave the **Leverage** and **Default leverage** fields empty. The leverage parameter isn't applied directly to accounts on the TradeLocker platform. Instead, leverage is configured per instrument within the platform. * In the **Rights** and **Default account rights** dropdowns, select the required permissions that will be applied to the product (such as `Enabled`, `Visible`, `Trade enabled`, `Transfer deposit`, and `Transfer withdraw`). The default rights will be assigned to TradeLocker accounts created automatically when the **Auto creation on login** option is triggered. For a list of possible permissions, refer to [Product permissions](../../back-office-guide/references/product-permissions). * In the **Max accounts** field, enter an integer value to define the maximum number of TradeLocker accounts that a client can create for each currency added to the product. For example, if `USD` and `EUR` are added as currencies to the product and the **Max accounts** option is set to `1`, the client can create one account in `USD` and one account in `EUR` based on this product. * To set no limit on the number of accounts, specify **-1**. * To forbid clients to create accounts, specify **0**. * In the **Mail** dropdown, select **Don't send**. This option is required to ensure that email notifications in B2CORE work correctly using the designated `TradeLockerUserCreated` email template. * In the **Start amount** field, specify the amount that will be automatically deposited to *demo* TradeLocker accounts upon their creation. * In the **Min deposit amount (USD)** field, you can optionally specify the minimum deposit, in USD, required to create a TradeLocker account based on this product. * In the **Auto creation on login** dropdown, select: * **Yes** — to automatically create TradeLocker accounts based on the product settings when clients first sign in to the B2CORE UI. * **No** — to create TradeLocker accounts based on this product manually. * In the **Agreement link** field, specify a link to the document to which clients must consent in order to open TradeLocker accounts via the B2CORE UI. * In the **Link info** field, specify a link to a resource with additional product information, which clients can access when creating TradeLocker accounts via the B2CORE UI. * On the **Currencies** tab, you can review the currency associated with the product and add more currencies if necessary. * After configuring the product settings, activate it by selecting **Enabled** in the **Status** dropdown. Click **Save** to create the product. TradeLocker accounts can now be created based on the product via the Back Office or B2CORE UI. Any changes to product settings will directly impact how the product is displayed and functions for clients in the B2CORE UI. This instruction explains how to create platforms, product groups, and products that are required for enabling MT4 and MT5 functionalities via the B2CORE Back Office. For managing live and demo trading accounts on both MT4 and MT5, it's required to configure separate platforms, product groups, and products for each in the Back Office. No external connections are required for MT platforms. Connections to these platforms are established within B2CORE via the internal WEBAPI service. All credentials needed to connect to the respective MT platform are configured in **Products** > **Platforms**. ## How to create a platform for MT [#how-to-create-a-platform-for-mt] To create a platform for MT: Navigate to **Products** > **Platforms**. Click **Create** in the upper-right page corner, and then select **MetaTrader 4** or **MetaTrader 5** in the dropdown. In the **Create platform** popup, fill in the following fields: * In the **Name** field, enter a unique name for the platform. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. * In the **Income transfer request** dropdown, select: * **Yes** — to require admin approval and create requests for transfers to MT accounts via the B2CORE UI. * **No** — to process transfers to MT accounts via the B2CORE UI without requests. * In the **Outcome transfer request** dropdown, select: * **Yes** — to require admin approval and create requests for transfers from MT accounts via the B2CORE UI. * **No** — to process transfers from MT accounts via the B2CORE UI without requests. Click **Save** to proceed. On the **Edit platform** page, specify the following settings: * In the **Short caption** field, you can optionally specify a short platform caption. * If you configure a demo platform for MT, select **Yes** in the **Demo** dropdown; otherwise, make sure that **No** is selected. * In the **Status** dropdown, select **Enabled**. In the **Settings** section, specify the following connection setting: ### MetaTrader connection [#metatrader-connection] * In the **Host** field, specify the IP address and port number for accessing the MT server. * In the **Login** field, enter the login for accessing the MT Manager. * In the **Password** field, enter the password for accessing the MT Manager. ### WEBAPI connection [#webapi-connection] The WEBAPI connection settings are provided by your account manager. * In the **Host** field, specify the domain name and port number for accessing WEBAPI. * In the **Access token** field, specify the token used to access WEBAPI. ### Settings [#settings] In this section, specify the additional settings: * In the **Max inactivity days** field, enter the number of days after which MT accounts will be archived if no activity is detected during that period. * In the **Web Terminal URL** field, specify the URL of the web trading terminal. When specified, the **Trade** button will appear on account cards for the respective platform in the B2CORE UI and mobile app, enabling clients to navigate to trading with a single click. * In the **Use reporting on the platform** dropdown, select: * **Enabled** — to activate the **Send reports** option for MT accounts created via B2CORE. * **Disabled** — to keep the **Send reports** option disabled for MT accounts created via B2CORE. Click **Test connection** to validate the connection settings. The checkmark displayed on the **Test connection** button indicates that the connection has been configured properly. After the connection settings have been successfully validated, click **Save**. ## How to create a product group for MT [#how-to-create-a-product-group-for-mt] To create a product group for MT: Navigate to **Products** > **Groups**. Click **+Create** in the upper-right page corner. On the **Create group** page, fill in the following fields: * In the **Caption** field, enter a caption for the product group. This caption will be assigned to the product group in the Back Office and will be visible to clients in the B2CORE UI. * In the **Description** field, enter a group description. * In the **Type** dropdown, select **Default**. Click **Save** to create the product group. ## How to create a product for MT [#how-to-create-a-product-for-mt] To create a product for MT: Navigate to **Products** > **Products**. Click the **Create** in the upper-right page corner, and then select: * **MetaTrader 5 Live** — to create a product for managing live accounts on MT5 * **MetaTrader 5 Demo** — to create a product for managing demo accounts on MT5 * **MetaTrader 4 Live** — to create a product for managing live accounts on MT4 * **MetaTrader 4 Demo** — to create a product for managing demo accounts on MT4 In the **Create product** popup, fill in the following fields: * In the **Platform Group** dropdown, select the appropriate group existing in your MT manager. MT accounts created based on this product via B2CORE will be assigned to this group. * In the **Currency** dropdown, select the currency for the product. The available currency options in B2CORE depend on the settings of the selected platform group. For example, if a platform group in the MT manager is configured for `USD`, then `USD` will be the default currency option for MT accounts created with this product via B2CORE. * In the **Name** field, enter a unique name for the product. * In the **Group** dropdown, select the previously created [product group](#how-to-create-a-product-group-for-mt) to include the product into that group. * In the **Factory** dropdown, select `100` to denominate MT accounts created with this product in currency subunits (for example, cents); otherwise, leave `1`. * In the **Type** dropdown, select: * **Trade** — if you create a product for managing live accounts * **Demo** — if you create a product for managing demo accounts Click **Save** to proceed. On the **Edit product** page, specify the following product settings: * In the **Name** field, you can modify the product name. The name must be unique. * In the **Caption** field, enter a caption for the product. This caption will be assigned to the product in the Back Office and will be visible to clients in the B2CORE UI. * In the **Default leverage** field, enter the default leverage ratio that will be assigned to MT accounts created automatically when the **Auto creation on login** option is triggered. * In the **Leverage** field, enter one or more leverage ratios that client can select when creating MT accounts via the B2CORE UI. * In the **Rights** and **Default account rights** dropdowns, select the required permissions that will be applied to the product (such as `Enabled`, `Visible`, `Trade enabled`, `Transfer deposit`, and `Transfer withdraw`). The default rights will be assigned to MT accounts created automatically when the **Auto creation on login** option is triggered. For a list of possible permissions, refer to [Product permissions](../../back-office-guide/references/product-permissions). * In the **Max accounts** field, enter an integer value to define the maximum number of MT accounts that a client can create for each currency added to the product. For example, if `USD` and `EUR` are added as currencies to the product and the **Max accounts** option is set to `1`, the client can create one account in `USD` and one account in `EUR` based on this product. * To set no limit on the number of accounts, specify **-1**. * To forbid clients to create accounts, specify **0**. * In the **Mail** dropdown, select: * **Send** or **Default** — to automatically send email notifications to clients when new MT accounts are created, providing them with the necessary details to start trading. * **Don't send** — to disable email notifications about new MT accounts. * In the **Mail template** dropdown, select the email template that will be used to send notifications about new MT accounts. * In the **Start amount** field, specify the amount that will be automatically deposited to *demo* MT accounts upon their creation. * In the **Min deposit amount (USD)** field, you can optionally specify the minimum deposit, in USD, required to create an MT account based on this product. * In the **Auto creation on login** dropdown, select: * **Yes** — to automatically create MT accounts based on the product settings when clients first sign in to the B2CORE UI. * **No** — to create MT accounts based on this product manually. * The **First transfer activation** option is only applicable to MT5. In the dropdown, select: * **Yes** — to create MT5 accounts without the `Trade enabled` permission. This permission will be assigned to the account upon the client's first successful transfer. * **No** — to create MT5 accounts with the `Trade enabled` permission, immediately active for trading. * In the **Agreement link** field, specify a link to the document to which clients must consent in order to open MT accounts via the B2CORE UI. * In the **Link info** field, specify a link to a resource with additional product information, which clients can access when creating MT accounts via the B2CORE UI. * On the **Currencies** tab, you can review the currency associated with the product and add more currencies if necessary. The available currency options are limited by the settings of the platform groups configured in the MT manager. * After configuring the product settings, activate it by selecting **Enabled** in the **Status** dropdown. Click **Save** to create the product. MT accounts related to the respective platform can now be created based on the product via the Back Office or B2CORE UI. Any changes to product settings will directly impact how the product is displayed and functions for clients in the B2CORE UI. If both MT4 and MT5 platforms are needed, follow the same instructions to configure the other platform. To create a wallet: Navigate to **Products** > **Products**. Click +**Create**, and then select **eWallet** in the dropdown. Fill out the form: * The **Platform** field displays **eWallet**. * In the **Platform Group** dropdown, select **eWallet**. * In the **Currency** dropdown, select one or more currencies that you want to enable for the wallet. * In the **Name** field, enter the wallet name that will be displayed on the [Products](../../back-office-guide/products/products) page * In the **Group** dropdown, select a [group](../../back-office-guide/products/groups). The wallet will be displayed in the selected group in the B2CORE UI. * In the **Factory** dropdown, select `1`, as wallets can't be denominated in currency subunits. Only standard currency denominations are allowed for wallets. * In the **Type** dropdown, select **Personal**. Click **Save**. Fill out the details: * Set the **Caption**, which will be displayed in the B2CORE UI. Set localizations if needed. * Set **Status** to **Enabled**. * Set **Group rights** to **eWallet** or select the **Rights** if group rights were not configured. * Set **Max accounts** to **1**. * Set an external **Link** to display the available currencies or other information. This link appears in the B2CORE UI as the `i` icon. * Set **Autocreation on login** to **Yes** to make this wallet available to each client upon initial sign-in to the B2CORE UI. Click **Save** to apply the changes. You can restrict access to a product so that it can only be used by clients who have achieved specific verification levels (for example, due to regulator requirements). Verification levels must be already created and configured (for details, refer to [Manage verification options](../manage-verification-options/)). Navigate to **Products** > **Products**. Choose a product the use of which you want to restrict, and click the **Edit** button located in the product row. Click **Actions** in the upper-right page corner, and then select **Verification level restrictions** in the dropdown. In the displayed **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option forbids the use of the product for selected verification levels. * **Allow only** — this option allows the use of the product only for selected verification levels. * In the **Rules** dropdown, select one or several verification levels. Click **Save** to apply the changes. To view all interest payments made to all clients, go to [Finance > Transactions](../../back-office-guide/finance/transactions) and filter the **Type** column by **Savings Payment**. The payments in the **Done** status are listed in the **Transactions**. To view interest payment details for a client in a specific savings program: Navigate to **Savings** > **Plans**. Click view-button displayed next to the plan for which you want to review interest payment details. In the plan details, go to the **Payments** section: * For `Fixed` strategies, the payments list includes scheduled payments as well as payments that have already been made to the client’s wallet. From this list, you can calculate the total amount of interest that the client will receive in the program. * For `Flexible` strategies, the list displays only payments made to a client. From this list, you can calculate the total amount of interest that has been paid. For each payment, you can view: * **Amount** – the payment amount. * **Due date** – for `Fixed` strategies, the date and time when the payment is scheduled to be made. For `Flexible` strategies, no scheduled payments are displayed. * **Status** — the payment status: * `Scheduled` — indicates that a payment is scheduled but hasn’t yet been made. * `Paid` — indicates that a payment has been made to a client. * `Cancelled` — indicates that a payment was cancelled because the client decided to withdraw the investment amount before the end of the plan length (for `Fixed` strategies) or before the end of the penalty period (for `Flexible` strategies). * `Paid date` – the date and time when the interest was paid to the client. Payment details in a Fixed savings planPayment details in a Fixed savings plan You can ask your clients to pass accreditation tests as part of your verification procedure. To enable a certain user group (usually, it is the “Admins” group) to create client accreditation tests, this user group should be assigned all the permissions related to the **Client Tests**, **Client Tests Answers** and **Client Tests Questions**. These permissions can be found under the **Verification** permission group (for details, refer to [How to add a user group and grant permissions](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions)). To create a client accreditation test, do the following: Navigate to **Verification** > **Client tests**, and then click **+Create** in the upper-right corner of the page. In the **Create client test** window, fill in the following fields: * In the **Caption** field, specify a title for your test. This title will be displayed in the B2CORE UI. * In the **Details** field, specify a test’s description or any other helpful information that clients should know before they start passing the test. Such information will be displayed under the test’s title in the B2CORE UI. * From the **Visible** drop-down list, select either **Yes** or **No** to show or hide this test in the B2CORE UI. We recommend that you select **No** at this step and switch the test visibility setting to **Yes** after finishing adding questions and answers to your test. Click **Save** to create the test. To add questions and answer choices to your test, click the **Edit** button located in the test row. On the **Edit client test** page, switch to the **Questions** tab, and then click **+Create** in the upper-right corner of the page. In the **Create client test questions** window that is displayed, fill in the following fields: * In the **Question** field, enter a text of a question. * From the **Type** drop-down list, select a question type. The following question types are available: * **open** — an open-ended question that can be answered in a free form. * **close** — a close-ended question that can be answered by choosing a single or multiple correct answers from a given list of options. * **questionnaire** — a multiple-choice question that can be answered by choosing one or more answers from a given list of options. * **poll** — a multiple-choice question that can be answered by choosing a single answer from a given list of options. * From the **Visible** drop-down list, select either **Yes** or **No** to show or hide this question. * Click **Save**. Add as many questions as required for your test by repeating Steps 5 and 6 of this procedure. Add answer options to the questions of **closed**, **questionnaire,** and **poll** types, by clicking Add answer options in the question row. In the **Edit client test answer** window that is displayed, fill in the following fields: * In the **Text** field, enter an answer to the question. * From the **Correct** drop-down list, select either **Yes** or **No** to mark this answer option as correct or incorrect. The correct answer options must be indicated only for questions of the **close** type. You can choose to add a single or multiple correct answers to a question. * From the **Visible** drop-down list, select either **Yes** or **No** to show or hide this answer option. * Click **Save** to add the answer option. Add as many answer options as required for each question included in your test by repeating Steps 8 and 9 of this procedure. After you have finished adding questions and answers to your test, switch the test visibility setting to **Yes** on the **Clients test** page. The client accreditation test is now available to your clients via the B2CORE UI. In addition, you can force your clients to pass this test before submitting documents for obtaining a particular verification level (for details, refer to [How to create verification levels](how-to-use-the-kyc-constructor#how-to-create-verification-levels) to learn more). This article provides instructions on how to configure B2CORE to use the KYC provider, [ShuftiPro](https://shuftipro.com/). With ShuftiPro, you can conduct document and face verification to validate the identity of *individual* clients, as well as address and location verification. In addition to document verification, you can enable the ShuftiPro Anti-money laundering (AML) check to screen your clients against multiple AML data sources, helping to protect your company from potential money laundering activities. Before proceeding with the instructions, you must have signed up for ShuftiPro and have an active account. ## How to configure a connection to ShuftiPro [#how-to-configure-a-connection-to-shuftipro] Only admins who are assigned the permissions to manage external connections can set up a connection to ShuftiPro. To set up a connection: In the B2CORE Back Office, navigate to **System** > **External Connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, specify a name that you want to use for the connection. * In the **Caption** field, specify a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **ShuftiPro**. Click **Save** to create the connection. In the connections list, find the ShuftiPro connection that you've created and click **Edit** to enter the connection details. On the **Edit connection** page, specify the following settings: * In the **API host** field, specify `https://api.shuftipro.com`. * In the **Client ID** and **Secret key** fields, specify the client ID and secret key value to access ShuftiPro. * In the **New signature (for secrets after March 2023)** field, select either: * **No** — for clients who registered with ShuftiPro before March 15, 2023. * **Yes** — for clients who registered with ShuftiPro or updated their secret keys after March 15, 2023. This is needed to validate a key signature returned in ShuftiPro API responses (for details, refer to [Response Signature](https://developers.shuftipro.com/docs/verification_endpoints/responses#response-signature) in the ShuftiPro documentation). * In the **Allow documents screenshots** dropdown, select **Enabled** to allow clients to upload document screenshots for verification, instead of requiring only live captures. By default, this option is disabled. * In the **Check AML** dropdown, select **Enabled** to use the ShuftiPro Anti-money laundering (AML) check. In this case, when clients submit documents for upgrading their verification levels they will be additionally screened against ShuftiPro AML data sources, including multiple global watchlists, FATF lists, PEP lists, and Sanction lists, to prevent the risk of money laundering. By default, this option is disabled. When the AML check is enabled, a client must meet two conditions to obtain a higher verification level: the submitted documents must be verified, and the AML check must be successful. If either condition fails, the verification level upgrade will be rejected. * In the **Show OCR form**, select: * **Enabled** — to display the OCR form during verification, enabling clients to review and confirm the information extracted from their submitted documents. * **Disabled** — to hide the form and skip the confirmation step. By default, the form is enabled. In the **Enabled** dropdown, select **Yes**. Click **Save** to apply the settings. ## How to create document groups for ShuftiPro verification [#how-to-create-document-groups-for-shuftipro-verification] For **document verification**, create three document groups named `passport`, `id_card`, and `driving_license`. These groups enables you to request your clients to submit passports, national identity cards, and driving licenses for identity verification. For **address verification**, multiple documents recognized by [ShuftiPro for address verification](https://developers.shuftipro.com/docs/coverage/documents#address-verification--validation) are supported, including the document type named `any`. Therefore, create the necessary document groups using names that match the ShuftiPro document types, such as `rent_agreement`, `bank_letter_receipt`, `employer_letter`, `utility_bill`, `tax_bill`, `any`, or others. These groups enable you to request your clients to submit respective documents to confirm their address and location details, such as city or country. The document type `any` enables clients to submit any document that includes their name and address for address verification. It's not tied to any specific document type, providing more flexibility and convenience for clients when confirming their addresses. For **face verification**, create the document group named `selfie`. To create a document group: In the B2CORE Back Office, navigate to **Verification** > **Document groups**. Click **+Create** in the upper-right page corner. On the **Create document group** page, fill in the following fields: * In the **Name** field, specify the name of a document group. Ensure to specify document group names exactly as provided above, in lower case. For example: `passport`, `id_card`, `driving_license`, `selfie`, and so on. For address verification, make sure to specify document group names exactly as listed in the [supported ShuftiPro document types](https://developers.shuftipro.com/docs/coverage/documents#address-verification--validation). For example: `rent_agreement`, `bank_letter_receipt`, `employer_letter`, `utility_bill`, `tax_bill`, `any`, or others. The document group named `any` allows clients to submit any document that includes their name and address, rather than a specific document type. This gives clients more flexibility when verifying their address. Make sure that **Yes** is selected in the **Enabled** dropdown. Click **Save** to create the document group. ## How to create document types for ShuftiPro verification [#how-to-create-document-types-for-shuftipro-verification] For each document group that you've created, create a document type. To create a document type: In the B2CORE Back Office, navigate to **Verification** > **Document types**. Click **+Create** in the upper-right page corner. On the **Create document type** page, fill in the following fields: * In the **Name** field, specify the name of a document type. Document type names must be the same as the names of the previously created document groups. For example: `passport`, `id_card`, `selfie`, `rent_agreement`, `bank_letter_receipt`, `employer_letter`, `utility_bill`, `tax_bill`, `any`, or others. In the **Status** dropdown, select **Enabled**. Click **Save** to create the document type. ## How to create verification levels for ShuftiPro [#how-to-create-verification-levels-for-shuftipro] You can create verification levels or modify the existing levels to use ShuftiPro for document, address, and face verification. To create a verification level: In the B2CORE Back Office, navigate to **Verification** > **Levels**. Click **+Create** in the upper-right page corner. On the **Create verification level** page, fill in the following fields: * In the **Index** field, specify a non-zero integer value. The zero (`0`) index is always assigned to the default verification level. For other verification levels, the index must be greater than zero, such as `1` for Level 1, `2` for Level 2 and so on. * In the **Wizard** dropdown, select `ShuftiProSDK`. The ShuftiPro popup will open in the B2CORE UI, enabling clients to follow the verification instructions and submit the required documents. * In the **Caption** field, specify a level name that will be displayed in the B2CORE UI and mobile app, such as `Level 1`. If required, specify the localization properties for this field by clicking the button located on the right side of the field. * In the **Desktop Description** field, specify a description of the level to be displayed in the B2CORE UI. This description can include the permissions granted to clients once they obtain this level. The description for the B2CORE UI can be specified in the HTML format. If required, specify the localization properties for this field. * In the **Mobile Description** field, specify a level description to be displayed in the mobile app. The description for the mobile app can be specified in the JSON format. If required, specify the localization properties for this field. * In the **Visible** dropdown, select **Yes**. * In the **Default** dropdown, select **No**. (`Level 0` is always the default verification level). * In the **Assigned Client Right** dropdown, select a permission level defining the set of permissions that you want to grant to your clients after obtaining this verification level (for details, refer to [Client rights](../../back-office-guide/system/client-rights)). * In the **Document groups** dropdown, select one or more required document groups. For example, you can select `passport` and `selfie` if you want your clients to submit their passports and pass face verification to receive this level. * In the **Client tests** dropdown, optionally select one or more accreditation tests if you want to force your clients to pass these tests before they can submit their documents for verification. The list of available tests includes all the tests with visibility set to **Yes**, which are displayed on the [Client tests](../../back-office-guide/verification/client-tests) page. Click **Save** to create the level. ## How to add the domain for callbacks in ShuftiPro [#how-to-add-the-domain-for-callbacks-in-shuftipro] To ensure that callbacks from ShuftiPro are successfully delivered and verification updates are received in B2CORE, you must add the domain part of your callback URL in your ShuftiPro account settings. To add the domain: Sign in to your ShuftiPro account. Go to **Settings** > **API Keys** > **Callback/Redirect URLs**. Add the domain part of your callback URL. The domain of your callback URL is the same as the domain of your B2CORE Back Office. For example, if your Back Office URL is `https://{your-Back-Office-URL}`, enter only `{your-Back-Office-URL}` — without `https://`. Make sure to replace `{your-Back-Office-URL}` with the actual domain of your B2CORE Back Office. Add the domain for callbacks in ShuftiPro Save your changes. This article provides instructions on how to configure B2CORE to use the KYC and KYT provider, [SumSub](https://sumsub.com/). Before proceeding with the instructions, you must have signed up for SumSub and have an active account. For KYT checks, **SumSub Fraud Prevention** must also be enabled and properly configured. ## How to configure a connection to SumSub [#how-to-configure-a-connection-to-sumsub] Only admins who are assigned the permissions to manage external connections can set up a connection to SumSub. To set up a connection: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name that you want to use for the connection. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **SumSubstance**. Click **Save** to create the connection. In the connections list, find the SumSub connection that you've created and click **Edit** to enter the connection details. On the **Edit connection** page, specify the following settings: * In the **Service Location** field, specify `https://api.sumsub.com/`. * In the **Client ID** field, specify your SumSub account name. To view your account name, in the SumSub interface, go to **Settings** > **Account Details**. * In the **Webhook Secret Key** field, specify a webhook secret. You should generate the webhook in the SumSub interface. To do this, in the SumSub interface, go to **Dev space** > **Webhooks** (for the required webhook configuration, refer to [SumSub webhook configuration](how-to-use-sumsubstance#sumsub-webhook-configuration)). * Leave the **Login** and **Password** fields empty. * In the **Token** and **Token Secret** fields, specify a token and a secret key value generated in the SumSub interface. To generate them, in the SumSub interface, go to **Dev space** > **App Tokens**. * To apply different verification flows to *individual* and *corporate* clients, select **Enabled** in the **Client Resetting Mode** dropdown. When the **Client Resetting Mode** option is enabled, this means that repeated verification is required for clients whose type has been changed from *individual* to *corporate*, or vice versa. After changing a type, the following happens: * In the B2CORE Back Office, a client’s verification level resets to `Level 0`, which is the default verification level. * All pending [client’s requests](../../back-office-guide/clients/requests) to obtain a higher verification level are automatically rejected. * In the SumSub system, an applicant is set back to the initial level, and all documents that have been previously uploaded for this applicant are invalidated. All files and documents that have been previously uploaded for this client in the B2CORE Back Office will still be available. In the **Transaction monitoring** section, configure the settings for KYT checks using the **SumSub Fraud Prevention**. These checks are currently supported for fiat and crypto deposits and withdrawals. * In the **Enabled** dropdown, select: * **Yes** — to enable transaction monitoring via **SumSub** and receive results in B2CORE. * **No** — to disable transaction monitoring via **SumSub**. * In the **Currency Filter** dropdown: * Select one or more currencies to monitor transactions only in the selected currencies. * Leave the list empty to monitor transactions in all currencies. Click **Save** to apply the settings. ## How to create document groups for SumSub verification [#how-to-create-document-groups-for-sumsub-verification] Create document groups to enable clients to submit various documents supported by SumSub for verification. For each document (such as an ID card, passport, driver’s license, and others) that you want to make available for verification, create a separate document group with the appropriate name. To create a document group: In the B2CORE Back Office, navigate to **Verification** > **Document groups**. Click **+Create** in the upper-right page corner. On the **Create document group** page, fill in the following fields: * In the **Name** field, specify the name of a document group. Ensure to specify document group names exactly as the names of [document types supported by SumSub](https://docs.sumsub.com/reference/add-id-documents#supported-document-types), such as `ID_CARD`, `PASSPORT`, `DRIVERS`, `RESIDENCE_PERMIT`, and so on. For example, if you want your clients to submit their ID cards for document verification, create a document group with the name `ID_CARD`. * In the **Caption** field, specify a document group caption that will be displayed in the B2CORE UI. * In the **Type** dropdown, select **One**. * In the **Description** field, specify a description for the document group that is used in the Back Office. Make sure that **Yes** is selected in the **Enabled** dropdown. Click **Save** to create the document group. ## How to create document types for SumSub verification [#how-to-create-document-types-for-sumsub-verification] For each document group that you've created, create a document type. To create a document type: In the B2CORE Back Office, navigate to **Verification** > **Document types**. Click **+Create** in the upper-right page corner. On the **Create document type** page, fill in the following fields: * In the **Name** field, specify the name of a document type. Document type names must be the same as the names of the previously created document groups. For example, `ID_CARD`, `PASSPORT`, `DRIVERS`, `RESIDENCE_PERMIT`, and so on. * In the **Caption** field, specify a document type caption that will be displayed in the B2CORE UI. * In the **Description** field, specify a description for the document type that will be displayed in the B2CORE UI. * In the **Group** dropdown, select a document group with which this document type must be associated. * In the **Max files** field, specify the maximum number of files that clients can upload for this document type. In the **Status** dropdown, select **Enabled**. Click **Save** to create the document type. ## How to create verification levels for SumSub in the B2CORE Back Office [#how-to-create-verification-levels-for-sumsub-in-the-b2core-back-office] You can create verification levels or modify the existing levels to use SumSub for verification. To create a verification level: In the B2CORE Back Office, navigate to **Verification** > **Levels**. Click **+Create** in the upper-right page corner. On the **Create verification level** page, fill in the following fields: * In the **Index** field, specify a non-zero integer value. The zero (`0`) index is always assigned to the default verification level. For other verification levels, the index must be greater than zero, such as `1` for Level 1, `2` for Level 2 and so on. * In the **Wizard** dropdown, select `SnsWizardSDK`. * In the **Caption** field, specify a level name that will be displayed in the B2CORE UI and mobile app, such as `Level 1`. If required, specify the localization properties for this field by clicking the button located on the right side of the field. * In the **Desktop Description** field, specify a description of the level to be displayed in the B2CORE UI. This description can include the permissions granted to clients once they obtain this level. The description for the B2CORE UI can be specified in the HTML format. If required, specify the localization properties for this field. * In the **Mobile Description** field, specify a level description to be displayed in the mobile app. The description for the mobile app can be specified in the JSON format. If required, specify the localization properties for this field. * In the **Visible** dropdown, select **Yes**. * In the **Default** dropdown, select **No**. (`Level 0` is always the default verification level). * In the **Assigned Client Right** dropdown, select a permission level defining the set of permissions that you want to grant to your clients after obtaining this verification level (for details, refer to [Client rights](../../back-office-guide/system/client-rights)). * In the **Document groups** dropdown, select one or more required document groups. For example, you can select `ID_CARD` and `RESIDENCE_PERMIT` if you want your clients to submit their ID cards and residence permits for verification to receive this level. * In the **Client tests** dropdown, optionally select one or more accreditation tests if you want to force your clients to pass these tests before they can submit their documents for verification. The list of available tests includes all the tests with visibility set to **Yes**, which are displayed on the [Client tests](../../back-office-guide/verification/client-tests) page. Click **Save** to create the level. ## How to create levels and flows in the SumSub interface [#how-to-create-levels-and-flows-in-the-sumsub-interface] The B2CORE Back Office supports two types of clients: *individual* and *corporate*. The SumSub system provides the capability to set up a separate verification flow for each of the types. To use this option, make sure that you enabled the **Client Resetting Mode** when [configuring a connection to SumSub](how-to-use-sumsubstance#how-to-configure-a-connection-to-sumsub). To add a new level: In the SumSub interface, navigate to **Integrations** > **Applicant Levels**. Click **Add new level**. Select the required steps. Level names must be specified in the following formats: * For *individual* clients: `level1`, `level2`, and so on. * For *corporate* clients: `level3corporate`, `level4corporate`, and so on. These formats ensure correct mapping between levels in SumSub and B2CORE. The mapping is based on the **Index** assigned to each verification level in B2CORE. You can find indexes in the respective column on the [Verification > Levels](../../back-office-guide/verification/levels) page of the B2CORE Back Office and use them in the level names for SumSub. For example: * `level1` in SumSub maps to the level with **Index** = 1 in B2CORE * `level2` in SumSub maps to the level with **Index** = 2 in B2CORE * `level3corporate` in SumSub maps to the level with **Index** = 3 in B2CORE * `level4corporate` in SumSub maps to the level with **Index** = 4 in B2CORE and so on. To add a new flow: In the SumSub interface, navigate to **Integrations** > **Verification Flow**. Click **Add new**. Select the required options. For each flow, select a compatible level. ## SumSub webhook configuration [#sumsub-webhook-configuration] **Reviewed** * Name: `REVIEWED` * Receiver: `HTTP Endpoint` * Target: `https://{your-Back-Office-URL}/api/v1/verification-sns/handle` * Type: `Applicant reviewed (applicantReviewed)` * Secret key: the secret key generated in SumSub Make sure to replace `{your-Back-Office-URL}` with the domain of your B2CORE Back Office, *not* the B2CORE UI. For example, the target for webhooks may look like this: `https://example.com/api/v1/verification-sns/handle`. Before you begin to configure a custom KYC (Know Your Customer) procedure, consider the following: * the number of verification levels that clients can obtain (you can use the built-in KYC provider or one of the [supported third-party KYC providers](../../integrations/kyc-providers) to run a verification procedure at each level) * the permissions that clients are granted after obtaining each verification level, as well as possible limits that can be applied to specific permissions * the documents that clients are required to submit to obtain each verification level. Moreover, it’s possible to configure separate KYC procedures for clients of different types, such as individual and corporate clients. You can also grant different initial verification levels to clients of different types after they sign up to the B2CORE UI (for details, refer to [How to add and configure the registration wizard](../manage-system-settings/how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard) and specifically the article about [how to configure the User Registration step](../manage-system-settings/how-to-set-up-the-registration-wazard/how-to-configure-the-user-registration-step)). Follow the steps below to create and set up verification levels, define the documents that clients must submit at each level, as well as configure the way the verification levels and their descriptions are displayed to clients in the B2CORE UI. ## How to create document groups [#how-to-create-document-groups] At this step, create document groups, for example, “Proof of ID”, “Proof of residence” and so on. Document groups are used to categorize documents required for verification. To create a document group: Navigate to **Verification** > **Document groups**, and then click **+Create** in the upper-right page corner. On the **Create document group** page, fill out the form: * Set the group **Name**, which will be displayed only in the Back Office. * Set **Type** to **One**. * Set **Caption** — the name of the document group in the B2CORE UI. Set localizations if needed. * Set **Description** — here, you can provide hints to your clients about the verification procedure. This information can be presented in the HTML format. Set localizations if needed. * Set **Enabled** to **Yes**. Click **Save** to create the document group. ## How to create document types [#how-to-create-document-types] A KYC document is a formal document such as an ID card, a passport, driver’s license, or bank statement, which can verify the identity and address of a client. At this step, define documents that clients should provide in order to get verified at each level. To define a document: Navigate to **Verification** > **Document types**, and then click **+Create** in the upper-right page corner. On the **Create document type** page, fill out the form: * Set the document **Name**, which will be displayed only in the Back Office. * Set **Caption** to specify the document name to be displayed in the B2CORE UI. Set localizations if needed. * Set **Description** — the description can be specified in the HTML format. Set localizations if needed. * Set **Status** to **Enabled**. * Set the document **Group** — it should be one of the groups created at the previous step. * Set **Max files** to indicate how many documents of this type your client can upload. Click **Save** to define the document type. ## How to create verification levels [#how-to-create-verification-levels] At this step, create the required verification levels. For each B2CORE instance, `Level 0` is already set up and is used as the default level. To create a new verification level: Navigate to **Verification** > **Levels**, and then click **+Create** in the upper-right page corner. On the **Create verification level** page, fill out the form: * Set the level **Index**, this value must be greater than 0. * Set **Wizard** — select `DocumentsWizard` to use the built-in KYC provider and display in the B2CORE UI a form for uploading required documents based on the specified document type. * Set **Caption** — the level name to be displayed to clients in the B2CORE UI and mobile app. If required, specify the localization properties for this field by clicking the button located on the right side of the field. * Set **Next Level** — select the next verification level that clients can obtain after they are granted the level that you currently configure. Leave this field empty to allow clients of different types, such as individual and corporate, to obtain different verification levels. The next level that a client is proposed to obtain in the B2CORE UI is the level with the next higher index according to the applied client type restrictions (for details, refer to [How to restrict the use of verification levels by client types](how-to-use-the-kyc-constructor#how-to-restrict-the-use-of-verification-levels-by-client-type)). * Set **Desktop Description** — the level description displayed to clients in the B2CORE UI. For a level description, you can list the permissions granted to clients after obtaining this level. The description for the B2CORE UI can be specified in the HTML format (see [Example](how-to-use-the-kyc-constructor#example) below). If required, specify the localization properties for this field. * Set **Mobile Description** — the level description displayed to clients in the mobile app. The description for the mobile app can be specified in the JSON format. If required, specify the localization properties for this field. * Set **Visible** to: * **Yes** — to create the level that will be displayed in the KYC flow to clients in the B2CORE UI. * **No** — to create a hidden level (for example, one with specific transaction limits) that can be assigned to clients only manually via the Back Office. * Set **Default** to **No** (since the default level is always Level 0). * In the **Assigned Client Right** dropdown, select a permission level defining a set of permissions that you want to grant to your clients after obtaining this verification level (to learn more, refer to [How to create permission levels](how-to-use-the-kyc-constructor#how-to-create-permission-levels)). * Select a client accreditation test in the **Client Tests** dropdown if you want to force your clients to pass the selected test before they can submit the documents required to obtain this verification level. The list of available client tests includes all the tests with visibility set to **Yes**, which are displayed on the [Client tests](../../back-office-guide/verification/client-tests) page. * Select **Document Groups** from among those created at [Step 1](how-to-use-the-kyc-constructor#how-to-create-document-groups), which specify the documents required for a client to be granted this verification level. Multiple groups can be selected. Click **Save** to create the verification level. ### Example [#example] The following HTML code example illustrates how to specify a level description for the B2CORE UI: ```html

Verification Level 0


To obtain Verification Level 1, submit the following documents:

  • A list of documents that a client must submit or other requirements that must be met for receiving Level 1.
```
To mark an operation as enabled for this verification level, change `glyphicon glyphicon-error` to `glyphicon glyphicon-success` in the HTML code. The level description will be displayed in the B2CORE UI as follows: The level description in the B2CORE UI ## How to restrict the use of verification levels by client type [#how-to-restrict-the-use-of-verification-levels-by-client-type] To configure separate verification procedures, for example for individual clients and corporate clients, indicate the levels that can be obtained only by clients of a specific type. To apply client type restrictions to a verification level: Navigate to **Verification** > **Levels**. Select the verification level, and click **Edit**. On the **Update verification level** page, click the **Actions** button, and select **Client type restriction**. In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Allow only** — to allow the use of the verification level only for a specific client type. * **Deny only** — to prohibit the use of the verification level for a specific client type. * In the **Rule** dropdown, select the client type to which you want to apply the selected rule. Click **Save** to apply the changes. ### Example [#example-1] Suppose that both *individual* and *corporate* clients are assigned the default `Level 0` after they sign up to the B2CORE UI. The following levels should be configured to support separate verification procedures for clients, based on **client type**: * Individual clients: `Level 0` → `Level 1` → `Level 2` Client type restriction: **Allow only** = `individual` * Corporate clients: `Level 0` → `Level 3` → `Level 4` Client type restriction: **Allow only** = `corporate` The next level that a client is allowed to obtain is the level with the next higher index according to the applied restrictions by client type. This may be useful when you want to use different [KYC providers](../../integrations/kyc-providers) for running verification procedures for individual and corporate clients. ## How to restrict the use of verification levels by jurisdiction or country [#how-to-restrict-the-use-of-verification-levels-by-jurisdiction-or-country] To configure more specific verification procedures, you can restrict the use of verification levels based on a client’s jurisdiction or country. To apply such restrictions to a verification level: Navigate to **Verification** > **Levels**. Select the verification level, and click **Edit**. On the **Update verification level** page, click the **Actions** button, and select: * **Jurisdiction restriction** — to apply the restriction based on the client’s jurisdiction. * **Country restriction** — to apply the restriction based on the client’s country. In the **Restrictions** popup, fill in the following fields: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Allow only** — to allow the use of the verification level only for the selected jurisdictions or countries. * **Deny only** — to prohibit the use of the verification level for the selected jurisdictions or countries. * In the **Rule** dropdown, select one or more jurisdictions or countries to which you want to apply the rule. Click **Save** to apply the changes. ### Example [#example-2] Suppose that both *individual* and *corporate* clients are initially assigned the default `Level 0` after signing up to the B2CORE UI. The following levels should be configured to support separate verification procedures for clients, based on **client type** and **jurisdiction**: * Individual clients in the **EU**: `Level 0` → `Level 1` → `Level 2` Client type restriction: **Allow only** = `individual` and Jurisdiction restriction: **Allow only** = `EU` These levels are accessible only to individual clients from the **EU** jurisdiction. * Individual clients in **CY** (Cyprus): `Level 0` → `Level 3` → `Level 4` Client type restriction: **Allow only** = `individual` and Jurisdiction restriction: **Allow only** = `CY` These levels are accessible only to individual clients from the **CY** jurisdiction. * Corporate clients in the **EU**: `Level 0` → `Level 5` → `Level 6` These levels are accessible only to corporate clients from the **EU** jurisdiction. Client type restriction: **Allow only** = `corporate` and Jurisdiction restriction: **Allow only** = `EU` * Corporate clients in **CY** (Cyprus): `Level 0` → `Level 7` → `Level 8` Client type restriction: **Allow only** = `corporate` and Jurisdiction restriction: **Allow only** = `CY` These levels are accessible only to corporate clients from **CY** jurisdiction. The next level that a client is allowed to obtain is the level with the next higher index according to the applied restrictions by client type and jurisdiction. ## How to create permission levels [#how-to-create-permission-levels] Permission levels are a set of operations that clients are allowed to make in the B2CORE UI. The permission levels are associated with verification levels. When clients obtain a particular verification level, they are granted the permissions associated with this verification level. To create a permission level: Navigate to **System** > **Client Rights**, and click **+Create** in the upper-right corner of the page. In the **Create role** window that is displayed, fill in the following fields: * **Name** — specify the name of the verification level, which should not include any capital letters. * **Caption** — specify the permission level description. Click **Save** to create the permission level. Click the **Edit** button located in the permission level row. In the **Parent Role** dropdown, select a previous permission level that clients must obtain before they can get this level. This field doesn't apply to the default permission level. Select the permissions that you want to grant to your clients at this level: * **Verification** — if selected, clients are allowed to obtain a higher verification level in the B2CORE UI. * **Converter** — if selected, clients can exchange funds in the B2CORE UI. * **Deposits** — if selected, clients can deposit funds in the B2CORE UI. * **Withdrawals** — if selected, clients can withdraw funds in the B2CORE UI. * **Internal Transfers** — if selected, funds can be transferred from one client to another within the same B2CORE system. Click **Save** to apply the changes. ## How to set up deposit, withdrawal, and transfer limits by verification levels [#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels] For each verification level, you can limit the amounts that clients who are granted this level can deposit, withdraw, and transfer. All limit values are calculated in USD. To set up limits for a particular level: Navigate to **Verification** > **Levels**. Select a verification level for which you want to set up limits, and then click the **Edit** button located in the level row. On the **Update verification level** page, fill in the fields displayed under the **Limits** section: * To limit the amount that clients can deposit per day, specify the maximum allowed value in the **Daily deposit** field. * To limit the amounts that clients can withdraw per day and per month, specify the maximum allowed values in the **Daily withdraw** and **Monthly withdraw** fields. * To set the minimum amount that clients can transfer from their wallets to trading accounts, specify the **Transfer min.** field. It won’t be allowed to transfer amounts that are less than the assigned limit. * To allow clients to withdraw certain amounts without obtaining approvals, specify the maximum allowed amount in the **Auto withdraw** field. The amounts that do not exceed the assigned limit can be withdrawn by clients automatically (without the admin approval). * To set the maximum allowed amount for internal transfer operations per day, specify the **Daily internal transfer** field. If a client wants to make an internal transfer after reaching a specified limit, a request for the internal transfer is created and must be approved by an admin. If a client makes an internal transfer to or from an MT account, the MT platform settings override the **Daily internal transfer** option. If the **Request required for transfer from** and **Request required for transfer to** options are enabled for the MT platform, the **Daily internal transfer** option is ignored, and requests for internal transfers are always created and must be approved by an admin. To apply no limits, enter **-1** in the corresponding field described above. To prohibit clients from making a specific transaction, enter **0** in the corresponding field described above. Click **Save** to apply the changes. **See also** [How to use SumSub](how-to-use-sumsubstance) [How to use ShuftiPro](how-to-use-shuftipro) ## Problem [#problem] A [Back Office user](../../back-office-guide/system/users/users) encounters the `403 Access Denied` error when attempting to approve or reject client requests. ## Possible reasons [#possible-reasons] This issue occurs if the user lacks the required permissions. Permissions from multiple categories must be granted. ## Solution [#solution] To verify and update the permissions: In the Back Office, navigate to **System** > **Users** > **Groups**. Locate the group in which the Back Office is included. Users in the **Administrators** group are granted all available permissions. This group can’t be removed and its permissions can’t be modified. Click the **Edit** button to open the group details. In the **Right** section, ensure the permission in the following categories are enabled: * **Clients** > **Client's request** — enable the permissions related to the required request types, such as: * `View client's requests with type Deposit` * `Update client's requests with type Deposit` * and other permissions. * **Finance** — enable the permissions related to the required operations. * **System** > **Requests** — enable the following permissions: * `View request resolutions` * `View request resolutions types` Alternatively, a user can be reassigned to the group that already has all the required permissions for managing client requests. Click **Save** to apply the changes. All Back Office users included in this group will now have these permissions. With them enabled, users will be able to approve and reject client requests without encountering the `403 Access Denied` error. The Back Office user must sign out and sign in to the Back Office again for the permissions to take effect. ## Problem [#problem] A client has enabled either **Google Authenticator** or **SMS confirmation** in the **Security** section of the B2CORE UI, but can't receive 2FA codes. ## Possible reasons [#possible-reasons] **Google Authenticator**: * The client has lost access to the app or the device on which it was installed. * The app isn't generating valid codes due to incorrect time synchronization on the device. **SMS confirmation**: * The SMS provider configuration in the Back Office is incomplete or incorrect. * Your SMS provider account doesn't have sufficient balance. * The SMS provider service is temporarily unavailable. * The client’s mobile operator blocks or delays SMS messages. ## Solution [#solution] To fix 2FA issues: ### Verify client 2FA settings [#verify-client-2fa-settings] * In the Back Office, navigate to **Clients** > **General**. * Find the client in the list and click the **Edit** button. * In the client details, go to the **Settings** tab. * In the **2FA** section, check whether one of the 2FA options is enabled for the client. If not, the client must enable 2FA in the **Security** section in the B2CORE UI. 2FA section in client details ### Troubleshoot Google Authenticator [#troubleshoot-google-authenticator] If the client can't generate valid codes or has lost access to the app or device: * You may disable the option on the **Settings** tab in the client details in the Back Office. * Ask the client to re-enable the Google Authenticator 2FA in the **Security** section in the B2CORE UI. Disabling 2FA removes an additional layer of protection. This action should only be performed at the explicit request of the client and under their sole responsibility. ### Troubleshoot SMS confirmation [#troubleshoot-sms-confirmation] * In the Back Office, navigate to **System** > **SMS providers**. * In the provider list, click the **Edit** button for the related provider, such as **Twilio**, to open its configuration details. * In the the **Provider settings** section: * Verify that the credentials are correct. * Ensure that the configuration is enabled. * Confirm that your SMS provider account has a sufficient balance for message delivery. Twilio provider settings If the configuration is correct but issues persist, contact the SMS provider to check for service disruptions or delivery issues with the client’s number. ## Problem [#problem] A client doesn't receive various emails from B2CORE, such as account creation confirmations, deposit notifications, or other system messages. ## Possible reasons [#possible-reasons] This issue may occur due to one or more of the following: * Emails being marked as spam or junk by the client’s email provider. * Incorrect or misconfigured SMTP settings in the B2CORE Back Office. * Emails stuck in the queue. * Missing or misconfigured email templates. * Issues with the email service provider, such as exceeded credits, service delays, or downtime. ## Solution [#solution] To address email delivery issues: ### Check spam and junk folders [#check-spam-and-junk-folders] Ask the client to check their spam or junk folders, especially if the email status is marked as successful in **Mailing** > **System** > **Logs** in the B2CORE Back Office. ### Verify SMTP settings in the B2CORE Back Office [#verify-smtp-settings-in-the-b2core-back-office] If multiple clients experience delivery issues, verify your [SMTP configuration settings](../../how-to-articles/manage-mailing-options/how-to-configure-smtp): * Navigate to **Mailing** > **System** > **Providers**. * Click the **Edit** button for the relevant SMTP configuration to open its details. * Click the **Test connection** button to validate the SMTP settings. * A checkmark on the **Test connection** button means the settings are properly configured. * A red **Test connection** button indicates errors in the settings, which will be listed. * Correct the settings and test again until the SMTP configuration is successful. * Ensure that the configuration is enabled. For details, refer to [How to configure SMTP](../../how-to-articles/manage-mailing-options/how-to-configure-smtp). ### Track an email delivery in the Email log [#track-an-email-delivery-in-the-email-log] * Navigate to **Mailing** > **System** > **Log**. * Locate the required email and check its delivery status: IN PROGRESS, FAIL, or SUCCESS. * For failed emails, check the **Reason** column to identify the issue. ### Check email templates in the B2CORE Back Office [#check-email-templates-in-the-b2core-back-office] * Navigate to **System** > **Templates** > **Email** > **Templates**. * Ensure that the template for the relevant notification exists and is properly configured (for details, refer to [How to configure email templates](../../how-to-articles/manage-system-settings/how-to-configure-email-templates)). * Ensure that the email template is enabled. ### Check the email provider operation [#check-the-email-provider-operation] If emails are delayed, verify that your email service provider is operational and that your account has sufficient credits or an active subscription. ## Problem [#problem] Clients don’t see their initiated transactions, such as deposits, withdrawals, transfers, internal transfers, or exchanges, in the **Transaction History** or the respective sections of the **Funds** menu in the B2CORE UI. ## Possible reasons [#possible-reasons] This issue may occur due to incorrect configuration of [operation types](../../back-office-guide/system/operation-types) in the B2CORE Back Office. ## Solution [#solution] To check the operation type configuration: In the Back Office, navigate to **System** > **Operation types**. Locate the required operation type, for example, `payouts`, which is used to control withdrawal transactions. Ensure that this operation type is enabled; otherwise, clients won’t be able to execute transactions of this type in the B2CORE UI. Click the **Edit** button to open the operation type details. Check the **Allowed operation status** list. If one or more statuses aren't selected, clients won’t see transactions in those statuses in the B2CORE UI. For example, if only the **Done** status is enabled for the `payouts` operation type, clients will see only their withdrawals in the **Done** status, but not those in other statuses. Allowed statuses for the payouts operation type Add all relevant statuses to the **Allowed operation status** list. Click **Save** to apply the changes. ## Problem [#problem] A client encounters the following error when attempting to exchange one currency for another in the B2CORE UI: `Exchange Rate error: the rate for this pair cannot be found, please try another pair`. ## Possible reasons [#possible-reasons] This issue may occurs due to one or more of the following: * One or both currencies aren't added in the B2CORE Back Office. * The selected currency pair isn't configured or is disabled in the B2CORE Back Office. * The exchange rate provider configuration is incomplete or incorrect. ### Solution [#solution] To fix the exchange issue: ### Verify that currencies exist in the B2CORE Back Office [#verify-that-currencies-exist-in-the-b2core-back-office] * Navigate to **Currencies** > **Currencies**. * Ensure that both currencies involved in the exchange are added. If not, add the missing currencies (for details, refer to [How to add a currency](../../how-to-articles/manage-currencies/how-to-add-a-currency)). ### Verify that the currency pair is configured in the B2CORE Back Office [#verify-that-the-currency-pair-is-configured-in-the-b2core-back-office] * Navigate to **Currencies** > **Currency pairs**. * Confirm that the required currency pair is configured and enabled. If not, add or enable it (for details, refer to [How to add an exchange currency pair](../../how-to-articles/manage-currencies/how-to-add-an-exchange-currency-pair)). ### Check that the exchange rate provider is properly configured in the B2CORE Back Office [#check-that-the-exchange-rate-provider-is-properly-configured-in-the-b2core-back-office] * Navigate to **Currencies** > **Rates**. * Locate the provider used to supply rates for the required currency pair, for example B2BINPAY, and click the **Edit** button to open its details. * Verify its configuration and credentials (for details, refer to [How to configure currency exchange rates](../../how-to-articles/manage-currencies/how-to-configure-currency-exchange-rates)). After confirming that currencies, currency pairs, and provider settings are correctly configured, the exchange should work without errors. ## Problem [#problem] You have enabled a new language in the Back Office under **System** > **Localization**, but translations in this language appear blank in the B2CORE UI. ## Possible reasons [#possible-reasons] This issue may occur because the newly enabled language hasn’t yet been added to B2TRANSLATE, which is a tool for managing translations for all supported languages in the B2CORE UI. For more information about B2TRANSLATE, refer to the [product documentation](https://docs.b2translate.b2broker.com/). To complete the steps below, you must be registered on B2TRANSLATE and have access to the project linked to your B2CORE. ## Solution [#solution] To check the language configuration in B2TRANSLATE: In the B2CORE Back Office, navigate to **System** > **Settings** to locate the UUID of the B2TRANSLATE project linked to your B2CORE and copy it. Sign in to B2TRANSLATE. Go to **Languages** and verify if the newly enabled language is available for your B2TRANSLATE projects. Go to **Projects** and find the related project by the UUID copied from the B2CORE Back Office. Click the **pencil** icon to edit the project. In the popup, check the **Languages** dropdown. If the required language is missing, add it. Edit a project in B2TRANSLATE Click **Save** to apply the changes. Configure translations for the added language (for details, refer to [Manage translations](https://docs.b2translate.b2broker.com/user-guide/manage-translations) in the [B2TRANSLATE documentation](https://docs.b2translate.b2broker.com/)). ## Problem [#problem] You've assigned a translation to a key in B2TRANSLATE, but a different translation is displayed for the this key in the B2CORE UI. For more information about B2TRANSLATE, refer to the [product documentation](https://docs.b2translate.b2broker.com/). ## Possible reasons [#possible-reasons] This issue may occur due to one of the following: * **B2TRANSLATE update delay**: updates in B2TRANSLATE may take a few minutes to appear, so the B2CORE UI might show the old translation temporarily. * **Overridden translation in B2CORE Back Office**: another translation may be assigned to this element in the B2CORE Back Office, where the localization option is available. If a field supports localization in the B2CORE Back Office, the localization button appears on its right side. Clicking this button opens a list of available languages where you can specify translations. ## Solution [#solution] To check and remove overridden translations: In the B2CORE Back Office, navigate to the respective menu. For example, **Products** > **Groups**. Click the **Edit** button for the relevant group to open its details. The **Caption** and **Description** fields support localizations. Click the button on the right side of the fields to view if any translations are applied to the fields and remove those that may override the B2TRANSLATE ones. Localization options for fields Before creating a manual deposit via the Back Office, make sure that the **manual** deposit method is created and enabled. To do this, navigate to **System** > **Deposit system** > **Deposit methods**. If the **manual** deposit method is not displayed on the **Deposit methods** page, create the method by following the instructions described in [How to add the manual deposit or withdrawal method](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method). After the **manual** deposit method is created and enabled, follow the steps below to create a deposit. Navigate to **Clients** > **General**. Select the client and click the **Edit** button. You can use [filters](../../back-office-guide/get-started#filtering-and-sorting) by name or email for a quick search. Go to the **Transactions** tab, and then select **Deposit**. Click **+Create**. Select a client account to which you want to deposit funds, and then click **Select**. Fill out the form: * Make sure that **Method** is set to **manual**. Check the account number and currency. * Enter the deposit amount. * Set **commissions**. * Enable the **Don’t send email** option if you don't want to notify the client about the deposit operation. * Confirm the operation by solving a simple math problem and enter the result in the **Verification code** field. * Add the **Internal comment** if needed. It will be displayed only in the Back Office. Click **Save** to create the deposit. Before creating a manual payout via the Back Office, make sure that the **manual** withdrawal method is created and enabled. To do this, navigate to **System** > **Payout system** > **Payout methods**. If the **manual** withdrawal method is not displayed on the **Payout methods** page, create the method by following the instructions described in [How to add a manual deposit or withdrawal method](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method). After the **manual** withdrawal method is created and enabled, follow the steps below to create a payout. Navigate to **Clients** > **General**. Select the client and click the **Edit** button. You can use [filters](../../back-office-guide/get-started#filtering-and-sorting) by name or email for a quick search. Go to the **Transactions** tab, and then select **Payout**. Click **+Create**. Select a client account from which you want to create a payout, and then click **Select**. Fill out the form: * Make sure that the **Method** is set to **manual**. Check the account number and currency. * Enter the payout amount. * Set **commissions**. * Enable the **Don’t send email** option if you don't want to notify the client about the payout operation. * Confirm the operation by solving a simple math problem and enter the result in the **Verification code** field. * Add the **Internal comment** if needed. It will be displayed only in the Back Office. Click **Save** to create the payout. To create and configure a report: Navigate to **Finance** > **Reports**. Click **+Create** in the upper-right page corner. On the **Create report** page, fill in the following fields: * In the **Interval** dropdown, schedule the report delivery: * **Daily** — the report is run and sent every day * **Weekly** — the report is run and sent once a week * **Monthly** — the report is run and sent once a month * In **Data slice** dropdown, select the period for which data is included in the report, as per the Back Office server time: * **Day** — the previous day, from 00:00 to 23:59 * **Week** — the previous week, from Monday 00:00 to Sunday 23:59 * **Month** — the previous month, from the first day of the month 00:00 to the last day 23:59 * **Curweek** — the previous 7 days, from the first day 00:00 to yesterday 23:59 * **Overall** — from the beginning of track record to yesterday 23:59 * **Curmonth** — from the first day of the current month 00:00 to yesterday 23:59 * In the **File format** dropdown, select **HTML**, **XLSX**, or **CSV**. * In the **Active** dropdown, select the report status: * **Active** — to run and send the report on schedule * **Inactive** — to disable the report * In the **Name** field, enter the report name. * In the **Class** dropdown, select one or several report types that you want to generate: * **Client Finance Report** — shows the amount of deposits, withdrawals and net deposits (the difference between total deposits and total withdrawals) made by each client over a specified time period, in corresponding currencies and in conversion to USD. The report includes the following fields: **Email**, **Verification Level**, **Currency**, **Deposit**, **Withdraw**, **(D - W)**, **(Deposit, USD)**, **(Withdraw, USD)** and **(Deposit - Withdrawal, USD)**. * **Transaction Finance Report** — contains detailed information on all transactions executed over a specified time period. The report includes various fields, such as **ID**, **Account ID**, **Operation ID**, **Email**, **Transaction Type**, **Method**, **Source Currency**, **Source Amount**, **Type Commission**, **Final Amount**, **Target Amount**, **Target Currency**, **Transaction Exchange Rate**, **% Markup**, **Profit Markup**, **Markup Currency** and others. * **Method Finance Report** — contains detailed information on methods used for execution of deposit and withdrawal operations over a specified time period. The data is grouped by currencies (such as fiat and crypto) and includes information about the commissions and profit earned from each operation. The report includes various fields, such as **Method**, **Currency**, **Deposit**, **Withdraw**, **Source Commission**, **Final Deposit amount**, **Final Withdrawal amount**, **Profit Markup**, **Counterparty Commission**, **Profit (Counterparty commission)** and others. * **Currency Finance Report** — shows the amount of deposits, withdrawals and net deposits (the difference between total deposits and total withdrawals) made over a specified time period in a particular currency and in conversion to USD. The report includes the following fields: **Currency**, **Deposit**, **Withdraw**, **(D - W)**, **(Deposit, USD)**, **(Withdraw, USD)** and **(Deposit - Withdrawal, USD)**. * **Balances Report** — shows balance changes on client accounts over a specified time period. The data is grouped by each currency and also includes the total balance change on all client accounts in conversion to USD. The report includes the following fields: **ID**, **Email**, **Client Name**, **Internal Client Type**, **Verification Level**, **Company Name**, **Currency**, **Balance**, **Hold**, **Rate**, **(Balance, USD)**, **Previous Balance** and **(Previous Balance, USD)**. * **User In Out** — this report is similar to the **Client Finance Report**, while also containing additional fields, such as **Transfers (D-W)** and **Manual (D-W)**. * **IB Balances Report** — shows the reward amounts earned by IB partners over a specified time period, as well as the total reward amount in conversion to USD. The report includes the following fields: **ID** (the identifier assigned to an IB partner), **Email**, **Client Name**, **Internal Client Type**, **Verification Level**, **Company Name**, **Currency**, **Balance**, **Rate** and **(Balance, USD)**. * **Balances Simplified Report** — shows balances on client accounts in each currency along with the total balance on all client accounts in conversion to USD. The report includes the following fields: **Email**, **Internal Client Type**, **Currency** and **Balance**. * **LegalEntityBalancesReport** — shows balances on all live accounts of the clients that are served by a specific legal entity. * In the **Mail to** field, enter the email address to which a link to download the report is sent. * In the **Start hour** field, enter the hour at which you want run the report and send it to the specified email, as per the Back Office server time. The value must be in the 0 — 23 range. * In **GMT offset** dropdown, select the GMT offset of your local time zone to send the report at the specified hour in your local time zone. The Back Office server time may differ from the time in your local time zone. The current server date and time are displayed in the topbar. Click **Save** to create the report. To transfer funds between accounts of the same client via the Back Office: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. You can use [filters](../../back-office-guide/get-started#filtering-and-sorting) by name or email for a quick search. Go to the **Transactions** tab, and then select **Transfer**. Click +**Create**. Fill out the form: * Select a debiting account in the **From account** dropdown. * Select a destination account in the **To account** dropdown. * Enter the transfer amount. * Confirm the operation by solving a simple math problem and enter the result in the **Verification code** field. Click **Save** to create the transfer. To exchange funds for a client via the Back Office: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. You can use [filters](../../back-office-guide/get-started#filtering-and-sorting) by name or email for a quick search. Go to the **Transactions** tab, and then select **Exchange**. Click +**Create**. Fill out the form: * Select a debiting account in the **From account** dropdown. * Select a destination account in the **To account** dropdown. * Select the **Exchange type**: * **Source & Rate (Sell)** — when selling currency, the destination amount can't be set * **Destination & Rate (Buy)** — when buying currency, the source amount can't be set * **Source & Destination (Direct)** — when making a direct transfer, the rates can't be set * Set the exchange amounts and rates depending on the selected exchange operation type. * Confirm the operation by solving a simple math problem and enter the result in the **Verification code** field. Click **Save** to exchange the funds. To get data about transactions on wallets and accounts of a specific client: Navigate to **Clients** > **General**. Select the client and click the **Edit** button. On the client details page, go to the **Transactions** tab, then select **Deposit**, **Payout**, **Transfer**, **Exchange**, or **Balance change operations** from the dropdown to view the respective transactions. From each page, export data by clicking the **Export** button in the upper-right corner. If filters are applied, some transactions may be excluded. Clear all filters to ensure you see the full list of transactions. It may also be important to check the **Status** column filters. For example, filter to show only transactions with the **Done** status and exclude those with **Pending** or **Failed** statuses. In the displayed popup: * Select the file format: XLSX or CSV. * Select **Send to email** to receive the file by email or **Download** to save it to your computer. * Click **Export**. You can then use the exported files to calculate and analyze transactions made on the client’s accounts and wallets. You can get the total deposits or withdrawals for all clients by exporting data from the relevant pages of the Back Office. To get the deposit or withdrawal data: Navigate to **Finance** > **Deposits** to view all client deposit transactions or **Finance** > **Payouts** to view all withdrawals. To display only the required information, hide or add columns using the **Column visibility** option. If filters are applied to the **Deposits** or **Payouts** page, some transactions may be excluded. Clear all filters to ensure you that see the full list of transactions. It may also be important to check the **Status** column filters. For example, you can filter to show only transactions with the **Done** status and exclude those with **Pending** or **Failed** statuses. Click the **Export** button in the upper-right page corner. In the displayed popup: * Select the file format: XLSX or CSV. * Select **Send to email** to receive the file by email or **Download** to save it to your computer. * Click **Export**. You can then use the exported file to find the total deposits or withdrawals for client wallets. Requests of the **PaymentSystem Deposit Assistance** and **PaymentSystem Withdrawal Assistance** types are automatically created in **Clients** > **Requests** when a corresponding deposit and withdrawal receives the `Assistance` status. This status indicates that the transaction status couldn't be determined automatically, and the admin must decide whether to continue syncing the transaction status with the external payment system or mark the transaction as failed. ## Note the difference [#note-the-difference] Deposit and withdrawal transactions may be assigned the `Assistance` status, while the corresponding requests in **Clients** > **Requests** are given the **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** type accordingly. These requests contain all available details about the transaction to help the admin make a decision on how to process it. ## Logic for creating PaymentSystem Assistance requests [#logic-for-creating-paymentsystem-assistance-requests] * For **deposits**, **PaymentSystem Deposit Assistance** requests *aren't* created when the `Assistance` status is assigned due to the **sync deadline** error, meaning that the deposit sync time with the payment system has expired. Such deposits must be processed directly in the deposit details in **Finance** > **Deposits**. For details, refer to [How to process deposits with the Assistance status](how-to-process-transactions-with-the-assistance-status#how-to-process-deposits-with-the-assistance-status). * For any reason other than the **sync deadline**, a **PaymentSystem Deposit Assistance** request is created for the deposit, and it must be processed within the corresponding request. * For **withdrawals**, **PaymentSystem Withdrawal Assistance** requests are always created when the `Assistance` status is assigned. These withdrawals must be processed within their respective requests. To process a PaymentSystem Assistance request: Navigate to **Clients** > **Requests**. Find the request related to the deposit or withdrawal transaction with the `Assistance` status. To filter the list, select **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** in the **Type** column and **Pending** in the **Status** column. Click the **Edit** button to open the request and view the transaction payment details. For an overview, refer to the [Payment details structure](how-to-process-transactions-with-the-assistance-status#payment-details-structure). These payment details are the same as those displayed on the **Payment system** tab in the deposit or withdrawal details under **Finance** > **Deposits** and **Finance** > **Payouts**. Based on the information provided in the request, take an appropriate action to update the transaction status. Before updating the transaction status, ensure to check the external payment system for the relevant transaction details to make a correct decision. The following transition options may be available, depending on the transaction’s current state: * [Move to In progress](move-to-in-progress) or [Move to Failed](move-to-failed). * [Move to Success](move-to-success) or [Move to Failed](move-to-failed). **See also** [Move to Success](move-to-success) [Move to In progress](move-to-in-progress) [Move to Failed](move-to-failed) Deposits and withdrawals initiated via [PSS-connected](../../integrations/payment-systems#payment-system-service-pss) methods may receive the `Assistance` status during processing. This status indicates that the transaction status couldn't be determined automatically during syncing with the external payment system and the transaction processing requires manual action. ## How to process deposits with the Assistance status [#how-to-process-deposits-with-the-assistance-status] Deposits may receive the `Assistance` status due to: * The sync time with the payment system has expired, meaning the **sync deadline** has been reached. In this case, the deposit must be processed directly in the deposit details in **Finance** > **Deposits**. * Any reason other than the **sync deadline**. In this case, a **PaymentSystem Deposit Assistance** request is created automatically in **Clients** > **Requests**, and the deposit must be processed within that request. The purpose of processing deposits with the sync deadline error directly in the deposit details is to prevent an excessive number of **PaymentSystem Deposit Assistance** requests and streamline request handling. To determine why a deposit has the `Assistance` status and process it: Navigate to **Finance** > **Deposits**. Find the deposit with the `Assistance` status that you need to process. To filter the list, select `Assistance` in the **Status** column to display only deposits with this status. Select the deposit and click the **Edit** button to open its details. In the deposit details, go to the **Payment system** tab. This tab displays detailed deposit information. For an overview, refer to the [Payment details structure](#payment-details-structure). Determine why the deposit received the `Assistance` status. In the **Timeline** section, review the status details: * If the status is **Unexpected** and the **Error code** field displays `service.sync_deadline`, the deposit syncing time with the payment system has expired. In this case, continue processing the deposit directly on the **Payment system** tab. * If any other error code is displayed, process the deposit in the corresponding **PaymentSystem Deposit Assistance** request that was created automatically in **Clients** > **Requests**. For details, refer to [How to process PaymentSystem Assistance requests for deposits and withdrawals](how-to-process-ps-deposit-assistance-and-ps-withdrawal-assitance-requests). To process the deposit with the `service.sync_deadline` error code, take the appropriate action to update the deposit status on the **Payment system** tab. The following options are available: * **Move to In progress** — to resume syncing of the deposit status with the external payment system. * **Move to Failed** — to stop syncing with the external payment system and mark the deposit as failed. For details, refer to [Move to In progress](move-to-in-progress) and [Move to Failed](move-to-failed). Note that for the `service.sync_deadline` case, these actions must be performed directly within the deposit details, on the **Payment system** tab. Depending on the selected option, the deposit status will be updated to **In progress** and then can reach one of the final statuses or will be updated to **Failed** immediately. ## How to process withdrawals with the Assistance status [#how-to-process-withdrawals-with-the-assistance-status] When a withdrawal receives the `Assistance` status, a **PaymentSystem Withdrawal Assistance** request is always created automatically in **Clients** > **Requests**. Such withdrawals must be processed within these requests. No manual actions for processing withdrawals are available within withdrawal details. To process a withdrawal with the `Assistance` status: Navigate to **Finance** > **Payouts**. Find the withdrawal with the `Assistance` status that you need to process. To filter the list, select `Assistance` in the **Status** column to display only withdrawals with this status. Select the withdrawal and click the **Edit** button to open its details. In the withdrawal details, go to the **Payment system** tab. This tab displays detailed withdrawal information. For an overview, refer to the [Payment details structure](#payment-details-structure). In the **Timeline** section, review the status and error code that caused the withdrawal to receive the `Assistance` status. Unlike deposits, withdrawals with the `Assistance` status always have a **PaymentSystem Withdrawal Assistance** request created in **Clients** > **Requests**. These withdrawals must be manually processed within their respective requests. For details, refer to [How to process PaymentSystem Assistance requests for deposits and withdrawals](how-to-process-ps-deposit-assistance-and-ps-withdrawal-assitance-requests). ## Payment details structure [#payment-details-structure] The following information is available on the **Payment system** tab in the details of deposits and withdrawals listed in **Finance** > **Deposits** and **Finance** > **Payouts**, as well as in the corresponding **PaymentSystem Deposit Assistance** and **PaymentSystem Withdrawal Assistance** requests listed in **Clients** > **Requests**. This information helps the admin decide how to process a specific transaction and includes the following sections: ### Deposit/Withdrawal information [#depositwithdrawal-information] Withdrawal information The main information about the transaction: **Identifier** The transaction identifier in the B2CORE Payment Systems Service (PSS). You can click it to navigate to the transaction details in **Finance** > **Deposits** or **Finance** > **Payouts**. *** **Payment provider identifier** The transaction identifier from the external payment system, which may have two statuses: * `Verified` — a transaction with this identifier exists in the payment system. * `Unverified` — a transaction with this identifier can't be found in the payment system. *** **Status** The status of the transaction in the B2CORE PSS: * **Created** — a transaction was created. * **In Progress** — a transaction is being processed. * **Success** — a transaction was completed successfully. This is a final status. * **Failed** — a transaction failed to complete. This is a final status. * **Unexpected** — a transaction is in an unknown state. This status must be handled by the admin as part of the assistance process. * **Unprocessable** — a transaction is in a state that requires manual actions, as no further actions can be taken automatically. This status must be handled by the admin as part of the assistance process. *** **Initial amount** The amount with which the transaction was initiated. *** **Initial currency** The currency in which the transaction was initiated. *** **Creation date** The date and time when the transaction was created. *** **Last updating date** The date and time when the transaction was last updated. ### Payment input snapshot [#payment-input-snapshot] The information entered by a client on a payment form when initiating a deposit or withdrawal. The fields that clients must complete depend on the selected deposit or withdrawal method. This information is displayed as the field name and the value provided by the client. For some methods, no information is required from clients. In this case, the message `The payment input snapshot is empty` is displayed. Payment input snapshot ### External details [#external-details] Additional information about the transaction, including useful data from the payment system. The set of information depends on the specific payment system. During transaction processing, there are no details in this section. ### Timeline [#timeline] Information about the transaction’s statuses within the B2CORE PSS. The data is presented in chronological order and includes useful details for each status. Timeline ### Polling job [#polling-job] After a transaction is created within the B2CORE PSS, the service initiates periodic requests to the external payment system to check the current status of the transaction. This periodic status check is referred to as the **Polling job** process. Each polling job attempt includes information about the request date, status, and additional details about any errors, if applicable. Polling job After the transaction is successfully completed, the information in all sections of the request is updated accordingly. When transactions — such as deposits, transfers, or exchanges between wallets and trading accounts — have the `Partial` status, it indicates that processing wasn’t completed due to technical issues. These transactions should be processed manually. To process a transaction with the `Partial` status: Navigate to **Finance** > **Transactions**. On the **Transactions** page, select `Partial` in the filter field displayed under the **Status** column to list all the transactions with that status. Select the transaction that you want to process. Click magnifying glass icon displayed on the left side of the transaction row. The system will automatically attempt to determine the final status of the transaction. * If successful, the transaction status is updated accordingly. * If the final status isn’t found, the following error message is displayed: `Operation was not found` and two buttons appear: * process transaction button — the **Process transaction** button * set done status button — the **Set Done status** button Your next step depends on whether the transaction exists on the respective trading platform, such as MT4, MT5, or cTrader. Therefore, navigate to the platform and check whether the funds have been received in the relevant trading account. It's important to verify the fund location before taking any further action. If the transaction is found on the platform, has been processed there, and the funds have reached the destination, click set done status button. This action assigns the `Done` status to the transaction in B2CORE since it has already been processed on the respective platform, but the status wasn’t received back to B2CORE. If the transaction isn't found on the platform, and the funds haven't reached the destination or been deducted from the source wallet, click process transaction button, and then confirm the action in the displayed popup. This will initiate the execution of the transaction again, and upon completion, the transaction will be assigned a final status. You can deposit different amounts to wallets and trading accounts for your clients at once using the **Update balances** option. To proceed, prepare a CSV file with the following information: email addresses of registered clients, account IDs to which funds should be deposited, and deposit amounts. Download the `template_update_balances.csv` file to ensure that your CSV file includes proper headers (such as `Email,AccountID,Amount`) and correctly structured data that is ready for updating balances. Keep in mind the following: * The number of rows in a CSV file mustn’t exceed 800. * Use a comma ( , ) to separate data items in your CSV file. No other separators are accepted. * Specify decimal amounts for deposits using a dot ( . ) as the decimal separator. * If a client account appears multiple times in the CSV file, its balance will be updated based on the number of occurrences. * The **Update balances** option updates balances of demo accounts and archived accounts. To prevent deposits to archived accounts, ensure that your CSV file doesn’t contain IDs of archived accounts. Don’t use the **Update balances** option for depositing funds when migrating client accounts between different platforms. This option is prohibited for such transactions. To update client balances: Navigate to **Clients** > **Accounts**. Click **+Update balances** in the upper-right page corner. In the **Update balances** popup, click **Upload csv file** and select a CSV file containing the required information for updating client account balances. To execute the action, click **Save**. The funds are deposited to clients using the **manual** method (for details, refer to [How to add the manual deposit or withdrawal method](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method)). To stop syncing the deposit or withdrawal status with the external payment system, move it to **Failed** in the **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request. To move a transaction to **Failed**: In the related **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request, click **Move to failed**. In the displayed popup, fill in the following fields: * In the **Error code** dropdown, select one of the following failure reasons: * **Operation not found** — indicates that the transaction couldn't be found in the external payment system. * **Operation failed** — indicates that the transaction failed in the external payment system. * **Other error** — indicates any other reason not covered by the options above. * In the **Error description** field, optionally provide a reason for marking the transaction as failed. * To confirm the action, solve a simple math problem and enter the result in the **Verification code** field. Move the transaction to failed Click **OK** to change the transaction status. Once the transaction status is set to **Failed**, the request will be marked as **Rejected**. ## Move a transaction to In progress [#move-a-transaction-to-in-progress] To continue syncing the deposit or withdrawal status with the external payment system, move it to **In progress** in the **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request. This will resume the [Polling job](how-to-process-transactions-with-the-assistance-status#polling-job) process for that transaction. To move a transaction to **In progress**: In the related **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request, click **Move to in progress**. Proceed depending on the status of the **Payment provider identifier** displayed in the [Deposit/Withdrawal information](how-to-process-transactions-with-the-assistance-status#depositwithdrawal-information). If the **Payment provider identifier** is marked as `Verified`, the following popup appears: Move the verified transaction to in progress To confirm the action, solve a simple math problem and enter the result in the **Verification code** field. If the **Payment provider identifier** is marked as `Unverified`, you must navigate to the external payment system and check that the related transaction exists and copy its identifier. Move the unverified transaction to in progress In the displayed popup, fill in the following fields: * In the **Identifier** field, specify the transaction identifier from the external payment system. * To confirm the action, solve a simple math problem and enter the result in the **Verification code** field. Click **OK** to change the transaction status. Once the transaction status is set to **In Progress**, the request will be marked as **Approved**. This request status doesn't mean that the transaction has been successfully completed. It indicates that syncing with the external payment system has resumed. If the transaction is assigned the **Unexpected** status again during repeated syncing, a new **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request with the **Pending** status will be automatically created in [Clients > Requests](../../back-office-guide/clients/requests), which will again require manual action. The deposit or withdrawal can be moved to **Success** in the **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request only if the latest attempt of the [Polling job](how-to-process-transactions-with-the-assistance-status#polling-job) process has the **Unprocessable** status, indicating that it must be finalized manually. Before moving a transaction to **Success**, you must verify in the external payment system that the corresponding transaction exists and has been successfully executed; otherwise, it may be incorrectly marked as successful, leading to discrepancies in the client's balance. To move a transaction to **Success**: In the related **PaymentSystem Deposit Assistance** or **PaymentSystem Withdrawal Assistance** request, click **Move to success**. In the displayed popup, fill in the following fields: * In the **Final amount** field, enter the amount to be deposited to or withdrawn from the client's wallet. The amount must be in the currency in which the transaction was initiated. If a client initiates a transaction in one currency but completes the payment in another, you must manually convert the amount and enter its equivalent in the currency in which the transaction was initiated. This amount will be deposited to or deducted from the client's wallet. * To confirm the action, solve a simple math problem and enter the result in the **Verification code** field. Move the deposit to success Click **OK** to change the transaction status. Once the transaction status is set to **Success**, the request will be marked as **Approved**. ## Problem [#problem] After signing in to the B2CORE UI and completing 2FA (if enabled), a client encounters the `404 Not Found` error and sees a blank page. ## Possible reasons [#possible-reasons] This issue may occur if the client doesn't have permissions to view the main menu due to restrictions based on **verification level** or **client type**. ## Solution [#solution] To check and update the main menu visibility settings: In the Back Office, navigate to **Promotion** > **Menu**. Ensure that the toggle in the **Visible** column is enabled for the **General** row. If disabled, clients will remain stuck on the **Sign In** page after entering their credentials. The main menu visibility option Click the **Edit** button in the **General** row to open the details. Check the **Verification level allowance** and **Client type allowance** lists. Make sure the client’s verification level and client type are included in those lists; otherwise, the main menu won't be displayed to that client. Verification level and client type restrictions for the main menu Click **Save** to apply the changes. Click the **eye** icon located in the **General** row to view the menu tree. The menu tree Verify that the **Visible** toggle is enabled for all menu items that you want to display in the main menu. For each menu item, click the **Edit** button and check the **Verification level allowance** and **Client type allowance** lists. Adjust them if necessary. The **Visible** toggle must be enabled for the **General** row and all required menu items. In addition, the **Verification level allowance** and **Client type allowance** lists for both the **General** row and menu items must be properly configured to ensure that clients with the appropriate verification levels and client types can access the menu. ## Problem [#problem] Clients may encounter various sign-in issues when using the mobile app on **iOS** or **Android**, such as: * The **Sign In** button not responding * Sessions closing immediately after sign-in * Valid credentials not being accepted * Biometric options (Face ID or fingerprint) not working ## Possible reasons [#possible-reasons] * Background processes interfering with the app * Expired or corrupted session data * Outdated app version or corrupted installation * Device OS not updated * Cache-related issues (for Android only) ## Solution [#solution] To resolve most sign-in issues: ### Force close and reopen the app [#force-close-and-reopen-the-app] Sometimes background processes cause unexpected issues. Fully close the app from recent apps, and then reopen it. ### Sign out of the app and sign in again [#sign-out-of-the-app-and-sign-in-again] If the session expires quickly, manually sign out of the app (if possible), and then sign in again. ### Reinstall the app [#reinstall-the-app] * Uninstall the app. * Download and reinstall it from **App Store** (iOS) or via the APK file (Android). ### Update the app [#update-the-app] * Check for the latest version in the **App Store** (iOS) or via the APK file (Android). * Install updates to ensure compatibility and bug fixes. ### Check for OS updates [#check-for-os-updates] * On iOS, go to **Settings** > **General** > **Software update**. * On Android, go to **Settings** > **About phone** > **System update** (or **Software updates**, depending on your device). * Install any available updates, as outdated OS versions can cause incompatibility. ### Clear app cache (for Android only) [#clear-app-cache-for-android-only] Go to **Settings** > **Apps** > **\{App name}** > **Storage** > **Clear cache**. ## Problem [#problem] A client can't submit a verification request in the B2CORE UI and encounters an error. ## Possible reasons [#possible-reasons] This issue may occur due to one or more of the following: * The required verification level isn't available to the client. * The KYC provider connection isn't properly configured or disabled in the B2CORE Back Office. * Your KYC provider subscription or plan is invalid, inactive, or unpaid. ## Solution [#solution] To fix verification issues: ### Check the availability of verification levels [#check-the-availability-of-verification-levels] * In the Back Office, navigate to **Verification** > **Levels**. * On the **Levels** page, check the **Visible** column and ensure the relevant level is marked as visible so that clients can obtain it. * To make the level visible, click the **Edit** button to open the level details and select **Yes** in the **Visible** dropdown. * Click **Save** to apply the changes. ### Check the KYC provider connection settings [#check-the-kyc-provider-connection-settings] * In the Back Office, navigate to **System** > **External connections**. * Locate the connection to the provider used for verification, such as **SumSub**, **ShuftiPro**, or others. * Click the **Edit** button for the relevant connection to open its details. * Review the connection settings and adjust them if necessary. * Ensure the connection is enabled. For details, refer to: * [How to use SumSub](../../how-to-articles/manage-verification-options/how-to-use-sumsubstance) * [How to use ShuftiPro](../../how-to-articles/manage-verification-options/how-to-use-shuftipro) ### Verify that your KYC provider subscription or plan is valid, paid, and active [#verify-that-your-kyc-provider-subscription-or-plan-is-valid-paid-and-active] If the subscription has expired or is inactive, clients won't be able to submit verification requests via the KYC provider. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} This article explains how amounts are calculated in the **Pay** and **Receive** fields in the B2CORE UI when transactions involve currency conversions. For such transactions, the resulting amounts depend on the following: * The **rounding rules** applied to the amount in the **Pay** and **Receive** fields. * The configured **currency scales** defining the number of decimal places supported for both the source and target currencies involved in a transaction. ## Rounding rules [#rounding-rules] For the **Pay** and **Receive** fields, different rounding rules are applied in B2CORE: * The **Pay** field: the amount is always **rounded up**. This ensures that the broker does not lose profit due to rounding differences. * The **Receive** field: the amount is always **rounded down** according to the scale of the target currency. ## Currency scales [#currency-scales] All currencies used for transactions in B2CORE have configured **scales**, which define the number of allowed decimal places. The scale determines the precision of rounding for any transaction involving that currency. You can configure the scale for each currency by navigating to **Currencies** > **Currencies**, opening the currency details, and setting the required value in the **Precision** field. For example: * **THB** (Thai Baht): scale `0` (no decimals) * **USD** (US Dollar): scale `2 `(two decimals) ## Example [#example] Suppose a client initiates a deposit to a **USD** wallet and pays in **THB** (Thai Baht). * When **THB** has a scale of `0` (no decimals): * Enter **245 USD** in the **Receive** field → the **Pay** field displays **7,968 THB**. * Enter **7,968 THB** in the **Pay** field → the **Receive** field displays **245.01 USD**. THB with scale 0 * When **THB** has a scale of `1` (one decimal): * Enter **245 USD** in the **Receive** field → the **Pay** field displays **7,967.4 THB**. * Enter **7,967.4 THB** in the **Pay** field → the **Receive** field displays **245 USD**. THB with scale 1 The mismatch occurs because the scale of `0` can't preserve decimal values, while scales of `1` or higher allow fractional amounts, resulting in more precise conversions. This instruction explains how to add deposit and withdrawal methods that use payment systems that can be connected to B2CORE through PSS. Payment System Service (PSS) is a new B2CORE service that offers enhanced connections to external payment providers and cashier systems. Payment systems marked with `Yes` in the **PSS-supported** column in [Integration > Payment systems](../../integrations/payment-systems) can be connected through PSS. ## General procedure [#general-procedure] Before adding deposit and withdrawal methods in B2CORE, ensure that you are signed up for the selected payment system and have an active account in that system. The procedure for adding a deposit or withdrawal method for payment systems that support connections through PSS includes two steps: Configure connections to a payment system in **System** > **External connections**. If the payment system supports both deposits and withdrawals, and you plan to use it for both, you must create two separate connections: one for deposits and another for withdrawals. For details, refer to [Step 1. How to configure a connection to a PSS-supported payment system](#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system). Add the deposit or withdrawal method that will use the selected payment systems. * To add a deposit method, navigate to **System** > **Deposit system** > **Deposit methods**. * To add a withdrawal method, navigate to **System** > **Payout system** > **Payout methods**. For details, refer to [Step 2. How to add a deposit or withdrawal method](#step-2-how-to-add-a-deposit-or-withdrawal-method). ## Step 1. How to configure a connection to a PSS-supported payment system [#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system] If a payment system supports both deposits and withdrawals and you intend to use it for both, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to a payment system: Navigate to **System** > **External connection**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name can only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to configure a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to configure a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select the payment system that you want to use for the deposit or withdrawal method. In the **Credentials** section that appears, fill in the required connection settings specific to the selected payment system. Click **Save** to create the connection. The connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. The connection is now ready to be used for adding a deposit or withdrawal method. ## Step 2. How to add a deposit or withdrawal method [#step-2-how-to-add-a-deposit-or-withdrawal-method] After configuring the required connections to the payment system, proceed to add and set up a deposit or withdrawal method: Navigate to **System** > **Deposit system** > **Deposit methods** or **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a deposit method. * **PaymentSystemWithdrawal** — to add a withdrawal method. After selecting the provider, the following fields will appear: * In the **Available account currencies** dropdown, select one or more currencies. The method can only be applied to accounts denominated in the selected currencies. * In the **Driver** dropdown, select the payment system that will be used for this method. * In the **Connection** dropdown, select the previously configured [connection](#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system) to the payment system. After specifying the connection, the **Configuration** section will appear, in which you may need to configure additional settings for the method. If the message `Configuration form is empty` is displayed, no additional settings are required. Click **Save** to create the method. The method will appear in the list of deposit methods. Click the **Edit** button to enter the method details and complete the following fields: * On the **Settings** tab, select one or more groups in which the method will be included, such as **Crypto**, **Fiat**, or both. * In the **Icon** field, specify the icon name that can be found in [Payment systems](../../integrations/payment-systems) to display the icon for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab (for the tab description, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details) or [Payout methods](../../back-office-guide/system/payout-system#details)). * If needed, configure commissions for the methods on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Click **Save** to apply the changes. The deposit or withdrawal method that uses the selected payment system is now configured in the B2CORE Back Office. ## Step 3. How to test a method configuration [#step-3-how-to-test-a-method-configuration] To validate the configuration and connection settings of a deposit or withdrawal method and ensure the method is operational, use **configuration testing**, which is available: * during method creation * during method configuration editing * during background testing while the method is in use ### How to manually test a method configuration [#how-to-manually-test-a-method-configuration] Use manual configuration testing when creating a method or editing its configuration to verify that the method connection and configuration settings are correct before saving your changes. To test a method configuration: Navigate to **System** > **Deposit system** > **Deposit methods** or **System** > **Payout system** > **Payout methods**. Select the method and click **Edit** to open the method details. Click the **Test configuration** button below the **Configuration** form to validate the method connection and configuration settings. The test is performed using two data sources: the information entered in the **Configuration** form and the **Credentials** specified in the external connection selected for the method. The test result is displayed on the page and can be one of the outcomes listed in [Method configuration test results](#method-configuration-test-results). ### How to view background method configuration test results [#how-to-view-background-method-configuration-test-results] After a deposit or withdrawal method is successfully created, a **background testing process** starts automatically. At defined intervals, the system validates two data sources: the information entered in the **Configuration** form and the **Credentials** provided by the external connection selected for the method. These checks may result in one of the outcomes listed in [Method configuration test results](#method-configuration-test-results). Unlike manual testing performed using the **Test configuration** button, background testing can detect issues that weren't present when the method was created or edited but appeared later due to changes in the payment system behavior. To view background test results: Navigate to **System** > **Deposit system** > **Deposit methods** or **System** > **Payout system** > **Payout methods**. Select the method and click **Edit** to open the method details. Go to the **Test configuration** tab to view the background test results. Manual configuration testing performed using the **Test configuration** button doesn't affect background test results and isn't displayed on this tab. The background test results are displayed as follows. When a method is initially created and the **Configuration** form (if applicable) is completed, along with the creation of an external connection containing **Credentials**, both the **Configuration** and **Credentials** records are assigned **version 1**. The current versions are shown in the lower-right corner of the tab. New method configuration testing Each time the **Configuration** or the associated **Credentials** from the external connection used by the method are updated, the system automatically increments the corresponding version number. When a new version is created, background testing for that version starts automatically. As a result, the test outcome may differ from the previous one. Updated method configuration testing After the **Configuration** or **Credentials** are updated: * The corresponding version is increased. * Background testing of the new version starts and may take some time. * Results of the previous tests become outdated: * They are moved to the **Previous** tests section. * Their **Relevance** value changes to `Old`. Once background testing of the new version is completed: * The latest test result becomes the current one. * The **Relevance** value changes to `Actual`, indicating that the result corresponds to the current configuration version. Background test result may also change without updating versions of the **Configuration** or **Credentials** from the respective external connection. This can occur for several reasons, including temporary unavailability of the external payment system, changes to the external service API, errors during the testing process. In such cases, a new background test result is also displayed on the tab. ### Method configuration test results [#method-configuration-test-results] Configuration testing can return one of the following results, indicating the current status of a deposit or withdrawal method: * **Authorized** — successful authentication with the payment system. The payment system account has sufficient permissions to perform financial operations. Successful — Authorized * **Available** — successful authentication with the payment system. This status doesn't guarantee that the account has permissions to create deposits or withdrawals. Successful — Available * **Failed** — configuration testing has failed. This status includes an error code and description. Failed * **Unexpected** — an unexpected configuration test result. This status includes an error code and description. Unexpected * **Not implemented** — configuration testing is not implemented for this payment driver. Not implemented **See also** [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods) [How to restrict the use of deposit and withdrawal methods](how-to-restrict-the-use-of-deposit-and-withdrawal-methods) [How to process transactions with the Assistance status](../manage-finances/how-to-process-transactions-with-the-assistance-status) This instruction explains how to add deposit and withdrawal methods using non-PSS connections for payment systems that haven't yet migrated to the new [B2CORE Payment System Service (PSS)](../../integrations/payment-systems#payment-system-service-pss). Non-PSS systems are marked with `No` in the **PSS-supported** column in [Integration > Payment systems](../../integrations/payment-systems). Before adding deposit and withdrawal methods in B2CORE, ensure that you are signed up for the selected payment system and have an active account in that system. To add and set up a deposit or withdrawal method: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the displayed page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select a payment system that you want to use for deposits or withdrawals. * In the displayed **Currency** dropdown, select a currency for deposits or withdrawals. After creating the method, you can add multiple currencies to it on the **TR Currencies** tab. * Leave the **Connection** field empty. Click **Save** to create the method. The created method is enabled by default. Locate the newly created method in the list and click the **Edit** button in the method row. On the **Settings** tab, select one or more groups in which the method should be included, such as **Fiat**, **Crypto**, or both. In the **Icon** field, specify the icon name that can be found in [Payment systems](../../integrations/payment-systems) to display the icon for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. Depending on the payment system that you selected as a provider, you may need to configure additional options that are specific to the provider in the **Provider settings** section. Review the currencies added on the **TR Currencies** and **PS Currencies** tabs, and add more if necessary (for tab descriptions, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details) or [Payout methods](../../back-office-guide/system/payout-system#details)). If needed, configure commissions for the methods on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Click **Save** to apply the changes. Click **Test connection** to validate the connection settings. The deposit or withdrawal method that uses the selected payment system is now configured in the B2CORE Back Office. **See also** [How to add the manual deposit or withdrawal method](how-to-add-the-manual-deposit-or-withdrawal-method) [How to add the Constructor deposit or withdrawal method](how-to-add-the-constructor-deposit-or-withdrawal-method) [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods) [How to restrict the use of deposit and withdrawal methods](how-to-restrict-the-use-of-deposit-and-withdrawal-methods) You can use the **Constructor** method for deposits or withdrawals when customization is needed to meet specific requirements. With **Constructor** methods, you can add and configure fields that clients must fill in when making deposits or withdrawals in the B2CORE UI. This flexibility is useful when additional details, such as bank information, payment references, or required documents, must be provided by clients. By ensuring that all necessary information is collected, these methods help streamline deposit and withdrawal processing. To add the **Constructor** method for deposits or withdrawals: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create method** page, fill in the following fields: * In the **Name** field, enter a name for the method, such as `Constructor`. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **Constructor**. * In the displayed **Currency** dropdown, select a currency for deposits or withdrawals. After creating the method, you can add multiple currencies to it on the **TR Currencies** tab. * Leave the **Connection** dropdown empty. Click **Save** to create the method. The **Constructor** method will appear in the list of methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, select one or more groups in which the method should be included, such as **Fiat**, **Crypto**, or both. * Review the currencies added on the **TR Currencies** and **PS Currencies** tabs, and add more if necessary (for tab descriptions, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details) or [Payout methods](../../back-office-guide/system/payout-system#details)). * Check the method status. Keep the method inactive (**No** is displayed in the **Enabled** field) until the method configuration is fully completed, including adding [custom fields](#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method). Once done, activate the method. Click **Save** to apply the changes. The initial setup of the **Constructor** method is complete. Next, proceed with adding the required custom fields. ## How to add custom fields for the Constructor deposit or withdrawal method [#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method] You can add and set up custom fields for deposit and withdrawal methods that use the **Constructor** provider. To add a custom field: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Select the deposit or withdrawal method that uses the **Constructor** provider. Click **Edit** to enter the method details. On the **Settings** tab, navigate to the **Custom fields** section, and then click **Add field**. In the **Add field** popup, fill in the following fields: * In the **Caption** field, enter a field name. The name will be displayed in the B2CORE UI. You can optionally add localizations to the field name by clicking the button on the right side of the **Caption** field and providing translations for the required languages. When switching languages in the B2CORE UI, the field name will be displayed according to the selected language. * In the **Type** dropdown, select a field type. The following types are available: * **Text** — to add a text field. * **Select with autocomplete** — to add a field with predefined options. When a client begins typing in this field, options that match the entered characters are displayed, enabling the client to select the desired one. * **File** — to add a field for attaching a document necessary for depositing or withdrawing funds. Click **Save** to add the custom field. To configure properties of the newly added field, click the **Edit** button located in the field row: * In the displayed **Main field settings** section, you can make the field mandatory by selecting `required` in the **Rules** field. * For a field of the **Select with autocomplete** type, add a list of predefined options. The options can be added manually or uploaded automatically by connecting to an appropriate API resource (for details, refer to [How to upload a list of predefined options for a custom field](#how-to-upload-a-list-of-predefined-options-for-a-custom-field)) * For a field of the **File** type, in the **Document type** dropdown, select the type of a document that clients should attach. The list of available document types includes all the types configured on the **Verification** > **Document types** page. Clients can attach files in JPEG, PNG, or PDF format with the file size up to 3 MB. Once you have completed the method configuration, activate it by selecting **Yes** in the **Enabled** dropdown. Click **Save** to apply the changes. When clients deposit or withdraw funds with the **Constructor** method, the added custom fields are displayed to them in the same order as they are listed in the **Custom fields** section of the Back Office. ## How to upload a list of predefined options for a custom field [#how-to-upload-a-list-of-predefined-options-for-a-custom-field] For each custom field of the **Select with autocomplete** type, you can automatically upload predefined options that clients can select when they deposit or withdraw funds in the B2CORE UI. For example, instead of manually adding bank names as predefined options for the “Bank name” field, you can retrieve them from an appropriate resource defined for your application API. To upload a list of predefined options for a custom field: Navigate to the details of a deposit or withdrawal method that uses the **Constructor** provider. On the **Settings** tab, navigate to the **Custom fields** section. Select a field of the **Select with autocomplete** type for which you want to upload a list of predefined options (such as “Bank name”), and then click **Edit**. Navigate to the **Field dynamic options** section, which is displayed below the **Custom fields** list, and specify the following fields: * In the **Endpoint** field, specify a URL of a specific API resource that includes field values that you want to use as predefined options for the selected custom field (such as the following sample endpoint: `https://[host]/api/banks`). The structure of the specified API resource is displayed in the **Endpoint result preview** field. The following example illustrates a possible resource structure: ```json [ { "bankId": 1, "bankName": "Bank name 1", "countryCode": "AE", "countryName": "UAE" }, { "bankId": 2, "bankName": "Bank name 2", "countryCode": "AE", "countryName": "UAE" }, { "bankId": 3, "bankName": "Bank name 3", "countryCode": "GE", "countryName": "Georgia" }, { "bankId": 4, "bankName": "Bank name 4", "countryCode": "GE", "countryName": "Georgia" }, { "bankId": 5, "bankName": "Bank name 5", "countryCode": "MZ", "countryName": "Mozambique" } ] ``` * In the **Options from key** dropdown, select the root element of the specified API resource (such as `root`). * In the **Option value from key** dropdown, select the resource field specifying the values of predefined options displayed for the custom field (such as `bankId`). * In the **Option caption from key** dropdown, select the resource field specifying the captions of the predefined options (such as `bankName`). Click **Save** to apply the changes. In the B2CORE UI, the list of predefined options for the “Bank name” custom field will include all the values retrieved from the `bankName` fields of the sample API resource. ## How to dynamically form a list of predefined options for a custom field [#how-to-dynamically-form-a-list-of-predefined-options-for-a-custom-field] A list of predefined options for a custom field can be formed dynamically, with the available options changing based on the selection made in an associated field. For example, a list of predefined options for the “Bank name” field can depend on the country that is selected in the “Country” field. To form dynamic lists of predefined options, both the associated custom fields must be populated with the options retrieved from the same API resource (for details, refer to [How to upload a list of predefined options for a custom field](#how-to-upload-a-list-of-predefined-options-for-a-custom-field)). To dynamically form a list of predefined options for a custom field: Navigate to the details of a deposit or withdrawal method that uses the **Constructor** provider. On the **Settings** tab, navigate to the **Custom fields** section. Select a field of the **Select with autocomplete** type for which you want to form a dynamic list of predefined options (such as “Bank name”), and then click **Edit**. Navigate to the **Field dynamic options** section, which is displayed below the **Custom fields** list, and specify the following field settings: * In the **Depends on field** dropdown, select another custom field (such as “Country”) that you want to associate with the “Bank name” field. * In the **Depends on field by key** dropdown, select the resource field that will be used to filter the options for the “Bank name” field (such as `countryCode`). Dynamic options for custom fields Click **Save** to apply the changes. In the B2CORE UI, the list of bank names displayed for the “Bank name” field will be filtered based on the country selected by the client in the the “Country” field. You can use the **manual** deposit and withdrawal methods to make deposits and withdrawals for your clients in the Back Office. For the **manual** method to work correctly, you must configure exchange rates in **Currencies** > **Rates** for all currencies that you plan to use with this method. These rates are required to calculate the **daily** and **monthly limits** for deposits and withdrawals, specified in verification level settings (for details, refer to [How to set up deposit, withdrawal, and transfer limits by verification levels](../manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels)). Because the limits are calculated in `USD`, you must configure rates to `USD` for each currency added to the **manual** method. For example, if you deposit funds in `EUR` to a client wallet denominated in `EUR` using the **manual** method, the `EURUSD` exchange rate is still required to calculate the client’s daily and monthly deposit limits; otherwise, an error will occur when processing the deposit. To add the manual methods for deposits and withdrawals: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a method** page, fill in the following fields: * In the **Name** field, enter a name for the method, such as `manual`. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption that will be applied to the method in the Back Office, such as `Manual Deposit` or `Manual Withdrawal`. * In the **Provider** dropdown, select **manual**. * In the displayed **Currency** dropdown, select a currency for deposits or withdrawals. After creating the method, you can add multiple currencies to it on the **TR Currencies** tab. * Leave the **Connection** dropdown empty. Click **Save** to create the method. The manual method appears in the list of methods and is enabled by default. To add more currencies for deposits or withdrawals using this method, click **Edit** to open the method details. On the **TR Currencies** tab, add the needed currencies. Click **Save** to apply the changes. The **manual** method is now ready for making deposits or withdrawals in the selected currencies via the Back Office. **See also** [How to create a deposit](../manage-finances/how-to-create-a-deposit) [How to create a payout](../manage-finances/how-to-create-a-payout) For deposit and withdrawal methods, you can configure commissions that will be deducted from clients when they make deposits or withdrawals in the B2CORE UI. To configure commissions: Navigate to **System** > **Deposit system** > **Deposit methods** or\ **System** > **Payout system** > **Payout methods**. Select the method and click the **Edit** button in the method row. On the **Edit method** page, go to the **Commissions** tab and click **+Add**. In the **Create commission** popup, fill in the following fields: * In the **Currency** dropdown, select a commission currency. * In the **Type** dropdown, select the commission type **TR** or **PSP** (for details, refer to [Deposit methods](../../back-office-guide/system/deposit-system#commissions-tab) and [Payout methods](../../back-office-guide/system/payout-system#commissions-tab)). * Enter commission rates in the respective fields shown in the image below. Fields for configuring commissions The use of these fields follows the formula: `Minimum commission amount (1) <= Fixed rate (2) + Percentage rate % (3) <= Maximum commission amount (4)` You can set a fixed commission rate, a percentage commission rate, or a combination of both. * To set a fixed commission rate, enter the commission amount in the field `2`. The specified commission amount is charged for each deposit or withdrawal transaction regardless of the transaction amount. For fixed commission rates, leave the other fields empty. * To set a percentage commission rate, enter the percentage value in the field `3`. The specified percentage of a deposit or withdrawal amount is charged as a commission. For percentage commission rates, it’s recommended that you set the minimum commission amount in the field `1` and the maximum commission amount in the field `4`. The commission can’t be be lower than the minimum amount or exceed the maximum amount. * If both a fixed rate in the field `2` and a percentage rate in the field `3` are entered, the commission is calculated as the sum of the fixed amount and the specified percentage of a deposit or withdrawal amount. For combined commissions, it’s also recommended that you set the minimum and maximum commission amounts. Click **Save** to apply the commission settings to the selected method. ## Example [#example] Suppose that commission rates for deposits in `USD` are configured as follows: `15 ≤ 10 + 5% ≤ 50` In this case: * The commission amount is calculated as 5% of a deposit amount plus a fixed rate of 10 USD. * The commission amount can't be less than 15 USD and can't exceed 50 USD. If 100 USD are credited to the client's account after the deposit is successfully processed by the payment provider, the commission is calculated as: `10 + (100 * 0.05) = 15 USD` If 1,000 USD are credited to the client's account, the commission is calculated as: `10 + (1,000 * 0.05) = 60 USD`, which exceeds the maximum commission limit. Therefore, the commission will be capped at `50 USD`. [1-2-Pay](https://1-2-pay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss). It supports deposits via QR codes and withdrawals to bank accounts, processed in `THB`. Follow the instructions below to configure the 1-2-Pay connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to 1-2-Pay. Before proceeding with the instructions, you must have signed up for 1-2-Pay and have an active account. All the details required for configuring connections to 1-2-Pay, including the **API start base URL**, **API sync base URL**, and other credentials, must be requested from the 1-2-Pay support. ## Configure connections to 1-2-Pay [#configure-connections-to-1-2-pay] If you plan to use 1-2-Pay for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to 1-2-Pay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_1-2-Pay` or `Withdrawals_1-2-Pay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **1-2-PAY**. In the **Credentials** section that appears, configure the settings specific to 1-2-Pay: * In the **Sandbox** dropdown, select: * **Yes** — for the sandbox testing environment * **No** — for the production environment * In the **API start base URL** field, specify the base URL for creating payment requests, provided by 1-2-Pay. * In the **API sync base URL** field, specify the base URL used by B2CORE to receive and validate callbacks, also provided by 1-2-Pay. ### Key points about URLs [#key-points-about-urls] * The **API start base URL** and **API sync base URL** are different endpoints and must be requested directly from 1-2-Pay. * Make sure to always use HTTPS, for example: * API start base URL: `https://api.example.com/` * API sync base URL: `https://inquiry.example.com/` * 1-2-Pay provides specific URLs for each environment. The URLs for sandbox differ from those for production, so be sure to request both sets and use the appropriate ones for your configuration. * In the **Channel** field, enter the channel assigned to your integration by 1-2-Pay. * In the **Partner code** field, enter the partner code assigned to your company by 1-2-Pay. * In the **Auth key** field, enter the API key for signing requests, provided by 1-2-Pay. Click **Save** to create the connection. The **1-2-Pay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via 1-2-Pay, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through 1-2-Pay [#add-a-deposit-method-through-1-2-pay] To add and set up a method for making deposits through 1-2-Pay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through 1-2-Pay will be available to accounts denominated in the selected currencies. For these currencies, conversion rates for `THB` must be configured. * In the **Driver** dropdown, select **1-2-PAY**. * In the **Connection** dropdown, select the previously configured [1-2-Pay connection](#configure-connections-to-1-2-pay). Skip the **Configuration** section as no settings are required for the 1-2-Pay deposit method. Click **Save** to create the deposit method. The **1-2-Pay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-12pay` to display the [predefined icon](../../integrations/payment-systems) for the 1-2-Pay deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `THB`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). 1-2-Pay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **1-2-Pay** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through 1-2-Pay [#add-a-withdrawal-method-through-1-2-pay] To add and set up a method for making withdrawals through 1-2-Pay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through 1-2-Pay will be available from accounts denominated in the selected currencies. For these currencies, conversion rates for `THB` must be configured. * In the **Driver** dropdown, select **1-2-PAY**. * In the **Connection** dropdown, select the previously configured [1-2-Pay connection for withdrawals](#configure-connections-to-1-2-pay). Skip the **Configuration** section as no settings are required for the 1-2-Pay withdrawal method. Click **Save** to create the withdrawal method. The **1-2-Pay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-12pay` to display the [predefined icon](../../integrations/payment-systems) for the 1-2-Pay withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `THB`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). 1-2-Pay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **1-2-Pay** withdrawal method is now configured in the B2CORE Back Office. ## Set up webhooks in 1-2-Pay [#set-up-webhooks-in-1-2-pay] To receive status updates for deposits and withdrawals in B2CORE, notification webhooks must be set up on the side of 1-2-Pay. ### Copy webhook URLs from the B2CORE Back Office [#copy-webhook-urls-from-the-b2core-back-office] You will need separate webhook URLs for both deposit and withdrawal methods. In the B2CORE Back Office, navigate to: * **System** > **Deposit system** > **Deposit methods** * **System** > **Payout system** > **Payout methods** Find the configured 1-2-Pay deposit or withdrawal method and click **Edit** to open its details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Provide URLs to 1-2-Pay [#provide-urls-to-1-2-pay] Send the copied webhook URLs (for both deposits and withdrawals) to the 1-2-Pay support for configuration on their side. [B2BINPAY](https://b2binpay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits with [static payment details](#deposits-with-static-payment-details-via-b2binpay) and withdrawals. The **Travel Rule** isn't currently supported for this integration because the corresponding driver for connecting to B2BIТPAY doesn't yet support **Travel Rule** requirements. Follow the instructions below to configure the B2BINPAY connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to B2BINPAY. Before proceeding with the instructions, you must have signed up for B2BINPAY and have an active wallet. ## Supported currencies [#supported-currencies] For the list of supported currencies for deposits and withdrawals via B2BINPAY, refer to [Currency codes](https://docs.b2binpay.com/references/currency-codes) in the B2BINPAY documentation. ## Configure connections to B2BINPAY [#configure-connections-to-b2binpay] If you plan to use B2BINPAY for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to B2BINPAY: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_B2BINPAY` or `Withdrawals_B2BINPAY`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemStaticDeposit** — to add a connection that will be used for a deposit method that supports **static payment details**. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **B2BINPAY V3**. In the **Credentials** section that appears, configure the B2BINPAY-specific settings: * In **API base URL** field, specify the base URL provided by B2BINPAY for your integration environment. * In the **Client ID** field, enter your client identifier provided by B2BINPAY. * In the **Client secret** field, enter the secret key associated with your client ID. * In the **Callback secret** field, enter the key used to verify callback notifications from B2BINPAY. For more details, refer to [How to access the API](https://docs.b2binpay.com/how-tos/manage-your-profile-and-system/how-to-access-api) in the B2BINPAY documentation. Click **Save** to create the connection. The B2BINPAY connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via B2BINPAY, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through B2BINPAY [#add-a-deposit-method-through-b2binpay] To add and set up a deposit method through B2BINPAY that supports **static payment details**: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemStaticDeposit**. After selecting **PaymentSystemStaticDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. The method will be available for depositing funds to client wallets in B2CORE, which are denominated in the currencies added on this tab. * In the **Driver** dropdown, select **B2BINPAY V3**. * In the **Connection** dropdown, select the previously configured [B2BINPAY connection for deposits](#configure-connections-to-b2binpay). After selecting the connection, the **Configuration** form appears. You may see the message `Configuration form is temporarily unavailable.` Wait a short while for the form to become available. In the **Configuration** section, fill in the following fields: * In the **Wallet** dropdown, select your B2BINPAY wallet that will be used for processing transactions. For each wallet in the list, the identifier assigned by B2BINPAY, the wallet type (**Merchant** or **Enterprise**), the wallet currency, and the label (if specified in B2BINPAY) are displayed. For details, refer to [Blockchain selection for Merchant and Enterprise wallets](#blockchain-selection-for-merchant-and-enterprise-wallets). * The **Collect personal data** field displays **No**, which can't be changed as the **Travel rule** isn't currently supported for this B2BINPAY integration. Click **Save** to create the deposit method. The B2BINPAY deposit method will appear in the list of deposit methods. Click **Edit** to open the method details and fill in the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-b2binpay` to display the [predefined icon](../../integrations/payment-systems) for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * In the **Rates provider** dropdown, select B2BINPAY as the preferred rate provider for processing deposits with conversions. To do this, B2BINPAY must first be added as an exchange rate provider under **Currencies** > **Rates** (for details, refer to [How to configure currency exchange rates](../manage-currencies/how-to-configure-currency-exchange-rates)). * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the currencies in which deposits can be processed. These are the currencies supported by the B2BINPAY wallet selected in the **Configuration** section. To enable deposits in a specific currency via this method, make sure that this currency is added on the **PS Currencies** tab. B2BINPAY deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The B2BINPAY deposit method with **static payment details** is now configured in the Back Office and available to clients in the B2CORE UI. ## Add a withdrawal method through B2BINPAY [#add-a-withdrawal-method-through-b2binpay] To add and set up a method for making withdrawals through B2BINPAY: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. The method will be available for withdrawing funds from client wallets in B2CORE, which are denominated in the currencies added on this tab. * In the **Driver** dropdown, select **B2BINPAY V3**. * In the **Connection** dropdown, select the previously configured [B2BINPAY connection for withdrawals](#configure-connections-to-b2binpay). After selecting the connection, the **Configuration** form appears. You may see the message `Configuration form is temporarily unavailable.` Wait a short while for the form to become available. In the **Configuration** section, fill in the following fields: * In the **Wallet** dropdown, select your B2BINPAY wallet that will be used for processing transactions. For each wallet in the list, the identifier assigned by B2BINPAY, the wallet type (**Merchant** or **Enterprise**), the wallet currency, and the label (if specified in B2BINPAY) are displayed. For details, refer to [Blockchain selection for Merchant and Enterprise wallets](#blockchain-selection-for-merchant-and-enterprise-wallets). * In the **Blockchain fee level** dropdown, select **Low**, **Medium**, or **High**. * In the **Force blockchain** dropdown (applicable for **Merchant** wallets only), select: * **Yes** — to use only [on-chain transactions](https://docs.b2binpay.com/references/key-terms?q=fee+level#on-chain-transaction). * **No** — to allow [off-chain transactions](https://docs.b2binpay.com/references/key-terms#off-chain-transaction) when possible. All transactions involving **Enterprise** wallets are always processed on the blockchain. * The **Collect personal data** field displays **No**, which can't be changed as the **Travel rule** isn't currently supported for this B2BINPAY integration. Click **Save** to create the withdrawal method. The B2BINPAY withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-b2binpay` to display the [predefined icon](../../integrations/payment-systems) for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * In the **Rates provider** dropdown, select B2BINPAY as the preferred rate provider for processing withdrawals with conversions. To do this, B2BINPAY must first be added as an exchange rate provider under **Currencies** > **Rates** (for details, refer to [How to configure currency exchange rates](../manage-currencies/how-to-configure-currency-exchange-rates)). * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the currencies in which withdrawals can be processed. These are the currencies supported by the B2BINPAY wallet selected in the **Configuration** section. To enable withdrawals in a specific currency via this method, make sure that this currency is added on the **PS Currencies** tab. B2BINPAY withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **B2BINPAY** withdrawal method is now configured in the B2CORE Back Office. ## Blockchain selection for Merchant and Enterprise wallets [#blockchain-selection-for-merchant-and-enterprise-wallets] In the **Configuration** section of a deposit or withdrawal method, you must select the wallet that will be used for processing transactions. The wallet type determines how the blockchain for processing transactions is defined. * When using **Merchant** wallets, clients can select a blockchain for processing their transactions, depending on the chosen deposit or withdrawal currency. For example, if the deposit currency is USDT, available blockchain options such as **Ethereum** (ETH), **Tron** (TRX), or **BNB Smart Chain** (BSC) may appear, depending on your **Merchant** wallet configuration in B2BINPAY. * When using **Enterprise** wallets, the blockchain on which transactions are processed is predefined by the wallet currency. For example, if your **Enterprise** wallet holds **USDT on Ethereum** (ETH), deposits will always be processed on the **Ethereum** (ETH) blockchain. ## Deposits with static payment details via B2BINPAY [#deposits-with-static-payment-details-via-b2binpay] Deposits with static payment details via B2BINPAY allow clients to generate one or more blockchain-specific deposit addresses in the B2CORE UI. These addresses are saved for future use and can be reused for subsequent deposits. The example below shows how the payment form appears in the B2CORE UI for the B2BINPAY deposit method with **static payment details**. On the form, a client can generate payment details for making deposits in USDT on either the **Ethereum** (ETH) or **Tron** (TRX) blockchain. The generated address are saved and can be reused for future deposits. These addresses can be copied and used without the need to open the **Deposit** page in the B2CORE UI. B2BINPAY deposit method with static payment details Follow the instructions below to configure a connection and set up deposit and withdrawal methods through [B2BINPAY](https://b2binpay.com/) in the B2CORE Back Office. This instruction describes the **non-PSS** B2BINPAY integration that includes support for the **Travel Rule**. ## B2BINPAY integration with Notabene [#b2binpay-integration-with-notabene] B2BINPAY is integrated with **Notabene** to ensure compliance with the **Travel Rule**, which requires collecting client data for crypto transactions, including deposits and withdrawals. **Notabene** evaluates incoming client data for compliance and issues directives to either block or approve crypto transactions. When setting up deposit and withdrawal methods through B2BINPAY in the B2CORE Back Office, you can select whether to collect and transmit client data to B2BINPAY for further forwarding to **Notabene** or disable data collection using the **Collect personal info option** described below. Before proceeding with the instructions, you must have signed up for B2BINPAY and have an active wallet. ## Configure connections to B2BINPAY [#configure-connections-to-b2binpay] The non-PSS B2BINPAY integration allows you to use a single connection to configure both deposit and withdrawal methods. To configure a connection to B2BINPAY: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `B2BINPAY`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **B2BINPAY**. Click **Save** to create the connection. The B2BINPAY connection will appear in the list of external connections. Click **Edit** to open the connection details and fill in the following fields: * In **Service location** field, enter the URL of the B2BINPAY API. * In the **Login** and **Password** fields, enter your API credentials generated in B2BINPAY. For more details, refer to [How to access the API](https://docs.b2binpay.com/how-tos/manage-your-profile-and-system/how-to-access-api) in the B2BINPAY documentation. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), enable it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. Once the connection is configured, you can use it to create and set up deposit and withdrawal methods via B2BINPAY. ## Add a deposit method through B2BINPAY [#add-a-deposit-method-through-b2binpay] To add and set up a deposit method through B2BINPAY: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `B2BINPAY_Deposits`). * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **B2BINPAY**. * In the displayed **Currency** dropdown, select a currency for the method. After creating the method, you can add multiple currencies to it on the **TR Currencies** tab. * In the **Connection** dropdown, select the previously configured [B2BINPAY connection](#configure-connections-to-b2binpay). Click **Save** to create the method. The B2BINPAY method will appear in the list of methods. Click **Edit** to open the method details and fill in the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-b2binpay` to display the [predefined icon](../../integrations/payment-systems) for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * In the **Rates provider** dropdown, select B2BINPAY as the preferred rate provider for processing deposits with conversions. To do this, B2BINPAY must first be added as an exchange rate provider under **Currencies** > **Rates** (for details, refer to [How to configure currency exchange rates](../manage-currencies/how-to-configure-currency-exchange-rates)). In the **Provider settings** section, configure the following B2BINPAY-specific settings: * In the **Wallet ID** dropdown, select your B2BINPAY wallet that will be used for processing transactions. * In the **Payment page** dropdown, select **Local**. * The **Local URL** field displays the payment page URL, such as: `https://{your-Front-Office-URL}/`\ `conversion/payment/qrcode/{address}/{currency}/{message}` * In the **Client type** dropdown, select **Enterprise** or **Merchant**, depending on your wallet type. * In the **Collect personal info** dropdown, select: * **No** — to disable the collection of client personal data. * **Yes** — to enable the collection of client personal data, which is sent to B2BINPAY and then forwarded to **Notabene** for verifying crypto transactions. On the **TR Currencies** tab, check the added currency and add more if needed. The deposit method will be available for funding client wallets in B2CORE, which are denominated in the currencies added on this tab. On the **PS Currencies** tab, add the currencies in which deposits can be processed. These are the currencies supported by B2BINPAY. For details, refer to [Currency codes](https://docs.b2binpay.com/references/currency-codes) in the B2BINPAY documentation. To enable deposits in a specific currency via this method, make sure that this currency added on the **PS Currencies** tab. For details, refer to [Add currencies on the PS Currencies tab](#add-currencies-on-the-ps-currencies-tab). Click the **Test connection** button to validate the connection settings. The green button indicates that the connection has been configured properly. The red button indicates that some connection settings aren’t valid. The errors displayed below the button specify the connection issues that need to be addressed. Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. The B2BINPAY deposit method is now configured in the Back Office and available to clients in the B2CORE UI. ## Add a withdrawal method through B2BINPAY [#add-a-withdrawal-method-through-b2binpay] To add and set up a withdrawal method through B2BINPAY: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `B2BINPAY_Withdrawals`). * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **B2BINPAY**. * In the displayed **Currency** dropdown, select a currency for the method. After creating the method, you can add multiple currencies to it on the **TR Currencies** tab. * In the **Connection** field, select the previously configured [B2BINPAY connection](#configure-connections-to-b2binpay). Click **Save** to create the method. The B2BINPAY method will appear in the list of methods. Click **Edit** to open the method details and fill in the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-b2binpay` to display the [predefined icon](../../integrations/payment-systems) for the method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * In the **Rates provider** dropdown, select B2BINPAY as the preferred rate provider for processing withdrawals with conversions. To do this, B2BINPAY must first be added as an exchange rate provider under **Currencies** > **Rates** (for details, refer to [How to configure currency exchange rates](../manage-currencies/how-to-configure-currency-exchange-rates)). In the **Provider settings** section, configure the following B2BINPAY-specific settings: * In the **Fee level** dropdown, select **Low**, **Medium**, or **High**. * In the **Wallet ID** dropdown, select your B2BINPAY wallet that will be used for processing transactions. * In the **WithdrawDone Notification** dropdown, select **No**. * In the **Client type** dropdown, select **Enterprise** or **Merchant**, depending on your wallet type. * In the **Destination tag** dropdown, select: * **Yes** — if a destination tag is required for making withdrawals. * **No** — if a destination tag isn't required for withdrawals. This depends on the blockchain on which withdrawals will be processed. * In the **Tag type** dropdown, select the type of the destination tag, either **Numeric** or **String**. Select **Not set** if you set the **Destination tag** dropdown to **No**. * In the **Off-chain transactions** dropdown, select: * **Enabled** — to allow [off-chain transactions](https://docs.b2binpay.com/references/key-terms#off-chain-transaction) when possible. * **Disabled** — to use only [on-chain transactions](https://docs.b2binpay.com/references/key-terms?q=fee+level#on-chain-transaction). * In the **Collect personal info** dropdown, select: * **No** — to disable the collection of client personal data. * **Yes** — to enable the collection of client personal data, which is sent to B2BINPAY and then forwarded to **Notabene** for verifying crypto transactions. On the **TR Currencies** tab, check the added currency and add more if needed. The method will be available for withdrawing funds from client wallets in B2CORE, which are denominated in the currencies added on this tab. On the **PS Currencies** tab, add the currencies in which withdrawals can be processed. These are the currencies supported by B2BINPAY. For details, refer to [Currency codes](https://docs.b2binpay.com/references/currency-codes) in the B2BINPAY documentation. To enable withdrawals in a specific currency via this method, make sure that this currency is added on the **PS Currencies** tab. For details, refer to [Add currencies on the PS Currencies tab](#add-currencies-on-the-ps-currencies-tab). Click the **Test connection** button to validate the connection settings. The green button indicates that the connection has been configured properly. The red button indicates that some connection settings aren’t valid. The errors displayed below the button specify the connection issues that need to be addressed. Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. The B2BINPAY withdrawal method is now configured in the Back Office and available to clients in the B2CORE UI. ## Add currencies on the PS Currencies tab [#add-currencies-on-the-ps-currencies-tab] To add a currency: Click **+Add** and select the currency in the dropdown. For the selected currency, specify the following parameters: * **Block explorer** — the URL template of the blockchain explorer used to track transactions. * **Blockchain code** — the numeric identifier of the blockchain used for processing transactions. This ensures the deposit is processed on the correct network. These codes must be taken from the B2BINPAY documentation: [Currency codes](https://docs.b2binpay.com/references/currency-codes) and [Block explorer list](https://docs.b2binpay.com/references/block-explorer-list). ### Example [#example] For example, `USDT` deposits can be processed on different blockchains, depending on the token standard: For **Tron (TRC20)**, specify: * **Block explorer**: —`https://tronscan.org/#/transaction/{address}` * **Blockchain code** — 2145 For **Ethereum (ERC20)**, specify: * **Block explorer**: —`https://etherscan.io/tx/{address}` * **Blockchain code** — 2015 For **Binance Smart Chain (BSC/BEP20)**, specify: * **Block explorer**: — `https://bscscan.com/tx/{address}` * **Blockchain code** — 2065 In the **Min** and **Max** fields, specify the minimum and maximum transaction amounts. Add a currency on the PS Currencies tab Click **Save** to add the currency on the tab. Add as many currencies as needed for your deposit and withdrawal methods. [BridgerPay](https://bridgerpay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits only. Follow the instructions below to configure the BridgerPay connection and set up the deposit method in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to BridgerPay. Before proceeding with the instructions, you must have signed up for BridgerPay and have an active account. ## Create a payment link in your BridgerPay account [#create-a-payment-link-in-your-bridgerpay-account] To create a payment link in BridgerPay, you need to create a checkout of the payment link type: Sign in to your BridgerPay account. In the main menu, navigate to **Checkouts**. Click the **plus** icon to add a new checkout, and then fill in the following fields: * In the **Title** field, enter a title for the checkout. * In the **Type** dropdown, select **Payment link**. Create a payment link in BridgerPay Click **Create**. After the checkout of the payment link type is successfully created, the required credentials for configuring the deposit method in the B2CORE Back Office will become available. ## Configure a connection to BridgerPay [#configure-a-connection-to-bridgerpay] To configure a connection to BridgerPay for making deposits: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_BridgerPay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **PaymentSystemDeposit**. In the **Driver** dropdown that appears, select **BridgerPay**. In the **Credentials** section that appears, configure the BridgerPay-specific settings: * In the **API base URL** field, specify `https://api.bridgerpay.com`. * In the **API user name** and **API password** fields, enter your credentials for accessing the BridgerPay API. * In the **API key** field, enter the API key generated in your BridgerPay account. Click **Save** to create the connection. The **BridgerPay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. ## Add a deposit method through BridgerPay [#add-a-deposit-method-through-bridgerpay] To add and set up a method for making deposits through BridgerPay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through BridgerPay will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **BridgerPay**. * In the **Connection** dropdown, select the previously configured [BridgerPay connection](#configure-a-connection-to-bridgerpay). In the **Configuration** section that appears, complete the following setting: * In the **Cashier key** field, specify the unique identifier provided by BridgerPay. Create the BridgerPay deposit method Click **Save** to create the deposit method. The **BridgerPay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-bridgerpay` to display the [predefined icon](../../integrations/payment-systems) for the BridgerPay deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab. To enable the method to process deposits in a specific currency, ensure it is added on this tab (for the tab description, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). BridgerPay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test is performed based on the settings specified in the method form and the data provided in the selected external connection. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **BridgerPay** deposit method is now configured in the B2CORE Back Office. ## Set up webhooks in your BridgerPay account [#set-up-webhooks-in-your-bridgerpay-account] To receive status updates for initiated deposits in B2CORE, you need to set up notification webhooks for PSPs in BridgerPay. ### Copy the webhook URL from the B2CORE Back Office [#copy-the-webhook-url-from-the-b2core-back-office] In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Find the configured **BridgerPay** deposit method and click **Edit** to enter the method details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. BridgerPay deposit method — Webhooks tab ### Add the webhook URL to PSPs in BridgerPay [#add-the-webhook-url-to-psps-in-bridgerpay] Sign in to your BridgerPay account. In the main menu, navigate to **Checkouts**. Select the added PSP and click it to open its details. In the details, click **Settings**. PSP Settings in BridgerPay Go to the **URLs** tab. Paste the webhook URL copied from the B2CORE Back Office into the **Webhook Notification URL** field. Add the webhook URL to a PSP in BridgerPay Save your changes. Repeat these steps for each PSP added and configured in your BridgerPay account. ## Specify redirect URLs for PSPs in BridgerPay [#specify-redirect-urls-for-psps-in-bridgerpay] To ensure proper redirection after a deposit is completed, failed, or canceled, set up the corresponding redirect URLs for PSPs in BridgerPay. To st up redirect URLs: In your BridgerPay account, navigate to **Checkouts** in the main menu. Select the added PSP and click it to open its details. In the details, click **Settings**. Go to the **URLs** tab. Specify the following URLs: * In the **Success Redirect URL**, specify `https://{your-Front-Office-URL}/en/payment/success`. * In the **Failure Redirect URL** and **Cancel Redirect URL** fields, specify `https://{your-Front-Office-URL}/en/payment/failed`. Make sure to replace `{your-Front-Office-URL}` with the domain of your B2CORE UI. Add redirect URLs for a PSP in BridgerPay Save your changes. Repeat these steps for each PSP added and configured in your BridgerPay account. ## Enable the 'Notify with original amount' option for PSPs in BridgerPay [#enable-the-notify-with-original-amount-option-for-psps-in-bridgerpay] The **Notify with original amount** option for PSPs in BridgerPay ensures that payment notifications include the original deposit amounts, without any modifications or additional charges. To enable this option: In your BridgerPay account, navigate to **Checkouts** in the main menu. Select the added PSP and click it to open its details. In the details, click **Settings**. In the section named **PSP Specific Settings**, enable the **Notify with original amount** option. Save your changes. Repeat these steps for each PSP added and configured in your BridgerPay account. The **BridgerPay** deposit method is now fully configured and available for clients to use when making deposits in the B2CORE UI. The **Canonical** driver lets you connect a payment service provider (PSP) of your choice to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), even when B2CORE does not yet offer a dedicated driver for that provider. ## Why use the Canonical driver [#why-use-the-canonical-driver] Most payment systems in B2CORE rely on a dedicated driver built specifically for one provider. The Canonical driver takes a different approach: it defines a single, standard API contract — the Canonical Deposit API — that any provider can implement. B2CORE then handles authentication, the deposit start flow, polling, webhooks, and the status lifecycle in a uniform way, regardless of which provider sits behind the contract. The Canonical driver is useful when you want to: * Connect a preferred or in-house PSP that has no dedicated B2CORE driver, without waiting for custom development. * Reduce time to market by having your provider implement one documented, stable contract instead of a bespoke integration. * Keep full control of the provider side, while B2CORE manages the deposit workflow on its side. The Canonical driver currently supports deposit flows. To offer deposits through your provider, the provider must implement the Canonical Deposit API described in the [OpenAPI specification](#openapi-specification) below and follow the behavioral requirements on this page. ## OpenAPI specification [#openapi-specification] The Canonical Deposit API is defined in the following OpenAPI specification, which covers authentication, request and response schemas, endpoints, and status codes. Download it to review the full contract that your provider must implement: The rest of this page describes the behavioral requirements, B2CORE-side configuration, and design decisions that the specification cannot express. Read both together for a complete picture of the integration. ## B2CORE driver credentials [#b2core-driver-credentials] These fields are configured **on the B2CORE side** (Back Office) and used to authenticate with the PSP API. See the [OpenAPI specification](#openapi-specification) for full JWT token generation and verification details. | Field | Description | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | | API base URL | HTTPS base URL of the PSP API. | | App ID | Unique merchant identifier. Used as the `sub` claim in the JWT. | | App secret | Secret key for HMAC-SHA256 signing. Base64 URL-encoded, 32 bytes (43 characters). Never sent in requests — used only to sign tokens. | ## B2CORE driver configuration fields [#b2core-driver-configuration-fields] These fields are configured **on the B2CORE side** (Back Office) and control driver behavior. They are not part of the PSP-facing API. ### Global parameters (`globalParam1`, `globalParam2`, `globalParam3`) [#global-parameters-globalparam1-globalparam2-globalparam3] Three configuration-level string fields sent with **every authenticated request** to the PSP. * For `POST` endpoints, they are included in the JSON request body. * For `GET` endpoints, they are included as query parameters. These represent PSP-specific values such as merchant ID, channel, or project ID. The exact semantics depend on the PSP implementation. The B2CORE admin fills them in during configuration setup. ### Required fields (read-only) [#required-fields-read-only] **Type:** Multi-select Selects which user info fields are displayed in the payment form as **read-only** (non-editable). Selected fields **must** already be configured and saved in the user's B2CORE profile. If any selected field is missing from the profile, the payment form generation fails with a missing fields error — the user cannot proceed until the data is filled in their B2CORE profile. The selected fields, along with the fields from Required fields (editable), determine which user data is meaningfully populated in the `startDepositUserInfo` object sent to the PSP in the `POST /api/v1/deposits` request. Fields not selected in either list are hidden in the form and may be sent as empty values. ### Required fields (editable) [#required-fields-editable] **Type:** Multi-select Selects which user info fields are displayed in the payment form as **editable**. The user can fill in or modify these fields directly in the payment form. Unlike Required fields (read-only), there is no requirement for these fields to be pre-configured in the user's B2CORE profile. **Priority rule:** If a field is selected in both Required fields (read-only) and Required fields (editable), it is displayed as **read-only**. The read-only setting always takes priority. **Email behavior:** Email is always displayed in the payment form and always sent in the `startDepositUserInfo`, regardless of whether it is selected in either list. The configuration only controls how it is displayed: | Email selected in | Behavior | | --------------------------- | ---------------------------------------------------------- | | Neither list | Displayed as an editable field | | Required fields (editable) | Displayed as an editable field | | Required fields (read-only) | Displayed as a read-only field (value from B2CORE profile) | | Both lists | Displayed as a read-only field (read-only takes priority) | ### Default sync deadline [#default-sync-deadline] **Type:** Select\ **Default:** `4h` Maximum duration after deposit creation during which B2CORE polls for the deposit status. After this deadline: * `StatusSyncInProgress` → the deposit is moved to `unexpected`. * `StatusSyncUnexpected` → the deposit is moved to `unexpected`. The `unexpected` status requires manual admin investigation via the LifecycleService. ### Safe to fail at start [#safe-to-fail-at-start] **Type:** Boolean (currently hardcoded to `yes`, no choice) Determines whether it is safe to mark a deposit as `failed` (terminal) when the start request encounters an unexpected error. * `yes` — if the PSP returns an error during deposit start, and B2CORE is confident the deposit was not created on the PSP side (for example, B2CORE never received a redirect URL), the deposit can safely be moved to `failed`. The client has not lost any money. * `no` — even on error, the deposit is moved to `in_progress` with an unverified external ID and polled, because the PSP might have created the deposit despite the error. **Currently, always `yes`.** The typical case: without a redirect URL, the client cannot complete the PSP payment page, so the deposit cannot succeed. ### Wait for webhook before polling [#wait-for-webhook-before-polling] **Type:** Boolean (currently hardcoded to `yes`, no choice) Controls whether B2CORE waits for a webhook notification before it starts polling `GET /api/v1/deposits/{externalID}`. | Value | Behavior | | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `yes` | After deposit start, B2CORE waits **up to 5 minutes** for a webhook before it begins to poll. If no webhook arrives within 5 minutes, B2CORE proceeds to standard polling. | | `no` | B2CORE begins polling immediately according to the standard backoff schedule. | **Rationale:** Many PSPs send a webhook notification quickly when the deposit status changes. Waiting for the webhook before polling reduces the number of unnecessary API calls, which helps stay within rate limits. The 5-minute timeout ensures progress even if the webhook is delayed or lost. ## Test configuration flow [#test-configuration-flow] When an admin clicks **Test Configuration** in B2CORE: ``` 1. B2CORE generates a one-time JWT signed with appSecret 2. B2CORE → POST /api/v1/configuration/test (with Bearer JWT + globalParams) 3. If response status = "available" → test result: "available" 4. If response status = "failed" → test result: "failed" (with error from PSP) 5. If unexpected error (5xx, timeout, and similar) → test result: "unexpected" ``` The test configuration method is the only method where any credential issue is expected to return not `401 Unauthorized`, but `200 OK` with a response body. The `code` and `description` are shown to the B2CORE administrator, so return clean, non-sensitive data. ## Webhook system design [#webhook-system-design] ### Two webhook channels [#two-webhook-channels] B2CORE supports **two webhook channels** per deposit: | Channel | Registration | Description | | ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | **Automatic** | Via `notificationURL` in the `POST /api/v1/deposits` request | Always active. B2CORE generates the URL and passes it to the PSP. | | **Admin-configurable** | Set by the admin in the B2CORE Back Office | Optional. The admin can configure a separate webhook URL that the PSP sends notifications to (for example, registered in the PSP's admin panel). | Both channels feed into the same B2CORE webhook handler → `driver_transit` store → poller optimization pipeline. ### Webhook as polling optimization [#webhook-as-polling-optimization] The webhook is **not** the source of truth. It is an **optimization** that reduces unnecessary polling requests. ``` PSP → B2CORE webhook handler → driver_transit (key-value store) → poller ``` How it works: 1. When a webhook arrives, B2CORE stores a flag in `driver_transit` keyed by `externalID`. 2. The poller checks `driver_transit` before it makes an API call: * If a webhook flag exists for the `externalID`, B2CORE immediately calls `GET /api/v1/deposits/{externalID}`. * If no flag exists and less than 5 minutes have passed, B2CORE waits (see [Wait for webhook before polling](#wait-for-webhook-before-polling)). * If no flag exists and more than 5 minutes have passed, B2CORE proceeds with standard polling. 3. When the deposit reaches a terminal status (success or failed), the `driver_transit` entry is deleted. ### Webhook payload [#webhook-payload] The webhook payload is minimal (see the webhook callback under `POST /api/v1/deposits` in the [OpenAPI specification](#openapi-specification)): ```json { "externalID": "550e8400-e29b-41d4-a716-446655440000", "status": "success" } ``` The payload contains the following fields: * `externalID` — matches the UUID from the `POST /api/v1/deposits` request. * `status` — one of `"success"`, `"failed"`, or `"unprocessable"`. The webhook should be sent only when the deposit transitions to a **terminal status**. ## Deposit start flow [#deposit-start-flow] ### Start request [#start-request] B2CORE initiates a deposit by calling `POST /api/v1/deposits`. The request includes a `returnURL` field — a B2CORE frontend page URL to redirect the user back to after PSP page interaction. This is **not a webhook** — it is a browser redirect only. For all other details, see the [OpenAPI specification](#openapi-specification). ### Start result mapping [#start-result-mapping] The PSP response maps to a B2CORE action as follows: | PSP response | B2CORE action | | ----------------------------------------------------------------- | --------------------- | | PSP returns a redirect URL | Move to `in_progress` | | 2xx with a specification violation (for example, no redirect URL) | Move to `failed` | | HTTP 4xx / 5xx / timeout / network error | Move to `failed` | All failure scenarios result in `failed` (not `unexpected`) because Safe to fail at start is `yes` (see [Safe to fail at start](#safe-to-fail-at-start)): without a valid redirect URL, the end user cannot interact with the PSP payment page, so no money can be lost. ### Redirect flow [#redirect-flow] On a successful start, B2CORE receives a redirect URL and sends the end user to the PSP payment page: * The `returnURL` takes the user back to a B2CORE frontend page that indicates the deposit is being processed. * After start, B2CORE begins the polling and webhook flow (see [Polling and status sync](#polling-and-status-sync)). * Currently, `"redirect"` is the only supported action type. ## Polling and status sync [#polling-and-status-sync] ### Polling backoff schedule [#polling-backoff-schedule] B2CORE uses **progressive backoff** to poll `GET /api/v1/deposits/{externalID}`: | Time since deposit start | Poll interval | | ------------------------ | ---------------- | | 0–15 minutes | Every 1 minute | | 15–60 minutes | Every 3 minutes | | 1–3 hours | Every 5 minutes | | 3–5 hours | Every 10 minutes | | 5+ hours | Every 15 minutes | ### Deadline handling [#deadline-handling] Default deadline: **4 hours** after deposit creation (configurable, see [Default sync deadline](#default-sync-deadline)). When the deadline is exceeded, intermediate statuses are resolved as follows: | Last poll result | B2CORE action | | -------------------------------------------- | -------------------- | | `inProgress` | Move to `unexpected` | | Network error, 5xx, parse error, and similar | Move to `unexpected` | The `unexpected` status stops automatic polling and requires manual admin action via B2CORE's LifecycleService. ### Webhook wait logic [#webhook-wait-logic] When Wait for webhook before polling is `yes` (current default, see [Wait for webhook before polling](#wait-for-webhook-before-polling)): ### Polling result mapping [#polling-result-mapping] Each poll result from `GET /api/v1/deposits/{externalID}` maps to a B2CORE internal action: | PSP response status | B2CORE action | | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `"inProgress"` + deadline not exceeded | Continue polling (retry) | | `"inProgress"` + deadline exceeded | Move to `unexpected` | | `"success"` | Move to `success`, stop polling. Save `finalAmount` and `finalCurrencyCode` | | `"failed"` | Move to `failed`, stop polling. Save `reason` | | `"unprocessable"` | Move to `unexpected`, stop polling. Save `reason`. Requires admin investigation | | HTTP 5xx / timeout / parse error | Treat as an `unexpected` poll attempt. Continue polling if the deadline is not exceeded | | HTTP 404 with `X-Safe-To-Fail-After-Seconds` | Continue polling. After the indicated time plus a safety margin (5 minutes), if still 404, move to `failed` with reason "deposit redirect URL is expired" | | HTTP 404 without the header | Continue polling. Wait for the deposit to appear on the PSP side or the sync deadline to be exceeded | ## Deposit status lifecycle [#deposit-status-lifecycle] This section describes B2CORE deposit statuses. For the mapping of PSP response statuses to B2CORE statuses, see [Start result mapping](#start-result-mapping) and [Polling result mapping](#polling-result-mapping). ### Full status diagram [#full-status-diagram] ### Recovery from the `unexpected` status [#recovery-from-the-unexpected-status] An admin can perform these manual transitions via the LifecycleService: | Transition | When to use | | ---------------------------- | -------------------------------------------------------------------------------- | | `unexpected` → `in_progress` | Retry polling (for example, after a PSP outage is resolved) | | `unexpected` → `success` | Only if the last poll attempt was `unprocessable` and the admin confirms success | | `unexpected` → `failed` | The admin confirms the deposit failed | ### Deposit status definitions [#deposit-status-definitions] The following table defines each B2CORE deposit status: | Status | Business meaning | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `in_progress` | The deposit is being processed. Covers all intermediate states: pending bank transfer, 3DS verification in progress, awaiting manual review on the PSP side, the client interacting with the PSP payment page, and similar. This is a non-terminal status — B2CORE continues polling. | | `success` | The broker has received the client's money. The PSP has confirmed the funds were credited. The `finalAmount` and `finalCurrencyCode` fields reflect the actual amount and currency received, which may differ from the initial request due to fees or conversion. | | `failed` | The deposit did not go through. The client did **not** lose any money, and the broker did **not** receive any funds. Examples: card declined, bank transfer rejected, user canceled on the PSP page, or redirect link expired. | | `unexpected` | The deposit could not be resolved automatically and requires manual admin action via B2CORE (see [Recovery from the `unexpected` status](#recovery-from-the-unexpected-status)); automatic polling has stopped. Entered on a deadline timeout while `in_progress`, or when the PSP reports `unprocessable`. | ### Deposit creation timing [#deposit-creation-timing] PSPs follow one of two patterns for deposit creation: | Pattern | Behavior | Polling impact | | ---------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- | | **Immediate creation** | The PSP creates the deposit record on `POST /api/v1/deposits`. | `GET /api/v1/deposits/{externalID}` returns a result immediately after start. | | **Deferred creation** | The PSP creates the deposit record only after the end user completes the PSP payment page. | `GET /api/v1/deposits/{externalID}` returns `404 Not Found` until the user completes the page. | For deferred creation, the PSP **should** return the `X-Safe-To-Fail-After-Seconds` header with the 404 response. This header tells B2CORE how long the redirect link is valid. After `redirect_time + header_value + safety_margin`, if the deposit is still 404, B2CORE marks it as `failed` with reason **"deposit redirect URL is expired"**. If the header is absent, B2CORE continues polling until the deposit appears or the sync deadline (default 4 hours) is exceeded, at which point the deposit moves to `unexpected`. ## Behavioral requirements [#behavioral-requirements] ### Distributed tracing [#distributed-tracing] All HTTP requests from B2CORE to the PSP include standard tracing headers per the [W3C Trace Context](https://www.w3.org/TR/trace-context/) specification: * `traceparent` — contains the trace ID, parent span ID, and trace flags. * `tracestate` — vendor-specific trace data. PSP implementations should propagate these headers to their downstream services for end-to-end observability. ### PSP payment page currency lock [#psp-payment-page-currency-lock] When the start deposit response includes a redirect to a PSP payment page: * The PSP page **must not** allow the end user to change the `currencyCode` to any analog, equivalent, or alternative currency. * The currency shown on the PSP page must match exactly what was sent in the start deposit request. * If the PSP page allows currency selection, the currency must be pre-selected and locked. ### IP whitelisting recommendation [#ip-whitelisting-recommendation] While not required by the API specification, PSP implementations are **strongly recommended** to configure IP whitelisting on their side. This provides an additional layer of security beyond JWT authentication, limiting API access to known B2CORE IP addresses. To make the Canonical driver available in your environment, please reach out to your account manager. Kindly specify how exactly and for what purposes you plan to use the Canonical driver so we can arrange access accordingly. [ChipPay](https://www.chippay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. ChipPay processes payments in `CNY`, which serves as its settlement currency, while the B2CORE PPS sends and receives amounts to and from ChipPay in `USDT`. For this reason, `USDT` must be added as a PS currency in the deposit and withdrawal methods configured in B2CORE. Follow the instructions below to configure the ChipPay connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to ChipPay. Before proceeding with the instructions, you must have signed up for ChipPay and have an active account. If you have any questions, consult the official [ChipPay Help Center](https://chippayhelp.zendesk.com/hc/en-gb) or contact their support team. ## Configure connections to ChipPay [#configure-connections-to-chippay] If you plan to use ChipPay for both deposits and withdrawals, you must configure separate connections, each dedicated to a specific deposit or withdrawal method. Each connection must be configured with the appropriate driver to ensure the correct operation of the respective deposit or withdrawal method. To configure a connection to ChipPay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_ChipPay` or `Withdrawals_ChipPay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select: * **ChipPay P2P buying order** — for deposits processed through ChipPay payment orders. Clients can pay using one of the available methods configured in your ChipPay merchant account, such as bank cards, **AliPay**, or **WeChat Pay**, if those options are enabled. * **ChipPay express buying order** — for deposits via bank card payments. * **ChipPay** — for withdrawals via bank card payments. In the **Credentials** section that appears, configure the ChipPay-specific settings: * In the **API base URL** field, specify `https://open-v2.chippay.com/`. * In the **Merchant ID** field, enter your ChipPay Merchant ID. * Generate a pair of 4096-bit RSA *private* and *public* keys using a secure tool, such as **OpenSSL** or another trusted method. For security reasons, it isn't recommended to use online tools to generate the keys. * In the **Private key** field, specify the *private* key, and make sure to specify the corresponding *public* key in your ChipPay account. Click **Save** to create the connection. The **ChipPay** connection for deposits or withdrawals will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need additional ChipPay connections for other payment methods, follow the same instruction to create a new connection with a different driver. The image below displays three configured ChipPay connections: one for the withdrawal method and two for deposit methods. External connections to ChipPay ## Add a deposit method through ChipPay [#add-a-deposit-method-through-chippay] To add and set up a method for making deposits through ChipPay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through ChipPay will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **ChipPay P2P buying order** or **ChipPay express buying order**. * In the **Connection** dropdown, select the previously configured [ChipPay connection for deposits](#configure-connections-to-chippay). If you selected the **ChipPay P2P buying order** driver, skip the **Configuration** section, as no settings are required for this deposit method. If you selected the **ChipPay express buying order** driver, in the **Configuration** section that appears, fill in the following fields: * In the **Exchange rate adjustment** dropdown, select: * **Yes** — to adjust the exchange rate provided by ChipPay when converting deposited funds into `CNY`, which is the settlement currency used by ChipPay for processing payments. * **No** — to use the default rate provided by ChipPay. * If you selected **Yes**, specify the adjustment value (as a percentage) in the **Adjustment value** field. The rate can only be adjusted within a ±3% range. For example, entering `3` increases the exchange rate by 3%, while `-3` decreases it by 3%. The adjusted rate will appear in the details of the ChipPay P2P buying order created to process the deposit. Click **Save** to create the deposit method. The **ChipPay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-chippay` to display the [predefined icon](../../integrations/payment-systems) for the ChipPay deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USDT`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). ChipPay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test is performed based on the settings specified in the method form and the data provided in the selected external connection. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **ChipPay** deposit method is now configured in the B2CORE Back Office. If you want to support both deposit methods offered by ChipPay, add and set up another deposit method that uses a different driver and connection. ## Add a withdrawal method through ChipPay [#add-a-withdrawal-method-through-chippay] To add and set up a method for making withdrawals through ChipPay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through ChipPay will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **ChipPay**. * In the **Connection** dropdown, select the previously configured [ChipPay connection for withdrawals](#configure-connections-to-chippay). Skip the **Configuration** section, as no settings are required for ChipPay withdrawals. Click **Save** to create the withdrawal method. The **ChipPay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-chippay` to display the [predefined icon](../../integrations/payment-systems) for the ChipPay withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USDT`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). ChipPay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test is performed based on the settings specified in the method form and the data provided in the selected external connection. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **ChipPay** withdrawal method is now configured in the B2CORE Back Office. [Jetapay](https://jetapay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and bank account withdrawals. Jetapay processes transactions only in `USD`, with a minimum amount of 10 USD and a maximum of 5,000 USD. Follow the instructions below to configure the Jetapay connection and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Jetapay. Before proceeding with the instructions, you must have signed up for Jetapay and have an active account. ## Configure connections to Jetapay [#configure-connections-to-jetapay] If you plan to use Jetapay for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to Jetapay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Jetapay` or `Withdrawals_Jetapay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **Jetapay**. In the **Credentials** section that appears, configure the Jetapay-specific settings: * In the **API base URL** field, specify `https://api.jetapay.com`. * In the **Token** fields, enter the token generated in your Jetapay account, which will be used to authenticate requests sent to the Jetapay API. Click **Save** to create the connection. The **Jetapay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via Jetapay, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through Jetapay [#add-a-deposit-method-through-jetapay] To add and set up a method for making deposits through Jetapay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select `USD`. * In the **Driver** dropdown, select **Jetapay**. * In the **Connection** dropdown, select the previously configured [Jetapay connection for deposits](#configure-connections-to-jetapay). Skip the **Configuration** section, as no settings are required for the Jetapay deposit method. Click **Save** to create the deposit method. The **Jetapay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the deposit method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USD`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Jetapay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Jetapay** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through Jetapay [#add-a-withdrawal-method-through-jetapay] To add and set up a method for making withdrawals through Jetapay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select `USD`. * In the **Driver** dropdown, select **Jetapay**. * In the **Connection** dropdown, select the previously configured [Jetapay connection for withdrawals](#configure-connections-to-jetapay). Skip the **Configuration** section, as no settings are required for the Jetapay withdrawal method. Click **Save** to create the withdrawal method. The **Jetapay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USD`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Jetapay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Jetapay** withdrawal method is now configured in the B2CORE Back Office. [KoraPay](https://www.korahq.com/payin) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits, withdrawals to bank accounts, and withdrawals to to mobile wallets via mobile money. Follow the instructions below to configure the KoraPay connection and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to KoraPay. Before proceeding with the instructions, you must have signed up for KoraPay and have an active account. You can consult the official [KoraPay documentation](https://developers.korapay.com/) or contact their support in case you have any questions. ## Supported currencies [#supported-currencies] Below is the table listing the currencies supported for deposits and withdrawals via KoraPay: For `XAF` and `XOF` currencies, amounts are rounded down to the nearest multiple of 5, as required by KoraPay. For example, if a client enters 2,573 `XAF`, it will be rounded down to 2,570 for the transaction. ## Configure connections to KoraPay [#configure-connections-to-korapay] If you plan to use KoraPay for both deposits and withdrawals, you must configure separate connections, each dedicated to a specific deposit or withdrawal method. Each connection must be configured with the appropriate driver to ensure the correct operation of the respective deposit or withdrawal method. To configure a connection to KoraPay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_KoraPay` or `Withdrawals_KoraPay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select: * **KoraPay** — for deposits. * **KoraPay bank account** — for withdrawals to bank accounts. * **KoraPay mobile money** — for withdrawals to mobile wallets via mobile money. In the **Credentials** section that appears, configure the KoraPay-specific settings: * In the **API base URL** field, specify `https://api.korapay.com`. * In the **Secret key** field, enter the secret key from your KoraPay account. * In the **Public key** field, enter the public key from your KoraPay account. To find both your secret and public keys, sign in to your KoraPay account, navigate to **Settings**, and open the **API Configuration** tab. API keys in KoraPay Click **Save** to create the connection. The **KoraPay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need additional KoraPay connections for other payment methods, follow the same instruction to create a new connection with a different driver. ## Add a deposit method through KoraPay [#add-a-deposit-method-through-korapay] To add and set up a method for making deposits through KoraPay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies that are supported for deposits, such as `NGN`, `GHS`, `KES`, `XAF`, and `XOF`. Deposits through KoraPay will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **KoraPay**. * In the **Connection** dropdown, select the previously configured [KoraPay connection for deposits](#configure-connections-to-korapay). In the **Configuration** section, set the **Merchant bears cost** option to: * **Yes** — the broker (merchant) pays the transaction fee. * **No** — the trader (client) pays the transaction fee. Click **Save** to create the deposit method. The **KoraPay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-korapay` to display the [predefined icon](../../integrations/payment-systems) for the KoraPay deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process deposits in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). KoraPay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **KoraPay** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through KoraPay [#add-a-withdrawal-method-through-korapay] To add and set up a method for making withdrawals through KoraPay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through KoraPay will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select: * **KoraPay bank account** — for withdrawals to bank accounts. Only withdrawals to Nigerian bank accounts are supported. * **KoraPay mobile money** — for withdrawals to mobile wallets via mobile money. Withdrawals are supported for Kenyan (KES), Ghanaian (GHS), Ivorian (XOF), and Cameroonian (XAF) mobile money accounts. * In the **Connection** dropdown, select the previously configured [KoraPay connection for withdrawals](#configure-connections-to-korapay). In the **Configuration** section, complete the following settings: For the **KoraPay bank account** driver: * In the **Merchant bears cost** dropdown, select: * **Yes** — the broker (merchant) pays the transaction fee. * **No** — the trader (client) pays the transaction fee. For the **KoraPay mobile money** driver: * Configure the **Merchant bears cost** option as described above. * In the **Country** dropdown, select the where this withdrawal method will be available, such as Kenya, Ghana, Côte d’Ivoire, or Cameroon. Click **Save** to create the withdrawal method. The **KoraPay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-korapay` to display the [predefined icon](../../integrations/payment-systems) for the KoraPay withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). KoraPay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **KoraPay** withdrawal method is now configured in the B2CORE Back Office. To add another withdrawal method via KoraPay using a different driver, follow the same instructions and select the other driver. [LuqaPay](https://luqapay.com/) can be connected to B2CORE through PSS, supporting withdrawals via bank transfers in `TRY`. Follow the instructions below to configure the LuqaPay connection and set up the withdrawal method in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to LuqaPay. Before proceeding with the instructions, you must have signed up for LuqaPay and have an active account. ## Configure a connection to LuqaPay [#configure-a-connection-to-luqapay] To configure a connection to LuqaPay for making withdrawals: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Withdrawals_LuqaPay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. In the **Driver** dropdown that appears, select **LuqaPay**. In the **Credentials** section that appears, configure the LuqaPay-specific settings: * In the **API base URL** field, specify: * `https://wallet.luqapay.com` — for the production environment * `https://sandbox-wallet.luqapay.com` — for the sandbox testing environment * In the **API key** field, enter the API key generated in your LuqaPay account. * In the **API secret key** field, enter the API secret generated in your LuqaPay account. Click **Save** to create the connection. The **LuqaPay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. ## Add a withdrawal method through LuqaPay [#add-a-withdrawal-method-through-luqapay] To add and set up a method for making withdrawals through LuqaPay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through LuqaPay will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **LuqaPay**. * In the **Connection** dropdown, select the previously configured [LuqaPay connection](#configure-a-connection-to-luqapay). In the **Configuration** section, select **Türkiye** in the **Country** dropdown. This is the only supported country for this integration. Click **Save** to create the withdrawal method. The **LuqaPay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `TRY`. This is the only currency supported for processing withdrawals with this integration. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). LuqaPay withdrawal method — Settings tab Click **Save** to apply the changes. The **LuqaPay** withdrawal method is now configured in the B2CORE Back Office. ## Set up a webhook in LuqaPay [#set-up-a-webhook-in-luqapay] To receive status updates for withdrawals in B2CORE, a notification webhook must be set up on the side of LuqaPay. ### Copy the webhook URL from the B2CORE Back Office [#copy-the-webhook-url-from-the-b2core-back-office] In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Find the configured **LuqaPay** withdrawal method and click **Edit** to open the method details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Provide the webhook URL to LuqaPay [#provide-the-webhook-url-to-luqapay] Send the copied webhook URL to the LuqaPay support for configuration on their side. [PayPaymentAsia](https://www.paymentasia.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. Follow the instructions below to configure the PaymentAsia connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to PaymentAsia. Before proceeding with the instructions, you must have signed up for PaymentAsia and have an active account. ## Supported currencies [#supported-currencies] Below is the table listing the currencies supported for deposits and withdrawals via PaymentAsia: ## Configure connections to PaymentAsia [#configure-connections-to-paymentasia] If you plan to use PaymentAsia for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to PaymentAsia: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_PaymentAsia` or `Withdrawals_PaymentAsia`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **PaymentAsia**. In the **Credentials** section that appears, configure the PaymentAsia-specific settings: ## For deposits: [#for-deposits] * In the **Payment base URL** field, specify `https://payment.pa-sys.com`. * In the **Gateway base URL** field, specify `https://gateway.pa-sys.com`. * In the **Merchant token** field, enter the token generated in your PaymentAsia account. * In the **Secret code** field, enter the secret code generated in your PaymentAsia account. You can find both the **Merchant token** and **Secret code** in your PaymentAsia account under **Merchants** > **Info**. ## For withdrawals: [#for-withdrawals] Specify the **Gateway base URL**, **Merchant token**, and **Secret code** fields as described above. Click **Save** to create the connection. The **PaymentAsia** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via PaymentAsia, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through PaymentAsia [#add-a-deposit-method-through-paymentasia] To add and set up a method for making deposits through PaymentAsia: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through PaymentAsia will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PaymentAsia**. * In the **Connection** dropdown, select the previously configured [PaymentAsia connection for deposits](#configure-connections-to-paymentasia). Skip the **Configuration** section, as no settings are required for the PaymentAsia deposit method. Click **Save** to create the deposit method. The **PaymentAsia** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-asia` to display the [predefined icon](../../integrations/payment-systems) for the PaymentAsia deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process deposits in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PaymentAsia deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PaymentAsia** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through PaymentAsia [#add-a-withdrawal-method-through-paymentasia] To add and set up a method for making withdrawals through PaymentAsia: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through PaymentAsia will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PaymentAsia**. * In the **Connection** dropdown, select the previously configured [PaymentAsia connection for withdrawals](#configure-connections-to-paymentasia). In the **Configuration** section, select one or more banks in the **Available banks** dropdown, which clients can choose when making withdrawals in the B2CORE UI. The list of banks must correspond to the [currencies available for withdrawals](#supported-currencies). These currencies should be added on the **PS Currencies** tab after creating the withdrawal method. If a currency doesn’t have a corresponding bank selected in the **Available banks** dropdown, withdrawals in that currency won't be available. Click **Save** to create the withdrawal method. The **PaymentAsia** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-asia` to display the [predefined icon](../../integrations/payment-systems) for the PaymentAsia withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PaymentAsia withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PaymentAsia** withdrawal method is now configured in the B2CORE Back Office. [PayPal](https://www.paypal.com) can be connected to B2CORE **only** through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. Follow the instructions below to configure the PayPal connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to PayPal. Before proceeding with the instructions, you must have signed up for PayPal and have an active account. ## Configure connections to PayPal [#configure-connections-to-paypal] If you plan to use PayPal for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to PayPal: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_PayPal` or `Withdrawals_PayPal`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **PayPal**. In the **Credentials** section that appears, configure the PayPal-specific settings: * In the **API base URL** field, specify `https://api-m.paypal.com`. * In the **Client ID** field, enter the ID of the REST API app that you created in your PayPal account. * In the **Client secret** field, enter the client secret associated with that app. To find your client ID and secret, sign in to your PayPal account and navigate to **My Apps & Credentials** in the main menu. On the **Live** tab, select your app to view and copy the credentials. Click **Save** to create the connection. The **PayPal** connection for deposits or withdrawals will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via PayPal, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through PayPal [#add-a-deposit-method-through-paypal] To add and set up a method for making deposits through PayPal: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through PayPal will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PayPal**. * In the **Connection** dropdown, select the previously configured [PayPal connection for deposits](#configure-connections-to-paypal). In the **Configuration** section that appears, configure the following parameter: * In the **Amount type** dropdown, select how the final deposit amount will be calculated: * **Net amount** (the default option) — the amount received by the broker after PayPal transaction fees are deducted. If no commission is set for the method in B2CORE, this net amount will be deposited to the client’s account. If a commission is set, it will be deducted from the net amount, and the client will receive a smaller amount. In both cases, the broker doesn't incur any losses. * **Gross amount** — the full deposit amount before PayPal transaction fees are deducted. If no commission is set for the method in B2CORE, the broker will receive less than the gross amount due to PayPal fees and will have to cover the difference, resulting in a loss. For more details on setting commissions, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods). Click **Save** to create the deposit method. The **PayPal** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-paypal` to display the [predefined icon](../../integrations/payment-systems) for the PayPal deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab. To enable the method to process deposits in a specific currency, ensure it is added on this tab (for the tab description, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PayPal deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PayPal** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through PayPal [#add-a-withdrawal-method-through-paypal] To add and set up a method for making withdrawals through PayPal: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through PayPal will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PayPal**. * In the **Connection** dropdown, select the previously configured [PayPal connection for withdrawals](#configure-connections-to-paypal). Skip the **Configuration** section, as no settings are required for the PayPal withdrawal method. Click **Save** to create the withdrawal method. The **PayPal** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-paypal` to display the [predefined icon](../../integrations/payment-systems) for the PayPal withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab (for the tab description, refer to [Payout methods](../../back-office-guide/system/payout-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PayPal withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PayPal** withdrawal method is now configured in the B2CORE Back Office. [PayRetailers](https://payretailers.com/en/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. Follow the instructions below to configure the PayRetailers connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to PayRetailers. Before proceeding with the instructions, you must have signed up for PayRetailers and have an active account. You can consult the official [PayRetailers documentation](https://payretailers.dev/docs/welcome) or contact their support in case you have any questions. ## Supported currencies [#supported-currencies] Below is the table listing the currencies supported for deposits and withdrawals via PayRetailers: ## Configure connections to PayRetailers [#configure-connections-to-payretailers] If you plan to use PayRetailers for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to PayRetailers: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_PayRetailers` or `Withdrawals_PayRetailers`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **PayRetailers**. In the **Credentials** section that appears, configure the PayRetailers-specific settings: * In the **API base URL** field, specify: * `https://api.payretailers.com` — for the production environment * `https://api-sandbox.payretailers.com` — for the sandbox testing environment * In the **Shop ID** field, enter the identifier assigned to your account by PayRetailers. * In the **Secret key** field, specify the secret key from your PayRetailers account. * In the **Subscription key** field, specify the subscription key from your PayRetailers account. All of these details are provided by PayRetailers during the onboarding process and can also be found in the **Shops** section of your PayRetailers account. PayRetailers — Shops menu Click **Save** to create the connection. The **PayRetailers** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via PayRetailers, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through PayRetailers [#add-a-deposit-method-through-payretailers] To add and set up a method for making deposits through PayRetailers: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through this method will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PayRetailers**. * In the **Connection** dropdown, select the previously configured [PayRetailers connection for deposits](#configure-connections-to-payretailers). In the **Configuration** section that appears, fill in the following fields: * In the **Channel** dropdown, select the payment channel: * **Online** — for online payments * **Wallet** — for payments via e-wallets * **Credit card** — for funding deposits with bank cards * **Cash** — for making cash payments through banks * In the **Country** dropdown, select the country where the payment will be processed. Click **Save** to create the deposit method. The **PayRetailers** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-payretailers` to display the [predefined icon](../../integrations/payment-systems) for the PayRetailers deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process deposits in a specific currency, ensure it is added on this tab. For PayRetailers **deposits**, the currencies used to process deposits are tied to the country selected in the method **Configuration** section. A single country may support more than one **deposit currency**: * **Argentina** → ARS, USD * **Brazil** → BRL, USD * **Chile** → CLP, USD * **Colombia** → COP, USD * **Costa Rica** → CRC, USD * **Ecuador** → USD * **El Salvador** → USD * **Mexico** → MXN, USD * **Panama** → USD * **Peru** → PEN, USD * **Rwanda** → RWF, USD * **Tanzania** → TZS, USD * **Kenya** → KES, USD * **Nigeria** → NGN, USD * **South Africa** → ZAR, USD For example, for Brazil, deposits can be processed in `BRL` and `USD`, both of which can be added on the **PS Currencies** tab. Additionally, the method can be restricted for use in a specific country by applying country restrictions (for details, refer to [How to restrict the use of deposit and withdrawal methods](how-to-restrict-the-use-of-deposit-and-withdrawal-methods#how-to-restrict-the-use-by-country)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PayRetailers deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PayRetailers** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through PayRetailers [#add-a-withdrawal-method-through-payretailers] To add and set up a method for making withdrawals through PayRetailers: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through this method will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **PayRetailers**. * In the **Connection** dropdown, select the previously configured [PayRetailers connection for withdrawals](#configure-connections-to-payretailers). In the **Configuration** section, select the payment channel in the **Channel** dropdown. Click **Save** to create the withdrawal method. The **PayRetailers** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-payretailers` to display the [predefined icon](../../integrations/payment-systems) for the PayRetailers withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. For PayRetailers **withdrawals**, each currency is tied to a specific country in a strict one-to-one relationship. This means that a withdrawal in a given currency is available only for its corresponding country. As a result, clients must select the appropriate country and provide the required bank details for that location. The following mapping shows which country is associated with each **withdrawal currency**: * **Argentina** → ARS * **Brazil** → BRL * **Chile** → CLP * **Colombia** → COP * **Ecuador** → USD * **Mexico** → MXN * **Peru** → PEN * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). PayRetailers withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **PayRetailers** withdrawal method is now configured in the B2CORE Back Office. [Payrock](https://payroc.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss). It supports: * Deposits in the following currencies: `CNY` (via Alipay, P2P, and bank transfers), `JPY` (via P2C and bank transfers), and `EGP` (via mobile money). * Withdrawals in: `CNY` (via Alipay, P2P, and bank transfers) and `JPY` (via P2C). In Payrock, each currency corresponds to a specific country, which means that the details shown in the payment form will be specific to that country — for example, the list of available banks for transfers. Follow the instructions below to configure the Payrock connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Payrock. Before proceeding with the instructions, you must have signed up for Payrock and have an active account. You can consult the official [Payrock documentation](https://support.payroc.com/s/) or contact their support in case you have any questions. ## Configure connections to Payrock [#configure-connections-to-payrock] If you plan to use Payrock for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to Payrock: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Payrock` or `Withdrawals_Payrock`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **Payrock**. In the **Credentials** section that appears, configure the Payrock-specific settings: * In the **API base URL** field, specify `https://gateway-dev.payrock.io`. * In the **Merchant code** field, enter the Merchant code assigned to your account by Payrock. * In the **Merchant key** field, enter the secret key provided by Payrock for your merchant account, used to authenticate API requests. You need to request the **Merchant code** and **Merchant key** from the Payrock support. Click **Save** to create the connection. The **Payrock** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via Payrock, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through Payrock [#add-a-deposit-method-through-payrock] To add and set up a method for making deposits through Payrock: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through Payrock will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Payrock**. * In the **Connection** dropdown, select the previously configured [Payrock connection for deposits](#configure-connections-to-payrock). Skip the **Configuration** section, as no settings are required for the Payrock deposit method. Click **Save** to create the deposit method. The **Payrock** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the deposit method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process deposits in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Payrock deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Payrock** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through Payrock [#add-a-withdrawal-method-through-payrock] To add and set up a method for making withdrawals through Payrock: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through Payrock will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Payrock**. * In the **Connection** dropdown, select the previously configured [Payrock connection for withdrawals](#configure-connections-to-payrock). Skip the **Configuration** section, as no settings are required for the Payrock withdrawal method. Click **Save** to create the withdrawal method. The **Payrock** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Payrock withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Payrock** withdrawal method is now configured in the B2CORE Back Office. [Paytiko](https://www.paytiko.com/) can be connected to B2CORE through PSS, with support for deposits only. For a full list of payment systems that can be connected through PSS, refer to [Integrations > Payment systems](../../integrations/payment-systems). Such systems are marked with `Yes` in the **PSS-supported** column. Follow the instructions below to configure the Paytiko connection and set up the deposit method in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Paytiko. Before proceeding with the instructions, you must have signed up for Paytiko and have an active account. ## Configure a connection to Paytiko [#configure-a-connection-to-paytiko] To configure a connection to Paytiko for making deposits: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Paytiko`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **PaymentSystemDeposit**. In the **Driver** dropdown that appears, select **Paytiko**. In the **Credentials** section that appears, configure the Paytiko-specific settings: * In the **API base URL** field, specify `https://core.paytiko.com`. * In the **Secrete key** field, enter your secret key. To find your secret key, sign in to your Paytiko account and navigate to **Payment settings** > **Merchants**, where you can copy it. Create the connection to Paytiko Click **Save** to create the connection. The **Paytiko** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. ## Add a deposit method through Paytiko [#add-a-deposit-method-through-paytiko] To add and set up a method for making deposits through Paytiko: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through Paytiko will be available for accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Paytiko**. * In the **Connection** dropdown, select the previously configured [Paytiko connection](#configure-a-connection-to-paytiko). Skip the **Configuration** section, as no settings are required for Paytiko. Create the Paytiko deposit method Click **Save** to create the deposit method. The **Paytiko** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, select **Fiat** in the **Group** dropdown. * In the **Icon** field, specify `paymethod-paytiko` to display the [predefined icon](../../integrations/payment-systems) for the Paytiko deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab (for the tab description, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Deposit method details Click **Save** to apply the changes. The **Paytiko** deposit method is now configured in the B2CORE Back Office. ## Set up a webhook in your Paytiko account [#set-up-a-webhook-in-your-paytiko-account] To receive status updates for initiated deposits in B2CORE, you need to set up a notification webhook in your Paytiko account. ### Copy the webhook URL from the B2CORE Back Office [#copy-the-webhook-url-from-the-b2core-back-office] In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Find the configured **Paytiko** deposit method and click **Edit** to enter the method details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Add the webhook URL to your Paytiko account [#add-the-webhook-url-to-your-paytiko-account] In your Paytiko account, navigate to **Payment settings** > **Merchants**. In the **Merchant settings**, paste the copied webhook URL into the **Url** field under the **External service** section. Add the webhook URL to your Paytiko account Click **Save** to apply the changes. The **Paytiko** deposit method is now fully configured and available for clients to use when making deposits in the B2CORE UI. [Praxis](https://praxis.tech/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. Follow the instructions below to configure the Praxis connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Praxis. Before proceeding with the instructions, you must have signed up for Praxis and have an active account. ## Configure connections to Praxis [#configure-connections-to-praxis] If you plan to use Praxis for both deposits and withdrawals, you must configure separate connections, each dedicated to a specific deposit or withdrawal method. Withdrawals through Praxis can be processed to **bank cards** or via an **alternative payment method** (APM) such as e-wallets. Each connection must be configured with the appropriate driver to ensure the correct operation of the respective deposit or withdrawal method. To configure a connection to Praxis: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Praxis` or `Withdrawals_Praxis`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select: * **Praxis cashier** — for processing deposits. * **Praxis bank card** — for withdrawals to bank cards. * **Praxis alternative payment method** — for withdrawals via an APM, such as e-wallets. In the **Credentials** section that appears, configure the Praxis-specific settings: * In the **Environment** dropdown (applicable only to the **Praxis bank card** driver), select **Production**. * In the **API base URL** field, specify `https://gw.praxisgate.com`. * In the **API secret** fields, enter the secret key provided by Praxis. * In the **Merchant ID** field, enter your Praxis Merchant ID. * In the **Application key** field, enter the key generated in your Praxis account. Click **Save** to create the connection. The **Praxis** connection for deposits or withdrawals will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need additional Praxis connections for other payment methods, follow the same instruction to create a new connection with a different driver. The image below displays three configured Praxis connections: one for the deposit method and two for withdrawal methods. External connections to Praxis ## Add a deposit method through Praxis [#add-a-deposit-method-through-praxis] To add and set up a method for making deposits through Praxis: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through Praxis will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Praxis cashier**. * In the **Connection** dropdown, select the previously configured [Praxis connection for deposits](#configure-connections-to-praxis). Skip the **Configuration** section, as no settings are required for the Praxis deposit method. Click **Save** to create the deposit method. The **Praxis** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-praxis` to display the [predefined icon](../../integrations/payment-systems) for the Praxis deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab. To enable the method to process deposits in a specific currency, ensure it is added on this tab (for the tab description, refer to [Deposit methods](../../back-office-guide/system/deposit-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Praxis deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test is performed based on the settings specified in the method form and the data provided in the selected external connection. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Praxis** deposit method is now configured in the B2CORE Back Office. In your Praxis account, make sure to apply the settings outlined below for proper processing of deposits. ## Set up the settings for deposit processing in your Praxis account [#set-up-the-settings-for-deposit-processing-in-your-praxis-account] Sign in to your Praxis account and apply the following settings: * The **Allow Payment Link Generation** option must be enabled. You can't activate this option on your own. To enable it, submit a request to Praxis support. * The **Validate IP** option should be either disable or contain the IP address of the host where your B2CORE Back Office resides. * The **Validate domain** option: * If you have the [mobile app](../../release-notes/release-notes-mobile) in addition to the B2CORE UI, this option must be disabled. * If you only have the B2CORE UI, this option should be either disabled or contain the domain on which your B2CORE UI resides. ## Add a withdrawal method through Praxis [#add-a-withdrawal-method-through-praxis] To add and set up a method for making withdrawals through Praxis: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through Praxis will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select: * **Praxis bank card** — the driver for withdrawals to bank cards. * **Praxis alternative payment method** — the driver for withdrawals via an APM (Alternative payment method), such as e-wallets. * In the **Connection** dropdown, select the previously configured [Praxis connection for withdrawals](#configure-connections-to-praxis). In the **Configuration** section that appears: * The **Gateway hash** field displays: * **Card processor** — if you selected the **Praxis bank card** driver. * **E-Wallet** — if you selected the **Praxis alternative payment method** driver. * In the **Profile ID** dropdown (applicable only to the **Praxis bank card** driver), select your Praxis profile type. Click **Save** to create the withdrawal method. The **Praxis** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-praxis` to display the [predefined icon](../../integrations/payment-systems) for the Praxis withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * Add the needed currencies on the **PS Currencies** tab. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab (for the tab description, refer to [Payout methods](../../back-office-guide/system/payout-system#details)). * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Praxis withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test is performed based on the settings specified in the method form and the data provided in the selected external connection. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Praxis** withdrawal method is now configured in the B2CORE Back Office. If you need both withdrawals to bank cards and e-wallets, add and set up another withdrawal method that uses a different driver and connection. [Proxpay](https://www.proxpay.co/auth/login) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss). It supports deposits via QR codes and withdrawals to bank accounts, processed in `THB`. Follow the instructions below to configure the Proxpay connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Proxpay. Before proceeding with the instructions, you must have signed up for Proxpay and have an active account. ## Configure connections to Proxpay [#configure-connections-to-proxpay] If you plan to use Proxpay for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to Proxpay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Proxpay` or `Withdrawals_Proxpay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **Proxpay**. In the **Credentials** section that appears, configure the Proxpay-specific settings. ### For deposits: [#for-deposits] * In the **API base URL** field, specify: * `https://api.proxpay.co` — for the production environment * `https://stg-api.proxpay.co` — for the sandbox testing environment * In the **API key** field, enter the API key provided by Proxpay to authenticate requests. * In the **Username** and **Password** fields, specify the credentials associated with your Merchant ID. * In the **API start base URL** field, specify `https://payment.thehabito.com`. This URL is only intended for the production environment and isn't available for the testing environment. * In the **Start token** field, enter the token used to initiate API sessions with Proxpay. * In the **Merchant ID** field, specify your Merchant ID assigned by Proxpay. * In the **Proxpay merchant ID** filed, specify the unique merchant identifier used for QR code deposits. ### For withdrawals: [#for-withdrawals] * In the **API base URL** field, specify: * `https://api.proxpay.co` — for the production environment * `https://stg-api.proxpay.co` — for the sandbox testing environment * In the **API key** field, enter the API key provided by Proxpay to authenticate requests. * In the **Username** and **Password** fields, specify the credentials associated with your Merchant ID. * In the **Merchant ID** field, specify your Merchant ID assigned by Proxpay. You need to request all the credentials required for configuring connections from the Proxpay support. Click **Save** to create the connection. The **Proxpay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via Proxpay, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through Proxpay [#add-a-deposit-method-through-proxpay] To add and set up a method for making deposits through Proxpay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through Proxpay will be available to accounts denominated in the selected currencies. For these currencies, conversion rates for `THB` must be configured. * In the **Driver** dropdown, select **Proxpay**. * In the **Connection** dropdown, select the previously configured [Proxpay connection for deposits](#configure-connections-to-proxpay). In the **Configuration** section, enter the value for the **Product detail** field as provided by the Proxpay support. Click **Save** to create the deposit method. The **Proxpay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the deposit method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `THB`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Proxpay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Proxpay** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through Proxpay [#add-a-withdrawal-method-through-proxpay] To add and set up a method for making withdrawals through Proxpay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through Proxpay will be available from accounts denominated in the selected currencies. For these currencies, conversion rates for `THB` must be configured. * In the **Driver** dropdown, select **Proxpay**. * In the **Connection** dropdown, select the previously configured [Proxpay connection for withdrawals](#configure-connections-to-proxpay). Skip the **Configuration** section, as no settings are required for the Proxpay withdrawal method. Click **Save** to create the withdrawal method. The **Proxpay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `THB`. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Proxpay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Proxpay** withdrawal method is now configured in the B2CORE Back Office. ## Set up webhooks in Proxpay [#set-up-webhooks-in-proxpay] To receive status updates for deposits and withdrawals in B2CORE, notification webhooks must be set up on the side of Proxpay. ### Copy webhook URLs from the B2CORE Back Office [#copy-webhook-urls-from-the-b2core-back-office] You will need separate webhook URLs for both deposit and withdrawal methods. In the B2CORE Back Office, navigate to: * **System** > **Deposit system** > **Deposit methods** * **System** > **Payout system** > **Payout methods** Find the configured Proxpay deposit or withdrawal method and click **Edit** to open its details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Provide URLs to Proxpay [#provide-urls-to-proxpay] Send the copied webhook URLs (for both deposits and withdrawals) to the Proxpay support for configuration on their side. [Sticpay](https://www.sticpay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals. Follow the instructions below to configure the Sticpay connection and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Sticpay. Before proceeding with the instructions, you must have signed up for Sticpay and have an active account. ## Supported currencies [#supported-currencies] Below are the tables listing the currencies supported for deposits and withdrawals via Sticpay. Transactions are processed through wallets created in your Sticpay account. To enable a particular currency, you must first create a wallet in that currency. ### Fiat currencies [#fiat-currencies] The following fiat currencies are supported for **both deposits and withdrawals**: ### Cryptocurrencies [#cryptocurrencies] The following cryptocurrencies are supported for **deposits only**: ## Minimum deposit and withdrawal amounts [#minimum-deposit-and-withdrawal-amounts] Sticpay applies a dynamic minimum amount to deposits and withdrawals, equivalent to **1 USD** based on Sticpay’s exchange rates. If a deposit or withdrawal request is created below this minimum threshold (in conversion to USD), Sticpay will reject the transaction. For deposits, a client will see an error if the amount is below the limit when redirected to the Sticpay page. For withdrawals, if the amount is below the limit, the transaction will fail when processed on the Sticpay side, and the client won’t see the reason for the failure. To prevent this, it is strongly recommended to configure a minimum withdrawal amount for each supported currency in the Sticpay withdrawal method in the B2CORE Back Office. ## Configure API settings in your Sticpay account [#configure-api-settings-in-your-sticpay-account] To enable integration between Sticpay and B2CORE, you need to configure specific API settings in your Sticpay account. To configure API settings: Sign in to your Sticpay account and navigate to the **Sticpay API** section. Configure the following settings, which are required for deposit and withdrawal methods to function correctly with B2CORE: * Select the **Enable** checkbox to activate API-based payments. * Select the **Unique order-no** checkbox to ensure that each transaction has a unique order number, preventing duplicates. * In the **Success URL** field, specify the URL to which clients will be redirected after a successful deposit, using the format: `https://{your-Front-Office-URL}/en/payment/success` * In the **Failure URL** field, specify the URL to which clients will be redirected after a failed deposit, using the format: `https://{your-Front-Office-URL}/en/payment/failed` * In the **Referrer URL** field, specify the URL to which clients will be redirected after canceling a deposit (for example, the **Funds** > **Deposit** page of your B2CORE UI), using the format: `https://{your-Front-Office-URL}/en/funds/deposit` Make sure to replace `{your-Front-Office-URL}` with the domain of your B2CORE UI. * In the **Callback URL** field, enter the webhook URL generated on the **Webhooks** tab of the deposit method settings after configuring the method in the B2CORE Back Office (for details, refer to [Set up a webhook in your Sticpay account](#set-up-a-webhook-in-your-sticpay-account)). * Select the **Plain JSON Callback** checkbox to ensure callback responses are formatted as plain JSON. * In the **Whitelist IPs** field, enter the comma-separated IP addresses from which requests to your API will be accepted. * In the **Encryption type** dropdown, select **SHA256** to use this encryption method for request signing and validation. Only **SHA256** is supported for integration with B2CORE. Sticpay API settings Click **Save** to apply your changes. ## Configure connections to Sticpay [#configure-connections-to-sticpay] If you plan to use Sticpay for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to Sticpay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Sticpay` or `Withdrawals_Sticpay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **Sticpay**. In the **Credentials** section that appears, configure the Sticpay-specific settings: * In the **Interface version** dropdown, select **Live** or **Sandbox**, depending on whether you're setting up a production or test integration. * In the **API base URL** field, specify `https://api.sticpay.com`, which is used for both production and sandbox environments. * In the **Merchant email** field, enter the email address associated with your Sticpay merchant account. The email can be found in the **Account** section. * In the **API key** field, enter the API key generated in the **Sticpay API** section of your account. Click **Save** to create the connection. The **Sticpay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via Sticpay, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through Sticpay [#add-a-deposit-method-through-sticpay] To add and set up a method for making deposits through Sticpay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through Sticpay will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Sticpay**. * In the **Connection** dropdown, select the previously configured [Sticpay connection for deposits](#configure-connections-to-sticpay). Skip the **Configuration** section, as no settings are required for the Sticpay deposit method. Click **Save** to create the deposit method. The **Sticpay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-sticpay` to display the [predefined icon](../../integrations/payment-systems) for the Sticpay deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process deposits in a specific currency, ensure it is added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Sticpay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Sticpay** deposit method is now configured in the B2CORE Back Office. ## Set up a webhook in your Sticpay account [#set-up-a-webhook-in-your-sticpay-account] To receive status updates for initiated deposits in B2CORE, you need to set up a notification webhook in your Sticpay account. ### Copy the webhook URL from the B2CORE Back Office [#copy-the-webhook-url-from-the-b2core-back-office] In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Find the configured **Sticpay** deposit method and click **Edit** to enter the method details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Add the webhook URL to your Sticpay account [#add-the-webhook-url-to-your-sticpay-account] In your Sticpay account, navigate to the **Sticpay API** section. Paste the copied webhook URL into the **Callback URL** field. Click **Save** to apply the changes. ## Add a withdrawal method through Sticpay [#add-a-withdrawal-method-through-sticpay] To add and set up a method for making withdrawals through Sticpay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through Sticpay will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **Sticpay**. * In the **Connection** dropdown, select the previously configured [Sticpay connection for withdrawals](#configure-connections-to-sticpay). Skip the **Configuration** section, as no settings are required for the Sticpay withdrawal method. Click **Save** to create the withdrawal method. The **Sticpay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-sticpay` to display the [predefined icon](../../integrations/payment-systems) for the Sticpay withdrawal method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. Sticpay applies a dynamic minimum withdrawal amount, equivalent to **1 USD** based on Sticpay's exchange rates. If a withdrawal is created below this minimum, the transaction will fail when processed on the Sticpay side, and the client won’t see the reason for the failure. To prevent this, specify a minimum amount for each currency (in conversion to USD) when adding it to the **PS Currencies** tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Sticpay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Sticpay** withdrawal method is now configured in the B2CORE Back Office. [TopChange Pay](https://www.topchange.net/) (TC Pay) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals in `USD`, `IRR`, `EUR`, `AED`, `TRY`, `CNY`, `RUB`, and `USDT`. Follow the instructions below to configure the TC Pay connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to TC Pay. Before proceeding with the instructions, you must have signed up for TC Pay and have an active account. You can consult the official [TC Pay documentation](https://topchange1.zendesk.com/) or contact their support in case you have any questions. ## Configure connections to TopChange Pay [#configure-connections-to-topchange-pay] If you plan to use TC Pay for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to TC Pay: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_TC_Pay` or `Withdrawals_TC_Pay`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **TC Pay**. In the **Credentials** section that appears, configure the TC Pay-specific settings: * In the **API base URL** field, specify `https://pg.topayment.net`. * In the **Merchant ID** field, enter the Merchant ID assigned to your account by TC Pay. * Generate a pair of RSA *private* and *public* keys using the **TC RSA Key Generator**. You can consult the official [TC Pay documentation](https://topchange1.zendesk.com/) or contact their support in case you have any questions. * In the **Private RSA key** field, specify the *private* key, and make sure to specify the corresponding *public* key in your TC Pay account. Click **Save** to create the connection. The **TC Pay** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via TC Pay, follow the same instruction to create a new connection for the other operation. ## Add a deposit method through TopChange Pay [#add-a-deposit-method-through-topchange-pay] To add and set up a method for making deposits through TC Pay: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through TC Pay will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **TC Pay**. * In the **Connection** dropdown, select the previously configured [TC Pay connection for deposits](#configure-connections-to-topchange-pay). In the **Configuration** section, fill in the **Terminal ID** associated with your TC Pay merchant account. This ensures that transactions are correctly routed and attributed to the appropriate payment terminal. Note that the allowed currency is determined by the specified Terminal ID. Click **Save** to create the deposit method. The **TC Pay** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the deposit method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process deposits in a specific currency, ensure it is added on this tab. For TC Pay, each deposit method can support only one currency under the **PS Currencies** tab. Therefore, if you want to allow your clients to deposit in all supported currencies (`USD`, `IRR`, `EUR`, `AED`, `TRY`, `CNY`, `RUB`, and `USDT`), you must create eight separate deposit methods — one for each currency, corresponding to the specified **Terminal ID**. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). TC Pay deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **TC Pay** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through TC Pay [#add-a-withdrawal-method-through-tc-pay] To add and set up a method for making withdrawals through TC Pay: In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Withdrawals through TC Pay will be available from accounts denominated in the selected currencies. * In the **Driver** dropdown, select **TC Pay**. * In the **Connection** dropdown, select the previously configured [TC Pay connection for withdrawals](#configure-connections-to-topchange-pay). In the **Configuration** section, fill in the **Terminal ID** associated with your TC Pay merchant account. This ensures that transactions are correctly routed and attributed to the appropriate payment terminal. Note that the allowed currency is determined by the specified Terminal ID. Click **Save** to create the withdrawal method. The **TC Pay** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currency. To enable the method to process withdrawals in a specific currency, ensure it is added on this tab. For TC Pay, each withdrawal method can support only one currency under the **PS Currencies** tab. Therefore, if you want to allow your clients to withdraw in all supported currencies (`USD`, `IRR`, `EUR`, `AED`, `TRY`, `CNY`, `RUB`, and `USDT`), you must create eight separate withdrawal methods — one for each currency, corresponding to the specified **Terminal ID**. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). TC Pay withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **TC Pay** withdrawal method is now configured in the B2CORE Back Office. [UniPayment](https://unipayment.io/en/) can be connected to B2CORE through PSS, with support for deposits via bank cards, processed in `EUR`, `GBP`, and `USD`. Follow the instructions below to configure the UniPayment connection and set up the deposit method in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to UniPayment. Before proceeding with the instructions, you must have signed up for UniPayment and have an active account. You can consult the official [UniPayment Help Center](https://help.unipayment.io/en/) or contact their support in case you have any questions. ## Configure a connection to UniPayment [#configure-a-connection-to-unipayment] To configure a connection to UniPayment for making deposits: In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_UniPayment`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **PaymentSystemDeposit**. In the **Driver** dropdown that appears, select **UniPayment**. In the **Credentials** section that appears, configure the UniPayment-specific settings: * In the **API base URL** field, specify: * `https://api.unipayment.io/` — for the production environment * `https://sandbox-api.unipayment.io/` — for the sandbox testing environment * In the **Client ID** field, enter the client identifier generated in your UniPayment account. * In the **Client secret** field, enter the secret key associated with your UniPayment client. To generate both your client ID and secret, sign in to your UniPayment account, click the profile icon and select **API Management**. Click **Save** to create the connection. The **UniPayment** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. ## Add a deposit method through UniPayment [#add-a-deposit-method-through-unipayment] To add and set up a method for making deposits through UniPayment: In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select one or more currencies. Deposits through UniPayment will be available to accounts denominated in the selected currencies. * In the **Driver** dropdown, select **UniPayment**. * In the **Connection** dropdown, select the previously configured [UniPayment connection](#configure-a-connection-to-unipayment). In the **Configuration** section, fill in the following fields: * In the **Application ID** field, enter the identifier of the app created in your UniPayment account. * In the **Payment method type** dropdown, select **Card**. App in UniPayment Click **Save** to create the deposit method. The **UniPayment** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify `paymethod-unipayment` to display the [predefined icon](../../integrations/payment-systems) for the UniPayment deposit method in the B2CORE UI. To use a custom icon, specify the URL of the image to be displayed. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add the needed currencies, such as `EUR`, `GBP`, and `USD`. Deposits through UniPayment will be processed in the currencies added on this tab. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). UniPayment deposit method — Settings tab Click **Save** to apply the changes. The **UniPayment** deposit method is now configured in the B2CORE Back Office. [Visionpay (HILZI)](https://visionpay.com/) can be connected to B2CORE through [PSS](../../integrations/payment-systems#payment-system-service-pss), with support for deposits and withdrawals processed in `USD` via the Whish Money app. Follow the instructions below to configure the Visionpay (HILZI) connections and set up the deposit and withdrawal methods in the B2CORE Back Office. These instructions correspond to the [General procedure](how-to-add-deposit-and-withdrawal-methods-through-pss) for adding methods for PSS-supported payment systems, but include details specific to Visionpay. Before proceeding with the instructions, you must have signed up for Visionpay and have an active account. All the details required for configuring connections to Visionpay, including the API base URL and credentials, must be requested from the Visionpay support. ## Configure connections to Visionpay (HILZI) [#configure-connections-to-visionpay-hilzi] If you plan to use Visionpay (HILZI) for both deposits and withdrawals, you must configure two separate connections: one for deposits and another for withdrawals. To configure a connection to Visionpay (HILZI): In the B2CORE Back Office, navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores (for example, `Deposits_Hilzi` or `Withdrawals_Hilzi`). * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select: * **PaymentSystemDeposit** — to add a connection that will be used for a deposit method. * **PaymentSystemWithdrawal** — to add a connection that will be used for a withdrawal method. In the **Driver** dropdown that appears, select **Hilzi**. In the **Credentials** section that appears, configure the Visionpay-specific settings: * In the **API base URL** field, specify the base URL provided by Visionpay for your integration environment. * In the **Login** and **Password** field, enter the credentials provided by Visionpay. You need to request the **API base URL** and credentials from the Visionpay support. Click **Save** to create the connection. The **Visionpay (HILZI)** connection will appear in the list of external connections. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** column), click the **Edit** button to open the connection details and set the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. If you need to support both deposits and withdrawals via Visionpay (HILZI), follow the same instruction to create a new connection for the other operation. ## Add a deposit method through Visionpay (HILZI) [#add-a-deposit-method-through-visionpay-hilzi] To add and set up a method for making deposits through Visionpay (HILZI): In the B2CORE Back Office, navigate to **System** > **Deposit system** > **Deposit methods**. Click **+Create** in the upper-right page corner. On the **Create a deposit method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemDeposit**. After selecting **PaymentSystemDeposit**, the following fields appear: * In the **Available account currencies** dropdown, select `USD`. * In the **Driver** dropdown, select **Hilzi**. * In the **Connection** dropdown, select the previously configured [Visionpay (HILZI) connection for deposits](#configure-connections-to-visionpay-hilzi). Skip the **Configuration** section, as no settings are required for the deposit method. Click **Save** to create the deposit method. The **Visionpay (HILZI)** deposit method will appear in the list of deposit methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the deposit method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USD`, the only supported currency for processing deposits. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Visionpay (HILZI) deposit method — Settings tab Click **Test configuration** to validate the connection settings of the deposit method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Visionpay (HILZI)** deposit method is now configured in the B2CORE Back Office. ## Add a withdrawal method through Visionpay (HILZI) [#add-a-withdrawal-method-through-visionpay-hilzi] To add and set up a method for making withdrawals through Visionpay (HILZI): In the B2CORE Back Office, navigate to **System** > **Payout system** > **Payout methods**. Click **+Create** in the upper-right page corner. On the **Create a payout method** page, fill in the following fields: * In the **Name** field, enter a name for the method. The name must be unique and may only contain Latin letters, numbers, dashes, and underscores. * In the **Caption** field, enter a caption for the method. This caption will be assigned to the method in the Back Office and will be visible to clients in the B2CORE UI. * In the **Provider** dropdown, select **PaymentSystemWithdrawal**. After selecting **PaymentSystemWithdrawal**, the following fields appear: * In the **Available account currencies** dropdown, select `USD`. * In the **Driver** dropdown, select **Hilzi**. * In the **Connection** dropdown, select the previously configured [Visionpay (HILZI) connection for withdrawals](#configure-connections-to-visionpay-hilzi). Skip the **Configuration** section, as no settings are required for the withdrawal method. Click **Save** to create the withdrawal method. The **Visionpay (HILZI)** withdrawal method will appear in the list of withdrawal methods. Click **Edit** to enter the method details and complete the following fields: * On the **Settings** tab, use the **Group** dropdown to select one or more groups where the method should be included. * In the **Icon** field, specify the URL of an image that will be displayed as the icon for the withdrawal method in the B2CORE UI. * Check the method status. If the method is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. * On the **PS Currencies** tab, add `USD`, the only supported currency for processing withdrawals. * If needed, configure commissions for the method on the **Commissions** tab (for details, refer to [How to configure commissions for deposit and withdrawal methods](how-to-configure-commissions-for-deposit-and-withdrawal-methods)). Visionpay (HILZI) withdrawal method — Settings tab Click **Test configuration** to validate the connection settings of the withdrawal method. The test result will be displayed on the page. After successfully validating the configuration, click **Save**. The **Visionpay (HILZI)** withdrawal method is now configured in the B2CORE Back Office. ## Set up webhooks in Visionpay (HILZI) [#set-up-webhooks-in-visionpay-hilzi] To receive status updates for deposits and withdrawals in B2CORE, notification webhooks must be set up on the side of Visionpay. ### Copy webhook URLs from the B2CORE Back Office [#copy-webhook-urls-from-the-b2core-back-office] You will need separate webhook URLs for both deposit and withdrawal methods. In the B2CORE Back Office, navigate to: * **System** > **Deposit system** > **Deposit methods** * **System** > **Payout system** > **Payout methods** Find the configured Visionpay (HILZI) deposit or withdrawal method and click **Edit** to open its details. Go to the **Webhooks** tab. Copy the URL displayed in the **Notification URL** field. ### Provide URLs to Visionpay [#provide-urls-to-visionpay] Send the copied webhook URLs (for both deposits and withdrawals) to the Visionpay support for configuration on their side. You can restrict the use of deposit and withdrawal methods based on **verification level**, **country**, or **client type**. Additionally, you can apply a combination of these restrictions to fine-tune access. ## How to restrict the use by verification level [#how-to-restrict-the-use-by-verification-level] You can restrict the use of deposit or withdrawal methods so that they can only be used by clients who have achieved specific [verification levels](../../back-office-guide/verification/levels) (for example, due to regulator requirements). To restrict the use of a deposit or withdrawal method by verification level: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Select the method and click the **Edit** button in the method row. Click **Actions** in the upper-right page corner, and then select **Verification level restrictions** in the dropdown. In the **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option forbids the use of the method for selected verification levels. * **Allow only** — this option allows the use of the method only for selected verification levels. * In the **Rules** dropdown, select one or several verification levels. Click **Save** to apply the changes. ## How to restrict the use by country [#how-to-restrict-the-use-by-country] You can restrict the use of deposit or withdrawal methods so that they can only be used by clients from specific countries. To restrict the use of a deposit or withdrawal method by country: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Select the method and click the **Edit** button in the method row. Click **Actions** in the upper-right page corner, and then select **Country restrictions** in the dropdown. In the **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option forbids the use of the method for selected countries. * **Allow only** — this option allows the use of the method only for selected countries. * In the **Rules** dropdown, select one or several countries. Click **Save** to apply the changes. ## How to restrict the use by client type [#how-to-restrict-the-use-by-client-type] You can restrict the use of deposit or withdrawal methods so that they can only be used by clients belonging to a specific [type](../../back-office-guide/clients/types), such as *individual* or *corporate*. To restrict the use of a deposit or withdrawal method by client type: Navigate to **System** > **Deposit system** > **Deposit methods** or\ to **System** > **Payout system** > **Payout methods**. Select the method and click the **Edit** button in the method row. Click **Actions** in the upper-right page corner, and then select **Client type restrictions** in the dropdown. In the **Restrictions** popup, fill in the following information: * In the **Enabled** dropdown, select **Yes**. * In the **Type** dropdown, select either of the two options: * **Deny only** — this option forbids the use of the method for selected client types. * **Allow only** — this option allows the use of the method only for selected client types. * In the **Rules** dropdown, select one or several client types. Click **Save** to apply the changes. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} ## Problem [#problem] A client can't to create a trading account via the B2CORE UI and encounters an error. ## Possible reasons [#possible-reasons] This issue may occur due to one or more of the following: * The connection to the trading platform is misconfigured or disabled. * The product settings prevent account creation (for example, limits on accounts or deposit requirements). * The product currency group isn't properly mapped to the platform. * Client-specific account limits are exceeded. ## Solution [#solution] To check the required settings related to creating accounts on trading platforms: ### Check the trading platform connection settings [#check-the-trading-platform-connection-settings] * In the Back Office, navigate to **Products** > **Platforms**. * Click the **Edit** button for the relevant platform to open its details. * Click **Test connection** to validate the connection settings. * A checkmark on the **Test connection** button means the connection is properly configured. * A red **Test connection** button indicates errors in the settings, which will be listed. * Correct the settings and test again until the connection is successful. * Ensure the connection is enabled. ### Check the setting of the related product used for creating account on a specific platform [#check-the-setting-of-the-related-product-used-for-creating-account-on-a-specific-platform] * In the Back Office, navigate to **Products** > **Products**. * Click the **Edit** button for the relevant product to open its details. * Review the following fields: * **Max accounts** – the maximum number of accounts a client can create per currency for this product. The client may have exceeded this limit. * **Min deposit amount (USD)** – the minimum deposit required to open an account. If the client doesn’t meet this requirement, the account can’t be created. For more details about these settings, refer to refer to [Products](../../back-office-guide/products/products#details). ### Verify that the product currency is assigned to the correct platform group [#verify-that-the-product-currency-is-assigned-to-the-correct-platform-group] * In the Back Office, navigate to **Products** > **Products**. * Click the **Edit** button for the relevant product to open its details. * Go to the **Currencies** tab. * Click the **Edit** button for the required currency. * Check the selected group in the **Platform group** dropdown and adjust it if needed. These are the groups created on the respective platform. The available currency options are limited by the settings of the configured platform groups. ### Check the limit on the number of allowed accounts in the client details [#check-the-limit-on-the-number-of-allowed-accounts-in-the-client-details] * In the Back Office, navigate to **Clients** > **General**. * Click the **Edit** button for the relevant client. * Go to the **Settings** tab. * Review the fields: * **Max Demo Trading Accounts** * **Max Live Trading Accounts** If limits are set in these fields, they override the product settings. The client may have already reached the maximum number of allowed accounts. You can adjust the limits if needed. ## Problem [#problem] A client's trading account in the B2CORE Back Office appears in the status **E** (Error) or **A** (Archived). ## Possible reasons [#possible-reasons] * The account has been archived in B2CORE. * The account was archived or deleted on the trading platform but remains visible in B2CORE. * A connection issue is preventing proper synchronization of account status. ## Solution [#solution] To troubleshoot these statuses: ### Unarchive an account in the B2CORE Back Office (if required) [#unarchive-an-account-in-the-b2core-back-office-if-required] * Navigate to **Clients** > **Accounts**. * Find the account in the list and click the **Edit** button to open its details. * Click the **Actions** button in the upper-right corner and select **Unarchive** in the dropdown. ### Handle an account in the E (Error) status [#handle-an-account-in-the-e-error-status] The account in the **E** status usually indicates that it was archived or deleted on the trading platform. To fix it, restore or unarchive the account on the trading platform. Once restored, the updated status will sync with B2CORE. ### Check the trading platform connection settings [#check-the-trading-platform-connection-settings] If an account appears in the **A** (Archived) status but is expected to be active, check the trading platform connection. For details, refer to **Step 1** in [Clients can't create trading accounts via the B2CORE UI](clients-can-not-create-trading-accounts-via-the-b2core-ui). ### Hide an account in the B2CORE UI if can't be unarchived or restored [#hide-an-account-in-the-b2core-ui-if-cant-be-unarchived-or-restored] If an account can't be unarchived or restored on the trading platform, remove the `Visible` permission for the account in the B2CORE Back Office. This ensures the account won't be displayed to the client in the B2CORE UI. To do this: * Navigate to **Clients** > **Accounts**. * Find the account in the list and click the **Edit** button to open its details. * In the Rights list, remove the `Visible` permission. * Click **Save** to apply the changes. Remove Visible from the Rights field {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} Managers are users with access to the Back Office who are responsible for organizing work and communicating with clients assigned to them. Newly registered clients are automatically distributed among the existing managers. Before adding a manager, ensure that the relevant user is created on the [System > Users > Users](../../back-office-guide/system/users/users) page, and then proceed to add this user as a manager. To add a manager: Navigate to **Clients** > **Managers**. Click **+Create** in the upper-right page corner. On the **Create manager** page, fill in the following fields: * In the **Email** dropdown, select the email address of the user who has been already registered in the Back Office on the **System** > **Users** > **Users** page. * In the **Name** field, enter the manager's full name. * In the **Phone** field, optionally specify the manager's phone number. * In the **Enabled** dropdown, select **Yes** or **No** to set the manager's profile status. Clients can be assigned only to `Enabled` managers. * In the **Title** field, optionally enter the manager’s title (such as `Mr` or `Mrs`). * In the **Default** dropdown, select: * **Yes** — to set this manager as the default. All new clients will be automatically assigned to this manager, considering country restrictions. * **No** — to keep this manager as non-default. Click **Save** to create the manager profile. ## How to apply country restrictions to a manager [#how-to-apply-country-restrictions-to-a-manager] With country restrictions, clients are automatically assigned to the appropriate managers according to the clients' countries. To apply country restrictions to a manager: Navigate to **Clients** > **Managers**. Select the manager and click **Edit**. On the **Edit manager** page, click the **Actions** button in the upper-right page corner, and then select **Country restrictions** in the dropdown. In the **Restrictions** popup, fill in the following fields: * Set the **Enabled** dropdown to **Yes**. * In the **Type** dropdown, select the rule type: * **Deny only** — the manager can be assigned to all clients, except for those from the selected countries. * **Allow only** — the manager can only be assigned to clients from the specified countries. * In the **Rules** dropdown, select one or more countries to which either the **Deny only** or **Allow only** rule will be applied. Click **Save** to apply the changes. To create user groups and assign to them custom permissions: Navigate to **System** > **Users** > **Groups**. Click **+Create** in the upper-right page corner. In the **Caption** field, enter a name for your group (for example, “Managers”). Grant the required permissions to a user group by selecting the appropriate checkboxes under the **Rights** section. All permissions are categorized into groups that correspond to the main menu items, and listed in alphabetical order. To quickly select all permissions or a particular permission type, click **Check** and select one of the following options: **All**, **View**, **Create**, **Update**, or **Delete**. To unselect all permissions, click **Uncheck all**. Click **Save** to create the user group. You can add new Back Office users, such as admins, only if you have the necessary permissions to manage users. To add a new Back Office user: Navigate to **System** > **Users** > **Users**. Click **+Create** in the upper-right page corner. On the **Create user** page, fill in the following fields: Create user page * In the **Email** field, enter the user's email address. * In the **Password** field, enter a password. You can also generate a secure password by clicking the **Generate** button on the right side of the field. To view the generated password, enable the **Show password** option. * In the **Status** dropdown, select **Enabled**. * In the **Groups** dropdown, select one or more groups in which the new user will be included (for details, refer to [How to add a user group and grant permissions](how-to-add-a-user-group-and-grant-permissions)). The selected groups define the permissions that the new user will have. The **Administrators** group grants all the available permissions to the users included in this group. * In the **Name** field, enter the user’s first and last names. * Select the **Send to email** checkbox to send credentials to the specified user email address. * Select the **Mask data** checkbox to prevent the user from viewing client personal data. With this option enabled, such data as client names, email addresses, and phone numbers will be masked with asterisks (`*`) for this particular Back Office user. Click **Save** to register the new user in the Back Office. For newly registered Back Office users, two-factor authentication (2FA) via email codes is enabled by default. After entering their credentials, users will be prompted to enter verification codes sent to their email addresses when signing in to the Back Office. To enable a language for use in the B2CORE UI or disable it: Navigate to **System** > **Localizations**. Select the language from the list and click **Edit**. To switch on the language, set **Enabled** to **Yes**. To switch off the language, set **Enabled** to **No**. If the selected language is marked as the default one, it can’t be disabled. Click **Save** to apply the changes. To block registration for clients from a specific country: Navigate to **System** > **Countries**. The list of countries available for registration is displayed on the **Countries** page. For a country for which you want to block registration, toggle the **Enabled** switch to an inactive state. In the displayed popup, click **Yes** to confirm the action. The selected country is now unavailable in the Registration form. ## Block a country for a single registration profile [#block-a-country-for-a-single-registration-profile] The **Countries** page is shared across B2CORE, so disabling a country there hides it in every area that offers a country choice, not only during registration. To block a country for one registration form while keeping it available everywhere else, leave it enabled on the **Countries** page and add it to the **Countries Blacklist** section of the relevant registration profile in **System** > **Registration**. The blacklisted countries are hidden from the **Country** selects of that registration form only. For details, refer to [How to migrate to the new registration settings](how-to-migrate-to-new-registration-settings). You can view and change the images displayed in the Back Office. To be able to view and change the Back Office images, you must be assigned the permissions to **View Backend images** and **Edit Backend images**, which can be found under the **System** permission group (for details, refer to [How to add a user group and grant permissions](how-to-add-a-user-group-and-grant-permissions)). To change an image specified for a Back Office element, remove the current image by clicking the **Delete** button, and then add a new one. To add a new image: Navigate to **System** > **Backend images**, and then click the **+Create** button located in the upper-right corner of the page. In the **Type** dropdown, select a Back Office element to which you want to apply a new image. The following options are available: * the main menu logo * the logo on the login page * the background image on the login page Click **Upload an image** and locate the image on your computer to assign to a selected user interface element. Click **Save** to update the specified image. You can modify the workflows of wizards used for configuring procedures that run in the B2CORE UI, such as client registration, authorization, password recovery, and others. To change a wizard workflow: Navigate to **System** > **Wizards**. Select the wizard you want to change and click the **Edit** button. Go to the **Workflow** tab. For wizards that support additional steps, you can add or remove them from the workflow: * To add a step, click **Add**, select the desired step, and click **Save**. * To delete a step, click the **bin** icon in the step row, and then confirm the deletion in the displayed popup. You can also restrict workflow steps for specific countries or client types: * Click the **Actions** button in the step row. * Select the restriction type: **Country restrictions** or **Client type restrictions**. * In the displayed popup, fill in the following fields: * In the **Type** dropdown, select the rule type: * **Allow only** — to allow the use of the step only for specific countries or client types. * **Deny only** — to prohibit the use of the step for specific countries or client types. * In the **Rules** dropdown, select one or more countries, or client types to which you want to apply the selected rule. * Set the **Enabled** option to **Yes** to apply the restriction. Click **Save** to apply the changes to the wizard workflow. [Acuity Trading](https://acuitytrading.com/) is a provider of market analysis tools and trading signals. Once configured, brokers can offer clients access to Acuity Trading research and analytics directly in the B2CORE UI. ## Acuity Trading widgets [#acuity-trading-widgets] Once connected, the following widgets become available to clients in the B2CORE UI: * **Research Terminal** — requires a trading account * **AnalysisIQ** — requires a trading account * **AssetIQ** * **Economic & Corporate Calendars** * **NewsIQ & Dynamic Emails** All widgets are hidden from the menu by default. After creating the connection, [enable the widgets](#enable-acuity-trading-widgets-for-clients) you want to offer. Before configuring a connection in the Back Office, request API access from Acuity Trading via your account manager or sign up on the [Acuity Trading website](https://acuitytrading.com/). You'll receive an API key and other credentials required for the connection. ## Configure a connection to Acuity Trading [#configure-a-connection-to-acuity-trading] To configure a connection in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name that you want to use for the connection. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. * In the **Provider** dropdown, select **Acuity Trading**. Click **Save** to create the connection. Find the newly created connection in the list and click **Edit**. On the **Edit connection** page, fill in the following fields with the credentials provided by Acuity Trading: * In the **API Key** field, enter your Acuity Trading API key. * In the **API URL** field, enter the Acuity Trading API endpoint. * In the **Salt** field, enter the salt value used to sign requests to Acuity Trading. * In the **Enabled** dropdown, select **Yes**. Click **Save** to apply the changes. Only one Acuity Trading connection can be active at a time. ## Enable Acuity Trading widgets for clients [#enable-acuity-trading-widgets-for-clients] Acuity Trading widgets are hidden from the B2CORE UI menu by default. To make them available to clients: Navigate to **Promotion** > **Menu**. Click the **eye** icon in the **General** row to view the list of menu items. Find the Acuity Trading widgets that you want to offer to clients (**Research Terminal**, **AnalysisIQ**, **AssetIQ**, **Economic & Corporate Calendars**, **NewsIQ & Dynamic Emails**) and enable the **active toggle** for each one. For more details on menu item settings, such as limiting visibility to specific [verification levels](../../back-office-guide/verification/levels) or [client types](../../back-office-guide/clients/types), see [Menu](../../back-office-guide/promotion/menu). To use the **RudderStack** platform with B2CORE and collect data on various events in the B2CORE UI, configure a connection to RudderStack. Before configuring a connection in the Back Office, you must have signed up for RudderStack and have an active account with the configured *sources*, which are places from which event data will be collected, and *destinations*, which are the platforms where you want to send your event data for analytics. You can consult the official [RudderStack documentation](https://www.rudderstack.com/docs/) or contact their support in case you have any questions. To configure a connection in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In **Name** field, enter a name that you want to use for the connection. * In the **Caption** field, enter a caption that will be applied to the platform in the Back Office. * In the **Provider** dropdown, select **RudderStack**. Click **Save** to create the connection. Find the newly created connection in the list and click **Edit**. On the **Edit connection** page, fill in the following fields: * In the **Data Plane URL** field, specify the URL for routing and processing events. * In the **Write Key** field, specify the unique identifier of your source. RudderStack uses this key to send events from a source to the specified destination. You can find these parameters on your RudderStack Homepage. RudderStack Homepage * In the **Enabled** dropdown, select **Yes**. Click **Save** to apply the changes. To use the **Zendesk** support platform with B2CORE, configure a connection to Zendesk. Once configured, clients can click the **HelpDesk** menu in the B2CORE UI or [mobile app](../../release-notes/release-notes-mobile) to be redirected to the Zendesk interface via single sign-on (SSO), eliminating the need for additional authentication. In Zendesk, they can submit and manage tickets, access live chat support, and utilize AI-powered features to receive assistance. Before configuring a connection in the Back Office, you must have signed up for Zendesk and have an active account with the configured SSO options. You can consult the official [Zendesk documentation](https://support.zendesk.com/hc/en-us) or contact their support in case you have any questions. To configure a connection in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In **Name** field, enter a unique name for the connection. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **Zendesk**. Click **Save** to create the connection. Find the newly created connection in the list and click **Edit**. On the **Edit connection** page, fill in the following fields: ### Common settings [#common-settings] * In the **Zendesk URL** field, specify your Zendesk URL, such as: `https://{your-subdomain}.zendesk.com` This URL is used by Zendesk to call API methods to verify JSON Web Tokens (JWTs) required for single sign-on from your mobile app. Ensure that this URL is also entered and saved in your Zendesk **Admin Center** while configuring SSO for the mobile SDK in **Channels** > **Mobile SDK** menu. Zendesk URL in Channels > Mobile SDK * In the **SSO Redirect URL (brand url)** field, specify the URL of the Zendesk page to which your clients will be redirected after successful authentication via single sign-on, such as: `https://{your-subdomain}.zendesk.com/hc/en-us` ### SSO Settings [#sso-settings] * In **SSO Shared Secret** field, specify the secret from Zendesk, which is used to generate JWTs required for single sign-on. This secret is generated in the Zendesk **Admin Center** during SSO configuration and must be copied from there. Shared secret in Zendesk ### Mobile SDK Settings [#mobile-sdk-settings] These settings are required only if you have a [mobile app](../../release-notes/release-notes-mobile) and need to enable SSO between your app and Zendesk. If you don't have the mobile app, these settings aren't necessary. * In the **App ID** field, specify the app identifier from Zendesk. * In the **Client ID** field, specify the client identifier from Zendesk. * In the **SDK JWT Secret** field, specify the secret generated in Zendesk, which is used to sign JWTs sent from B2CORE to Zendesk for single sign-on. All these values are generated in your Zendesk **Admin Center** when configuring SSO for the mobile SDK in the **Channels** > **Mobile SDK** menu and must be copied from there. ### Mobile SDK in Zendesk [#mobile-sdk-in-zendesk] In Zendesk **Admin Center** in **Channels** > **Mobile SDK**, insert the **JWT URL**. The URL must have the following format: `https://{your-Back-Office-URL}/api/v2/my/helpdesk/zendesk/auth/mobile/exchange` Make sure to replace `{your-Back-Office-URL}` with the domain of your B2CORE Back Office. Mobile SDK settings in Zendesk Once the necessary settings are specified in the B2CORE Back Office, select **Yes** in the **Enabled** dropdown. Click **Save** to apply the changes. If you previously used **SupportPal** as your help desk platform, refer to [How to switch from SupportPal to Zendesk](how-to-switch-from-supportpal-to-zendesk) to make sure that your clients submit new tickets only through Zendesk but can still view their SupportPal ticket history. ## How to configure the Zendesk chatbot [#how-to-configure-the-zendesk-chatbot] To use the Zendesk chatbot in B2CORE, you need to configure the widget and authentication settings in your Zendesk account. The chatbot will be displayed in the B2CORE UI, allowing clients to ask questions, quickly find the information that they need, report issues, and seamlessly switch to a live operator, all without requiring additional authentication. To set up the chatbot widget and generate the required credentials: In Zendesk Admin Center, navigate to **Channels** > **Messaging and social** > **Messaging**. Add a web widget. Copy the widget code snippet to get the **Widget Key**, which is the UUID-style identifier. The key will be required when configuring the widget settings in the B2CORE Back Office. To set up automatic authentication for clients interacting with the chatbot, navigate to **Account** > **Security** > **End user authentication**. On the **Messaging** tab, click **Create key**. Copy the values from the **Messaging Auth ID** and **Messaging Auth Shared Secret** fields. These values will be required when configuring the widget settings in the B2CORE Back Office. ## How to configure chatbot settings in the B2CORE Back Office [#how-to-configure-chatbot-settings-in-the-b2core-back-office] After configuring the chatbot in Zendesk, proceed with the respective settings in the B2CORE Back Office to enable the bot in the B2CORE UI: In the B2CORE Back Office, navigate to **System** > **External connections**. Find the existing Zendesk connection in the list and click **Edit**. On the **Edit connection** page, fill in the following fields: ### Widget Settings [#widget-settings] * In the **Enable Widget on WEB** dropdown, select **Yes** to enable displaying the chatbot in the B2CORE UI and mobile app. * In the **Widget ID** field, enter the **Widget Key** you copied from Zendesk. * In the **Widget Auth Key ID** field, enter the **Messaging Auth ID** retrieved from Zendesk. * In the **Widget Auth Key Secret** field, enter the **Messaging Auth Shared Secret** retrieved from Zendesk. Click **Save** to apply the changes. The Zendesk chatbot is now displayed in the B2CORE UI, enabling clients to quickly access support and resolve their questions. Email templates are used to notify clients and [Back Office users](../../back-office-guide/system/users/users) about specific system events. You can configure custom email templates instead of pre-configured ones. For a full list of supported event types and related pre-configured email templates, refer to [Email template types](../../back-office-guide/references/email-template-types). Some types are used to notify clients, while others are for [Back Office users](../../back-office-guide/system/users/users). To configure an email template: Navigate to **System** > **Templates** > **Email** > **Templates**. Click **+Create** in the upper-right page corner. On the **Create email template** page, fill in the following fields: * In the **Type** dropdown, select the [event type](../../back-office-guide/references/email-template-types) for which the email template will be used. For example, `accountCreated`: when a wallet or trading account (such as on the **MetaTrader** platform) is created for a client, this template will be used to send an email notification. * In the **Locale** dropdown, select the language of the email template. * In the **Enabled** dropdown, select **Yes**. * In the **Subject** field, enter the subject of the email template. * In the **Email template** field, specify the HTML layout for the email template. Click **Preview** to render the HTML and check how the template will appear in an email, ensuring there are no layout errors. If the template is enabled, it can be saved only after it is successfully rendered and displayed in the preview area. Click **Save** to create the template. The template will be used to send email notifications for the selected event type. ## How to add download links for trading terminals to email templates [#how-to-add-download-links-for-trading-terminals-to-email-templates] Adding download links for trading terminals to email templates can be helpful when sending account creation emails to clients, allowing them to easily access the required terminals. To add the download links: Navigate to **System** > **Templates** > **Email** > **Templates**. Select the required template, such as `accountCreated`, `cTraderAccountCreated`, `MatchTraderClientCreated`, or others. These templates are used to send emails to clients when accounts on the respective platforms are created. Including download links for the corresponding terminals may be useful. Click the **Edit** button to open the template details. In the **Email template** field, add the download links in HTML format. Example: ```html For Web: Open
For Windows: Download
For Mac: Download
For Linux: Download
For iOS: Download
For Android: Download
``` If using the above example, make sure to replace `{link-to-web-trading-terminal}` and `{download-link}` with the actual URLs for each trading terminal, and `{color-code}` with the desired color code for the links. You can also adjust other styles, such as `text-decoration`, as needed to match your email template design.
Click **Preview** to render the HTML and check how the template will appear in the email, ensuring there are no layout errors. If the template is enabled, it can be saved only after it is successfully rendered and displayed in the preview area. Click **Save** to apply the changes.
The email template will include the trading terminal download links, making it easier for clients to access the platforms directly from their notifications. It's possible to configure the settings in the Back Office to display download links for iOS and Android apps, along with download instructions, in the B2CORE UI. Once configured, the download button will appear on the **Sign In** page, enabling clients to download the apps without needing to sign in. Additionally, the button will be displayed at the top of the **Dashboard** after clients sign in. To configure the mobile app download settings: Navigate to **System** > **Settings**. In the **Mobile** section, configure the following settings: * In **Mobile application** dropdown, select the platforms for which you want to provide mobile app download links: * **iOS** — select this option to provide a link for downloading your iOS app from the Apple Store. * **Android** — select this option to provide a link for downloading your Android app from Google Play. * **Android APK Registry** — select this option to provide a link for downloading the Android APK. If your mobile apps for both iOS and Android are live, you can select several options. * If you selected **iOS**, specify the URL for downloading the iOS app from the Apple Store in the **iOS URL** field. * If you selected **Android**, specify the URL for downloading the Android app from Google Play in the **Android URL** field. * If you selected **Android APK Registry**, specify the universally unique identifier (UUID) of your Android APK in the **Android APK Registry ID** field. This UUID is used to generate the download link for the Android APK. If you don't have the UUID, contact your account manager for assistance. Click **Save** to apply the changes. Below is the example that shows the mobile app download button displayed on the **Sign In** page of the B2CORE UI. The download options for iOS and Android Upon clicking the button, the options for downloading the apps for the respective platforms are displayed. The download button for mobile apps on the Sign In page For Android, the APK installation instructions are detailed below. The Android APK installation steps Create bulk actions to perform specific actions in respect to multiple clients at a time. To create a bulk action: Navigate to **System** > **Bulk actions**. Click **+Create** in the upper-right corner of the page. From the **Action** drop-down list, select an action type that you want to perform as a bulk action. The following action types are available: * ban clients * change a client type * change an internal client type * change a verification level * make a deposit * zero out balances In the **Name** field, enter a name for your bulk action. In the **Description** field, enter a description for your bulk action. Click **Upload csv file** and select a CSV file that has previously been downloaded to your computer, containing the email addresses of the clients to whom the bulk action applies (for details, refer to [How to export a CSV file with email addresses](how-to-export-a-csv-file-with-email-addresses)). Depending on the bulk action type that you selected, additional fields may be displayed that you need to fill in. Click **Save** to apply the changes. The bulk action has been created and executed. To verify whether it has been executed successfully, check the **Status** column on the **Bulk actions** page. To create a request resolution type: Navigate to **System** > **Requests** > **Resolutions Types**. Click +**Create**. Fill out the form: * Set the **Name** of the type (for example, `financial`). * Set the **Caption** — the title of the type that will be displayed in the resolution types drop-down list (for example, `Financial Rejection`). * Set **Enabled** to **Yes**. Click **Save** to create the resolution type. To create a request resolution: Navigate to **System** > **Requests** > **Resolutions**. Click **+Create**. Fill out the form: * Set the **Name** of the resolution (for example, `suspicious`). * Set the **Caption** — the title of the resolution that will be displayed in the resolutions drop-down list (for example, `Suspicious Transaction`). * Set **Enabled** to **Yes**. * Select **Resolution type** from the list. The resolution type must be previously created in the system (for details, refer to [How to create a request resolution type](how-to-create-a-request-resolution-type)). Click **Save** to create the resolution. This guide is for brokers who want their clients to be able to log in or register using their Google or Apple account, in addition to (or instead of) email and password. It explains what you need to prepare on your side and what happens once you hand the information to B2Broker. This is a **joint setup**: you own the Google/Apple developer accounts and credentials, B2Broker wires them into your B2CORE instance. Nothing is enabled until both sides are done. This feature has a **one-time setup fee**. Contact your account manager or our support team to confirm the fee and availability before requesting access. ## What you get [#what-you-get] * A "Sign in with Google" and/or "Sign in with Apple" button on your login and registration pages. * New users who sign up this way are created automatically — no separate registration form. * Users who already have a password account can also link a Google/Apple account later (linking is by email address). ## Before you start [#before-you-start] * Confirm with your B2Broker account manager that social sign-in is available for your B2CORE instance. This depends on you already running on the current identity platform. * Decide **which providers** you want: Google only, Apple only, or both. Apple requires a paid Apple Developer account, so plan for that if you want it. * You will need someone on your side with access to your company's Google Cloud / Apple Developer accounts (or the ability to create new ones). ## What you need to prepare — Google [#what-you-need-to-prepare--google] 1. **A Google Cloud project.** Use an existing company project or create a new one dedicated to sign-in. 2. **OAuth consent screen.** Configure: * App name, support email, logo (this is what your users will see on the Google consent prompt). * Scopes: `openid`, `email`, `profile`. * Publishing status: while the app is in **Testing**, only explicitly added test users can sign in — anyone else gets `access_denied`. Move the app to **Published** before go-live. 3. **An OAuth 2.0 Client ID** (application type: **Web application**). * We will give you the exact **Authorized redirect URI** to register — it is tied to your B2CORE instance's hostname and looks like: ``` https:///srvsz/auth/clients/v1/self-service/methods/oidc/callback/google ``` * Add the same host (no path) as an **Authorized JavaScript origin**. 4. Copy the resulting **Client ID** and **Client secret**. ## What you need to prepare — Apple [#what-you-need-to-prepare--apple] Apple's setup has more moving parts and requires an active [Apple Developer Program](https://developer.apple.com/programs/) membership. 1. **An App ID** with the **Sign In with Apple** capability enabled (reuse an existing App ID if you have one, or create a new one). 2. **A Services ID** — this is the actual OAuth client Apple uses. When configuring it: * **Domain**: your B2CORE instance's API host (no scheme, no path). * **Return URL**: the Apple callback URL we provide, in the same shape as Google's above but ending in `/apple`. 3. **A "Sign in with Apple" private key (`.p8` file)** generated under Apple's **Keys** section, with the Sign In with Apple capability linked to your App ID. This file is only downloadable once — save it immediately somewhere safe. 4. Your **Team ID** (10-character alphanumeric, shown in your Apple Developer account header). 5. The **Key ID** of the key you created in step 3. You'll end up with five pieces of information: Services ID (client ID), Team ID, Key ID, the `.p8` private key file, and — unlike Google — there is no separate "client secret" to copy; Apple's secret is derived from the other four. ## Handing credentials to B2Broker [#handing-credentials-to-b2broker] Send us: * Google: Client ID + Client secret. * Apple: Services ID, Team ID, Key ID, and the `.p8` private key file. **Treat these as secrets** — especially the Apple private key. Send them through a secure channel your account manager provides (a secrets share link or an encrypted attachment), not plain email or chat. We'll confirm once they're stored securely on our side and let you know when the buttons are live. ## What happens next [#what-happens-next] Once we have your credentials, we enable the feature on your B2CORE instance and deploy. This typically causes a brief restart of the login service — no downtime is expected, but avoid scheduling it during peak hours. ## Testing after go-live [#testing-after-go-live] 1. Open your login page — you should see the Google/Apple button(s). 2. Sign in with a real account for each enabled provider. 3. Confirm the user lands signed in, and that their email/name look correct in your admin panel. 4. If Google is still in **Testing** mode, only test users you added to the consent screen will be able to sign in — everyone else will see `access_denied`. Publish the app before advertising the feature to real users. ## Good to know [#good-to-know] **Apple only shares the user's name and email on their very first consent.** If a user revokes your app in their Apple ID settings and signs in again later, Apple will only send back an anonymous identifier — the name may be missing from then on. This is an Apple limitation, not a bug on our side. **Apple emails may be "private relay" addresses** (`...@privaterelay.appleid.com`). These are real, working addresses — just routed through Apple. Treat them as the user's canonical email; they will not automatically match an existing password account that used the user's real email. **Google requires a verified email.** If a Google account's email isn't verified, sign-in will fail by design — this protects your user base from unverified identities. **Provider IDs are fixed** (`google`, `apple`). If you ever need to rotate credentials (for example, a leaked secret), contact B2Broker — we can update them without changing the login URLs your users already use. ## Questions / support [#questions--support] Reach out to your B2Broker account manager or support channel with your broker name and which provider(s) you're setting up. Various types of data can be exported as CSV files. This article describes how to export a CSV file containing your client email addresses. Such CSV files may be used to perform bulk actions, identifying the clients to whom bulk actions will apply. Navigate to **Clients** > **General**. You can apply filters to a clients list to display specific records that you want to export. Click **Column visibility** in the upper-right page corner. Hide all the columns except for the **Email** column. Click **Export** in the upper-right page corner. Select the CSV format. Select an export method. You can either send a CSV file to your email address or download it to your computer. The exported CSV file containing email addresses can be used to create a bulk action. To do this, open the file and remove the **Email** column header so that only email addresses are listed in the file. You can import to the Back Office data about clients, their accounts, and [IB programs](../../back-office-guide/introducing-brokers) from a CSV or TSV file. To import data: Navigate to **System** > **Import Data**. Click **+Create** in the upper-right page corner. In the **Title** field, enter a name that you want to assign to your data import operation. In the **Description** field, optionally enter a short description for your import operation. In the **Action** dropdown, select one of the following options: * `import-users` — to import client-related data * `import-accounts` — to import data about accounts for existing clients * `import-ibs` — to import IB-related data for existing clients Below, you’ll find the requirements for the necessary data and formats for each import option. In the **Delimiter** dropdown, select a delimiter character used to separate data contained in a CSV or TSV file (such as `comma`, `semicolon`, or `tab`). Click **Browse** and select a CSV or TSV file for data import. Click **Save** to start the import operation. ### The `import-users` option: [#the-import-users-option] To successfully import client-related data, a CSV or TSV file must include the Email, Last name, and First name headers. If any of these required fields are missing, the import operation will fail. Download the `template_import_users.csv` file that you can use to verify that your CSV file includes the correct headers and data formats. You can use a semicolon or tab as a delimiter instead of a comma in your file. During data import: * If an email address exists in B2CORE, client data will updated with the data from a CSV or TSV file. * If an email address doesn’t exist in B2CORE, a new client profile will be added to it. ### The `import-accounts` option: [#the-import-accounts-option] To successfully import data about client accounts, a CSV or TSV file must include the Email, Account number, Product ID, and Product currency headers. If any of these required fields are missing, the import operation will fail. Download the `template_import_accounts.csv` file that you can use to verify that your CSV file includes the correct headers and data formats. You can use a semicolon or tab as a delimiter instead of a comma in your file. During data import: * If an email address exists in B2CORE, data about client accounts will be added to it. * If an email address doesn’t exist in B2CORE, data about accounts won't be imported. ### The `import-ibs` option: [#the-import-ibs-option] The IB-related data can be imported only from a CSV file. To successfully import this type of data, a CSV file must include the IB Email, Client Email, and IB Type ID headers. If any of these required fields are missing, the import operation will fail. Download the `template_import_ibs.csv` file that you can use to verify that your CSV file includes the correct headers and data formats. You can use a semicolon or tab as a delimiter instead of a comma in your file. During data import: * If an email address specified as **IB Email** exists in B2CORE, this client will be added as an IB partner and the IB-related data will be imported for that client. * If an email address specified as **IB Email** doesn’t exist in B2CORE, the IB-related data won't be imported. After the import operation is finished, you can check its status and click the **Edit** button located in the import operation row to view the **Log messages** and **Error messages** fields listing the details about the records that were successfully imported as well as errors that occurred during import. You can import to the Back Office the data about [user groups](../../back-office-guide/system/users/groups), including the data about permissions granted to each group, from a JSON file. To import the data about Back Office user groups: Navigate to **System** > **Users** > **Groups**. Click the **Import** button located in the upper-right corner of the page. In the **Import groups** popup, click **Browse** and navigate to a JSON file containing the data that you want to import. To choose how to import the data if a file lists the same user group names as that of the existing groups, select one of the following options in the **Replace** dropdown: * **Enabled** — to replace the existing user groups with the imported user groups. * **Disabled** — to add the imported user groups to the existing ones. In this case, incremental postfixes (such as (1), (2) and so on) are added to the names of the imported user groups. If their names don’t match the existing user group names, such groups are appended to the list of Back Office user groups. Click **Save** to import the data. Use integration with [Salesforce](https://salesforce.com/) to automatically sync client data from B2CORE to Salesforce. This integration helps centralize client information, streamline internal processes, and support sales and marketing workflows within your Salesforce environment. This integration currently supports one-way data transfer from B2CORE to Salesforce; reverse syncing isn’t available. Before proceeding with the instructions, you must sign up for Salesforce and create an **External client app**, which enables external services to interact with the Salesforce API. If you have any questions, consult the official [Salesforce Help Center](https://help.salesforce.com/) or contact their support team. ## Create an External client app in Salesforce [#create-an-external-client-app-in-salesforce] To create an External client app in Salesforce: In Salesforce, go to **Settings** > **Setup**. In the **Setup** section, enter **App Manager** in the search box, and then click it in the search results. Click **New External Client App**. In the **Basic Information** section, fill in the following fields: * **External client app name** — specify the name of your B2CORE instance. If you have several instances, use different names when configuring External client apps for each one in Salesforce. * **API name** — auto-filled based on the app name. * **Contact email** — enter the email address of the contact user. * **Distribution site** — select **Local**. This setting determines who can view and authorize in the created External client app. **Local** means that it's accessible only within your organization. Expand the **API (Enable OAuth Settings)** section and select the **Enable OAuth** checkbox. * In the **Callback URL**, specify `https://login.salesforce.com/services/oauth2/success`. * In the **OAuth scopes**, select the required permissions. The minimum set for API access is: * Manage user data via APIs (api) * Perform requests at any time (refresh\_token, offline\_access) * Access the Salesforce API Platform (sfap\_api) * Select the **Introspect all tokens** checkbox (recommended). This allows the resource server to validate access tokens without calling Salesforce for every request. In the **Flow Enablement** section, select **Enable Client Credentials Flow**. In the **Security** section, select the following: * Enable Client Credentials Flow * Require secret for Web Server Flow * Require secret for Refresh Token Flow * Require Proof Key for Code Exchange (PKCE) extension for Supported Authorization Flows * Issue JWT Web Token (JWT)-based access tokens for named users Click **Save** to create the app. After creating the app, Salesforce generates the **Consumer key** and **Consumer secret**, which serve as the app’s identifier and secret key. You can find them by opening the app card, navigating to **Settings** > **OAuth Settings**, and clicking the **Consumer Key and Secret** button. The **Consumer key** and **Consumer secret** are required for configuring the connection to Salesforce in the B2CORE Back Office. ## Further External client app configuration [#further-external-client-app-configuration] After creating your External client app, proceed with the additional configuration steps: In Salesforce, go to **Setup** > **Users** > **Users** and find the contact user specified during your **External client app** registration. Open the user’s card and in the **Permission set assignments** section, add the **API Enabled permission**. Copy the name from the **Username** field. Go to **Setup** > **External Client Apps** > **External Client App Manager**, and open your app card. In the app card, go to **Policies** > **OAuth Policies** > **OAuth Flows and External Client App Enhancements**, select the checkbox **Enable Client Credentials Flow** and enter the previously copied username. In **Policies** > **OAuth Policies** > **App Authorization**, select **Expire refresh token after specific time** and fill in the following parameters: * **Refresh Token Validity Period** — set to `365`. * **Refresh Token Validity Unit** — select `Days`. * **IP Relaxation** — select `Enforce IP restrictions`. * **Named User JWT-Based Access Token Settings** — select `Set app-specific token timeout (1 Hour)`. Click **Save** to apply the changes. ## Get your Salesforce domain [#get-your-salesforce-domain] In Salesforce, go to **Setup** > **Settings** > **Company Settings** > **My Domain**. Copy the value from the **Current My Domain URL** field. The Salesforce domain is required for configuring the connection to Salesforce in the B2CORE Back Office. ## How to configure a connection to Salesforce in the B2CORE Back Office [#how-to-configure-a-connection-to-salesforce-in-the-b2core-back-office] To configure a connection to Salesforce in the B2CORE Back Office: Navigate to **System** > **External connections**. Click **+Create** in the upper-right page corner. On the **Create connection** page, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **Salesforce**. Click **Save** to create the connection. The **Salesforce** connection will appear in the list of external connections. Click **Edit** to enter the connection details and complete the following fields: * In the **Domain URL** field, provide the URL of your Salesforce instance, such as: `https://{your-domain}.my.salesforce.com` The domain URL can be found in Salesforce by navigating to **Setup** > **Settings** > **Company Settings** > **My Domain**. * In the **Consumer key** field, specify the consumer key generated by Salesforce after creating your **External client app**. * In the **Consumer secret** field, specify the consumer secret generated in the same Salesforce Connected App. The secret is used together with the **Consumer Key** to authenticate API requests. Both the **Consumer key** and **Consumer secret** can be found in the Salesforce app card by navigating to **Settings** > **OAuth Settings** and clicking the **Consumer Key and Secret** button. * In the **Company (applied to all new leads)** field, enter the company name that should appear in Salesforce when creating new lead records, which are the Salesforce records created for each client synced from B2CORE. This field is required for Salesforce. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. After configuring the connection, all clients listed under **Clients** > **General** in the B2CORE Back Office will be automatically synced with Salesforce, where each client is added as a separate lead record. Any further updates to client personal details will also be synced with Salesforce. ## Overview of client data synced with Salesforce [#overview-of-client-data-synced-with-salesforce] The following required and optional client fields are synced from B2CORE to Salesforce in lead records: ### Required fields [#required-fields] The following required client fields are always synced from B2CORE to Salesforce: * **Last name** — if not specified, `Undefined` is sent to Salesforce. * **Company** — the company name specified in the **Company (applied to all new leads)** field of the external connection configured in the B2CORE Back Office is sent to Salesforce. ### Optional fields [#optional-fields] The following optional fields, which can be useful for business processes, are synced from B2CORE to Salesforce if they are specified in the client details in the B2CORE Back Office: * **First name** * **Middle name** * **Email** * **City** * **State** * **Address** * **Postal code** * **Country** and **Country code (ISO)** * **Phone** — if multiple phone numbers are specified for a client in the B2CORE Back Office, the confirmed number is sent to Salesforce; if none is confirmed, the most recently updated number is used. ## How to add custom fields for syncing from B2CORE to Salesforce [#how-to-add-custom-fields-for-syncing-from-b2core-to-salesforce] You can sync additional fields from B2CORE to Salesforce, such as a client’s **Status**, **Verification level**, and **Client type** to reflect them in lead records in Salesforce. In **Salesforce**, add these fields: Sign in to Salesforce. Go to **Setup** > **Object Manger**. Select the **Lead** object. In the object details, select **Fields & Relationships** and click **New**. Select the filed type, such as **Text**. Enter the **Field Label**. The **Field Name** will be auto-filled based on the label. If needed, you can specify additional field parameters. Refer to the [Salesforce Help Center](https://help.salesforce.com/) for more information. Save the changes to add the new field to the object. In the **B2CORE Back Office**, set up field mapping: Navigate to **System** > **External connections**. Find the connection configured for Salesforce and click **Edit** to open the connection details. Set up the field mapping by selecting the corresponding fields created in Salesforce for **Status**, **Client type**, and **Verification level**. Set up field mapping Click **Save** to apply the changes. Once the fields are added and mapped, the client’s **Status**, **Client type**, and **Verification level** are automatically synced from B2CORE and displayed in lead records in Salesforce. If one or more fields aren't mapped, they won't be synced to Salesforce. [Amplitude](https://amplitude.com/) is an event-based analytics platform that can be configured to receive data about client activity in the B2CORE UI, **iOS**, and **Android** apps. It provides insights into engagement, retention, and financial results, helping you evaluate performance and improve your services. ## Key concepts in Amplitude [#key-concepts-in-amplitude] In Amplitude, **events** represent actions that clients perform in B2CORE, such as sign-ups, sign-ins, deposits, withdrawals, wallet creation, and many others. Each event may include **event properties** (for example, platform name, amount, currency, or others) which provide context for deeper analysis. By tracking events, you can better understand client behavior and evaluate how they interact with the B2CORE UI, iOS, and Android apps. **Default Amplitude Events** Amplitude provides a set of default events, such as **Start Session**, **End Session**, and others. These events are marked with the Amplitude logo. **B2CORE-specific events** B2CORE offers a set of pre-defined events, such as **Deposit page clicked**, **Deposit submitted**, **Verification started**, **Verification submitted**, **Wallet created**, **Feedback**, and others. These events start tracking automatically once Amplitude is connected to your B2CORE. The full list of B2CORE-specific events available for tracking is provided in the document **Tracking B2CORE Events with Amplitude**, which can be requested via your account manager. ## Sign up for Amplitude [#sign-up-for-amplitude] Sign up for Amplitude on your own by following the official [Amplitude documentation](https://amplitude.com/docs). You can start with the free version. If you have any questions, contact their support team. ## Create a project and sources in Amplitude [#create-a-project-and-sources-in-amplitude] You should create an **account** for your organization in Amplitude, then create a **project** and add **sources** that represent the origin of the data sent to Amplitude (for example, iOS, Android, Web, or Backend). Sources are added using the appropriate [Amplitude SDK](https://amplitude.com/docs/sdks/analytics) for each platform. Amplitude sources After adding sources, share the generated API keys with B2BROKER so we can complete the SDK setup for you. This setup enables event data from your B2CORE to be sent to Amplitude. ## Check incoming events for Amplitude tracking [#check-incoming-events-for-amplitude-tracking] Once sources are configured and your Amplitude project starts receiving data from B2CORE, all received events are collected in **Data** > **Events**, along with their event properties in **Data** > **Properties**. You must verify incoming events with the `Unexpected` status against the documented events in **Tracking B2CORE Events with Amplitude** to understand their meaning and either add the events that you want to track to your Amplitude plan or delete the ones you don't need. It's recommended to perform event verification carefully, taking into account your Amplitude plan limits. Some events, such as **Page viewed**, occur very frequently (for example, on every page load) and may quickly consume the monthly event quota, potentially exceeding your Amplitude plan. Add events to your Amplitude tracking plan Events included in your Amplitude tracking plan are marked as `Live` and begin tracked in real time. ## Configure data representation in Amplitude [#configure-data-representation-in-amplitude] In your Amplitude project, access the **Dashboard** on the **Home** page. By default, it includes a set of pre-defined widgets with collected data from the default Amplitude events. You can fully customize the **Dashboard** to display the information and charts that are most relevant to you. Amplitude Home ## Build charts in Amplitude [#build-charts-in-amplitude] Charts in Amplitude turn raw event data into visual insights about how clients interact with B2CORE. Each chart is based on the events you track, enabling you to monitor engagement, conversion, retention, and user distribution. This makes it easier to understand client behavior and improve your services. To create a chart, click **Create** > **Charts** and select the desired chart type. For more details on working with charts, see the official [Amplitude documentation](https://amplitude.com/docs). Below are several examples of simple charts that you can build in Amplitude. You can add charts to your **Dashboard**, share them, and export data if needed. ### Segmentation chart [#segmentation-chart] The **Segmentation** chart compares or segments your events by event properties over a selected time period. Segmentation chart The chart above shows the number of unique clients who accessed the IB room over the past year, broken down by country. ### Funnel chart [#funnel-chart] The **Funnel** chart helps you understand how clients navigate within the UI and identify potential problem areas where they tend to drop off. A common example of a funnel is analyzing sign-ups and onboarding. Funnel chart The chart above shows the conversion rate from clients who started registration to those who completed it over the past 7 days. ### User composition [#user-composition] The **User Composition** chart provides insights into the structure of your client base. Unlike event-driven analyses, this chart relies on user properties, such as country, language, platform, or account type, rather than client actions. User composition The chart above shows the distribution of registered clients across different countries, helping you understand where your clients come from and how your client base is organized. B2CORE supports embedding third-party web applications directly into the client UI via an iframe. When a custom menu item is configured with the **Iframe** behavior, B2CORE loads your application inside the interface, providing a seamless experience for clients without leaving the platform. This guide covers two aspects: configuring the custom menu item in the B2CORE Back Office, and preparing your application to work correctly inside the B2CORE iframe. ## Prerequisites [#prerequisites] Before proceeding, ensure the following: * Your application is accessible via HTTPS. * You have access to the B2CORE Back Office with the `Update menu` permission (for details, refer to [How to add a user group and grant permissions](how-to-add-a-user-group-and-grant-permissions)). * You are familiar with the [How to add custom menu items](../manage-advertising-options/how-to-add-custom-menu-items) procedure. ## Step 1. Configure your server to allow iframe embedding [#step-1-configure-your-server-to-allow-iframe-embedding] By default, most web servers and frameworks prevent pages from being embedded in iframes on other domains. To allow B2CORE to load your application, you must configure the appropriate HTTP response headers on your server. You need to set **one or both** of the following headers: ### Content-Security-Policy [#content-security-policy] The `Content-Security-Policy` header with the `frame-ancestors` directive controls which origins are allowed to embed your page. Set this header to include your B2CORE instance origin: ``` Content-Security-Policy: frame-ancestors 'self' https://portal.example.com ``` Replace `https://portal.example.com` with the actual origin of the B2CORE UI used by your clients. You can specify multiple origins separated by spaces if your application needs to be embedded across several B2CORE instances. For more information, refer to the [Content-Security-Policy documentation on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy). ### X-Frame-Options [#x-frame-options] The `X-Frame-Options` header is an older mechanism that achieves a similar result. If you use it, set it to `ALLOW-FROM` with your B2CORE origin: ``` X-Frame-Options: ALLOW-FROM https://portal.example.com ``` The `X-Frame-Options: ALLOW-FROM` directive is not supported by all browsers. It is recommended to use the `Content-Security-Policy` header with the `frame-ancestors` directive as the primary mechanism and include `X-Frame-Options` only as a fallback for older clients. For more information, refer to the [X-Frame-Options documentation on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options). ## Step 2. Add a custom menu item in the B2CORE Back Office [#step-2-add-a-custom-menu-item-in-the-b2core-back-office] To make your application accessible to clients, add a custom menu item with the iframe behavior: Navigate to **Promotion** > **Menu**. Click the **eye** icon in the **General** row to view the menu tree. Click **+Create** in the upper-right page corner. Fill in the required fields: * In the **Name** field, enter a unique name for the menu item. * In the **Caption** field, enter the label that clients will see in the menu. * In the **External URL** field, specify the URL of your application. * In the **Icon** field, specify the URL of an SVG icon (16x16 px, monochrome, transparent background). * In the **Custom Behavior** dropdown, select **Iframe**. Configure optional restrictions if needed: * To limit visibility to specific verification levels, select the appropriate levels in the **Verification Level Allowance** dropdown. * To limit visibility to specific client types, select the corresponding types in the **Client Type Allowance** dropdown. Enable the **Visible** checkbox to make the item appear in the menu. Click **Save** to add the custom menu item. When clients click this menu item, your application will load inside an iframe within the B2CORE UI. Two other behavior options are available for custom menu items: **Same tab** (opens the URL in the current browser tab) and **New tab** (opens the URL in a new browser tab). The iframe option is the only one that embeds your application within the B2CORE interface. ## Step 3 (optional). Implement the postMessage communication protocol [#step-3-optional-implement-the-postmessage-communication-protocol] If your application needs to identify the authenticated B2CORE user, match the B2CORE UI theme, or follow the language selected by the user, you can implement the `postMessage` communication protocol described below. This step is optional — if your application does not require user authentication, theme synchronization, or language synchronization, you can skip it. ### Message reference [#message-reference] #### Messages from your application to B2CORE [#messages-from-your-application-to-b2core] | Message type | Description | Payload | | ------------------------- | -------------------------------------------------------------------- | ------------------------------------- | | `embed-iframe-ready` | Signals that the iframe has loaded and is ready to receive messages. | `{ type: "embed-iframe-ready" }` | | `embed-request-jwt-token` | Requests a JWT authentication token from B2CORE. | `{ type: "embed-request-jwt-token" }` | #### Messages from B2CORE to your application [#messages-from-b2core-to-your-application] | Message type | Description | Payload | | ----------------------- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | `embed-theme-change` | Sent whenever the B2CORE UI theme changes (and once immediately after `embed-iframe-ready`). | `{ type: "embed-theme-change", theme: "dark-theme" \| "light-theme" }` | | `embed-language-change` | Sent whenever the B2CORE UI language changes (and once immediately after `embed-iframe-ready`). | `{ type: "embed-language-change", lang: "" }` | | `embed-jwt-token` | Successful response to a token request. | `{ type: "embed-jwt-token", token: "", expiresAt: "" }` | | `embed-jwt-token-error` | Error response when token generation fails. | `{ type: "embed-jwt-token-error", error: "" }` | | `embed-logout` | Sent when the B2CORE user logs out. Any token previously issued to your app is now invalid. | `{ type: "embed-logout" }` | The `lang` field contains a lowercase ISO 639-1 language code (for example, `en`, `de`, `ar`) matching the language currently selected in the B2CORE UI. A JWT token issued via `embed-jwt-token` is bound to the B2CORE user who was signed in at the time it was issued. When that user logs out, B2CORE sends `embed-logout` and the token must no longer be used. Discard any cached token, stop scheduled refreshes, and clear user-specific state on receipt of this message. If a different user then signs in, request a new token with `embed-request-jwt-token` — a fresh token is issued for the new user. ### Communication flow [#communication-flow] The sequence of messages between your application and B2CORE follows this pattern: **Signal readiness.** When your page finishes loading, send the `embed-iframe-ready` message to B2CORE. This tells the host that your application is ready to receive data. **Receive the current theme.** B2CORE responds with `embed-theme-change` containing the current theme (`dark-theme` or `light-theme`). Apply the theme to your UI. You will also receive this message whenever the user switches themes. **Receive the current language.** B2CORE also responds with `embed-language-change` containing the language code currently selected in the B2CORE UI (for example, `en` or `ar`). Apply the corresponding locale to your UI. You will receive this message again whenever the user changes the language. **Request an authentication token.** When you need to identify the current user, send `embed-request-jwt-token`. B2CORE responds with either `embed-jwt-token` (containing the JWT and its expiration time) or `embed-jwt-token-error` if token generation fails. **Refresh the token before expiry.** The JWT has an expiration time provided in the `expiresAt` field (ISO 8601 format). Request a new token before the current one expires to maintain uninterrupted access. **Handle logout.** When the B2CORE user logs out, B2CORE sends `embed-logout`. On receipt, discard the cached token, cancel any scheduled refresh, and clear user-specific state so no data leaks to the next user. If another user signs in afterwards, request a fresh token with `embed-request-jwt-token`. ### Code example [#code-example] A complete JavaScript snippet you can include in your application: ```javascript (function () { const B2CORE_ORIGIN = '*'; // Replace with your B2CORE instance origin for production let currentToken = null; let tokenRefreshTimer = null; // --- Send a message to B2CORE --- function sendToHost(message) { window.parent.postMessage(message, B2CORE_ORIGIN); } // --- Handle incoming messages from B2CORE --- function handleMessage(event) { const data = event.data; if (!data || !data.type) return; switch (data.type) { case 'embed-theme-change': applyTheme(data.theme); break; case 'embed-language-change': applyLanguage(data.lang); break; case 'embed-jwt-token': handleToken(data.token, data.expiresAt); break; case 'embed-jwt-token-error': console.error('Token error from B2Core:', data.error); break; case 'embed-logout': handleLogout(); break; } } // --- Apply theme to your UI --- function applyTheme(theme) { document.documentElement.setAttribute('data-theme', theme); } // --- Apply language to your UI --- function applyLanguage(lang) { document.documentElement.setAttribute('lang', lang); } // --- Handle received JWT token --- function handleToken(token, expiresAt) { currentToken = token; // Schedule a refresh 2 minutes before expiry if (tokenRefreshTimer) { clearTimeout(tokenRefreshTimer); } const refreshIn = new Date(expiresAt).getTime() - Date.now() - 2 * 60 * 1000; if (refreshIn > 0) { tokenRefreshTimer = setTimeout(requestToken, refreshIn); } else { requestToken(); } } // --- Request a JWT token from B2CORE --- function requestToken() { sendToHost({ type: 'embed-request-jwt-token' }); } // --- Handle B2CORE user logout --- function handleLogout() { // The token is bound to the user who just logged out — stop using it. currentToken = null; if (tokenRefreshTimer) { clearTimeout(tokenRefreshTimer); tokenRefreshTimer = null; } // Clear any user-specific state in your app here. } // --- Initialize --- window.addEventListener('message', handleMessage); sendToHost({ type: 'embed-iframe-ready' }); requestToken(); })(); ``` Replace the `B2CORE_ORIGIN` value with the actual origin of your B2CORE instance (for example, `'https://portal.example.com'`) in production. Using `'*'` is acceptable during development only, as it allows any origin to communicate with your application. ### TypeScript type definitions [#typescript-type-definitions] If your application is built with TypeScript, you can use the following type definitions: ```typescript type EmbedTheme = 'dark-theme' | 'light-theme'; // Messages: Your App -> B2CORE interface EmbedIframeReadyMessage { readonly type: 'embed-iframe-ready'; } interface EmbedRequestJwtTokenMessage { readonly type: 'embed-request-jwt-token'; } type EmbedOutboundMessage = EmbedIframeReadyMessage | EmbedRequestJwtTokenMessage; // Messages: B2CORE -> Your App interface EmbedThemeChangeMessage { readonly type: 'embed-theme-change'; readonly theme: EmbedTheme; } interface EmbedLanguageChangeMessage { readonly type: 'embed-language-change'; readonly lang: string; // ISO 639-1 code, e.g. "en", "de", "ar" } interface EmbedJwtTokenMessage { readonly type: 'embed-jwt-token'; readonly token: string; readonly expiresAt: string; // ISO 8601 } interface EmbedJwtTokenErrorMessage { readonly type: 'embed-jwt-token-error'; readonly error: string; } interface EmbedLogoutMessage { readonly type: 'embed-logout'; } type EmbedInboundMessage = | EmbedThemeChangeMessage | EmbedLanguageChangeMessage | EmbedJwtTokenMessage | EmbedJwtTokenErrorMessage | EmbedLogoutMessage; ``` ## Step 4 (optional). Validate the JWT token [#step-4-optional-validate-the-jwt-token] The JWT token issued by B2CORE can be validated against the JSON Web Key Set (JWKS) endpoint exposed by the B2CORE API (Admin Panel backend). This is typically the API/admin domain, not the client-facing UI domain: ``` https://api./.well-known/jwks.json ``` Use this endpoint to retrieve the public keys needed to verify the token signature. Most JWT libraries support JWKS-based validation out of the box. For manual inspection during development, you can decode and verify JWT tokens using the [JWT decoder tool](https://dinochiesa.github.io/jwt). **See also** [How to add custom menu items](../manage-advertising-options/how-to-add-custom-menu-items) [How to configure a menu in the B2CORE UI](../manage-advertising-options/how-to-configure-a-menu-in-the-b2core-ui) [Menu](../../back-office-guide/promotion/menu) To maintain granular access control, you can allow Back Office users, such as admins or managers, to see only specific clients. You should have a Back Office user created and assigned to a particular user group (for details, refer to [How to add an admin user](how-to-add-an-admin-user) and [How to add a user group and grant permissions](how-to-add-a-user-group-and-grant-permissions)). To make a Back Office user see only specific clients: Navigate to **System** > **Users**. Select the user who you want to be able to see only specific clients. Click the **Edit** button located in the user row. In the **Allowed Client Tags** dropdown, select one or more tags identifying the clients that should be visible to the user (for details, refer to [How to assign tags to clients](../manage-clients/how-to-assign-tags-to-clients)). Click **Save** to apply the changes. The selected Back Office user is now allowed to see only the clients who have been assigned specific tags. The following instruction explains how to migrate clients and their related data, including personal information, accounts, and KYC documents, from an external CRM to B2CORE. The migration process includes importing all required client data, with documents uploaded as digital resources and securely linked to the corresponding client profiles in B2CORE. It's strongly recommended to test the import functionality in a sandbox environment before running a full migration with actual client data. This allows you to understand the process, verify data requirements, and identify any limitations, helping to ensure a safe and error-free migration to production. To migrate clients and their related data to B2CORE: ## Import clients and their personal information [#import-clients-and-their-personal-information] Import the client list and required personal information using the `import-users` option, which is available by navigating to **System** > **Import Data**. For details, refer to [How to import client-related data](how-to-import-client-related-data) and specifically the [import-user option](how-to-import-client-related-data#the-import-users-option). ## Import client accounts [#import-client-accounts] Once clients are imported, proceed to import their account information using the `import-accounts` option, which is also available by navigating to **System** > **Import Data**. For details, refer to [How to import client-related data](how-to-import-client-related-data) and specifically the [import-accounts option](how-to-import-client-related-data#the-import-accounts-option). ## Migrate client KYC documents [#migrate-client-kyc-documents] Transfer documents submitted by clients for KYC verification, such as ID cards, passports, or other types, to B2CORE using the B2CORE API, via the endpoint: `POST` `[host]/api/v2/documents` The B2CORE API is restricted and *not* publicly available. Access to the API and its documentation must be requested via a support ticket, including a clear and detailed description of your intended use cases. By following these steps, you ensure a structured, accurate, and secure migration of client data into B2CORE, minimizing errors and preserving data integrity. Since the middle of July 2026, B2CORE provides new registration settings that replace Registration wizards. The new registration settings work together with custom fields, so you can build a registration process tailored to your needs — from a simple form with an email address and a password to a multi-step process with custom fields. The new registration settings are more flexible and easier to maintain than Registration wizards and the Advanced Data step, which were built for tech-savvy users and were harder to support. If you have mobile applications, do not turn off or delete the existing Registration wizards. End users with older app versions installed cannot register without them. We will monitor the usage of the Registration wizards and remove them in a future release, so keep them as is for now. ## Migration overview [#migration-overview] To migrate to the new registration settings, complete the following steps: 1. Optionally, set up custom fields for any information you want to collect beyond the standard profile fields. 2. Create a registration profile in **System** > **Registration** and configure its fields, options, terms, and custom fields. 3. Enable the registration profile and verify the registration process in the B2CORE UI. ## Step 1. Set up custom fields (optional) [#step-1-set-up-custom-fields-optional] Complete this step only if your registration process requires information beyond the standard fields. To collect standard fields alone, such as an email address, a password, and a phone number, skip to [Step 2](#step-2-create-a-registration-profile). To manage custom fields, navigate to **System** > **Custom Fields**. This menu contains two pages: * **Groups** — sections that organize related fields, such as Personal Information, Tax Information, or Economic Profile. * **Fields** — the individual fields, each belonging to a group and defined with a type, a label, and validation rules. Groups page in the System > Custom Fields menu Fields page in the System > Custom Fields menu To add a field, click **+Create** on the **Fields** page, then enter the label, select the group, set validation rules such as **Required**, and, for select fields, add the options that clients choose from. Field creation form with label, group, validation, and options For details on creating and managing custom fields, refer to [Custom fields](../../back-office-guide/system/custom-fields). ## Step 2. Create a registration profile [#step-2-create-a-registration-profile] To create a registration profile: Navigate to **System** > **Registration**. Click **+Create** in the upper-right page corner, then select the profile type to create, such as an individual registration profile. In the **General Settings** section, fill in the following fields: * **Caption** — the profile name displayed to clients as the registration option on the **Sign up** page in the B2CORE UI. * **Status** — set to **Enabled** to make the profile available on the **Sign up** page, or **Disabled** to hide it. * **Register As (Client Type)** — the client type assigned to clients who register through this profile, such as individual or corporate. * **Verification Level** — the initial verification level assigned to clients after registration. In the **Fields Configuration** section, enable the standard fields that clients fill in during registration, such as **Email**, **Password**, **First Name**, **Last Name**, **Country**, and **Phone**, and disable the fields you do not need. In the **Registration Options** section, select the options to apply, such as **Require age 18+**, which validates the **Birthday** field, and **Require email confirmation**. General settings, fields configuration, and registration options for a registration profile In the **Countries Blacklist** section, select the countries to hide from the **Country** selects in this registration form. The selected countries stay enabled globally on the **Countries** page but are not offered to clients who register through this profile. Use this option to restrict the country choice for a specific registration profile without affecting other areas of B2CORE. To block a country everywhere at once, disable it on the **Countries** page instead — see [How to block registration for a country](how-to-block-registration-for-a-country). In the **Terms & Conditions** section, click **+Add Term** to add each agreement that clients accept during registration, then set its translation key and fallback caption. The fallback caption supports links, so you can point clients to a Customer Agreement or another document. In the **Custom Fields** section, select the custom fields to show in the registration form. * By default, custom fields are displayed on multiple pages, grouped by the groups you set up in Step 1. * To show all custom fields on a single registration step, select **Don't split fields by groups**. To show a custom field only when another field has a specific value, use the **Conditional Display** section. Click **+Add Rule**, select the field to show, the field to check, and the value that triggers it. Both fields must also be selected in the **Custom Fields** section. Terms and conditions, custom fields, and conditional display for a registration profile Click **Save** to create the registration profile. ## Localize fields and terms [#localize-fields-and-terms] Fill in all captions, custom fields, and terms and conditions in English first, then translate them into the languages you support in B2TRANSLATE. To transfer the translatable keys to B2TRANSLATE, click **Copy B2TRANSLATE keys JSON** in the upper-right corner of the registration profile page. The button copies the translatable keys for all custom fields and terms and conditions in the profile as JSON, which you then paste into B2TRANSLATE to translate into every language you need. ## Step 3. Verify the registration process [#step-3-verify-the-registration-process] After you set the profile status to **Enabled**, the corresponding registration option is displayed to clients on the **Sign up** page in the B2CORE UI. Complete a test registration to confirm that the fields, options, and custom fields behave as expected. The values that clients fill in for custom fields are available for each client in the **Clients** > client profile > **Custom fields** tab in the B2CORE Admin Panel, where an admin can also view and edit them. Keep the existing Registration wizards enabled until you no longer support the older mobile app versions. For details on the previous approach, refer to [How to set up the Registration wizard](how-to-set-up-the-registration-wazard). **See also** * [Custom fields](../../back-office-guide/system/custom-fields) These instructions explain how to set up 2FA services in the Back Office, enabling your clients to use Google Authenticator or SMS for 2FA in the B2CORE UI to secure their profiles. ## How to set up 2FA with Google Authenticator [#how-to-set-up-2fa-with-google-authenticator] To provide your clients with the option to use Google Authenticator for 2FA in the B2CORE UI, configure the following settings in the Back Office: Navigate to **System** > **Settings** and configure the following options in the **Two-factor authentication** section: * **Enabled Two-factor auth providers** — select **Google Authenticator** to make this 2FA option available to your clients in the B2Core UI. * **Google authenticator service name** — enter a name (for example, your company name) that will be displayed to clients in the Google Authenticator app. This name can be changed if needed. For more details, refer to [Settings](../../back-office-guide/system/settings). Verify the configuration of the related wizards: * **2FA Google Authenticator** * **2FA Google Auth** Ensure these wizards are enabled and have no restrictions: * Navigate to **System** > **Wizards**. * Find the required wizard and click **Edit**. * Go to the **Workflow** tab. * For each wizard step, click **Actions**, then select **Country restrictions**, **Client type restriction**, or **Jurisdiction restriction**. * In the **Restrictions** popup for each option, confirm that **Enabled** is set to **No**. Clients can now enable and use 2FA via Google Authenticator in the B2CORE UI to secure their profiles. ## How to set up 2FA with SMS [#how-to-set-up-2fa-with-sms] Before setting up 2FA with SMS, make sure that you have added and configured a 2FA SMS provider (such as [Twilio](../manage-communication-platforms/how-to-configure-twilio) or Vonage). To provide your clients with the option to use 2FA via SMS in the B2CORE UI, configure the following settings in the Back Office: Navigate to **System** > **Settings** and configure the following options: In the **Client settings** section: * **Unique phone** — select **Enabled** to ensure phone numbers are unique for each client. In the **Other settings** section: * **Confirmation phone code lifetime** — specify the period, in seconds, during which a verification code sent to a client phone number is valid. * **Sms limit for each recipient** — specify the maximum number of verification code messages that can be requested by a client per day. In the **Two-factor authentication** section: * **Enabled two-factor auth providers** — select **SMS** to make this 2FA option available to your clients in the B2Core UI. For more details, refer to [Settings](../../back-office-guide/system/settings). Create a template for delivering 2FA codes via SMS: * Navigate to **System** > **Templates** > **Sms** > **Confirmation Templates**. * Click **+Create** in the upper-right page corner. * On the **Create template** page, fill in the following fields: * In the **Name** field, enter `default`. * In the **Caption** field, enter a name that you want to use for the template in the Back Office (such as `2FA SMS`). * In the **Template** field, specify the message text, such as: `: Your verification code is %CODE%.` * Click **Save** to save the template. Verify the configuration of the related wizards: * **2FA SMS** * **2FA SMS Auth** * **Phone Confirm** Ensure these wizards are enabled and have no restrictions: * Navigate to **System** > **Wizards**. * Find the required wizard and click **Edit**. * Go to the **Workflow** tab. * For each wizard step, click **Actions**, then select **Country restrictions**, **Client type restriction**, or **Jurisdiction restriction**. * In the **Restrictions** popup for each option, confirm that **Enabled** is set to **No**. Clients can now enable and use 2FA via SMS in the B2CORE UI to secure their profiles. In addition, you can enable client phone number confirmation during registration by delivering verification codes via SMS (for details, refer to [How to add and configure the registration wizard](how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard)). ### How to test operation of 2FA with SMS [#how-to-test-operation-of-2fa-with-sms] After you have configured 2FA with SMS in the Back Office, you can test its operation as follows: Sign in to the B2CORE UI. Click the profile icon in the upper-right page corner, and then select **Security** in the dropdown. In the **Two-factor authentication** section, enable the **SMS Confirmation** option. Enter your phone number in the displayed form. Click **Continue**. If you have received a verification code to a specified phone number, 2FA with SMS operates properly. You can configure a connection to the Apple Push Notification service (APNs) to enable your deployed [iOS app](../../b2core-mobile/deploying-your-ios-app) to send push notifications when the following events occur: * a deposit request is created * a request to update a client's verification level is created * an existing announcement is updated * a HelpDesk response is received To configure a connection to the APNs: Navigate to **System** > **External Connections**. Click **+Create** in the upper-right corner of the page. On the **Create connection** field, fill in the following fields: * In the **Name** field, enter a name for the connection. The name must be unique. * In the **Caption** field, enter a caption that will be applied to the connection in the Back Office. * In the **Provider** dropdown, select **ApplePushNotification**. Click **Save** to create the connection. The **ApplePushNotification** connection will appear in the list of external connections. Click **Edit** to enter the connection details and complete the following fields: * In the **App key id** field, enter the key identifier of your iOS app. * In the **App team id** field, enter the identifier assigned to your development team after enrolling in the Apple Developer Program. * In the **App bundle id** field, enter the bundle identifier of your iOS app. * In the **Private key content** field, enter your private key required to access and authenticate communication with the APNs. * In the **Production** dropdown, select **Yes** to enable your iOS app to send push notifications. Check the connection status. If the connection is inactive (**No** is displayed in the **Enabled** field), activate it by setting the **Enabled** dropdown to **Yes**. Click **Save** to apply the changes. Push notifications will now be delivered to clients who have installed and signed in to your iOS app. You can set up event notifications to be sent to [Back Office users](../../back-office-guide/system/users/users) through the following channels: email, SMS, Slack, or Telegram. ## Prerequisites [#prerequisites] The following prerequisites are required before setting up event notifications: * If you plan to send event notifications through Slack or Telegram, create and configure a corresponding bot, and then specify the bot token in the **Slack bot** or **Telegram bot** field on the **System** > **Settings** page. To learn how to obtain the bot tokens, refer to [How to set up a Slack bot](../manage-communication-platforms/how-to-set-up-a-slack-bot) and [How to set up a Telegram bot](../manage-communication-platforms/how-to-set-up-a-telegram-bot). * If you plan to send event notifications as direct Slack or Telegram messages to Back Office users, specify for each user their Slack and Telegram identifiers in the **Slack chat Id** and **Telegram chat Id** fields on the [Back Office user details page](../../back-office-guide/system/users/users#details). To learn how to get a user’s Telegram identifier, refer to [How to get Telegram chat, group and channel identifiers](../manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers). * Create notification templates for each channel through which you plan to deliver event notifications. To do this, navigate to **System** > **Templates**, and then select a channel for which you want to create templates. To view the examples of email, SMS, Slack, and Telegram templates, refer to[Templates](../../back-office-guide/system/templates/). After fulfilling the prerequisites, set up an event notification as follows: Navigate to **System** > **Event Notifications**, and click **+Create** in the upper-right corner of the page. In the **Event** dropdown, select an event for which you want to trigger notifications when the event occurs (for details, refer to [Event types for triggering event notifications for Back Office users](../../back-office-guide/references/event-types-for-triggering-event-notifications-for-back-office-users)). In the **Description** field, specify a short description for the event notification. In the **Users** field, specify the email addresses of Back Office users that will receive notifications. To add all Back Office users to the list of notification recipients, click **All users**. Enable one or several channels to deliver notifications. The available options: **Email**, **Sms**, **Slack,** and **Telegram**. * After enabling the **Email** or **Sms** option, expand the **Template** dropdown and select a notification template. Email and Sms notification options * After enabling the **Slack** or **Telegram** option, do the following: * Select **Private** to send notifications to the recipients as direct Slack or Telegram messages. The messages are sent to the chats that are specified in the **Slack chat Id** and **Telegram chat Id** fields on the [Back Office user details page](../../back-office-guide/system/users/users#details). * Select **Group** to send notifications to a specific group or channel. * In the displayed **Group Id** field, specify the identifier of a group or channel to which notifications will be delivered (for details, refer to [How to get Telegram chat, group, and channel identifiers](../manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers)). * In the **Template** dropdown, select a notification template. Slack and Telegram notification options In the **Enabled** dropdown, select **Enabled** to send notifications after the selected event occurs. Click **Save** to save the notification settings. When switching from SupportPal to Zendesk, you aim for clients to submit new tickets only through Zendesk but still be able to view their SupportPal ticket history. To prevent clients from submitting new tickets via SupportPal while allowing them to view their existing tickets: Navigate to **System** > **External connections**. Locate the connection with `SupportPal` in the **Provider** column and click **Edit**. On the **Edit connection** page, set the **Read-only** option to **Yes**. Click **Save** to apply the changes. This guide is for brokers who want another application — your own product, a partner's app, or an identity platform like Keycloak — to let users sign in with their existing B2CORE account, instead of building a separate login. B2CORE acts as the **OpenID Connect (OIDC) identity provider**. Your application (the relying party) redirects users to B2CORE to log in, and gets back a token proving who they are. Users authenticate once against their B2CORE identity; they do not create a separate account for your app. This enables **single sign-on (SSO)**: users sign in once with their B2CORE account and gain access to your connected application without a separate login. This feature has a **one-time setup fee**. Contact your account manager or our support team to confirm the fee and availability before requesting access. ## Is this the right fit? [#is-this-the-right-fit] Use this if: * You have a web or mobile app and want a "Sign in with B2CORE" option. * You want to federate B2CORE into another identity system you already run (for example, add B2CORE as an identity provider inside your own Keycloak realm). This is standard OAuth2 / OIDC — any mainstream library or identity platform (Keycloak, Auth0, `oidc-client-ts`, `openid-client`, `go-oidc`, Passport, NextAuth, and others) can consume it, since everything the client needs is published in one discovery document. ## What you need to decide before requesting access [#what-you-need-to-decide-before-requesting-access] Have answers to these ready — your account manager will ask for them when registering your application: | Item | What we need | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Application name** | A short, human-readable name (for our records and any consent screen). | | **Redirect URI(s)** | The exact URL(s) in your app that should receive the login response, for example `https://app.example.com/auth/callback`. Must be exact — scheme, host, path, and trailing slash all matter. | | **Post-logout redirect URI(s)** | Where users land after logging out, for example `https://app.example.com/`. | | **Scopes** | `openid` is always required. Add `profile` and `email` if you need the user's name/email. Add `offline_access` only if you need long-lived refresh tokens. | ## What you'll receive from us [#what-youll-receive-from-us] Once your application is registered, you'll receive: * A **Client ID** (matches the application name you provided). * A **Client Secret**, delivered through a secure channel. Store it the way you'd store a database password; it does not expire but can be rotated on request (see [Good to know](#good-to-know)). * The OIDC discovery URL for your B2CORE instance: ``` https:///srvsz/auth/hydra/v1/.well-known/openid-configuration ``` Point your OIDC library at this single URL — it will discover the authorization, token, userinfo, JWKS, and logout endpoints on its own. You should not need to hard-code any of the individual endpoints. ## Integrating your application [#integrating-your-application] 1. Configure your OIDC client library with the discovery URL, Client ID, and Client Secret above. 2. Use the **Authorization Code flow with PKCE** if your library supports it (recommended for both web and mobile apps). 3. Request only the scopes you actually need — `openid` at minimum, plus `profile`, `email`, and `offline_access` as applicable. 4. For the user's profile info, call the `/userinfo` endpoint (or decode the `id_token`) rather than trying to read anything out of the `access_token` — the access token is opaque and not meant to be parsed. 5. To log a user out, redirect them to the discovery document's `end_session_endpoint` with `id_token_hint` and your registered `post_logout_redirect_uri`. **Federating instead of integrating a custom app?** If you're adding B2CORE as an identity provider inside another identity platform you run (for example, Keycloak) rather than a custom app, configure it as a generic OpenID Connect provider using the same discovery URL, Client ID, and Client Secret above — the exact steps depend on your platform. Some platforms use a fixed callback URL tied to a provider alias you choose (Keycloak's broker endpoint is one example); if yours does, agree on that alias with us before we register your redirect URIs, since they must match exactly. ## Good to know [#good-to-know] **Logout is local only.** Redirecting to the logout endpoint ends the session for your app; it does not sign the user out of B2CORE itself or any other app they're signed into. There is no cross-app "logout everywhere" today. **Refresh tokens are one-shot.** Each refresh returns a new refresh token that replaces the previous one — don't reuse an old one after refreshing. **Redirect URIs must match exactly.** Add any local/dev URLs you need during testing to your initial request; changing them later means contacting us again. **Rotating your Client Secret** requires contacting B2Broker support. There is a short window between us generating the new secret and you updating your app where logins with the old secret will fail — plan the swap for low-traffic hours. ## Testing after setup [#testing-after-setup] 1. Trigger the login flow from your application (or your identity platform, if federating) and confirm it redirects through B2CORE's login page. 2. Log in with a real B2CORE account and confirm you land back in your app, signed in, with the expected user info. 3. If you requested `offline_access`, test a token refresh. 4. Test the logout flow and confirm it clears your app's session. ## Questions / support [#questions--support] Reach out to your B2Broker account manager or support channel with your broker name and the application details from the [table above](#what-you-need-to-decide-before-requesting-access). {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} You can temporarily block a partner. Blocked partners don't receive rewards, their referral links can't be used. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner that you want to block and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set **Enabled** to **No**. Click **Save** to block the partner. You can **unblock** the partner any time: set **Enabled** back to **Yes**. You can also permanently delete a partner by clicking in the list. Note that this action **can't be undone**. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, select a new partnership program from the **IB type** dropdown. Click **Save** to apply the changes. **See also:** * [How to configure personal rewards](how-to-configure-personal-rewards) * [How to configure a Master IB](how-to-configure-a-master-ib) Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set **Master** to **Yes**. Set **Number of Master levels** — a number of levels which you want to reward for this partner. Defaults to **100**. Set **Master Level Ratio** — a fixed multiplier for any level within *Master IB max level* value. Click **Save** to apply the changes. The **Level 1** with the multiplier **1** is configured by default for any IB type. You can modify it. To create the next level: Go to **Introducing Brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Navigate to the **Levels** tab. Click **Create**. Set level **Ratio**, which is a reward multiplier. Click **Save** to apply the changes. Go to the **Preferences** tab. Click **Save** to apply the changes. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set the **Personal ratio** value — a personal multiplier which will be used for rewards calculations. Click **Save** to apply the changes. This article is intended for clients who already have an API driver configured for Converter. To configure a driver for the Converter to B2CORE API v2.x on your IB instance, follow the steps below: Add a new admin user by navigating to **System** > **Users** > **Users**. Click **+Create** and fill in the required fields. Refer to [How to add an admin user](https://docs.b2core.b2broker.com/how-to-articles/manage-system-settings/how-to-add-an-admin-user) for details. Select **Administrators** in the **Groups** dropdown. Navigate to **Introducing Brokers** > **Platforms** > **Platforms**. Select the platform for which you're configuring a driver. Go to the **Drivers** tab and click **Create**. Fill in the following fields: * **Provider** — select **API** in the dropdown. * **Name** — enter **API**. * **Server** — specify the Back Office base URL in the following format: `{baseUrl}/api/v2`. For example, `test.com/api/v2`. * **Login** — enter the newly added admin user's email that you specified at Step 1. * **Password** — enter the newly added admin user's password that you specified at Step 1. * **Version** — specify the version of a driver. Click **Save** to add the Converter driver to your IB instance. Go to **Introducing Brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Go to the **Tiers** tab. Click **Create**. Enter the **Name** of the tier. Set required number of **Active traders** to receive increased rewarding. Set the value to **0** to ignore this parameter in reward calculations. Set required amount of **Trading volume, in lots** to receive increased rewarding. Set value to **0** to ignore this parameter in reward calculations. Set required amount of **Trading volume, in USD** to receive increased rewarding. Set value to **0** to ignore this parameter in reward calculations. Set tier **Ratio** — rewards multiplier for the partners who have reached volume/clients goals for a tier period. Click **Save** to apply the changes. Go to the **Preferences** tab and set **Tier period** in days — the number of days in which amounts set on the previous step must be achieved by a partner to receive increased rewarding. Click **Save** to apply the changes. How reward calculation applies a tier: * A partner qualifies for a tier only if **all three** configured conditions (active traders, trading volume in lots, trading volume in USD) are met — a condition set to **0** is always satisfied and does not block qualification. * If a partner qualifies for more than one tier, the tier with the **highest ratio** is applied, not the first one configured. * The tier period is measured from the trade that triggers the reward, not from today: the window is the tier period ending the day **before** that trade (the trade's own day is not included). * If the tier period is not set (or is 0 or less), the payment fails validation and no reward is paid. * A partner with no sub-accounts (no clients in their chain) always gets zero traders/volume metrics, so they can only qualify for a tier where every condition is set to 0. It's assumed that a connection to cTrader has already been configured in the B2CORE Back Office by the admin who is assigned the permissions to manage external connections and platforms. To configure a cTrader connection to an IB instance, do the following: Navigate to **Introducing Brokers** > **Platforms** > **Platforms**. Click **Create** and fill in the following fields: * **Provider** — select **cTrader** from the dropdown. * **Platform** — select **cTrader** from the dropdown. * **Name** — specify the platform name. Click **Save** to apply the changes. Click the **Edit** button located in the row of the newly created cTrader platform. The **Preferences** tab displays the cTrader configuration settings specified when a connection to this platform was set up in the B2CORE Back Office. Switch to the **Drivers** tab and click **Create**. Configure a connection to a synchronizer database. This is a MySQL database that stores the data collected from the cTrader platform. To establish the connection, fill in the following fields: * **Provider** — select **PDO** from the dropdown. * **Name** — specify the name of a synchronizer database. * **Server** — specify the address of a synchronizer database. * **Login** — enter the username for connecting to a synchronizer database. * **Password** — enter the password for connecting to a synchronizer database. * **Version** — specify the version of a synchronizer connection driver. The currently supported version is `3`. Click **Save** to connect the **cTrader** platform to an IB instance. Before creating a new type, make sure that the following necessary parameters are configured and enabled in the Back Office: * Navigate to **Products** > **Products** and check that at least one product with type **Partner** is created and enabled. You can use filter by type for quick search. If there is no product with this type, [create one](how-to-set-up-a-wallet). Go to **Introducing brokers** > **Program** > **Types**. Click **Create**. The **Preferences** tab of the Type details will open. Click **Save** to apply the changes. In the **Name** field, enter a partnership program name. In the **Description** field, enter a partnership program caption. This can be, for example, conditions for participation. From the **Registration** dropdown, select an option of joining a partnership program: * **Auto**: Each client signing up to the B2CORE UI automatically becomes a partner. If multiple partnership programs are available, an IB account is created for each program. * **Public**: Clients can see available partnership programs in the B2CORE UI and can apply for it. For this type of registration, **Approvement** option is available and enabled by default, which means that clients join a partnership program only after their [joining requests](#user-content-fn-1)[^1] are approved by a Back Office admin. If the option is disabled, the partner can access the IB Room immediately after the registration. * **Private**: Clients are added to a partnership program by a Back Office admin. Applying via the B2CORE UI is unavailable. * **Inherited**: Clients are added to a partnership program automatically if the partner who referred them already participates in this program. Applying via the B2CORE UI is unavailable and the program isn't visible to clients. If the referring partner doesn't participate in the program, or a client signs up without a referral link, no IB account is created. The **Approvement** option isn't available for this type of registration, since the program is assigned by the system rather than requested by a client. * **Restricted**: Clients can join a partnership program only using a link provided by a participant of another or the same program. Specify the program identifier in the **Restriction** field. For this type of registration, **Approvement** option is available and enabled by default, which means that clients join a partnership program only after their [joining requests](#user-content-fn-2)[^2] are approved by a Back Office admin. If the option is disabled, the partner can access the IB Room immediately after the registration. From the **Product** dropdown, select a product. From the **Currency** dropdown, select a currency. Click **Save** to apply the changes. [^1]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/back-office-guide/clients/requests). [^2]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/back-office-guide/clients/requests). ## Generate a QR code [#generate-a-qr-code] Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. Go to the **Links** tab and click a link in the **Landing page** column. At the bottom of the page, you can see the **Change color** and **Add icon** dropdowns. There are two default background colors — black and white. You can customize colors, see [below](how-to-generate-a-qr-code#customize-colors) for details. Icon is optional, you can ignore this field, but remember that using an icon for QR codes can increase the number of scans by 2-3 times. You can customize icons, see [below](how-to-generate-a-qr-code#customize-icons) for details. Use the **Click to generate QR code** button to create a QR code. You can copy your QR code by clicking **Copy Embed** or download it to your device by clicking **Download QR Code**. ## Customize colors [#customize-colors] Navigate to **Introducing brokers** > **Promo** > **QR Codes** > **Colors**. Click **Create** to create a new color and fill out the form: * **Name** — enter the name of the color. * **Background color** — enter the HEX code of the background. * **Foreground color** — enter the HEX code of the foreground. Click **Save** to save a new color. The color is now available in the dropdown of colors when creating a QR code. ## Customize icons [#customize-icons] Navigate to **Introducing brokers** > **Promo** > **QR Codes** > **Icons**. Click **Create** to create a new icon and fill out the form: * **Name** — enter the name of the icon. * **Icon** — attach the icon file. Make sure your icon is a PNG image and its size is from 128 x 128 to 512 x 512 and less than 100 KB. Click **Save** to save a new icon. The icon is now available in the dropdown of icons when creating a QR code. To import data: ## Prepare a CSV file to import [#prepare-a-csv-file-to-import] The file must contain the following fields: Download the `template_import_ibs.csv` file that you can use to verify that your CSV file includes the correct headers and data formats. You can use a semicolon or tab as a delimiter instead of a comma in your file. ## Create an import operation [#create-an-import-operation] 1. Go to **System** > **Import data**. 2. Click **+Create** in the upper-right page corner. ## Fill out the form [#fill-out-the-form] 1. In the **Title** field, enter a name that you want to assign to your data import operation. 2. In the **Description** field, optionally enter a short description for your import operation. 3. From the **Action** dropdown, select `import-ibs` — to import IB-related data for existing clients. 4. In the **Delimiter** dropdown, select a delimiter character you used to separate data in your prepared CSV file (such as `comma`, `semicolon`, or `tab`). ## Upload the CSV file [#upload-the-csv-file] Click **Browse** and select your prepared CSV file for data import. ## Run the data import [#run-the-data-import] Click **Save** to start the import operation. Mind that all fields in the CSV file are required. If any of the fields are missing, the import operation will fail. During the data import: * If an email address specified as **IB Email** exists in B2CORE, this client will be added as an IB partner and the IB-related data will be imported for that client. * If an email address specified as **IB Email** doesn’t exist in B2CORE, the IB-related data won't be imported. After the import operation is finished, you can check its status and click the **Edit** button located in the import operation row to view the **Log messages** and **Error messages** fields listing the details about the records that were successfully imported as well as errors that occurred during import. To create a partner profile: Go to **Introducing brokers** > **Program** > **Introducing brokers**. Click **Create**. Enter the **Email** of the client who is registered in the B2CORE UI. If the client hasn't yet registered in the B2CORE UI, you can create the profile. From the **Type** dropdown, select a partnership program. Click **Save** to apply the changes. Go to **Introducing brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Go to the **Symbols** tab. Select the symbol for which you want to configure payment preferences and click . For a quick search, you can filter symbols by a platform, trading group, symbol name, and other criteria. From the **Payment plan** dropdown, select an option for reward calculation. For detailed descriptions, refer to [Payment plans](../payment-plans). Remember that available payment plans depend on the platform. Depending on the selected payment plan, fill in corresponding fields (see [below](how-to-set-up-a-payment-plan-for-symbols#payment-plan-settings)). In the **Position** field, select the positions for which you want to calculate the reward amount: open, close, or both. In the **Apply** field, select whether to apply the specified settings to the current symbol or to a trading group. Click **Create** to apply the changes. ## Payment plan settings [#payment-plan-settings] * Indicate the **Percentage** of the received commission that you want to pay to your partners. For example, **10** means 10%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. * Select the **Currency** in which rewards will be paid. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * Specify the **Amount** that you want to pay your partners for each lot traded by their clients. Positive integer and decimal values greater than or equal to 0 (zero) are supported. Keep in mind that you must monitor profitability using this scheme as the reward amounts may exceed the commissions charged. For this payment plan you need to preliminary configure a required amount of levels. Refer to [How to configure levels](how-to-configure-levels) for step-by-step instructions. * Select the **Currency** in which rewards will be paid. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * In the **Amount** field, specify the max amount of the reward. This is the amount that will be paid to partners for trades of their direct clients (Level 1: *IB* → *Direct client*). Positive integer and decimal values greater than or equal to 0 (zero) are supported. * Click links below the **Amount** field to specify the exact amounts that partners receive at each level. The number of links depends on the number of configured levels. In the example below, 3 Levels are configured for the IB type. Therefore, you can see two links: * distribution of the **Max amount** between 2 levels (*IB* → *SubIB* → *Client*) * distribution of the **Max amount** between 3 levels (*IB* → *SubIB* → *SubIB* → *Client*) Max amount Refer to [Max amount](../payment-plans#max-amount) for a distribution example. * Specify the **Markup**, in points, that you want to pay your partners for each lot traded by their clients. Positive integer values greater than or equal to 0 (zero) are supported. * In the **Markup, %** field, specify your markup on the trading platform. This value is required for correct calculations of reward amounts. * In the **Percentage** field, indicate a percentage of your markup (**Markup, %**) that you want to pay your partners for each lot traded by their clients. Positive integer and decimal values greater than or equal to 0 (zero) are supported. * Indicate the **Percentage** of the market spread value that you want to pay to your partners. For example, **10** means 10%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. The **Position** field is automatically set to **closed** and cannot be changed. * Indicate the **Percentage** of the platform spread value that you want to pay to your partners. For example, **50** means 50%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. The **Position** field is automatically set to **closed** and cannot be changed. * The markup percentage is automatically retrieved from the trading platform's symbol configuration and used in reward calculations. A **Wallet** is a partner account, to which all partner rewards are credited. Before creating a partner product, navigate to **Products** > **Platforms** and make sure that **Personal** platform is enabled. Go to **Products** > **Products**. Click **Create** and select **eWallet** from the dropdown. The **Create product** popup will open. From the **Platform group** dropdown, select **eWallet**. From the **Currency** dropdown, select a currency in which you want to pay rewards to your partners. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. In the **Name** field, enter a wallet name. It can be the same as currency for your convenience. Select **Group**. From the **Factory** dropdown, select **100** if a wallet is denominated in currency subunits (for example, cents); otherwise, leave the default value **1**. From the **Type** dropdown, select **Partner**. Click **Save**. The **Info** tab of the Product details will open. Set the **Caption**, which will be displayed in the B2CORE UI. Set localizations if needed. Set **Status** to **Enabled**. Grant permissions: select required **Rights** or check **eWallet** in the **Group rights**. Set **Max accounts** to **-1**. Click **Save** to apply the changes. Go to **Platforms** > **Groups** and confirm that the cent trading group already exists for the platform. If it doesn't, create it on the trading platform side first. In the B2CORE Back Office, go to **Products** > **Product Currencies** and open the product currency linked to the cent account. Set **Factory** to **100**. This value marks the product currency as a cent one. Go to **Platforms** > **Groups**, open the cent group, and set **Lot size** to **0.01** — matching the platform's 1:100 contract-size ratio for cent accounts. Apply these steps in order: **Platform group** → **Product currency (Factory)** → **IB group (Lot size)**. If the Lot size step is skipped or done before the others, calculated volumes and rewards come out 100x too high. ## Reward rate [#reward-rate] Once **Lot size = 0.01** is set for the group, reuse the existing per-standard-lot reward rate as-is — don't rescale it manually. Lot size already accounts for the 1:100 ratio, so rescaling the rate too would double-count it (e.g. a $2 per-lot rate doesn't need to become $0.02). ## Notes [#notes] * No new IB type, reward currency, or separate wallet is required for a cent account — the existing setup and reward plan can be reused. * The reward/wallet currency isn't hardcoded to USD — it follows the platform group's **Payment currency**. * A separate "cent" currency (e.g. USC) doesn't need to be created or enabled anywhere — cent-ness is determined only by the product currency's **Factory** field. This article covers two common scenarios for managing client structures in the IB system: * Transferring an entire client tree from one IB to another. * Transferring an individual client from one IB to another. You can also reassign clients and sub-IBs between IBs directly on the [Reassign Users](../back-office-guide/program/reassign-users) page, without exporting and importing IB-related data. ### Before you start [#before-you-start] * Ensure you have proper backup of client data. * Confirm that the destination IB exists and is active. * Always verify exports before deleting source IBs. ## Transferring the entire client structure from one IB to another [#transferring-the-entire-client-structure-from-one-ib-to-another] Use this method to move all clients or SubIBs from one Introducing Broker to another while preserving all relationships and data. This scenario requires the **mandatory removal of the source IB** from which clients are being transferred. Go to **Introducing brokers** > **Program** > **Introducing brokers** and open the profile of the source IB (`IB1`). On the **Clients** tab, export all first-level clients under `IB1`. Export only first-level clients. All lower-level clients will be automatically transferred with their relationships preserved. After confirming the export is complete, delete `IB1` from the system. Import IB data, as described here: [How to import IB-related data](how-to-import-ib-related-data). In your CSV file, specify the following: * In the **IB Email** column, the email address of the destination IB (`IB2`). * In the **Client Email** column, the email addresses of clients exported from `IB1`. * In the **IB Type ID** column, the identifier of the desired IB type. To find IB type IDs, go to **Introducing brokers** > **Program** > **Types** and export the existing types. The required IDs will be available in the exported file. Upload the CSV file and complete the import process. All clients will be transferred to `IB2` with their transaction data, reward information, and subordinate client relationships intact. ## Moving a particular client from one IB to another [#moving-a-particular-client-from-one-ib-to-another] Use this method to transfer an individual client or SubIB from a source IB to a target IB while preserving all their data. Identify the current IB under which the client is located (`IB1`) and determine the target IB where the client should be moved (`IB2`). Go to **Introducing brokers** > **Program** > **Clients** and remove the client from `IB1`. Go to **Introducing Brokers** > **Program** > **Introducing brokers** and select the target `IB2`. On the **Clients** tab, click the **Create** button to add the client. On the **Clients** tab, enter the client's email address to create them under the target `IB2`. The system will automatically preserve all transaction and reward information during this process. Verify that the client has been successfully moved to the target `IB2` with all their historical data intact. ## Set up IB [#set-up-ib] ## Create your IB program [#create-your-ib-program] ## Manage partners [#manage-partners] ## Other [#other] On the **Partner Dashboard** page (labeled **Dashboard** on some stands), you can find a set of widgets displaying the data related to the partnership programs you've joined. In the dropdown located at the top of the page, select a partnership program for which you want to display widgets. The set and layout of widgets displayed may vary depending on the broker configuration. The following widgets are available: **Wallet** View the total balance of your rewards in your wallet, as well as the total rewards earned. In the widget, you can click **Withdraw** to navigate to the **Funds** > **Withdraw** page and withdraw a desired amount from your wallet, or you can click **Transactions** to navigate to the **Transactions** tab of the [Reports](reports/transactions) page, listing reward payments related to a selected partnership program. *** **Partner Link** View the details of your referral link. You can select a **Landing Page** (currently, only **Sign Up** is available) and a **Language** (select **Global** for a non-localized link), then copy the generated link. *** **CPA Program** Track the CPA (Cost Per Acquisition) program activity for a selected period. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. If there is no CPA program activity for the selected period, the widget displays an empty state. *** **Savings Rebates** Track savings-rebate activity for a selected period. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. *** **Trading Report** Monitor the number of your active traders, trading volume, and the amount of paid rewards. You can select a period for which you want to display the data, such as **Day**, or apply a custom period by selecting the start and end dates in the date range field. The report table includes the following columns: **Date**, **Active Traders**, **Trades**, **Trading Vol.**, **Reward Amount**. *** **Acquisition Report** Track the number of clicks on your referral links or promo banners and the number of registrations made after clicking your referral materials. The widget displays a chart showing **Clicks** and **Registration** trends. The report table includes the following columns: **Date**, **Clicks**, **Registrations**. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. *** **Rewards by Symbol** Monitor the rewards generated per traded symbol. The report table includes the following columns: **Symbol**, **Trades**, **Volume (Lots)**, **Reward/Lot**, **Reward Amount**. Depending on the broker configuration, this menu section may be labeled **IB Room** or **Partners** in the B2CORE UI. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} In this guide, we'll cover the primary features and functionalities of IB. The **Interface overview** provides a general description of the Back Office interface and its main controls. The following pages mirror the structure of the **Introducing brokers** menu in the Back Office. Each page includes a detailed explanation of a corresponding Back Office section, listing the available fields, applicable filters, limits, value ranges, and so on. This guide serves primarily as a reference and isn't focused on explaining specific user scenarios in detail. However, the guide pages contain cross-references to relevant how-to articles (step-by-step tutorials) and include links to other materials that may be helpful. The Back Office user interface is uniform across all pages, ensuring consistent look and feel and featuring a common set of basic options. ## The top bar options [#the-top-bar-options] At the top of a typical Back Office page, you can find a top bar with the following elements: * — click it to expand or collapse the main menu. * — click it to see the events that were scheduled for Admins in the **Event Calendar**. The number of upcoming events is displayed on a counter badge. * — click it to see pending client requests. The number of new requests is displayed on a counter badge. * **Language** **menu** — click it to select the interface language. * **User profile pane** — click this panel to access the **Log out** button. ## Common buttons and icons [#common-buttons-and-icons] The following buttons can be found on most Back Office pages. * the **Create** button — used to add a new entry. * the **Export** button — used to export table data to a CSV file. * the **Import** button — used to import an XLSX or a CSV data file. * — used to apply custom filters. * — used to reset custom filters. * — used to access details. * — used to delete an entry. Page elements may serve as hyperlinks which can be clicked to drill down to details. Access to this data is maintained based on the permissions assigned to a particular user group. ## Filtering [#filtering] Throughout the Back Office, the data is typically organized in tables that can be filtered. You can specify multiple criteria for filtering column data. When filtering is available, the appropriate input fields are displayed in column headers. The inputs vary depending on a data format, such as text, number, date, time, or list. To facilitate filtering by date, two fields for the start and end dates may be displayed so that you can define a time period. To enable or disable filters, click and buttons. ## Sorting [#sorting] In the Back Office, you can sort the data available in tables. The columns by which you can sort data are marked with displayed in column headers (no arrows are displayed when sorting isn't available). You can click these arrows to sort data in an ascending () or descending () order, by a single column at a time. ## Pagination [#pagination] You can display table data across multiple pages and specify how many records to display on a page. You can also view the total number of records found. To open the previous or next page, click the left or right arrow. ## Export and import [#export-and-import] Some Back Office pages support data export to CSV files. This option is available on pages that contain an **Export** button above the data table. The data in a resulting file matches the applied sorting and filtering criteria. To export page data to a CSV file, click the **Export** button. Some Back Office pages also support importing of CSV and XLSX files. This option is useful when you need to update the symbol settings for a partnership program. To import data, click the **Import** button, choose the file that you want to import and click **Open**. ## Localizations [#localizations] In the B2CORE Back Office, you can configure fields that support localizations to have multiple language options in the B2CORE UI. Using the **localization** buttons, you can set translations for these fields into different languages. To set localizations, click the **Localization** button next to the field, enter the translation in the supported languages and click **OK**. Note that only enabled localizations are displayed. You can enable or disable localizations in the **System** > **Localizations** section. View the following information for each process: **Date** The date and time when a process started running. *** **Process name** The name of a process. Possible values: * **Clear Cache** (`cache`) — clears cache for the specified time period. * **Cancel Payments** (`cancel`) — reverts reward payments. * **Create Payments** (`payments`) — initiates reward payments. * **Process Payments** (`transactions`) — processes reward transfers. * **Run Automation** (`schedule`) — runs consequentially the full process cycle (Sync Symbols + Sync Groups + Sync Trades + Create Payments + Process Payments + Sync Accounts). * **Run Diagnostics** (`diagnostics`) — runs diagnostics of IB services. * **Sync Accounts** (`accounts`) — runs synchronization of [accounts](platforms/accounts) with trading platforms. * **Sync Groups** (`groups`) — runs synchronization of [groups](platforms/groups) with trading platforms. * **Sync Symbols** (`symbols`) — runs synchronization of [symbols](platforms/symbols) with trading platforms. * **Sync Trades** (`trades`) — runs synchronization of [trades](platforms/trades) with trading platforms. *** **Memory** The amount of memory used by a process. *** **CPU Time** The time which it took a process to run. *** **PID** The process identifier. *** **Exit code** The process result. Possible values: * **0** — the process completed successfully. * **1** — the process wasn't completed due to errors. * **2** — the process was gracefully stopped due to service maintenance. On this page, you can monitor the synchronization pipelines that keep IB data in sync with trading platforms. To run a synchronization manually, click the **Run process** button. The following information is provided about each pipeline run: **Date** The date and time when a pipeline run started. *** **Platform** The trading platform for which the synchronization was run. *** **Steps** The synchronization steps included in the pipeline run. *** **Status** The current status of the pipeline run. The weekly calendar view displays the pipeline runs by day of the week. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} To manage translations, you must be assigned the *Editor* permission. You can't edit translations in **DEMO** projects. To add a new translation or edit the existing one: On the **Projects** page, click the project name. From the language dropdown above the table, select a required language. Only languages supported for the project are available. Locate a required key. To locate a key, click the **magnifying glass icon** and start typing the key name or translation in the search field, or use [filters](../filter-keys). Enter a translation in the **Custom translation** field. The field supports HTML autocomplete and syntax highlighting. You can [use variables](use-variables-in-translations) and [handle plural forms](handle-plural-forms) if available. You can also request enabling [AI translations](translate-with-ai) for your projects. The changes are saved automatically. In this article, you'll learn how to enable the editing mode in the WebUI of your product. This feature will help you easily find out the identifier of any translation key on a page. ### Activate the editing mode [#activate-the-editing-mode] You can activate the editing mode on any page of your product WebUI: In the browser address bar, append `?showTranslateEditor=true` to the page URL and press *Enter*. You will see the corresponding notification at the top of the page. Enable the editing mode You can switch between WebUI pages: the editing mode remains active until you disable it by clicking the **Exit editing mode**. ### Copy a key [#copy-a-key] In this mode, all available translations on the page are marked with **pencil icons**. Note that elements not shown by default will become visible when hovered over. Select a translation you want to edit and click the **pencil icon** near it to copy its key to the clipboard. Copy the key identifier ### Locate the key [#locate-the-key] 1. In B2TRANSLATE, on the **Projects** page, select your project. 2. Click the **magnifying glass icon** and paste the copied value to the search field. The key list will be automatically filtered by the key identifier. Now you can edit the translation. Refer to [Add or modify translations](add-or-modify-translations) for details. You can copy translations from another project included in the same project type. In the target project, the translations are added only to keys without translations (the **Custom translation** field is empty). Existing translations (the **Custom translation** field isn't empty) aren't overwritten. You must be assigned the *Editor* permission in the target project and at least the *Viewer* permission in the source project. To copy translations: On the **Projects** page, click the name of a project to which you want to copy translations. From the language dropdown above the table, select a required language. Click **Import keys** in the page header. Import keys In the **Import keys** popup, check the selected platform (if applicable) and language. From the **Import from project** dropdown, select a project from which you want to copy the translations. Only projects containing the selected platform (if applicable) and language and where you're assigned at least the *Viewer* permission are displayed. Select a source project to import keys from Click the **Import** button. If needed, repeat for other languages. ### Export translations to a CSV file [#export-translations-to-a-csv-file] 1. On the **Projects** page, click the project name. 2. From the language dropdown above the table, select a required language. 3. Mark the checkboxes for the keys that you want to copy. Mark the upper checkbox to select all. 4. From the **Bulk actions** dropdown appearing above the table, select **Download CSV**. Download CSV Alternatively, you can download **all** project keys: 1. On the **Projects** page, select a project and click the **three dots**. 2. Select **Download CSV**. 3. Select a required platform (if applicable) and language. 4. Click **Download**. The CSV file will be downloaded to your computer. ### Edit translations in the CSV file [#edit-translations-in-the-csv-file] Mind the following: * Edit only values in the `translation` column. * Only a comma (`,`) or a semicolon (`;`) can be used as a separator. Attention: If you use Pages by Apple Inc. to edit your file, it may sometimes add extra semicolons to the first row, potentially affecting file upload. * For multi-word translations containing spaces, use quotes (`"My new translation"`). * If there is no `originalDefaultTranslation`, then the custom translation is always ignored. * If the `languageDefaultTranslation` and the custom translation are the same, then the custom translation is ignored. * In other cases, the custom translation is updated. ### Import the CSV file [#import-the-csv-file] 1. Get back to the translation page of your project. 2. Click **Upload CSV** in the page header. Upload CSV 3. Select a required language. 4. Drag and drop the file into the upload area or click **Add file** to select the file from your computer. The maximum allowed file size is 3 MB. Add CSV file 5. Click **Upload**. 6. Refresh the page to see the translations uploaded. Alternatively, you can upload the file from the project list: 1. On the **Projects** page, select a project and click the **three dots**. 2. Select **Upload CSV**. 3. Select a required platform (if applicable) and language. 4. Drag and drop the file into the upload area or click **Add file** to select the file from your computer. 5. Click **Upload**. B2TRANSLATE's pluralization feature enables accurate translation of quantity-dependent strings across different languages. This guide explains how to work with plural forms when translating content that changes based on quantity. ## Understanding plural forms [#understanding-plural-forms] Different languages have varying rules for plural forms. While English typically uses two forms (singular and plural), other languages may require multiple forms based on complex grammatical rules, for example: * **English**: 1 file, 2 file**s**, 5 file**s** * **Russian**: 1 файл, 2 файл**а**, 5 файл**ов** B2TRANSLATE automatically determines the required plural forms based on your target language and displays the appropriate input fields. ## The Pluralization panel [#the-pluralization-panel] When working with pluralized keys, you'll see the dedicated **Pluralization** panel containing multiple input fields, each representing a different plural form for your target language. Pluralization panel ### The Other form [#the-other-form] This is the primary required form used across all languages worldwide. Every pluralized translation must include this form as it serves as the fallback for any unspecified cases. If you fill only the **Other** form and leave the others empty, B2TRANSLATE will automatically populate the remaining forms with the **Other** form value. This ensures your translation remains functional while you work on completing all forms. On the translation page of your project, this form is displayed in the **Translation** field for keys with plural forms. ### Default value [#default-value] Under each plural form input field, you'll see the default value (typically the English source text). The display logic works as follows: * If your target language has more plural forms than the source language (for example, Russian with 4 forms vs English with 2), default values will only appear under the corresponding number of forms. * When no default translation is present in your target language, only English translations are displayed, maintaining the existing logic. ## Translation workflow [#translation-workflow] ### Access the Pluralization panel [#access-the-pluralization-panel] On the **Translations** page, click the **three dots** (View details) for a desired key. You'll see the **Pluralization** tab where applicable. If not, only the **Info** tab is available. ### Fill in the plural forms [#fill-in-the-plural-forms] 1. Start with translating the **Other** form, as this is required for all languages. If you fill only the **Other** form and leave the others empty, B2TRANSLATE will automatically populate the remaining forms with the **Other** form value. This ensures your translation remains functional while you work on completing all forms. 2. For languages requiring multiple forms, ensure every field is properly filled before saving. Though this step isn't mandatory, leaving some fields empty may result in incomplete translations depending on your target language requirements. Fill in plural forms ### Save changes [#save-changes] All modifications within the **Pluralization** panel must be saved manually using the **Save changes** button. The system will not automatically save changes as you type, allowing you to work on multiple forms before committing your translations. ## Best practices [#best-practices] When working with plural forms, consider the following: * **Review all forms together**: Since all forms for a key are displayed simultaneously, use this opportunity to ensure consistency in terminology and style. * **Use contextual guidance**: Each form includes labels and tooltips explaining when that particular form should be used. * **Test with numbers**: Consider how your translations will appear with different quantities (1 item, 2 items, 5 items, 100 items). * **Complete all required forms**: Ensure all forms are filled for languages that require complete sets. * **Verify Other form**: Always provide a translation for the **Other** form as it serves as the universal fallback. * **Save regularly**: Remember to manually save your changes using the **Save changes** button. You can copy translations to another project included in the same project type. The translations from a source project are assigned to the same keys in a target project. You must be assigned the *Editor* permission in the target project and at least the *Viewer* permission in the source project. If translations in the target project already exist, they'll be **overwritten**. To copy translations: On the **Projects** page, click the name of a project from which you want to copy translations. From the language dropdown above the table, select a required language. Mark the checkboxes for the keys that you want to copy. Mark the upper checkbox to select all. From the **Bulk actions** dropdown appearing above the table, select **Send translations**. Send translations In the **Send translations** popup, mark one or more projects to which you want to copy the selected translations. Only projects containing the selected language and where you're assigned the *Editor* permission are displayed. Select target projects to import keys to Click **Send**. B2TRANSLATE offers integration with ChatGPT for translating keys. This option isn't provided by default, but should be requested for individual projects. Contact your account manager to request access. AI translations are available for all languages, excluding English (the default language). You must be assigned the *Editor* permission for adding and editing translations with AI. To translate with AI: On the **Projects** page, click the project name. From the language dropdown above the table, select a required language. Only languages supported for the project are available. Make sure the **Translate with AI** button is active (highlighted in blue), indicating the AI translating is enabled for the current project. Otherwise, if the **Translate with AI** button is inactive (grayed out) request access from your account manager. Translate with AI enabled Click the **Translate with AI** button. If the **Source** translation is empty, AI translation is unavailable. The **Source** value will be translated to your selected language and added to the **Custom translation** field. Certain keys support variables for translations. These variables are replaced with actual values calculated during product operation. If a key supports variables, they are displayed under the **Custom translation** field. Click the variable to include it in the translation. Each variable can be included only once. Alternatively, the variables can be omitted to use a less detailed message. ## Example [#example] The keys on the picture below support variables. When the message is displayed in the WebUI, the variables are replaced with the actual links. Translation variables You can configure cashback reward programs for clients who trade on MT4/5. The cashback is rewarded for the volumes traded on MT accounts over a day, based on closed positions, and deposited to clients the following day. For example, the cashback for the volumes traded on May 24 is rewarded to clients on May 25. From the **MetaTrader Volume** menu, you can access the **MetaTrader 4** and **MetaTrader 5** pages to configure cashback programs for each platform. Each page is divided into two tabs: * [Preferences tab](preferences-tab) * [Tiers tab](tiers-tab) On this tab, you can configure the following settings of a cashback reward program for MT4 or MT5: **Enabled** If **Enabled**, the cashback program is enabled for the MT4 or MT5 platform; otherwise, **Disabled**. *** **Cashback value (per lot)** The fixed rate per each traded lot. The cashback value can be denoted as an integer or decimal value. The cashback amount is calculated as follows: `Cashback amount = Cashback value * Number of traded lots` *** **Cashback currency** The cashback program currency. The cashback is calculated only for the volumes traded on MT accounts denominated in the cashback program currency. In addition, this is the currency in which the cashback is paid to clients. To receive the earned cashback, a client must have an account of the `trade` or `personal` type, denominated in the cashback program currency. For example, the cashback rate is 0.7 and the cashback program currency is USD. For the volume of 10 lots traded on the MT account denominated is USD, the cashback is calculated as follows: `0.7 * 10 = 7` The cashback of 7 USD is rewarded to the owner of the MT account. *** **Account destination type** The type of the account to which the cashback is rewarded: * **Trade** — the cashback is rewarded to the client’s MT trading account on which the volume taken for cashback calculations has been traded. * **Personal** — the cashback is rewarded to the client’s account of the `personal` type, such as a wallet, denominated in the cashback program currency. If the **Personal** account type is selected, ensure that your clients have personal-type accounts in the required currency; otherwise, the earned cashback can’t be deposited to them. By default, the **Trade** account type is selected. *** **Ignored symbols groups** A list of ignored symbols. The trades made in the selected symbols are excluded from cashback calculations. *** **Accounts platform groups allowance** A list of MT account groups. By default, all the account groups configured on the MT platform are selected. If the **Accounts number allowance** field is empty, all the MT trading accounts included in the groups selected in **Accounts platform groups allowance** field are rewarded the cashback. *** **Accounts number allowance** A comma-separated list of MT account numbers. By default, the list is empty. If one or more MT account numbers are listed in this field, only the listed accounts are rewarded the cashback and the **Accounts platform groups allowance** option is ignored. *** **Updated** The date when the cashback program was last modified. **See also** [How to configure cashback programs for MT4 and MT5](../../../how-to-articles/manage-cashback-options/how-to-configure-cashback-programs-for-mt4-and-mt5) On this tab, you can manage the tiers that determine the increased cashback rates for clients who have traded certain volumes over a day. View the following information about each cashback reward tier: **Name** The tier name. *** **Trading volume, lots** The volume, in lots, that must be traded in order to receive the increased cashback. *** **Cashback value** The increased cashback rate that is used instead of the rate specified on the **Preferences** tab if the volume traded on an MT account over a day has reached the required tier volume. *** **Created at** The date and time when the tier was created. *** **Updated at** The date and time the tier was last modified. **See also** [How to add cashback reward tiers](../../../how-to-articles/manage-cashback-options/how-to-configure-cashback-programs-for-mt4-and-mt5#how-to-add-cashback-reward-tiers) On this tab, you can view a list of client's [accounts](../accounts). To view details of a specific account, click the **Edit** button in the corresponding row. On this tab, you can find additional information provided by a client during registration. The fields displayed on this tab depend on the [Registration wizard configuration](../../system/wizards#registration-wizard) This tab is visible by default. Here, you can find information about a particular client and view the client profile details, such as profile status and verification level. The grayed-out fields are disabled and cannot be edited (most of them are system fields and filled automatically). Use caution when customizing the following fields because this may affect a client’s permissions: * **Email** — this field is disabled by default. This email address is used by a client to log in to the system. To enable editing a client’s email, click the **Edit** button. To view the previous email addresses specified for a client, switch to the [History tab](history-tab) and select the **Email change history** option. * **Birthday** — this field is disabled by default. To enable editing a client’s date of birth, click the **Edit** button. A user must be at least 18 years old to be allowed to use the system. * **Status** — the current [status](../../references/client-statuses) of a client profile. * **Client type** — the [type](../types) of a client profile. * **Manager** — the client’s [manager](../managers). The scope of activities that a client is allowed to perform may vary depending on the client department and their assigned manager. * **Verification level** — the [verification level](../../verification/levels) obtained by a client. This level determines the scope of activities that a client is allowed to perform. * **Client Rights** — the [client rights](../../system/client-rights) assigned to a client, which determine the actions available to the client in the B2CORE UI. * **Client Tags** — the tags assigned to a client, which are used to sort the client list displayed to [Back Office administrators](../../system/users/). These tags have no effect on client permissions. * **Risk level** — the risk level assigned to a client, which may determine the scope of activities that the client is allowed to perform. On this tab, you can also add a picture to a client profile by clicking the **Edit** button located in the picture frame and selecting the required image. The added picture will be displayed in the client profile in the B2CORE UI. On this tab, you can view, add, and edit text notes, or comments, related to a particular client. These comments are displayed only in the Back Office. Your clients won't receive any notifications upon adding these comments. The following information is displayed about each internal comment: **Comment** The text of an internal comment about a client. *** **Date** The date and time when a comment was added. *** **Creator** The administrator who added a comment. *** **Last Editor** The administrator who has last edited a comment. On this tab, you can view a list of a client’s addresses and phone numbers as well as add the required contact information by clicking the **+Add** button. ## Addresses [#addresses] In this section, the following information is provided: **Address type** The type of address: * **Residential** — the client’s primary living address. * **Billing** — the address associated with billing or invoices. * **Mailing** — the address where correspondence is sent. * **Birth place** — the location where the client was born. * **Legal** — the official address used for legal purposes. *** Details of the address, such as **Country**, **City**, **State**, **Postal code**, and street address. ## Phones [#phones] In this section, the following information is provided: **Phone** The client's phone number provided during registration (if your registration procedure requires phone numbers) or added by a Back Office user. *** **Confirmed** * **Yes** — indicates that this phone number was the last one confirmed by the client via SMS. For example, if two phone numbers are provided and the client confirms the first one, it is marked as confirmed. If the client later confirms the second number, the second number becomes confirmed, and the first number is marked as unconfirmed. * **No** — indicates that the phone number is unconfirmed. *** **Default** This field is deprecated and no longer in use. *** phone-button — the **phone** icon The option to dial the specified client's phone number from the Back Office. To use this option, a phone service provider, such as Twilio, must be configured (for details, refer to [How to configure Twilio](../../../how-to-articles/manage-communication-platforms/how-to-configure-twilio)). *** delete_button — the **bin** icon This option is available if you're granted the `Update clients` permission, which includes the ability to edit client information on the **Contacts** tab. By clicking the icon, you can delete any added phone numbers, including the confirmed phone number. After removing a confirmed phone number, a client can add and confirm a new phone number to associate with their profile. Once removed, the phone number becomes available for registering a new client profile, assuming that your registration procedure requires [phone numbers to be unique](../../system/settings#client-settings). On this tab, you can view and edit the values of [custom fields](../../system/custom-fields) specified for a client. The fields are organized by the [custom field groups](../../system/custom-fields#groups) configured in your system. Select a group to view and edit the fields it includes. The set of available fields and groups depends on the custom fields configured in **System** > **Custom Fields**. On this tab, you can view a list of devices from which a client was logged in to the B2CORE UI. This list indicates the client IP address, the date and time of the last login, device operation system, client browser, and device fingerprint data (including a canvas code picture) containing detailed information about the device from which a client has logged in to the B2CORE UI. On this tab, you can view a list of documents that a client submitted for [verification](../../verification/). **ID** The document identifier in the Back Office. *** **Type** The [document type](../../verification/document-types). *** **Status** The current[ status of a client request](../../references/client-request-statuses) for document approval. *** **Request ID** The identifier of a client’s document approval request. *** **Uploaded by** Indicates who uploaded the document. *** **Uploaded at** The date and time when the document was uploaded. **See also** [How to use the KYC constructor](../../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor) On this tab, you can view and manage files related to a particular client. By default, the folder tree on this tab reflects the structure of [system client folders](../../system/client-folders). As a more advanced approach to storing files, you can create and then manage custom folders, taking into account the following considerations: * A folder tree can be of any nesting depth. * Predefined folders cannot be deleted on this tab. * You can view only those predefined system folders to which you were granted access. If a system folder is created with the same name as that of a custom folder of some client, a `_Custom` postfix is added to the custom folder name, and the system folder is created at the same nesting level. Use the following buttons to perform a specific action: **Download all** Choose a method to export a ZIP archive containing files related to a particular client (you can send the archive to your email address or download it to your computer). To export all files, click **Download All**. To export specific files, press **Command** (on macOS) or **Ctrl** (on Windows), select the required files with the mouse cursor, and then click **Download All**. *** **Add file** Upload client files from your computer or a cloud to the Back Office. *** **Upload multiple files** Upload multiple client files at once. *** **Add directory** Create a new folder. *** **Edit** Rename files or move them to other folders. The files can only be moved between folders related to a specific client. *** **Delete** Delete selected files or folders. *** **Cancel** Discard unsaved changes. *** **Save** Apply the changes. **See also** [How to upload a file](../../../how-to-articles/manage-clients/how-to-upload-files-to-a-client-profile) On this tab, you can find a list of a client’s deposit and withdrawal wallets, as well as a list of saved withdrawal templates. Select the wallet type to view the details: ## Withdrawal wallets [#withdrawal-wallets] On this page, you can view a list of wallets that were used by a client for withdrawal of funds. **Method** The [method](../../system/payout-system#payout-methods) used to withdraw funds. *** **Currency** The wallet currency. *** **Address** The public wallet address. *** **Destination tag** Applicable only for certain currencies (XRP, XLM, BNB, and XEM). ## Saved withdrawals [#saved-withdrawals] On this page, you can view a list of saved withdrawal templates. Such templates can be created by a client when making a withdrawal, to avoid specifying the same information repeatedly for similar subsequent withdrawals. **Name** The name of a [payment system](../../../integrations/payment-systems). *** **Saved at** The date and time when a withdrawal template was saved. After clicking the **eye** icon, you are navigated to a page displaying the details of a selected withdrawal template. The withdrawal template data is stored in the JSON format. ## Deposit wallets [#deposit-wallets] On this page, you can view a list of cryptocurrency wallets that were generated for a client. **Method** The [method](../../system/deposit-system#deposit-methods) used to deposit funds. *** **Currency** The currencies enabled for a wallet. *** **Address** The public wallet address. *** **Destination tag** Applicable only for certain currencies (XRP, XLM, BNB, and XEM). On this tab, you can view the history of changes of a client’s password, email address, verification level, and 2FA options. Select one of the following options to view the details: ## Passwords change history [#passwords-change-history] On this page, you can find the details about previously changed client passwords: **Date** The date and time when the password was changed. *** **Type** The type of an action that resulted in changing the password: * **Restored** — the password was updated by a client. * **Changed by admin** — the client’s password was updated by an administrator. *** **Changed by** The email address of the person who changed the password. **See also** [How to change a client password](../../../how-to-articles/manage-clients/how-to-change-a-client-password) ## Test results [#test-results] On this page, you can find a list of [accreditation tests](../../verification/client-tests) that a client has passed in the B2CORE UI and view their results. ## Authorization history [#authorization-history] On this page, you can view the log of client sessions in the B2CORE UI. **Auth date** The date and time when a client logged in to the B2CORE UI. *** **Auth IP** The IP address from which a client logged in to the B2CORE UI. *** **Auth location** The location (country and city) from which a client logged in to the B2CORE UI, which is determined based on the client IP address. *** **Status** The result of a login attempt: `success` or `failed`. ## Email change history [#email-change-history] On this tab, you can view the log of changes made to a client’s email address. **Origin Email** The previous client email address. *** **Changed To** The current email address that is used by a client to sign in to the B2CORE UI. *** **Changed Data** The date when an email address was changed. *** **Changed By** The email address of a person who changed the client email. If an email address was specified for the first time, the **Origin email** and **Changed by** columns are empty. ## 2FA history view [#2fa-history-view] The log indicating when 2FA was enabled or disabled for a client contains the following data: **Date** The date and time when 2FA was enabled or disabled for a client. *** **Enabled** The action type indicating whether 2FA was enabled or disabled. *** **Provider** The 2FA service provider. **See also** [How to disable 2FA for a client](../../../how-to-articles/manage-clients/how-to-disable-2fa-for-a-client) ## Verification change history [#verification-change-history] On this page, you can view the details about each [verification level](../../verification/levels) obtained by a client. This information includes the name of the previous and newly obtained levels, as well as the date and time when each verification level was obtained and the name of the person who granted the level to a client, along with a reason why it was granted. **See also** [How to use the KYC constructor](../../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor) On this page, you can find a list of all clients registered either through the B2CORE UI or via the Back Office. ## General information [#general-information] The following information is provided about each client: **ID** The identifier of a client in the system. *** **Name** The client’s name. *** **Created** The date and time when a client profile was created. *** **Status** The current [status of a client profile](../../references/client-statuses) in the B2CORE UI. *** **Email** The mail address used by a client to log in to the B2CORE UI. *** **Nickname** The client’s nickname. *** **Tags** The tags assigned to a client that are used to sort the client list displayed to [Back Office administrators](../../system/users/users). *** **Manager** The client’s [manager](../managers). *** **Phone** The client’s phone number. *** **Country** The client’s [country](../../system/countries) (if specified by a client during registration or KYC verification process). *** **Jurisdiction** The [jurisdiction](../jurisdictions) to which the client is assigned, either automatically upon registration or manually. *** **City** The client’s city. *** **Types** The client [profile type](../types). *** **Internal client type** For internal use only. The internal client profile category. *** **Verification level** The [verification level](../../verification/levels) obtained by a client. *** **Company Short** The short name of a client’s company. *** **Company Full** The full name of a client’s company. *** **Risk level** The risk level assigned to a client, which may determine the scope of activities that the client is allowed to perform. *** **Last login** The date and time when a client was last logged in to the B2CORE UI. To assign tags to multiple clients or change their profile statuses at once, click the **Select** button, and then select the clients by clicking client rows, or click **Select All**. Next, expand the **Edit selected clients** drop-down menu, and then select **Assign Tags** or **Select Status**. *** **Communication language** The client's preferred language, which also determines the localization used in the B2CORE UI. By default, the column is hidden but can be added to the table using the **Column visibility** option. To view client details, click the **Edit** button and switch to a tab displaying the required information. *** **UTM metas** The pieces of tracking information attached to URLs that identify where clients came from, allowing you to track which campaigns or channels brought them to B2CORE and analyze conversion performance. By default, the column is hidden but can be added to the table using the **Column visibility** option. ## Details [#details] To access tabs displaying additional information, click drop-down-menu-button (the menu button) located in the upper-right page corner and expand the dropdown that displays the available options. The available tabs are described in the subsequent sections of this document. **See also** [How to register a new client](../../../how-to-articles/manage-clients/how-to-register-a-new-client) [How to assign tags to clients](../../../how-to-articles/manage-clients/how-to-assign-tags-to-clients) On this tab, you can find information about referral programs which a client has joined. **Introducing broker ID** The identifier assigned to a client after joining a particular referral program. *** **Type** The name of a referral program. To view program details, click its name. On this tab, you can view a list of messages sent to a client email and export this data to a CSV or XLSX file. **ID** The email identifier. *** **Active queue ID** The identifier of a queue in which an email is included. *** **Email** The client email address. *** **Subject** The email subject. *** **Attempt date** The date and time when the most recent attempt to send an email was made. *** **Status** The email delivery status: `IN PROGRESS`, `FAIL`, or `SUCCESS`. *** **Reason** The reason why an email delivery failed. To export the email data to a CSV or XLSX file, click the **Export** button located in the upper-right corner of the screen. You can download the file to your computer or send it to the email address specified in your profile. To view a complete list of emails sent to all clients, switch to the [mailing log](../../mailing/system#log) by navigating to **Mailing** > **System** > **Log**. On this tab, you can view and manage the marketing attributes collected for a client, such as the communication consent, communication language, email address and first deposit amount. The following information is provided about each attribute: **Field** The attribute name and its identifier in the system. *** **Value** The attribute value. *** **Created** The date and time when the attribute was created. *** **Updated** The date and time when the attribute was last updated. To add a new attribute, click the **Add** button. After making changes, click **Save** to apply them. On this tab, you can configure various client profile settings, which are grouped under the following sections: ## Settings [#settings] In this section, you can select a communication language and set a color to be applied to a client’s requests: **Communication Language** The language in which communication with a client is conducted. For a list of supported languages, refer to [Localizations](../../system/localizations). *** **Request color** The color used to highlight requests from a client that are displayed in the [Requests](../requests) section. You can click the gray input field and pick the color from a palette. Alternatively, you can specify the color name, or define its HEX or RGBA value. ## 2FA [#2fa] In this section, you can learn about 2FA (two-factor authentication) options configured for a client: * **SMS** — if `enabled`, a client receives 2FA verification codes using SMS * **Google** — if `enabled`, a client receives 2FA verification codes using the Google Authenticator app ## Rights [#rights] In this section, you can override the [permissions](../../system/client-rights) granted to a client based on the obtained [verification level](../../verification/levels). The permissions determine which kinds of operations the client is allowed to make in the B2CORE UI. **Verification** If selected, clients are allowed to obtain a higher [verification level](../../verification/levels) in the B2CORE UI. *** **Converter** If selected, clients can exchange funds in the B2CORE UI. *** **Deposits** If selected, clients can deposit funds in the B2CORE UI. *** **Withdrawals** If selected, clients can withdraw funds in the B2CORE UI. *** **Internal Transfers** If selected, funds can be transferred from one client to another within the same B2CORE system. *** **Overwrite with explicit settings** After enabling or disabling specific permissions for a client, select this option, and then click **Save** to apply the changes. The permissions that don’t correspond to the current verification level of a client are marked with `*`. ## Options [#options] In the **Accounts limitations (Overrides Product max accounts)** section, you can limit the maximum number of demo and live trading accounts available to a client by using the **Max Demo Trading Accounts** and **Max Live Trading Accounts** fields. The number of demo accounts can be limited for any trading platform providing the capability to create demo accounts. The values specified on this tab override the default system limits defined in the [Products](../../products/products) section. On this tab, you can view a history of trades executed by a client on **B2TRADER**. **Order ID** The identifier assigned to an order on B2TRADER. *** **Instrument** The currency pair. *** **Side** The trade side: `Buy` or `Sell`. *** **Quantity** The amount traded, in a quote currency. *** **Price** The trade execution price. *** **Value** The amount traded, in a base currency. *** **Fee** The commission charged for a trade. *** **Fee Product** The commission currency. *** **Date** The date and time when a trade was executed. On this tab, you can find detailed information about a client’s transactions. Select the transaction type to view the details: **Deposit** The list of client’s [deposits](../../finance/deposits). *** **Payout** The list of client’s [payouts](../../finance/payouts). *** **Transfer** The list of client’s [transfers](../../finance/transfers). *** **Exchange** The list of client’s [exchanges](../../finance/exchange). *** **Balance change operation** The history of changes to a client’s balance resulting from an administrator’s actions in the Back Office, which includes the following information: * **Date** — the date and time when a change to a client’s balance has occurred * **Account** — the user account number * **Amount** — the transaction amount * **Deposit/Withdraw** — the transaction type * **Admin user** — the administrator who made the transaction The changes to a client’s balance effected by a Back Office administrator aren't reflected on the [Deposits](../../finance/deposits) and [Payouts](../../finance/payouts) pages. On this page, you can view and add client tags. Assigning tags to clients enables you to filter the client list for Back Office users, such as admins or managers, so they only see clients with specific tags, while other clients remain hidden. Tags can be assigned to clients either manually or automatically after client registration when using [jurisdictions](../../clients/jurisdictions). The following information is provided about each client tag: **ID** The identifier of a client tag. *** **Caption** The name of a client tag. To update a client tag, click the **Edit** button located in a tag row, and then specify a new name for the tag. **See also** [How to assign tags to clients](../../../how-to-articles/manage-clients/how-to-assign-tags-to-clients) [How to create a jurisdiction](../../../how-to-articles/manage-clients/how-to-create-a-jurisdiction) [How to make an admin user see only specific clients](../../../how-to-articles/manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) On this page, you can view a list of all user groups created in the Back Office and manage their permissions. ### General information [#general-information] The following information is provided about each user group: **ID** The identifier of a user group. *** **Group** The name of a group. The **Administrators** group can’t be removed and its permissions can’t be modified. Users included in this group are granted all available permissions. To export the data about Back Office user groups, including the data about permissions granted to each group, to a JSON file, click the **Export** button located in the upper-right corner of the page. To import the data about Back Office user groups, click the **Import** button, and then select a JSON file containing the required data. To view group details, click the **Edit** button. ### Details [#details] The detail page contains the following tabs: * **Group** — a list of permissions granted to the users included in this group. * **Users** — a list of users included in this group. **See also** [How to add a user group and grant permissions](../../../how-to-articles/manage-system-settings/how-to-add-a-user-group-and-grant-permissions) [How to import data related to Back Office user groups](../../../how-to-articles/manage-system-settings/how-to-import-data-related-to-back-office-user-groups) On this page, you can view a list of registered Back Office users, such as admins or managers, modify their profile settings, and add new users. ### General information [#general-information] The following information is provided about each user: **ID** The user identifier. *** **Name** The user’s name. *** **Email** The user’s email address that is used to sign in to the Back Office. *** **Allowed Client Tags** The client tags that are used to sort the client list displayed to a user. *** **Status** The status of the user profile:`Enabled` or `Disabled`. Users whose profiles are disabled can't sign in to the Back Office. *** **Two Factor Authentication** The status of 2FA: * `Disabled` — 2FA is disabled. * `Email` — 2FA with email codes is enabled. * `TOTP` — 2FA with time-based one-time passwords (TOTP) is enabled, such as through the Google Authenticator app. Users can enable 2FA with TOTP for their profiles by clicking the profile button displaying their email address in the top bar and selecting **Enable 2FA** in the dropdown. After confirming the action in the popup, they should follow the displayed instructions to set up 2FA using Google Authenticator. *** **IP Whitelist** A list of [allowed IP addresses](../../security/white-lists) specified for a user. *** **Groups** A list of [groups](groups) in which a user is included. The groups define the permissions that the user is asssigned. *** **Creator** The identifier of the user who created a user profile. Click the identifier to navigate to the user details page. *** **Created At** The date and time when a user profile was created. To view user details, click the **Edit** button. ### Details [#details] The following additional information is provided about each user: **Phone** The user’s phone number. *** **Password** The masked password that is used to sign in to the Back Office. *** **Telegram chat Id** The identifier of a Telegram chat, group, or channel for receiving event notifications (for details, refer to [How to get Telegram chat, group, and channel identifiers](../../../how-to-articles/manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers)). *** **Slack chat Id** The identifier of a Slack channel for receiving event notifications. *** **Event notifications** The list of events about which a user is notified. You can add events to this list or remove them. The list includes the event notifications configured on the [System > Event notifications](../event-notifications) page. *** **Send to email** Enable this option to send credentials to a specified user email address. *** **Mask data** Enable this option to prevent a user from viewing client personal data in the Back Office. When enabled, such data as client names, email addresses, and phone numbers are masked with asterisks (`*`) for the user. *** To add a picture to a user profile, click the **Edit** button located in the picture frame and select an image. * Supported formats: PNG, JPG and JPEG * File size: up to 3 MB Back Office users can upload pictures only for their own profiles. The uploaded picture is added as an icon to a user email address displayed in the top bar. *** To manage 2FA options for a user, click the **Actions** button in the upper-right page corner, and then select one of the following options: * **Reset 2FA to Email** — to enable 2FA with email codes for the user. * **Disable 2FA** — to disable for the user any 2FA method that is currently in use. *** ### Fields for filtering [#fields-for-filtering] **Countries** * If the **All except** option is enabled and one or several countries are specified in the field below, a user is allowed to see a list of clients from all countries except for the ones specified in the field below it. * If the **All except** option is disabled and one or several countries are specified in the field below, a user is only allowed to see a list of clients from the countries specified in the field below it. **See also** [How to add an admin user](../../../how-to-articles/manage-system-settings/how-to-add-an-admin-user) In this subsection, you can manage HTML email templates that are used to notify clients and [Back Office users](../users/) about specific event types. ## Template types [#template-types] On this page, you can manage the types of events about which clients and Back Office users can be notified by email. ### General information [#general-information] The following information is provided about each event type: **Name** The event type name. *** **Caption** The event type description. *** **Enabled** If **Yes**, an event type is enabled for triggering event notifications; otherwise, **No**. To view the template type details, click the **Edit** button. ### Details [#details] On the details page, you can edit the **Name** and **Caption** fields, as well as enable or disable the template type. In addition, you can return the HTML templates related to the selected template type to their default configurations. To do this, click the **Actions** button displayed in the upper-right page corner, and then select **Reset templates** in the dropdown. After that, the HTML email templates, which are listed on the [Templates](email#templates) page, are reset to defaults. ## Templates [#templates] On this page, you can manage HTML email templates that are used to deliver notifications about occurred events to clients and Back Office users. ### General information [#general-information-1] The following information is provided about each template: **Type** The [email template type](../../references/email-template-types). *** **Locale** The language of an email template. *** **Subject** The subject of an email template. *** **Enabled** If **Yes**, an email template is enabled and can be used to deliver notifications; otherwise, **No**. To view the template details, click the **Edit** button. ### Details [#details-1] In the **Template** window, you can view or edit the HTML code of a template. The parameters, such as text color or company name, that are defined in the [Key-value storage](../key-storage) can be inserted in email templates. When an email notification is sent to a client or Back Office user, such parameters are replaced with the values that are specified for them in the storage. To render the HTML code and view how a template will look in an email, click the **Preview** button. If the template is enabled, it can be saved only after it is successfully rendered and displayed in the preview area. ### Example [#example] The following is an example of an HTML code for an email template: ```html         ``` ## Templates [#templates] On this page, you can manage templates used to send [event notifications](../event-notifications) to [Back Office users](../users/) via Slack. For Slack, templates are supported for the following [types of events](../../references/event-types-for-triggering-event-notifications-for-back-office-users): * `PayoutRequestInitialized` * `TestPassing` ### General information [#general-information] The following information is provided about each template: **Name** The template name. *** **Caption** The template description. *** **Enabled** If **Yes**, a template is enabled and can be used for event notifications; otherwise, **No**. To view the template details, click the **Edit** button. ### Details [#details] In the **Template** field, you can view or slightly edit the template text. ### Supported Slack templates [#supported-slack-templates] Use the Slack templates provided below for notifications about supported event types. These templates contain keys that are replaced with relevant values when the event occurs and the notification is sent to recipients. #### **PayoutRequestInitialized** [#payoutrequestinitialized] The template for notifications about withdrawal requests created by clients: ``` Project: {frontUrl}|{companyName} Type: Payout Payout number: {urlMetaDetails}|{metaId} Client Email: mailto:{clientEmail}|{clientEmail} Task: check and approve the {urlRequestDetails}|withdrawal ``` #### **TestPassing** [#testpassing] The template for notifications about accreditation tests completed by clients. ``` Project: {frontUrl}|{companyName} Test: testName Request number: {urlRequestDetails}|{applicationId} Client Email: mailto:{clientEmail}|{clientEmail} ``` In this subsection, you can manage templates that are used for SMS notifications. ## General templates [#general-templates] On this page, you can manage templates that are used to deliver [event notifications](../event-notifications) to [Back Office users](../users/) via SMS. ### General information [#general-information] The following information is provided about each template: **Name** The template name. *** **Caption** The template description. *** **Enabled** If **Yes**, a template is enabled and can be used for event notifications; otherwise, **No**. To view the template details, click the **Edit** button. ### Details [#details] In the **Template** window, you can view or edit the template text. ### Example [#example] The following is an example of a template for SMS notifications about withdrawal requests created by clients: ``` Project: {companyName} Type: Payout Payout number: {metaId} Client Email: {clientEmail} ``` ## Confirmation templates [#confirmation-templates] On this page, you can manage templates that are used to deliver verification codes to clients for whom 2FA (two-factor authentication) is enabled via SMS. ### General information [#general-information-1] The following information is provided about each template: **Name** The template name. The template with the name **default** can't be disabled, deleted, or renamed. *** **Caption** The template description. *** **Enabled** If **Yes**, a template is used to deliver verification codes to clients via SMS; otherwise, **No**. To view the template details, click the **Edit** button. ### Details [#details-1] In the **Template** window, you can view or edit the template text. ### Example [#example-1] The following is an example of a template for delivering verification codes via SMS: ``` Your verification code is %CODE%. ``` ## Templates [#templates] On this page, you can manage templates used to send [event notifications](../event-notifications) to [Back Office users](../users/) via Telegram. For Telegram, templates are supported for the following [types of events](../../references/event-types-for-triggering-event-notifications-for-back-office-users): * `PayoutRequestInitialized` * `TestPassing` ### General information [#general-information] The following information is provided about each template: **Name** The template name. *** **Caption** The template description. *** **Enabled** If **Yes**, a template is enabled and can be used for event notifications; otherwise, **No**. To view the template details, click the **Edit** button. ### Details [#details] In the **Template** field, you can view or slightly edit the template text. ### Supported Telegram templates [#supported-telegram-templates] Use the Telegram templates provided below for notifications about supported event types. These templates contain keys that are replaced with relevant values when the event occurs and the notification is sent to recipients. #### **PayoutRequestInitialized** [#payoutrequestinitialized] The template for notifications about withdrawal requests created by clients: ``` Project: {frontUrl}|{companyName} Type: Payout Payout number: {urlMetaDetails}|{metaId} Client Email: mailto:{clientEmail}|{clientEmail} Task: check and approve the {urlRequestDetails}|withdrawal ``` #### **TestPassing** [#testpassing] The template for notifications about accreditation tests completed by clients. ``` Project: {frontUrl}|{companyName} Test: testName Request number: {urlRequestDetails}|{applicationId} Client Email: mailto:{clientEmail}|{clientEmail} ``` To configure settings for savings programs with fixed interest rates, specify the following settings in the **Fixed Preset Details** section: * **Plan length (days)** — select a period, in days, during which the amount invested in the savings program must be held. The plan length can be specified with an interval of 30 days, such as 30, 60, 90, and so on. At the end of the plan length, the investment amount that a client contributed to the program is refunded to the client wallet. * **Payment period (days)** — select a period, in days, indicating the frequency of interest payments. The payment period can be specified with an interval of 30 days, such as 30, 60, 90, and so on, and must be less than or equal to the plan length. * **Investment amount** — enter an amount that a client must contribute to the savings program when subscribing to it. The investment amount is deducted from a client wallet denominated in the program currency. If a client has more than one wallet denominated in the program currency, the client can select a wallet from which the investment amount should be deducted. The investment amount can be specified as an integer or decimal value. * **Interest rate (percent)** — enter a percentage of the investment amount, which is used to calculate interest earned at the end of each payment period (for details, refer to [Interest calculation example — Fixed strategy](configure-the-fixed-strategy-settings#interest-calculation-example--fixed-strategy).) The interest rate can be specified as an integer or decimal value. * **Penalty type** — select how the penalty is calculated. The penalty amount is charged to a client if the client withdraws their invested funds before the end of the plan length. * **Fixed** — a fixed amount is deducted as a penalty. * **Percentage** — a percentage of the invested funds is deducted as a penalty. * **Cancellation penalty** — specify as follows: * For the **Fixed** penalty type, specifies the exact penalty amount charged to a client. The amount must be an integer or decimal value and must be lower than the investment amount. * For the **Percentage** penalty type, specifies the percentage of the investment amount deducted as a penalty. ## Interest calculation example — Fixed strategy [#interest-calculation-example--fixed-strategy] This example illustrates how interest is calculated for a client subscribed to a savings program with the `Fixed` strategy. Suppose that the savings program is configured with the following settings: * the **Investment amount** is 1,500 USD * the **Interest rate (percent)** is 3% * the **Plan length (days)** is 180 days * the **Payment period (days)** is 60 days The interest accrued and paid to the client for the first 60-day period since the date the client subscribed to the program is calculated as follows: `Earned interest = Investment amount * Interest rate / 100` `1,500 * 3 / 100 = 45 USD` The earned interest of 45 USD isn’t taken into account when calculating interests for subsequent periods. This means that the same interest, which is equal to 45 USD in this example, is earned and paid every 60 days till the end of the plan length. Detailed information about interest payments to the clients subscribed to savings programs can be found in payment plans that are listed on the [Savings > Plans](../../../back-office-guide/savings/plans) page. To configure settings for savings programs with flexible interest rates, specify the following settings in the **Flexible Preset Details** section: * **Minimum investment amount** — enter the minimum amount of the initial investment. Investments less than the specified amount won’t be accepted. * **Minimum additional investment** — enter the minimum amount that clients can add to the initial investment. Clients can’t add amounts less than this specified minimum. The minimum investment and additional investment amounts can be specified as integer or decimal values. * **Penalty period (days)** — specify the period, in days, during which a client can’t withdraw their invested funds without a penalty. * **Penalty type** — select how the penalty is calculated. The penalty amount is charged to a client if the client withdraws their invested funds before the end of the penalty period. * **Fixed** — a fixed amount is deducted as a penalty. * **Percentage** — a percentage of the total invested funds is deducted as a penalty. * **Redeem penalty** — specify as follows: * For the **Fixed** penalty type, specifies the exact penalty amount that will be charged to a client. The amount must be an integer or decimal value and must be lower than the minimum investment amount. * For the **Percentage** penalty type, specifies the percentage of the total invested funds that will be deducted as a penalty. * **Payment period** — indicates the frequency of interest payments and is set to `The first day of each month` and can’t be changed. For example, if a client successfully subscribes to a savings program on May 31, the first interest payment will occur on the next day, June 1. In the **Tiers** section, set up tiers that are used to apply flexible interest rates: * **Tier from** — enter the minimum amount that clients must invest to get an interest rate assigned to that tier. This amount indicates the tier’s starting point and the previous tier’s end point. There is the tier with the **Tier From** value equal to 0 (zero), which cannot be removed. * **Annual percentage rate** — enter the annual interest rate, in percentage, applied to the tier (for interest calculation details, refer to [Interest calculation example — Flexible strategy](configure-the-flexible-strategy-settings#interest-calculation-example--flexible-strategy)) Add as many tiers as required for your savings program. To add a new tier, click the **Add** button. ## Interest calculation example — Flexible strategy [#interest-calculation-example--flexible-strategy] This example illustrates how interest is calculated for a client subscribed to a savings program with the `Flexible` strategy. Suppose that the savings program is configured with the following settings: * Tier 1: the **Tier from** is 0 and **Interest of year (%)** is 10% * Tier 2: the **Tier from** is 5,000 and **Interest of year (%)** is 14.6% * the **Minimum investment amount** is 3,000 USD * the **Minimum additional investment** is 1,000 USD If a client subscribes to the program on May 30 and deposits 3,650 USD, the client receives an annual interest rate of 10%. At the end of May 30, the interest is accrued. It’s calculated as follows: `Earned interest = Investment amount * (Interest rate / 100) / 365` `3,650 * (10 / 100) / 365 = 1 USD` If on May 31, the client adds 1,350 USD, bringing the total invested to 5,000, the client receives an annual interest rate of 14.6%. At the end of May 31, the interest is accrued as follows: `5,000 * (14.6 / 100) / 365 = 2 USD` The total interest accrued for two days May 30 and May 31, which is 3 USD, is paid to the client wallet on June 1. Detailed information about interest payments to the clients subscribed to savings programs can be found in payment plans that are listed on the [Savings > Plans](../../../back-office-guide/savings/plans) page. ## Modify tiers for savings programs with Flexible strategies [#modify-tiers-for-savings-programs-with-flexible-strategies] In the existing savings presets, you can modify tiers that are used to apply flexible interest rates. To modify tiers: Navigate to **Savings** > **Presets**. Select the preset and click the **Edit** button. In the **Tiers** section, you can: * change the amounts in the **Tier from** fields * adjust the interest rates applied to the tiers * remove existing tiers * add new tiers To update tiers applied to the savings plans that have already been created based on the selected preset, enable the **Update Savings Plans Tiers** checkbox. The modified tiers will be used for interest calculations in all the existing savings plans. If you want the modified tiers to apply only to new savings plans, leave the checkbox unchecked. Click **Save** to apply the changes. You can create savings programs with `Fixed` and `Flexible` strategies and enable your clients to invest their funds in these programs and earn interest. To create a savings program: Navigate to **Savings** > **Presets**. Click **+Create** in the upper-right page corner, and select: * **Fixed preset** — to create a program with a fixed interest rate * **Flexible preset** — to create a program with a flexible interest rate Configure the following general settings: * In the **Currency** dropdown, select a currency for the savings program. To subscribe to the program, your clients must have wallets denominated in the program currency. * In the **Name** field, enter a unique name for the savings program. The program name is displayed to clients in the B2CORE UI. * In the **Description** field, enter a program description. The program description is displayed to clients in the B2CORE UI. * Set the **Status** option to **Active** or **Inactive**. * If **Active**, the card showing details of the savings program is displayed in the B2CORE UI, and clients can subscribe to the program. * If **Inactive**, the card of the savings program isn’t displayed in the B2CORE UI. * In the **Admission fee** field, enter a fee amount that clients must pay when subscribing to the savings program. The admission fee is deducted from client wallets denominated in the program currency. The admission fee can be specified as an integer or decimal value. If you don’t want to charge the admission fee, enter 0 (zero). Proceed to configuring settings specific to the selected savings strategy: * [Configure the Flexible strategy settings](configure-the-flexible-strategy-settings) * [Configure the Fixed strategy settings](configure-the-fixed-strategy-settings) After configuring the settings, click **Save** to create the savings program. The savings program preset is displayed on the **Savings Preset** page. If the preset is assigned the **Active** status, the card of the created savings program is displayed to clients in the B2CORE UI, and clients can subscribe to the program. ## Field types [#field-types] The supported field types for the Registration wizard include: * **input** — a text input field. * **group** — a container that holds one or more fields of various types or other groups. * **passwordButton** — a password input field that includes a show/hide button for toggling the visibility of the entered password. * **select** — a dropdown that enables clients to select a single option from a predefined list. * **multiSelect** — a dropdown that enables clients to select multiple options from a predefined list. * **radio** — a single-choice selector that presents several options, enabling clients to select one option from a predefined list. * **boolean** — a checkbox field that enables clients to mark it as either true or false. * **date** — a field for entering or selecting a date. * **phone** — a field for entering a phone number according to the predefined format. ## Validation rules [#validation-rules] Data validation rules that can be assigned to the Registration wizard fields include: * `required` — indicates that a field is required. * `email:rfc,spoof,strict` — validates that an email address follows the correct format. * `unique_active_email` — ensures that an email address is unique and not already registered in your system. * `password_length` — validates that a password meets the required length. * `password_content` — validates that a password includes the required characters and symbols. * `same:password` — ensures that the password entered in the **Password confirmation** field matches the one in the **Password** field. * `string` — a string of characters. * `min:1` — requires a minimum of one character in the entered string. * `max:30` — limits the entered string to a maximum of 30 characters. * `info_name` — validates that an entered string includes allowed characters. * `phone:AUTO` — validates that a phone number follows the correct format. * `distinct` — ensures that the phone number is unique and not already confirmed by another registered client in your system. * `date` — validates that the entered or selected value is a date. * `age:18` — ensures that a user is at least 18 years old (in addition to the `date` rule). * `requiredValue` — validates that the selected value is **True**. * `countries_handbook` — ensures that the value is from the list of countries configured in your system. * `client_addresses_handbook` — ensures that the value is from the list of address types registered in your system. * `nullable` — allows the field to accept an empty value. * `array` — an array of values. * `numeric` — a numeric value. The Registration wizard can accept and process only specific data within the Basic Information step. The tables below outline the fields supported for this step: * [Email, password, and password confirmation fields](#email-password-and-password-confirmation-fields) * [First name, last name, and birthday fields](#first-name-last-name-and-birthday-fields) * [Address fields](#address-fields) * [Phone fields](#phone-fields) * [Consent and agreement fields](#consent-and-agreement-fields) For each field, it's indicated whether it can be used independently or must be nested within a specific group. Field names must be specified exactly as provided in the **Name** column. Field labels that will be displayed on the **Sign Up** page in the B2CORE UI can be amended according to your preferences. In addition, specific data validation rules that should be assigned to the fields are listed in the **Validation rules** column. For descriptions of all available field types and data validation rules that can be assigned to the fields, refer to [Field types](field-types-and-validation-rules#field-types) and [Validation rules](field-types-and-validation-rules#validation-rules). ## Email, password, and password confirmation fields [#email-password-and-password-confirmation-fields] The table below provides information about the fields for entering an email, setting a password, and confirming the password, including field types, validation rules, and additional attributes for proper configuration. ## First name, last name, and birthday fields [#first-name-last-name-and-birthday-fields] The table below outlines the fields for entering a first name, last name, and birth date. These fields must be nested within the **group** field named `info`. ## Address fields [#address-fields] The table below outlines the fields for entering address information. These fields must be nested within the **group** field named `0`, which must in turn be nested within the **group** named `addresses`. ## Phone fields [#phone-fields] The table below outlines the field for entering a phone number. This field must be nested within the **group** field named `0`, which must in turn be nested within the **group** named `phones`. ## Consent and agreement fields [#consent-and-agreement-fields] The table below outlines the fields required for client consent. These fields are essential for obtaining necessary agreements and consents from clients. These fields must be nested within the **group** field named `requirements`. **Deprecated.** Registration wizards are deprecated. To set up the client registration process, use the new registration settings and custom fields instead — see [How to migrate to the new registration settings](../how-to-migrate-to-new-registration-settings). If you have mobile applications, keep the existing Registration wizards enabled until you no longer support older app versions, because end users on those versions rely on them to register. The Registration wizard determines the registration procedure for new clients in the B2CORE UI, as well as the information the clients are prompted to provide during registration. You can add several Registration wizards in order to configure separate registration procedures, for example, for individual and corporate clients. To add and configure the Registration wizard: Navigate to **System** > **Wizards**. On the **Wizards** page, click **+Create** in the upper-right page corner. On the **Create wizard** page, fill in the following fields: * In the **Name** field, enter the wizard name, such as Corporate or Individual. The wizard name is displayed to clients as the name of the registration option on the **Sign up** page in the B2CORE UI. * In the **Type** dropdown, select **Registration**. * In the **Default** dropdown, select: * **Yes** — to mark the wizard as the default Registration wizard. The default wizard is displayed as the first registration option on the **Sign up** page in the B2CORE UI if more than one Registration wizard is configured. * **No** — to display the wizard following the default one on the **Sign up** page in the B2CORE UI if more than one Registration wizard is configured. Click **Save** to add the wizard. In a wizards list, find the added Registration wizard, and click **Edit**. In the **Description** field on the **Wizard** tab, optionally enter a short description of the registration procedure or any other helpful information that clients should know before they start registration. The description is displayed under the wizard name on the **Sign up** page in the B2CORE UI. To configure the registration procedure steps, go to the **Workflow** tab. By default, the following two steps are configured and placed in the order in which they are performed during registration: * Step 1: **Basic Information** — a client is prompted to fill in the required personal information, such as an email address, first and last names, phone number, address, and password for accessing their profile in the B2CORE UI. To view a list of predefined fields added for the Basic Information step, click the **Edit** button located in the step row, and go to the **Custom fields** tab. Enable the fields that you want clients to fill in during registration and disable the others (for details, refer to [How to set up fields for the Basic Information step](how-to-set-up-fields-for-the-basic-information-step)). * Step 2: **User Registration** — a client is registered in B2CORE and assigned the client type and initial verification level (for details, refer to [How to configure the User Registration step](how-to-configure-the-user-registration-step)). Workflow tab of the Registration wizard To include additional steps in the registration procedure, click **+Add**. In the **Add workflow** popup, select the step type. The possible steps: * **Client Type** — a client is prompted to select the profile type, such as individual or corporate. * **Email Confirmation** — a client is prompted to confirm the email address entered at the Basic Information step with a verification code sent to that email. * **New Phone Confirmation** — a client is prompted to confirm the phone number entered at the Basic Information step with a verification code sent to that number. * **Advanced** *(deprecated)* — this step is no longer available for adding to new Registration wizards. If the Advanced step was previously added to an existing Registration wizard, it's preserved and can still be modified or removed (for details, see [How to set up fields for the Advanced step](how-to-set-up-fields-for-the-advanced-step)). Click **Save** to add the selected step to the registration procedure. The step is added to the steps list based on the order that is predefined for each step. After completing the configuration of the registration procedure steps, go to the **Wizard** tab. On the **Wizard** tab, enable the wizard by selecting **Yes** in the **Enabled** dropdown. Click **Save** to apply the changes. After enabling the wizard, the corresponding registration option is displayed to clients on the **Sign up** page in the B2CORE UI. The image below shows an example of the the B2CORE UI **Sign up** page enabling new clients to select the **Individual**, **Corporate**, or **Partner** registration option. Sign Up page **See also** [How to block registration for a country](../how-to-block-registration-for-a-country) At the User Registration step, clients are registered in B2CORE and assigned the initial verification level. It's possible to select the client type and verification level that are assigned to clients after registration. This may be useful when you configure two separate registration procedures for individual and corporate clients and want to assign different initial verification levels to such clients. Select the client type and verification level assigned to clients after registration: Navigate to **System** > **Wizards**. Select the Registration wizard and click **Edit**. Go to the **Workflow** tab. Click the **Edit** button located in the User Registration step row. Go to the **Settings** tab, and fill in the following fields: * In the **Register As** dropdown, select the client type that is assigned to clients after registration. The list includes all the enabled client types configured on the [Clients > Types](../../../back-office-guide/clients/types) page. If you leave `Not selected` in the **Register As** dropdown, the client type marked as default on the [Clients > Types](../../../back-office-guide/clients/types) page will be assigned to clients after registration. If no default type is set, the type with the lowest priority index will be assigned. * In the **Verification Level** dropdown, select the initial verification level that is assigned to clients after registration. The list includes all the verification levels configured on the [Verification > Levels](../../../back-office-guide/verification/levels) page except for the default verification level to which the zero (`0`) index is assigned. If you want to assign the default verification level to clients after registration, leave\ `Not selected` in the **Verification Level** dropdown. User Registration step Click **Save** to apply the changes. The Advanced step is *deprecated* and can no longer be added to new Registration wizards. If the Advanced step was previously added to your existing wizard, you can edit or remove it, but you can't add new fields to this step. After registration, the information collected in the Advanced step is displayed on the [Advanced tab](../../../back-office-guide/clients/general/advanced-tab) in the client details. To set up fields for the Advanced step: Navigate to **System** > **Wizards**. Select an existing Registration wizard and click **Edit**. Go to the **Workflow** tab. Click the **Edit** button located in the Advanced step row. Go to the **Custom fields** tab. To modify settings of an existing field, click the **Edit** button located in the field row. Configure the following field settings: * In the **Main field settings** section: * In the **Type** dropdown, select the field type. * In the **Enabled** dropdown, select `Enabled` to display the field during registration or `Disabled` to hide the field. * In the **Field attributes** section: * In the **Name** field, enter the field name used in the Back Office. Only Latin characters, digits, and underscores are allowed. * In the **Label** field, enter the field label. Field labels are displayed on the **Sign Up** page in the B2CORE UI. * In the **Rules** dropdown, select one or more rules for validating the data entered in the field by clients. For descriptions of all available field types and data validation rules that can be assigned to the fields, refer to [Field types](field-types-and-validation-rules#field-types) and [Validation rules](field-types-and-validation-rules#validation-rules). Click **Save** to apply the changes to the field settings. After saving the field settings, you'll be redirected to the fields list on the **Custom fields** tab. Ensure that all the fields you want clients to complete at the Advanced step are enabled. To remove a field that you no longer need in the Advanced step, click the **bin** icon located in the field row. Click **Save** to apply the changes to the wizard. At the Basic Information step, clients are prompted to provide their personal information by completing the fields displayed on the **Sign Up** page in the B2CORE UI. This step includes a predefined set of fields. You can edit or remove these fields, but you can't add new fields to this step. To set up fields for the Basic Information step: Navigate to **System** > **Wizards**. Select an existing Registration wizard and click **Edit**. Go to the **Workflow** tab. Click the **Edit** button located in the Basic Information step row. Go to the **Custom fields** tab. Custom fields tab To modify settings of an existing field, click the **Edit** button located in the field row. The Registration wizard can accept and process only a specific set of data. For details on the fields that you can add, along with their names, settings, and attributes, refer to [Fields supported in the Basic Information step](fields-supported-in-the-basic-information-step). Configure the following field settings: * In the **Main field settings** section: * In the **Type** dropdown, select the field type. * In the **Enabled** dropdown, select `Enabled` to display the field during registration or `Disabled` to hide the field. * In the **Field attributes** section: * In the **Name** field, enter the field name used in the Back Office. * In the **Label** field, enter the field label. Field labels are displayed on the **Sign Up** page in the B2CORE UI. * In the **Rules** dropdown, select one or more rules for validating the data entered in the field by clients. The list of field attributes depends on the selected field type and can include other attributes. If additional attributes are available for the field, they are listed in [Fields supported in the Basic Information step](fields-supported-in-the-basic-information-step). Click **Save** to apply the changes to the field settings. Save field settings After saving the field settings, you'll be redirected to the fields list on the **Custom fields** tab. Ensure that all the fields you want clients to complete during registration are enabled. To remove a field that you no longer need for registration, click the **bin** icon located in the field row. Click **Save** to apply the changes to the wizard. **Deprecated.** Registration wizards are deprecated. To set up the client registration process, use the new registration settings and custom fields instead — see [How to migrate to the new registration settings](../how-to-migrate-to-new-registration-settings). If you have mobile applications, keep the existing Registration wizards enabled until you no longer support older app versions, because end users on those versions rely on them to register. The **Promo Banners** tab on the **Promo** page lists a preconfigured collection of promo banners that can be used to attract new clients by means of banner advertising. A **promo banner** is represented by a rectangle of a varying size and color, within which some message is displayed. In the context of banner advertising, the purpose of such banners is to attract visitors of a host website where a banner is placed and encourage them to navigate to a specified landing page. Each banner card displays its size, language, and landing type (for example, **Registration**). **Key points:** * You can configure multiple promo banners for your referral campaign. * The promo banners can be placed on websites or any other advertising platforms. * You can filter the banners displayed on this page by their size, language, or theme. * To change the number of banners displayed per page, use the **Rows per page** dropdown. * Every promo banner configured by the broker is automatically made available to all partners of the selected partnership program — banner visibility cannot be limited to specific partners. ## Filter data [#filter-data] You can filter the banners displayed on this page using the following criteria: * **Size** — select a banner size to display banners of this size. * **Language** — select a language to display banners localized for this language. * **Theme** — select a theme to display banners with this theme. To change the number of banners displayed per page, use the **Rows per page** dropdown. ## Configure a banner [#configure-a-banner] To configure a promo banner: 1. From the dropdown located at the top of the page, select a **partnership program** for which you want to configure a banner. 2. Click a **banner** that you want to configure. 3. From the **Landing page** dropdown, select a landing page to which users should be navigated after clicking the banner.\ At present, only the **Sign up** page of the B2CORE UI can be used as a landing page. 4. Click **Copy** to copy the HTML code of your banner to the clipboard. The HTML code includes your unique ID. The copied HTML code can be embedded into an advertising website of your choice. A click is only registered once the banner code is actually rendered on a page and a visitor loads it — simply opening the landing page URL in a browser (without the banner being embedded and shown) will not be counted as a click and will not attribute the resulting registration to you. The **Promo** page includes the following tabs: The same link-building controls are also available in the **Partner Link** widget on the [Partner Dashboard](../dashboard). ## Referral links [#referral-links] The **referral link** (also referred to as **Partner Link**) is a personal URL created by a partner introducing new clients to the B2CORE UI. The URL includes a unique identifier (ID) that is assigned to a partner after joining a partnership program. The ID is used to keep track of new clients introduced by each partner and calculate rewards for trades executed by their clients. A partner may have multiple IDs after joining several programs. **Key points:** * A number of referral links can be created (your referral links can be localized or global). * Every link includes a unique partner ID. * You can convert the links into [QR codes](links#qr-codes). * The links can be shared on websites, through social media, in emails, or by any other means preferred by a partner promoting the B2CORE UI. ### Create a personal link [#create-a-personal-link] To create a referral link: 1. In the dropdown located at the top of the page, select a partnership program for which you want to create a link. 2. In the **Link settings** section: * **Landing Page** — select a webpage displayed after clicking the referral link. At present, only the **Sign Up** page of the B2CORE UI can be used as a landing page. * **Language** — select a language to create a localized URL. Select **Global** to create a regular URL that doesn't indicate a particular language. 3. Optionally, you can include [UTM parameters](links#utm-parameters) in your referral link by expanding the **UTM parameters** section and specifying the needed parameters. After you've configured the link settings, your referral link is displayed on the right side of the page. You can copy the URL to the clipboard using the **Copy** button. ### UTM parameters [#utm-parameters] The UTM parameters (or *tracking tags*) are short text codes that you can include into referral links to track various metrics and assess the efficiency of your marketing strategies. You can specify the following UTM parameters: ## QR codes [#qr-codes] If required, your referral links can be converted into QR codes that users can scan to be forwarded to a landing webpage pointed by the link URL. **Key points:** * You can generate multiple QR codes for a single referral link. * The QR codes can be customized by specifying various background colors and adding icons to them. * Similar to regular referral links, the QR codes can be shared on websites, through social media, in emails, or by any other means preferred by a partner seeking to attract new clients. * The QR codes can be downloaded to your computer and then used in printed promo materials. ### Generate a QR code [#generate-a-qr-code] To generate a QR code for your referral link, click the **Generate code** button displayed on the right side of the page. Optionally, you can apply custom settings to your QR code before generating it: * **Color** — select a QR code color. * **Icon** — select an icon to be added to a QR code. After the QR code is generated: * **Download PNG** — click this button to download a PNG image of the generated QR code to your computer. * **Copy embed code** — click this button to copy the HTML code of the generated QR code to the clipboard. You can then embed this code into your website or any other promo material. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Account ID** The trading account identifier. *** **Platform** The trading platform on which an account is created. *** **Currency** The currency in which an account is denominated. *** **Balance** The current balance on an account. *** **Credit** The credit on an account. *** **Profit** The profit earned on an account. *** **PnL** The current profit-loss value calculated for an account. *** **Trades** The total number of trades executed on an account. *** **Vol** The total trading volume on the account. *** **Lots** The total volume, in lots, traded on the account. *** **Rewards** The total amount of rewards paid to you for trades executed on the account. *** **Created** The date and time when the account was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on trading accounts created by this client. * **Account ID** — enter an account identifier to display the data on this account. * **Date Range** — select a start and end date to display the data on trading accounts created during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To specify how many items to show on each page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The total number of clicks, registrations, and the click conversion rate are displayed for the selected program. The following information is displayed in the report table: **Click ID** The identifier of the click on a referral link or promo banner. *** **Client ID** The client identifier. It's displayed if after clicking your referral link or promo banner, a user has signed up to the B2CORE UI and become your [direct client](#user-content-fn-1)[^1]. *** **Country** The country where a user who clicked your referral link or promo banner is located, based on the user's IP address. *** **IP Address** The IP address of a user who clicked your referral link or promo banner. *** **Link** The identifier of a referral link or promo banner that was clicked. *** **Referrer** The resource from where a user came, such as a website or social media platform. *** **Date** The date and time when a referral link or promo banner was clicked. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on clicks made by this client. * **Country** — select a country to display the data on clicks made by users located in this country. * **Landing page** — select a landing page to display the data on clicks resulting in this page being opened. Users are navigated to this page after clicking your referral links or promo banners. * **Referrer** — specify a resource, such as a website or social media platform, to display the data on clicks made on this resource. * **Date range** — select a start and end date to display the data on clicks made during the specified period. * **Show UTM filters** — expand this section to specify [UTM parameters](../promo/links#utm-parameters) and display the data on traffic sources. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. [^1]: The client who signed up to the B2CORE UI by your referral link. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Client ID** The client identifier. *** **Name** The full name of a client. *** **Email** The client's email address. *** **Country** The country specified by a client when signing up to the B2CORE UI. *** **Trading Volume** The total volume, in lots, traded by the client and their clients. *** **Rewards** The total amount of rewards paid to you for trades executed by the client and their clients. *** **Clients** The total number of your clients attracted by your client, both [direct clients](#user-content-fn-1)[^1] and [sub-IB clients](#user-content-fn-2)[^2]. *** **Date** The date and time when a client has signed up to the B2CORE UI after clicking your referral link or promo banner. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **SubIB**: * Select **Yes** to display a list of your [sub-IB clients](#user-content-fn-3)[^3]. * Select **No** to display a list of your [direct clients](#user-content-fn-4)[^4]. * Select **None** to display a full list of clients. * **Client ID** — enter a client identifier to display the data on this client. * **Country** — select a country to display a list of clients who specified this country when signing up to the B2CORE UI. * **Date range** — select a start and end date to display the data on clients who have signed up to the B2CORE UI during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## View client details [#view-client-details] To open the **Client details** page, select a client and click the client row area. On the details page, you can switch between the following tabs: On this tab, you can find information about the client identifier, name, email address, location, and level[^5]. Depending on the configuration of your partnership program, partners rewards may be calculated based on levels assigned to their clients. On this tab, you can find a list of all clients, both [direct clients](#user-content-fn-6)[^6] and [sub-IB clients](#user-content-fn-7)[^7]. On this tab, you can find a list of client trading accounts, platforms on which the accounts were created, as well as trading and balance operations made on these accounts. On this tab, you can find a list of all trades executed by a client and learn about the rewards paid to you for each trade. [^1]: Clients who signed up to the B2CORE UI by your referral link. [^2]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. [^3]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. [^4]: Clients who signed up to the B2CORE UI by your referral link. [^5]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../../broker-guide/key-terms#level "mention") [^6]: Clients who signed up to the B2CORE UI by your referral link. [^7]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. The **CPA** report lists clients you have referred to the CPA program and shows how far each client has progressed through the program conditions. ## Generate a report [#generate-a-report] The following information is displayed in the report table: **Client** The unique identifier of the referred client. *** **CPA Program** The name of the CPA program to which the client was referred. *** **Steps Accomplished** The conditions from the CPA program payment plan that the client has completed. Possible steps include: * **Registration** — the client has registered using your referral link. * **KYC** — the client has completed identity verification. * **Minimum Deposit** — the client has made the minimum required deposit. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **CPA Program** — select a CPA program to display acquisitions attributed to this program. * **Date range** — select a start and end date to display acquisitions created during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following data is displayed in the report table: **Client Email** The email address of the client who owns the account to which the deposit was made. *** **Id** The identifier of a deposit operation. *** **Account** The trading account number. *** **Currency** The deposit currency. *** **Amount** The deposit amount. *** **Date** The date and time when a deposit was made. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Platform unique value** — enter a unique identifier of a deposit operation to display the corresponding deposit. * **Account** — enter a trading account number to display the data on deposits made to this account. * **Date range** — select a start and end date to display the data on deposits made during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. The **Reports** page is a single page with the following tabs. Each tab provides its own table columns, and shares common **Filters** and **Rows per page** controls. ## Generate a report [#generate-a-report-] The following information is displayed in the report table: **Client ID** The client identifier. *** **Level** The client level[^1]. *** **Platform** The trading platform on which a trade was executed. *** **Account ID** The identifier of a trading account on which a trade was executed. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbols traded. *** **Volume Lot** The volume traded, in lots. *** **Reward Amount** The rewards paid to you for a trade. *** **Trade Execution Time** The date and time when a trade was executed. *** **Transaction ID** The identifier of the transaction through which the reward was paid. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on trades executed by this client. * **Account ID**, **Trade ID**, **Transaction ID** — enter an account, trade, or transaction identifier to display the corresponding trades. * **Symbol** — specify trade symbols, such as **ETH/USD**, to display the data on trades that were made on these symbols. * **Level** — enter a client level to display the data on rewards generated by the clients assigned this level. * **Date range** — select a start and end date to display the data on trades executed during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. [^1]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../../broker-guide/key-terms#level "mention") The **Savings Rebates** report lists the rewards you have received for clients who invested in savings plans. ## Generate a report [#generate-a-report] The following information is displayed in the report table: **Client** The unique identifier of the client whose savings activity generated the reward. *** **Program** The name of the savings program for which the reward was calculated. *** **Level** The program level at which the reward was calculated. *** **Rebate** The reward amount paid to you. *** **Period** The date of the period for which the reward was calculated. *** **Status** The current status of the payment: * **Pending** — the reward is waiting to be processed. * **Succeeded** — the reward was successfully transferred to your account. * **Failed** — the reward could not be transferred. ## Sort data [#sort-data] Click the **Program** column header to sort payments. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Status** — select a status to display payments with this status. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] The following data is displayed in the report table: **Email** The email address of the client who executed the trade. *** **Client ID** The client identifier. *** **Platform** The trading platform on which a trade was executed. *** **Account ID** The identifier of a trading account on which a trade was executed. *** **Symbol** The symbols traded. *** **Position ID** The identifier of the position associated with the trade. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Position** The position status. Possible values: * Open * Closed *** **Volume** The volume traded, in lots. *** **Trade Execution Time** The date and time when a trade was executed. *** **Price** The price at which the trade was executed. *** **Swap** The swap amount charged or credited for the trade. *** **Commission** The commission charged for the trade. *** **Profit** The profit or loss generated by the trade. ## Filter data [#filter-data] You can filter the data displayed on this page using the following criteria: * **Trade ID**, **Position ID**, **Account ID** — enter a trade, position, or account identifier to display the corresponding trades. * **Date range** — select a start and end date to display the data on trades executed during the specified period. * **Email** — specify a client email to display the data on trades executed by this client. * **Client ID** — enter a client identifier to display the data on trades executed by this client. * **Side** — specify a trade side to display the corresponding trades. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Transaction ID** The transaction identifier. *** **Wallet ID** The identifier of a wallet to which a reward was paid. *** **Rewards** The number of trades covered by a single reward payment. *** **Amount** The amount rewarded. *** **Date** The date and time when a transaction was made. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Transaction ID** — enter a transaction identifier to display the corresponding transaction. * **Wallet ID** — enter a wallet identifier to display the data on rewards paid to this wallet. * **Date range** — select a start and end date to display the data on transactions made during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following data is displayed in the report table: **Client Email** The email address of the client who owns the account from which the withdrawal was made. *** **Account** The trading account number. *** **Currency** The withdrawal currency. *** **Amount** The withdrawal amount. *** **Id** The identifier of a withdrawal operation. *** **Date** The date and time when a withdrawal operation was made. ## Filter data [#filter-data] You can filter the data displayed on this page using the following criteria: * **Platform unique value** — enter a unique identifier of a withdrawal operation to display the corresponding withdrawal. * **Account** — enter a trading account number to display the data on withdrawals made from this account. * **Date range** — select a start and end date to display the data on withdrawals made within the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Account list [#account-list] The following information is provided on each account: **Account** The account number. Click it to view [account details](accounts#account-details). *** **Client ID** The partner identifier in the B2CORE UI. *** **Contact email** The partner email. *** **IB name** The partner name. *** **IB type** The partnership program. *** **Created** The date and time when an account was created. ## Account details [#account-details] To view details, click the **account number** or . The page is divided into the following tabs: On this tab, you can view detailed information about an account. **Account** The account number. *** **Balance** The current balance on an account. *** **Introducing broker** The partner name. *** **Type** The account type. *** **Created** The date and time when an account was created. On this tab, you can view reward-related transactions made on a currently selected account. For a detailed description of the fields, see [Transactions](transactions). ## Currency list [#currency-list] View the following information for each currency: **Name** The currency name. *** **Alias** The currency designation used on a specific trading platform. *** **Alphabetic code** The alphabetic currency code. For fiat currencies, the codes are as per ISO 4217; for cryptocurrencies, conventional coding is used. *** **Numeric code** The numeric currency code. For fiat currencies, the codes are as per ISO 4217; for cryptocurrencies, conventional coding is used. *** **Minor unit** The maximum number of digits after a decimal separator, indicating the decimal precision with which the amounts in a currency are displayed. *** **Sign** The currency symbol. *** **Class** The currency category. Possible values: * Fiat * Crypto *** **Created** The date and time when a currency was added. ## Currency details [#currency-details] To view details, click the **currency number** or . Here you can view and customize currency settings. All fields, except for **Created**, can be modified. On this page, you can view a list of failed IB reward payments along with the error details. The following information is provided about each failed payment: **ID** The identifier of the failed payment. *** **Error Reason** The reason why the payment failed. *** **Error Message** The detailed error message. *** **Transaction ID** The identifier of the related transaction. *** **Account ID** The identifier of the related account. *** **Created At** The date and time when the failed payment was registered. At least one provider is configured by default. For custom crypto assets, you can manually specify a static exchange rate for it. ## Provider list [#provider-list] View the following information for each rate provider: **Priority** The rate provider priority. If you have multiple providers configured, data requests are sent based on their priority. If the highest priority provider doesn’t respond, the request moves to the next provider in line, continuing in this manner until the data is received. *** **Name** The rate provider name. **Created** The date and time when a rate provider was added. ## Rate provider details [#rate-provider-details] To view details, click the **provider name** or . The page is divided into the following tabs: On this tab, you can customize rate provider settings. **Provider** The rate provider. *** **Priority** The rate provider priority. This value can be modified. *** **Name** The rate provider name. This value can be modified. *** **Base currency** *Available for custom rate providers only*. The base currency. This value can be modified. *** **Quote currency** *Available for custom rate providers only*. The quote currency. This value can be modified. *** **Rate** *Available for custom rate providers only*. The exchange rate. This value can be modified. *** **Created** The date and time when a rate provider was added. *Not available for custom static rates*. On this tab, you can run diagnostics and check the connection to a provider, by clicking the **Test connection** button. ## Reward list [#reward-list] View the following information for each reward: **Trade execution time** The date and time when a trade was executed. *** **Trade ID** The identifier of a trade for which a reward was paid. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Currency** The reward currency. *** **Amount** The reward amount. *** **Level** The client level. *** **IB name** The name of a partner. *** **IB email** The partner email. *** **IB type** The partnership program. *** **Transaction ID** The identifier of a transaction that resulted in crediting a reward to a partner's account. Multiple rewards can be paid as part of a single transaction. **State** The current status of a reward payment: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and debited from a partner's account. *** **Created** The date and time when a reward was calculated. ## Reward details [#reward-details] To edit information about a reward, click the **trade execution time** or . The detailed information contains the following: **Reward state** The current status of a reward payment: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and debited from a partner's account. *** **Reward amount** The total amount rewarded. *** **Transaction ID** The transaction identifier. *** **Level** The partner's level. *** **Introducing broker** The name of a partner. *** **Payment plan** The formula for setting up the rewards calculation. To learn more, refer to [Payment plans](../../payment-plans). *** **Level ratio** The multiplier based on which rewards are calculated considering a partner's level. *** **Personal ratio** The individual multiplier based on which rewards are calculated for a specific client. *** **Tier ratio** The multiplier based on which rewards are calculated considering a specific tier. *** **Tier trading volume** The trading volume defined for a tier. *** **Tier active traders** The number of active traders defined for a tier. *** **Tier name** The tier name. *** **Tier period** The number of days during which a partner must meet tier objectives to receive increased rewards. *** **Created** The date and time when a reward was paid. *** **Trading platform** The trading platform name. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Trading account** The account number of a client who executed a trade. *** **Trade ID** The trade identifier. *** **Trade execution time** The date and time when a trade was executed. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Quote currency** The quote currency traded. *** **Contract size** The trade amount. *** **Price** The execution price. *** **Volume, lots** The trade volume, in lots. *** **Volume, USD** The trade volume, in USD. *** **Commission** The paid commission amount. *** **Client email** The email of a client who executed a trade. *** **Client ID** The client identifier in the B2CORE UI. ## Transactions list [#transactions-list] View the following information for each transaction: **ID** The transaction identifier. *** **Currency** The currency in which a reward was paid. *** **Amount** The amount of a transaction. *** **Account number** The partner account number. *** **Client ID** The identifier of a client profile. *** **IB name** The name of a partner. *** **IB email** The partner email. *** **IB type** The partnership program. *** **Status** The current status of a transaction. Possible values: * **Failed** — the transaction failed due to internal technical reasons. This is a final status. * **Invalid** — the transaction amount is `0`, the transaction won't be processed. This is a final status. * **Processing** — the transaction is currently being credited, the status will be changed soon. * **Transferred** — the transaction was successfully credited. This is a final status. *** **Processed** The date and time when a transaction was credited. *** **Created** The date and time when a transaction was created. ## Transaction details [#transaction-details] To view details, click the **transaction ID** or . The page is divided into the following tabs: On this tab, you can view detailed information about a transaction. **Status** The current status of a transaction. Possible values: * **Failed** — the transaction failed due to internal technical reasons. This is a final status. * **Invalid** — the transaction amount is **0** (zero), the transaction won't be processed. This is a final status. * **Processing** — the transaction is currently being credited, the status will be changed soon. * **Transferred** — the transaction was successfully credited. This is a final status. *** **Amount** The amount of a transaction. *** **Side** The transaction side. Possible values: * Debit * Credit *** **Account** The account number of a partner. *** **Client ID** The identifier of a client profile. *** **Contact email** The partner email. *** **IB name** The name of a partner. *** **IB type** The partnership program. *** **Rewards** The number of rewards paid by this transaction. *** **Processed** The date and time when a transaction was credited. *** **Created** The date and time when a transaction was created. On this tab, you can view the rewards credited to a partner's account by this transaction. For more details, refer to [Rewards](rewards). Client acquisitions are tracked per CPA program. To view acquisitions for a program, open the program and go to the **Client Acquisitions** tab. ## Acquisition list [#acquisition-list] View the following information for each CPA acquisition: **Client ID** The unique identifier of the referred client. *** **Client Name** The name of the referred client. *** **Partner Name** The name of the partner who referred the client. *** **Partner User ID** The unique identifier of the partner who referred the client. *** **Events** The conditions from the payment plan that the client has fulfilled. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display acquisitions attributed to this partner. * **Date range** — select a start and end date to display acquisitions created during the specified period. **See also:** * [CPA programs](cpa-programs) * [Payment plans](payment-plans) * [CPA payments](cpa-payments) ## Payment list [#payment-list] View the following information for each CPA payment: **Partner User ID** The unique identifier of the partner who earned the reward. *** **Partner Name** The name of the partner who earned the reward. *** **Payment Amount** The reward amount. *** **Currency** The reward currency. *** **Status** The current status of a CPA payment: * **Pending** — the reward has been calculated and is waiting to be processed. * **Processing** — the reward transfer is in progress. * **Processed** — the reward was successfully transferred to the partner's account. * **Succeeded** — the reward transfer was confirmed as successful. * **Failed** — the reward could not be transferred to the partner's account. * **Cancelled** — the reward was cancelled and will not be paid. *** **Processed At** The date and time when the payment was processed. *** **Created** The date and time when the CPA payment was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display payments for this partner. * **Partner Name** — enter a partner name to display payments for this partner. * **Status** — select a status to display payments with this status. * **Date range** — select a start and end date to display payments processed during the specified period. **See also:** * [CPA programs](cpa-programs) * [CPA acquisitions](cpa-acquisitions) ## Program list [#program-list] View the following information for each CPA program: **Name** The name of a CPA program. Click the name to open the [program details](cpa-programs#program-details). *** **Reward Currency** The currency in which partner rewards are paid. *** **Payment Mode** The mode that determines how rewards are calculated when a client meets multiple conditions: * **Cumulative** — the partner receives a reward for each payment plan whose conditions are met. Rewards from all triggered plans are added together. * **Max Tier** — only the highest-priority payment plan whose conditions are met is rewarded. The payment window defines the period during which the client can still reach a higher tier before the reward is finalised. *** **Active** Whether the CPA program is active: * **Yes** — the program is active and partners can earn rewards. * **No** — the program is inactive and no new rewards are created. *** **Created** The date and time when a CPA program was created. *** **Updated** The date and time when a CPA program was last updated. ## Edit a CPA program [#edit-a-cpa-program] To edit a CPA program, click the **Edit** icon next to the program in the list, or click **Edit** on the program details page. The following fields can be edited: * **Name** — the name of the program. * **Description** — the description of the program. Reward Currency and Payment Mode cannot be changed after the program is created. ## Create a CPA program [#create-a-cpa-program] To create a CPA program: 1. Click **Create**. 2. Fill in the required fields: * **Name** — enter a name for the CPA program. * **Description** — optionally, enter a description. * **Reward Currency** — select the currency in which partner rewards will be paid. * **Payment mode** — select how rewards are calculated. 3. If **Max Tier** is selected as the payment mode, specify the **Payment Window (days)**. This is the period during which a client must meet conditions to trigger a reward. 4. Click **Save**. After creating a program, add [payment plans](payment-plans) and conditions to define the reward structure. ## Program details [#program-details] To access program details, click the **program name**. The page displays the program settings and the list of associated [payment plans](payment-plans), organized in the following tabs: * **General** — program settings. * **CPA Payment Plans** — the payment plans associated with this program. * **Client Acquisitions** — clients referred by partners who have fulfilled the program conditions. See [CPA acquisitions](cpa-acquisitions). ### Activate a program [#activate-a-program] A CPA program can only be activated if it has at least one active payment plan with at least one condition. To activate a program, click **Activate**. To deactivate an active program, click **Deactivate**. Deactivating a program stops new rewards from being created but does not affect rewards already in progress. ### Assign to a partner group [#assign-to-a-partner-group] A CPA program must be assigned to a partner group to take effect. Partners in the group will earn CPA rewards when their referred clients meet the program conditions. To assign a CPA program to a partner group, go to **Program** → **Types**, open the group settings, and select the program in the **CPA Program** field on the **Preferences** tab. ## Filter data [#filter-data] You can filter the data displayed in the CPA programs list using the following criteria: * **Name** — enter a program name to search for programs with a matching name. * **Payment Mode** — select a payment mode to display programs with this mode. * **Active** — select a status to display active or inactive programs. * **Date range** — select a start and end date to display programs created during the specified period. **See also:** * [Payment plans](payment-plans) * [CPA acquisitions](cpa-acquisitions) * [CPA payments](cpa-payments) CPA is disabled by default. Contact your B2BROKER integration team to enable it. Each [CPA program](cpa-programs) contains one or more payment plans. A payment plan defines the set of conditions a referred client must meet for the partner to earn a reward. ## Payment plan list [#payment-plan-list] View the following information for each payment plan: **Name** The name of a payment plan. *** **Payment Amount** The reward amount paid to the partner when the plan conditions are met. *** **Priority** The priority of the plan. Only used in **Max Tier** mode — when a client qualifies for multiple plans, only the plan with the highest priority is rewarded. In **Cumulative** mode, priority has no effect. If two plans have the same priority in **Max Tier** mode, the behavior is undefined — only one plan will be rewarded but the result is not deterministic. Always assign a unique priority to each plan to avoid ambiguity. *** **Conditions** The conditions configured for the payment plan. *** **Created** The date and time when the payment plan was created. ## Edit a payment plan [#edit-a-payment-plan] To edit a payment plan, open the CPA program in edit mode and click the **Edit** icon next to the plan. The following fields can be edited: * **Name** — the name of the plan. * **Description** — the description of the plan. * **Payment Amount** — the reward amount. * **Priority** — the plan priority. * **Conditions** — add or remove conditions. Payment Amount and conditions cannot be changed while the CPA program is active. Deactivate the program first, make the changes, then reactivate it. ## Delete a payment plan [#delete-a-payment-plan] To delete a payment plan, open the CPA program in edit mode and click the **Delete** icon next to the plan. A payment plan cannot be deleted while the CPA program is active. Deactivate the program first. ## Add a payment plan [#add-a-payment-plan] To add a payment plan to a CPA program: 1. Open a CPA program in edit mode (click **Edit**). 2. In the **CPA Payment Plans** section, click **Create**. 3. Fill in the required fields: * **Name** — enter a name for the payment plan. * **Description** — optionally, enter a description. * **Payment Amount** — enter the reward amount to pay to the partner when conditions are met. * **Priority** — set the priority of the plan. Only applies in **Max Tier** mode — when a client qualifies for multiple plans, only the plan with the highest priority is rewarded. * **Conditions** — select one or more conditions the referred client must fulfill. For condition-specific options, see [Condition types](payment-plans#condition-types). 4. Click **Save**. Conditions cannot be added to or removed from a payment plan while the CPA program is active. Deactivate the program first, make the changes, then reactivate it. ## Condition types [#condition-types] **Registration** The client registered in the B2CORE UI by clicking the partner's referral link. No additional fields. *** **KYC Approved** The client passed the KYC verification at the specified level. * **KYC Level** — the verification level the client must reach. The available levels depend on the project configuration. *** **Minimum Deposit** The client deposited at least the specified amount. * **Amount** — the minimum deposit amount. * **Currency** — the currency of the deposit. A payment plan can have multiple conditions selected. All selected conditions must be met for the partner to earn the reward. **See also:** * [CPA programs](cpa-programs) * [CPA acquisitions](cpa-acquisitions) ## Accounts list [#accounts-list] View the following information for each trading account: **Platform** The trading platform name. *** **Group** The account group defined on the platform. *** **Type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Account** The account number on a trading platform. This is a link to [account details](accounts#account-details). *** **Currency** The currency in which an account is denominated. *** **Trades** The number of trades made on the account. *** **Deposits** The amount deposited to an account. *** **Withdrawals** The amount withdrawn from an account. *** **Balance** The balance on an account. *** **Credit** The credit on an account. *** **Equity** The account equity. *** **Commission** The commissions paid for operations on an account. *** **Swap** The swap on an account. *** **Profit** The profit on an account, before commissions. *** **PnL** The profit-loss value calculated for an account. *** **Name** The name of a client profile. *** **Email** The client email. *** **Client ID** The identifier of a client profile. *** **Archived** Indicates whether an account is archived on a trading platform. *** **Enabled** If enabled, the account participates in data sync and calculation of rewards. All accounts are enabled by default (the **Enabled** field is set to **Yes**). You can change the this status in the account details. *** **Hidden** If **Yes**, an account isn't shown to a partner. This means the account is included in a [group](groups) for which the **Hide accounts** setting is enabled. *** **Created** The date and time when an account was created on a trading platform. ## Account details [#account-details] To view details, click the **account number** or . The page is divided into the following tabs: On this tab, you can view general information about an account. On this tab, you can view the deposit history of an account. For a detailed description of the fields, see [Deposits](deposits). On this tab, you can view the withdrawal history of an account. For a detailed description of the fields, see [Withdrawals](withdrawals). On this tab, you can view trading history of an account, with the following data provided on each trade: **Trade execution time** The date and time when a trade was executed. *** **Platform** The name of a platform on which a trade was executed. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Volume, lots** The volume traded, in lots. *** **Position** The current position state. Possible values: * Closed * Open *** **Rewards** The amount of rewards paid for a trade. ## Deposit list [#deposit-list] By default, the list is sorted by date in the descending order (the most recent deposits appear at the top of the list). For a list of deposits made by a client, navigate to the **Program** > **Clients** > **Details** > **Deposits** tab. For a list of deposits made on a trading account, navigate to the **Platforms** > **Accounts** > **Details** > **Deposits** tab. View the following information for each deposit: **Date** The date and time when a deposit operation was made. *** **Platform** The trading platform name. *** **Account** The trading account number. *** **Currency** The deposit currency. *** **Amount** The deposit amount. *** **ID** The deposit identifier. ## Deposit details [#deposit-details] To view details, click the **deposit ID** or . The detailed information contains the following: **Trading platform** The trading platform name. *** **Transaction ID** The unique identifier of a deposit operation on a trading platform. *** **Trading account** The trading account number. *** **Base currency code** The deposit currency. *** **Amount** The deposit amount. ## Group list [#group-list] View the following information for each group: **Platform** The trading platform name. *** **Group** The group of trading accounts as set on a trading platform. *** **Trades** The number of trades made by IB clients. *** **Created** The date and time when a group was created on a trading platform. ## Group details [#group-details] To view details, click the **group name** or . The page is divided into the following tabs: On this tab, you can view the general configuration of a group. **Platform** The trading platform name. *** **Group** The group of trading accounts, as defined on the trading platform. *** **Currency** The currency in which the trading accounts in this group are denominated. *** **Lot size** The lot size. The standard lot size of **1.00** is used by default; the lot size of **0.01** is used for groups providing for greater decimal precision. *** **Hide accounts** If **Yes**, accounts included in this group are hidden and aren't shown to a partner. *** **Archived** If **Yes**, this group was archived on the trading platform. *** **Created** The date and time when a group was created on the trading platform. On this tab, you can view information about trades. **Trade execution time** The date and time when a trade was executed. *** **Platform** The trading platform name. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Volume** The volume traded. *** **Position** The current position state. Possible values: * Open * Closed *** **Rewards** The amount of rewards paid for a trade. ## Platform list [#platform-list] The page data is presented in a table form, with the table columns providing the following information: **ID** The platform identifier in the B2CORE IB. *** **Name** The trading platform name. *** **Status** The trading platform status. Possible values: * Enabled * Disabled *** **Trades** The number of trades made on a platform. *** **Created** The date and time when a platform was connected to your IB. ## Platform details [#platform-details] To view details, click the **platform name** or . The page is divided into the following tabs: On this tab, you can view trading platform settings. Learn about the provider, credentials, and date and time when a platform was edited. Click the **Platform ID** link to navigate to the **Edit platform** page where you can view the details about a provider and configure its settings. After you have finished configuring a platform, click **Save** to apply the changes. *** **Trades cutoff (UTC)** Empty by default. Set it if you need the system to ignore trades made before a specific date. On this tab, you can view information about drivers. The **Report** and **WEBAPI** drivers are configured by default. You can specify the driver **Priority** so that if a driver with a higher priority fails, a backup driver with a lower priority is used instead. If all drivers fail, the service reports that it can't operate properly. After a driver is added, it's automatically assigned the lowest priority. The priority can be changed later on when configuring drivers. You can run diagnostics by clicking the **Test connection** button. Click the driver name to navigate to the details page where you can view the details about a driver and configure its settings. After you have finished configuring a driver, click **Save** to apply the changes. ## Symbol list [#symbol-list] View the following information for each symbol: **Platform** The trading platform name. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol group** *Applicable only for MetaTrader 5.* The symbol group, as defined on the trading platform. *** **Symbol** The symbol code. *** **Contract size** The contract size. *** **Quote currency code** The code of the quote currency. *** **Archived** If **Yes**, this symbol was archived on the trading platform. *** **Trades** The total number of trades by a symbol. *** **Created** The date and time when a symbol was created on a trading platform. ## Symbol details [#symbol-details] To view details, click the **symbol name** or . The page is divided into the following tabs: On this tab, you can view detailed information about a symbol. **Trading platform** The trading platform name. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol** The symbol code. *** **Quote currency** The second currency listed in a currency pair. *** **Contract size** The contract size. *** **Archived** If **Yes**, this symbol was archived on the trading platform. *** **Created** The date and time when a symbol was created. On this tab, you can view, add and modify payment plans configured for symbols. **#** The sequence number. *** **Type** The partnership program. *** **Payment plan** The configuration of rewards calculation. *** **Position** The position status. Possible values: * Open * Closed *** **Created** The date and time when a payment plan was created. ## Trade list [#trade-list] View the following information for each trade: **Trade execution time** The date and time when a trade was executed. *** **Platform** The name of a trading platform. *** **Account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Account** The number of a trading account. *** **Trade ID** The trade identifier on the trading platform. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The trade symbol. *** **Volume, lots** The volume traded, in lots. *** **Position** The current position state. Possible values: * Open * Closed *** **Reversal** *Applicable for cTrader only.* If **Yes**, the position was reversed as a result of the trade. For more information, refer to [cTrader documentation](https://help.ctrader.com/ctrader-web/interface/trade-watch/#reverse-and-double-position). *** **Rewards** The number of rewards paid for a trade. ## Trade details [#trade-details] To view details, click the **Trade execution time**, **Trade ID** or . The page is divided into the following tabs: On this tab, you can view detailed information about a trade. **Trading platform** The name of a trading platform. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Trading account** The account number of a client that has executed a trade. *** **Trade ID** The trade identifier on the trading platform. *** **Trade execution time** The date and time when a trade was executed. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol name. *** **Quote currency** The alphabetic code of a quote currency. *** **Contract size** The contract size. *** **Price** The trade execution price. *** **Volume, lots** The volume traded, in lots. *** **Volume, USD** The volume traded, in USD. *** **Commission** The total amount of paid commissions. *** **Reversal** *Applicable for cTrader only.* If **Yes**, the position was reversed as a result of the trade. For more information, refer to [cTrader documentation](https://help.ctrader.com/ctrader-web/interface/trade-watch/#reverse-and-double-position). *** **Client email** The client email. *** **Client ID** The client identifier. On this tab, you can view detailed information about rewards paid for trades. This tab is empty if no rewards were paid. **Level** The level of a client. *** **Currency** The currency in which a reward was paid. *** **Amount** The amount of a reward. *** **IB name** The partner name. *** **IB email** The partner email. *** **IB type** The name of partnership program. *** **State** The current status of a reward payment. Possible values: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and then debited from a partner's account. *** **Created** The date and time when a reward was calculated. ## Withdrawal list [#withdrawal-list] The list is sorted by date in descending order by default (newer withdrawals appear at the top of the list). To view a list of withdrawals specified by a client, navigate to the **Program** > **Clients** > **Details** > **Withdrawals** tab. To view a list of withdrawals specified by a trading account, navigate to the **Platforms** > **Accounts** > **Details** > **Withdrawals** tab. View the following information for each withdrawal: **Date** The date and time when a withdrawal operation was executed. *** **Platform** The trading platform name. *** **Account** The account number on a trading platform. *** **Currency** The currency in which a withdrawal operation was executed. *** **Amount** The amount of a withdrawal operation. *** **ID** The identifier withdrawal operation. ## Withdrawal details [#withdrawal-details] To view details, click the **withdrawal ID** or . The detailed information contains the following: **Trading platform** The trading platform name. *** **Transaction ID** The unique identifier of a withdrawal operation on a trading platform. *** **Trading account** The account number on a trading platform. *** **Base currency code** The currency in which a withdrawal operation was executed. *** **Amount** The amount of a withdrawal operation. The B2CORE IB API is currently restricted and **not** publicly available. ## App list [#app-list] View the following information for each app: **App name** The app name. *** **Registration date** The date and time when an app was registered. ## App details [#app-details] To view details, click the **app name** or **pencil icon**. The detailed information contains the following: **App name** The app name. *** **Client ID** The public identifier of your app. *** **Client secret** The private identifier of your app, which is used to verify the client's identity when accessing the system via the API. Your **Client ID** and **Client secret** are used to verify your identity. To properly protect you and your clients, please make sure that these values are kept in a secure storage. **Registration date** The date and time when an app was registered. Date and time values in the B2CORE UI are displayed according to these settings. The values on this page are read-only and can't be modified. On this page, a connection to the IB server is set up. The **API status** field on this page indicates the current API connection status. The most common statuses are listed below: * `Running` — the IB server is functioning properly. * `Maintenance` — the IB server is being updated. * `NotFoundHttpException` — an incorrect **API Base URL**. * `SSL Certificate Problem` — the certificate has expired. This page contains current versions of the B2CORE IB and a link to Release notes. ## Client list [#client-list] View the following information for each client: **Registration date** The date and time when a client was registered. *** **Name** The name of a client. This is a link to [client details](clients#client-details). *** **Country** The client's location. *** **Email** The client's email address. *** **Client ID** The client identifier used in the B2CORE UI. *** **IB type** The partnership program joined by a partner who referred the client. *** **IB** The name of a partner who referred the client. This is a link to [partner details](introducing-brokers#partner-details). ## Client details [#client-details] To access details, click the **client name** or . The page is divided into the following tabs: On this tab, you can view the client identifier, tags, chain, name, email, country, and registration date. On this tab, you can view a client's trading accounts. For a detailed description of the fields, see [Accounts](../platforms/accounts). On this tab, you can view a client's deposit history. For a detailed description of the fields, see [Deposits](../platforms/deposits). On this tab, you can view a client's withdrawal history. For a detailed description of the fields, see [Withdrawals](../platforms/withdrawals). On this tab, you can view a client's trading history. For a detailed description of the fields, see [Trades](../platforms/trades). ## Partner list [#partner-list] View the following information for each partner: **Name** The name of a partner. This is a link to [partner details](introducing-brokers#partner-details). *** **Country** The country specified by a partner during registration and a KYC procedure. *** **Email** The partner email. *** **Client ID** The partner identifier used in the B2CORE UI. *** **Direct clients** The number of partner's [direct clients](#user-content-fn-1)[^1]. *** **Trading volume, lots** The total trading volume, in lots, for which rewards were paid, including the volume traded by all of the partner's clients regardless of their level. Use a quick filter to include or exclude clients with zero trading volume. *** **Trading volume, USD** The total trading volume, in USD, for which rewards were paid, including the volume traded by all of partner's clients regardless of their level. Use a quick filter to include or exclude clients with zero trading volume. *** **Reward amount** The total amount of rewards paid to a partner. *** **IB type** The partnership program joined by a partner. *** **Master** Indicates if a partner is assigned the Master[^2] status. *** **Registration date** The date and time when a partner joined a partnership program. ## Partner details [#partner-details] To access details, click the **partner name** or . The page is divided into the following tabs: On this tab, you can view the partner profile information and do the following: * Configure payment preferences * Change a program joined by a partner * Block a partner On this tab, you can view a partner's banner performance data. For a detailed description of the fields, see [Banners](../promo/banners/). On this tab, you can view a partner's link performance data and generate a QR code. For a detailed description of the fields, see [Landings](../promo/landings). On this tab, you can view the click performance for a partner's links and banners. For a detailed description of the fields, see [Analytics](../promo/analytics/clicks). On this tab, you can view a partner's direct clients and sub-IB clients. For a detailed description of the fields, see [Clients](clients). On this tab, you can view a list of accounts of all partner's clients. For a detailed description of the fields, see [Accounts](../platforms/accounts). On this tab, you can view a partner's account deposit history. For a detailed description of the fields, see [Deposits](../platforms/deposits). On this tab, you can view a partner's account withdrawal history. For a detailed description of the fields, see [Withdrawals](../platforms/withdrawals). On this tab, you can view a partner's trading history. For a detailed description of the fields, see [Trades](../platforms/trades). On this tab, you can view the rewards paid to a partner. For a detailed description of the fields, see [Rewards](../payments/rewards). On this tab, you can view reports for paid rewards. Use the **Group by** option to view trades according to a specific timeframe (previous hour, day, week, month, year). To view trades over a custom timeframe, enter the **Period start** and **Period end** dates. For more details, refer to [Payment report](../reports/payment-report). **See also:** * [How to register a partner](../../how-to-articles/how-to-register-a-partner) * [How to block a partner](../../how-to-articles/how-to-block-a-partner) * [How to configure personal rewards](../../how-to-articles/how-to-configure-personal-rewards) * [How to configure a Master IB](../../how-to-articles/how-to-configure-a-master-ib) [^1]: Clients who signed up to the B2CORE UI by a referral link of a partner. [^2]: Key partners with personal conditions. To learn more, see [#master-ib](../../key-terms#master-ib "mention") On this page, you can reassign clients and sub-IBs from one Introducing Broker to another without manually exporting and importing IB-related data. The following options are available: * **Reassign All** — reassign all users from one IB to another. Specify the following fields: * **Source IB email** — the email address of the IB from which users are reassigned. * **New IB email** — the email address of the IB to which users are reassigned. * **Reassign One** — reassign an individual client or sub-IB to another IB. Specify the following fields: * **Client / Sub-IB email** — the email address of the client or sub-IB to be reassigned. * **Source IB email** — the email address of the IB from which the user is reassigned. * **New IB email** — the email address of the IB to which the user is reassigned. Click **Preview** to review the reassignment before applying it. ## Reassignment history [#reassignment-history] The list of performed reassignments is displayed below, providing the following information: **Type** The reassignment type: `Reassign All` or `Reassign One`. *** **Introducing brokers** The source and destination IBs of the reassignment. *** **Status** The current status of the reassignment. *** **Users** The number of reassigned users. *** **Created** The date and time when the reassignment was created. ## Type list [#type-list] View the following information for each program: **Name** The name of a partnership program. This is a link to [type details](types#type-details). *** **Levels** The number of levels[^1] configured for a partnership program. *** **Tiers** The number of tiers[^2] configured for a partnership program. *** **Introducing brokers** The number of partners participating in a program. *** **Direct clients** The number of your partners' [direct clients](#user-content-fn-3)[^3]. *** **Reward amount** The number of rewards paid to your partners. *** **Created** The date and time when a partnership program was created. ## Type details [#type-details] To access details, click the **type name** or . The page is divided into the following tabs: On this tab, you can view the partnership program settings. **Name** The name of a partnership program. *** **Description** The description of a partnership program. *** **Registration** The options of joining a partnership program. Possible values: * **Auto** — each client signing up to the B2CORE UI automatically becomes a partner. If multiple partnership programs are available, an IB account is created for each program. * **Inherited** — clients are added to a partnership program automatically, but only if the partner who referred them already participates in this program. If the referring partner doesn't participate, or a client signs up without a referral link, no IB account is created. The program isn't visible in the B2CORE UI, so clients can't apply for it. * **Private** — clients are added to a partnership program by a Back Office admin. * **Public** — clients can view available partnership programs in the B2CORE UI and choose which programs they join. * **Restricted** — clients can join a partnership program only using a link provided by a participant of another or the same program. The program identifier is indicated in the **Restriction** field. *** **Approvement** *Applicable only for Public or Restricted registration.* If **Enabled**, clients join a partnership program only after their [joining requests](#user-content-fn-4)[^4] are approved by a Back Office admin. *** **Masked email** If **Enabled**, client names and emails aren't visible to a partner. *** **Hidden levels** If **Yes**, all configured levels are displayed. Disabled by default. *** *** **Tier period** The number of days in which the targets set on the **Tiers** tab must be achieved by a partner to receive an increased reward. *** **Currency** The currency in which rewards to partners are paid. The currency is product-specific and can't be edited. *** **CPA Program** The CPA program assigned to this partnership program. Partners in this program will earn CPA rewards when their referred clients meet the CPA program conditions. Only active CPA programs are available for selection. If the assigned program is later deactivated, it remains linked to the partnership program and is marked as inactive. *** **Created** The date and time when a partnership program was created. On this tab, you can view all the available symbols on connected trading platforms. You can choose different [payment plans](../../payment-plans) for different symbols. Trading platforms can be connected and disconnected in the [Platforms](../platforms/) section. **Platform** The name of a trading platform. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol group** *Applicable only for MetaTrader 5.* The symbol group, as defined on the trading platform. *** **Symbol** The name of a symbol. This is a link to symbol details. *** **Payment plan** The [payment plan](../../payment-plans) set up for a symbol. *** **Position** The state of positions for which rewards are paid. Possible values: * Open * Closed * Open & Closed On this tab, you can view the configured levels. Define the number of partner levels to reward and specify the multiplier used for calculating rewards. Level 1 is created by default. Create an unlimited number of levels depending on your partnership program design. **Level** The sequence number of a level. *** **Ratio** The rewards multiplier. *** **Created** The date and time when a level was created. *** **Updated** The date and time when a level was last updated. On this tab, you can view configured tiers and define targets for your partners. **Name** The name of a tier. *** **Active traders** The number of clients that a partner must introduce to receive an increased reward. These clients should execute at least one trade during the specified **Tier period** to be considered active traders. If 0 (zero), this benchmark is ignored during calculation of rewards. *** **Trading volume, lots** The volume, in lots, that must be traded by partner's clients. If 0 (zero), this benchmark is ignored during calculation of rewards. *** **Ratio** The reward multiplier. *** **Created** The date and time when a tier was created. *** **Updated** The date and time when a tier was last updated. On this tab, you can view the rewards paid to your partners participating in this partnership program. For a detailed description of the fields, see [Rewards](../payments/rewards). On this tab, you can view reports on paid rewards. View trades for different time intervals (hour, day, week, month, years) or view trades according to partners. To view trades over a custom timeframe, enter the **Period start** and **Period end** times. For more details, refer to [Payment report](../reports/payment-report). **See also:** * [How to create an IB type](../../how-to-articles/how-to-create-an-ib-type) * [How to change an IB type for a partner](../../how-to-articles/how-to-change-an-ib-type-for-a-partner) [^1]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../key-terms#level "mention") [^2]: Goals to achieve for receiving increased rewarding. To learn more, see [#tier](../../key-terms#tier "mention") [^3]: Clients who signed up to the B2CORE UI by a referral link of a partner. [^4]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/en/back-office-requests.html). The **Landings** section is not available in the Back Office. Landing pages are configured at the system level by your B2BROKER integration team and are used by partners in their IB Room. ## How landings work [#how-landings-work] In the current version of B2CORE IB, each instance has a single referral landing page configured at the system level. This is typically the registration page of your client portal. When a partner shares their referral link, it redirects the client to this landing page with the partner's unique token appended as a query parameter: ``` {scheme}://{host}{path}?{token}={partner_token} ``` For example: `https://my.example.com/register?referral=abc123` The following parameters are configured by your B2BROKER integration team: | Parameter | Description | Default | | --------------- | ---------------------------------------------------- | ----------- | | Scheme | Protocol used for the link | `https` | | Host | Domain of your client portal | — | | Path | Path to the registration page | `/register` | | Token parameter | Query parameter name that carries the referral token | `referral` | To configure or update these settings, contact your B2BROKER integration team. ## Partner view [#partner-view] Partners can see and copy their referral links in **IB Room → Promo → Links**. On that page, partners can also: * Select a landing page from the available options * Select a language * Add UTM parameters to their link * Generate a QR code for the link Using the **Acquisition report**, you can do the following: * Identify the partners whose clients have executed at least one trade during the reporting period. If the partner's clients haven't made any transactions for the selected period, such partners aren't included in the report. * Learn whether your referral links or promo banners are being clicked. * Assess different traffic sources and see from where new clients are coming (such as specific websites, social media or other venues). * Identify particular countries where the users who clicked your referral links are located. * View the number of clients who have completed registration after clicking your referral link or banner. * View the click conversion rate. The following filter parameters are available: * **Group by** — the criteria for grouping the filtered data. You can group the data by a country/region, referrer, partner or time period (spanning from one hour to a year). * **IB type** — the partnership program. * **Start date** — the beginning of the reporting period. * **End date** — the end of the reporting period. A report is generated automatically after applying filters. Above the report table, you can find **totals** calculated over a specified time period, along with trends obtained for the one preceding it. When exporting page data, the totals aren't included in the report file. The following data is displayed on this page: **Active partners** The number of new partners whose clients have executed at least one trade during the reporting period. *** **Clicks** The number of clicks. *** **Registrations** The number of registrations. *** **Click conversion rate** The number of registrations divided by the number of clicks, expressed as a percentage. It's calculated according to the following formula: **Registrations / Clicks × 100 %**. With a **Payment** report you can: * Spot the best performing traders generating the most revenue for you. * View the rewards paid to partners during a selected period of time. * Find out about the trading volume, both in lots and USD. To group and filter data, specify the following settings: * **Group by** — indicates whether to group data by partners or a time period * **IB type** — the partnership program * **Start date** — the beginning of a reporting period * **End date** — the end of a reporting period A report is generated automatically after applying filters. Above the report table, you can find **totals** calculated over a specified time period, along with trends obtained for the one preceding it. When exporting page data, the totals aren't included in the report file. The following data is available on this page: **Active partners** The number of new partners whose clients have executed at least one trade during the reporting period. *** **Active traders** The number of traders who have executed at least one rewarded trade. *** **Trades** The number of trades for which partners were rewarded. *** **Trading volume, lots** The volume of trades for which partners were rewarded, in lots. *** **Trading volume, USD** The volume of trades for which partners were rewarded, in USD. *** **Rewards** The rewards paid (and marked as *Credited*), in USD. Savings Rebates is disabled by default. Contact your B2BROKER integration team to enable it. A savings acquisition is created when a client referred by a partner enrolls in a savings program. The acquisition tracks savings activity events for that client. ## Acquisition list [#acquisition-list] View the following information for each savings acquisition: **Client ID** The unique identifier of the referred client. *** **Client Name** The name of the referred client. *** **Partner Name** The name of the partner who referred the client. *** **Partner User ID** The unique identifier of the partner who referred the client. *** **Savings Program** The savings program in which the client enrolled. *** **Events** The savings activity events recorded for this client, such as plan creation and deposits. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Savings Program** — select a program to display acquisitions for this program. * **Partner User ID** — enter a partner user ID to display acquisitions attributed to this partner. * **Date range** — select a start and end date to display acquisitions created during the specified period. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings programs](savings-programs) * [Savings payments](savings-payments) A savings payment is created when a partner earns a reward for a referred client's savings activity during a given period. ## Payment list [#payment-list] View the following information for each savings payment: **Partner User ID** The unique identifier of the partner who earned the reward. *** **Partner Name** The name of the partner who earned the reward. *** **Client ID** The unique identifier of the client whose savings activity generated the reward. *** **Savings Program** The savings program for which the reward was calculated. *** **Level** The program level at which the reward was calculated. *** **Period Date** The date of the period for which the reward was calculated. *** **Payment Amount** The reward amount. *** **Currency** The reward currency. *** **Status** The current status of a savings payment: * **Pending** — the reward has been calculated and is waiting to be processed. * **Processing** — the reward transfer is in progress. * **Processed** — the reward was successfully transferred to the partner's account. * **Succeeded** — the reward transfer was confirmed as successful. * **Failed** — the reward could not be transferred to the partner's account. * **Cancelled** — the reward was cancelled and will not be paid. *** **Created** The date and time when the savings payment was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display payments for this partner. * **Partner Name** — enter a partner name to display payments for this partner. * **Status** — select a status to display payments with this status. * **Period date range** — select a start and end date to display payments for periods within the specified range. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings programs](savings-programs) * [Savings acquisitions](savings-acquisitions) A savings program defines the conditions and reward rates under which partners earn rebates when their referred clients invest in savings plans. ## Program list [#program-list] View the following information for each savings program: **Name** The name of a savings program. Click the name to open the [program details](savings-programs#program-details). *** **Currency** The currency in which partner rewards are paid. *** **Active** Whether the savings program is active: * **Yes** — the program is active and partners can earn rewards. * **No** — the program is inactive and no new rewards are created. *** **Created** The date and time when a savings program was created. *** **Updated** The date and time when a savings program was last updated. ## Create a savings program [#create-a-savings-program] To create a savings program: 1. Click **Create**. 2. Fill in the required fields: * **Name** — enter a name for the program. * **Description** — optionally, enter a description. * **Currency** — select the currency in which partner rewards will be paid. 3. Click **Save**. After creating a program, add [levels](savings-programs#levels) to define the reward structure, then activate the program. Currency cannot be changed after the program is created. ## Edit a savings program [#edit-a-savings-program] To edit a savings program, click the **Edit** icon next to the program in the list. The following fields can be edited: * **Name** — the name of the program. * **Description** — the description of the program. ## Program details [#program-details] To access program details, click the **program name**. The page displays the program settings and the list of associated levels. ### Levels [#levels] Each savings program contains one or more levels. A level defines the reward rate a partner earns based on their referred clients' savings activity. View the following information for each level: **Level** The level number. *** **Reward Value** The reward rate, as a percentage applied to the client's savings amount. *** **Active** Whether the level is active. #### Add a level [#add-a-level] To add a level to a savings program: 1. Open the program details page. 2. In the **Levels** section, click **Create**. 3. Fill in the required fields: * **Level** — the level number. * **Reward Value** — the reward percentage. * **Active** — whether the level is active. 4. Click **Save**. #### Edit or delete a level [#edit-or-delete-a-level] Levels cannot be added, edited, or deleted while the savings program is active. Deactivate the program first. ### Activate a program [#activate-a-program] A savings program can only be activated if it has at least one active level. To activate a program, click **Activate**. To deactivate an active program, click **Deactivate**. Deactivating a program stops new rewards from being created but does not affect payments already in progress. ### Assign to a partner group [#assign-to-a-partner-group] A savings program must be assigned to a partner group to take effect. Partners in the group will earn savings rewards when their referred clients invest in savings plans. To assign a savings program to a partner group, go to **Program** → **Types**, open the group settings, and select the program in the **Savings Program** field on the **Preferences** tab. ## Filter data [#filter-data] You can filter the data displayed in the savings programs list using the following criteria: * **Name** — enter a program name to search for programs with a matching name. * **Active** — select a status to display active or inactive programs. * **Date range** — select a start and end date to display programs created during the specified period. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings acquisitions](savings-acquisitions) * [Savings payments](savings-payments) {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} If the default list doesn't meet your partnership program requirements, you can add new countries using the **Create** button or modify them according to your preferences using the **pencil icon**. The following information is provided about each country: **Name** The name of a country. *** **Alpha-2 code** The two-letter country code, as per ISO 3166. *** **Alpha-3 code** The three-letter country code, as per ISO 3166. *** **Numeric code** The numeric country code, as per ISO 3166. *** **Geographic region** The geographic subregion, as per ISO 3166. *** **Created** The date and time when an entity was added. By default, you can use the service which determines the client's geolocation based on the IP address. You can edit the available geolocation services or add custom ones. ## Providers list [#providers-list] The following information is provided about each provider: **Priority** The provider priority. If you have multiple providers configured, data requests are sent based on their priority. If the highest priority provider doesn’t respond, the request moves to the next provider in line, continuing in this manner until the data is received. *** **Name** The name of a provider. This is a link to provider details. *** **Created** The date and time when a provider was added. ## Provider details [#provider-details] To access details, click the **provider name** or **pencil icon**. Here you can adjust provider settings. The page is divided into the following tabs: On this tab, you can view general information on a provider, as well as change its name and priority. On this tab, you can view general information on a database, including the number of records. On this tab, you can run diagnostics and check the connection to a provider, by clicking the **Test connection** button. View the following information for each attack: **IP Address** The client IP address from which an attack was registered. *** **Incidents** The number of failed attempts to obtain a token using invalid credentials. *** **Created** The date and time when an attack was registered. View the following information for each authentication: **IP Address** The client IP address from which the authentication was made. *** **Client ID** The client identifier. *** **User-Agent** The User-Agent data. *** **Created** The date and time when a user was authenticated. **Authorization** is a successful obtaining of an access token using provided credentials. View the following information for each authorization: **IP Address** The client IP address from which the authorization was made. *** **Client ID** The client identifier. *** **User-Agent** The User-Agent data. *** **Created** The date and time when a token was obtained. *** **Updated** The date and time when a token was last refreshed. *** **Expires** The date and time when a token expires. Any IP address from which multiple failed attempts to authorize are made is automatically blocked for a certain period of time. Such addresses are added to a blacklist, along with the IP addresses that were blocked manually. View the following blacklist settings: **Enabled** The current access permissions set for an IP address. *** **Auth attempts** The maximum number of attempts to authorize or authenticate made from an IP address before it's added to a blacklist. *** **Deny, seconds** The time period for which an IP address is blocked, in seconds. An **incident** is a failed attempt to obtain a token using invalid credentials. If the number of incidents exceeds the **Auth attempts** threshold set on the **Preferences** > **Security** > **Blacklist** page, it's classified as an [attack](attacks). View the following information for each incident: **IP Address** The client IP address from which an incident was registered. *** **User-Agent** The User-Agent data. *** **Fingerprint** The device fingerprint data. *** **Requests** The amount of failed attempts to obtain a token with invalid credentials. *** **Attack** Indicates whether the incident is considered an attack. *** **Created** The date and time when an incident was registered. View the following information for each IP address: **IP Address** The IP address. *** **Policy** The access policy. Possible values: * **allow** — access to the IB platform is allowed from this IP address. * **deny** — access to the IB platform is denied from this IP address. *** **Time to live** *(optional)* The time period for which a policy holds, in seconds. *** **Expires** The date and time when a policy expires. *** **Created** The date and time when a policy was added. Before enabling a whitelist, make sure **all** trusted IPs are assigned the **allow** policy on the **Preferences** > **Security** > **IP addresses** page. Set **Enabled** to **Yes** to allow access only from specific IP addresses and deny access from all other IPs. ## Click list [#click-list] View the following information for each click: **Date** The date and time when a click was made. This is a link to click details. *** **IP address** The IP address from which registration was completed. *** **Latitude**, **Longitude** The geographical coordinates of a newly registered client. *** **Country** The country of a newly registered client, according to the IP address. *** **Landing page** The landing page to which a referral link is pointing. *** **URL** The resource identifier. *** **UTM Campaign** The URI parameter that specifies an individual campaign name. *** **UTM Content** The URI parameter that’s used to differentiate similar content or links within the same ad. For example, if you have two call-to-action links within the same email message, you can use **UTM Content** and set different values for each so you can tell which version is more effective. *** **UTM Medium** The URI parameter that specifies advertising or marketing media, for example: cpc, banner, email. *** **UTM Source** The URI parameter that identifies an advertiser, site, publication, that’s sending traffic to your property, for example: google, youtube. *** **UTM Term** The URI parameter that identifies paid search keywords. *** **Referrer** An HTTP header identifying the address of a web page from which a resource was requested. *** **User-Agent** The User-Agent data, which may include optional comments. *** **Client ID** The link to a client's profile in the B2CORE UI. *** **Client name** The name of a newly registered client. *** **Contact email** The email of a newly registered client. *** **Country of residence** The country specified by a client during registration. *** **Registration** The status of a client registration request. ## Click details [#click-details] To access details, click the **Date** or . A banner you create is automatically made available to every partner of the corresponding partnership program — there is currently no way to restrict a banner to specific partners or partner groups. ## Banner list [#banner-list] View the following information for each banner: **Banner** The thumbnail banner image. *** **Name** The banner name. *** **Language** The banner [language](languages). *** **Size** The banner [size](sizes). *** **Theme** The banner [theme](themes). *** **Clicks** The number of times a banner was clicked. *** **Registrations** The number of clients registered after clicking a banner. A click is only counted once the banner is actually rendered and loaded on a page a visitor opens — navigating to the banner's landing page URL directly (without the banner itself being displayed) is not counted as a click and does not produce a registration or partner attribution. *** **Click conversion rate** The click conversion rate, which is the number of registrations divided by the number of clicks, expressed as a percentage. *** **Created** The date and time when a banner was created. ## Banner details [#banner-details] To access details, click the **banner name** or . Here you can view and customize banner settings. **Name** The banner name. This value can be modified. *** **Language** The banner language. This value can be modified. *** **Size** The banner size. This value can be modified. *** **Theme** The banner theme. This value can be modified. *** **CDN Image URL** The CDN URL pointing to a banner along with a banner image. This value can be modified. *** **Clicks** The number of times a banner was clicked. *** **Registrations** The number of clients registered after clicking a banner. *** **Click conversion rate** The click conversion rate, which is the number of registrations divided by the number of clicks, expressed as a percentage. *** **Created** The date and time when a banner was created. *** **Updated** The date and time when a banner was last updated. ## Language list [#language-list] View the following information for each language: **Language** The language name. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was added. ## Language details [#language-details] To access details, click the language name or . Here you can view and customize language settings. **Name** The language name. This value can be modified. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was created. *** **Updated** The date and time when a language was last updated. ## Size list [#size-list] View the following information for each language: **Size** The size name. *** **Banners** The number of banners of this size. *** **Created** The date and time when a size was added. ## Size details [#size-details] To access details, click the size name or . Here you can view and customize size settings. **Width** The banner width. This value can be modified. *** **Height** The banner height. This value can be modified. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was created. *** **Updated** The date and time when a language was last updated. ## Theme list [#theme-list] View the following information for each theme: **Theme** The theme name. *** **Created** The date and time when a theme was created. *** **Banners** The number of banners added to a theme. ## Theme details [#theme-details] To access details, click the theme name or . Here you can view and customize theme settings. **Name** The theme name. This value can be modified. *** **Banners** The number of banners added to a theme. *** **Created** The date and time when a theme was created. *** **Updated** The date and time when a theme was last updated. ## Color list [#color-list] View the following information for each color: **Priority** The priority that defines the order in which colors are listed in the B2CORE UI. *** **Name** The color name. *** **Background color** The HEX code of a background color. *** **Foreground color** The HEX code of a foreground color. *** **Created** The date and time when a color was added. ## Color details [#color-details] To access details, click the color name or . Here you can view and customize color settings. **Name** The color name. This value can be modified. *** **Priority** The priority that defines the order in which colors are listed in the B2CORE UI. This value can be modified. *** **Background color** The HEX code of a background color. This value can be modified. *** **Foreground color** The HEX code of a foreground color. This value can be modified. *** **Created** The date and time when a color was added. *** **Updated** The date and time when a color was last updated. ## Icon list [#icon-list] View the following information for each color: **Priority** The priority that defines the order in which icons are listed in the B2CORE UI. *** **Icon** The thumbnail icon image. *** **Name** The icon name. *** **Created** The date and time when an icon was added. ## Icon details [#icon-details] To access details, click the icon name or . Here you can view and customize icon settings. **Name** The icon name. This value can be modified. *** **Priority** The priority that defines the order in which icons are listed in the B2CORE UI. This value can be modified. *** **Icon** The icon image. *** **Created** The date and time when an icon was added. *** **Updated** The date and time when an icon was last updated. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} ## General information [#general-information] The B2CONNECT FIX server provides all the functionality necessary for real-time trading and receiving up-to-date market information via the Financial Information eXchange protocol. In this document, you can find a detailed description of the B2CONNECT FIX API, including the information about how to connect to a demo FIX server. The B2CONNECT FIX API is based on the version 4.4 of the Financial Information eXchange protocol. It’s assumed that the reader of this document is already familiar with the FIX protocol. To learn more about the protocol specification, see the [FIX Trading Community website](https://www.fixtrading.org/). If your trading engine is powered by Go, take a minute to learn about [SimpleFix Go](https://github.com/b2broker/simplefix-go/). This open-source library is provided by the B2CONNECT team to help you quickly integrate FIX messaging into your environment. The library is entirely written in Go and supports any FIX API version. ### Supported message types [#supported-message-types] The following message types can be assigned to the `<35> MsgType` field of a [Standard header](fix-api#standard-header): * `0` — [Heartbeat](fix-api#heartbeat) (Client ↔ B2CONNECT) * `1` — [Test Request](fix-api#test-request) (Client ↔ B2CONNECT) * `2` — [Resend Request](fix-api#resend-request) (Client ↔ B2CONNECT) * `3` — [Reject](fix-api#reject) (Client ← B2CONNECT) * `4` — [Sequence Reset](fix-api#sequence-reset) (Client ↔ B2CONNECT) * `5` — [Logout](fix-api#logout) (Client ↔ B2CONNECT) * `8` — [Execution Report](fix-api#execution-report) (Client ← B2CONNECT) * `9` — [Order Cancel Reject](fix-api#order-cancel-reject) (Client ← B2CONNECT) * `A` — [Logon](fix-api#logon) (Client → B2CONNECT) * `D` — [New Order Single](fix-api#new-order-single) (Client → B2CONNECT) * `F` — [Order Cancel Request](fix-api#order-cancel-request) (Client → B2CONNECT) * `V` — [Market Data Request](fix-api#market-data-request) (Client → B2CONNECT) * `W` — [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) (Client ← B2CONNECT) * `Y` — [Market Data Request Reject](fix-api#market-data-request-reject) (Client ← B2CONNECT) ### Standard header [#standard-header] All FIX messages must start with a **Standard header**. The **Standard header** includes the following fields: ### Standard trailer [#standard-trailer] Along with a Standard header, all FIX messages must also contain a **Standard trailer**. The **Standard trailer** includes the following fields: ## Session messages [#session-messages] The messages listed in this section are used to maintain any live FIX session with the B2CONNECT FIX server, including both [quoting](fix-api#quoting) and [trading](fix-api#trading) sessions. ### Heartbeat [#heartbeat] This message is sent back and forth between the FIX server and the client to check the connection status and in response to [Test Request](fix-api#test-request) messages. The **Heartbeat** message includes the following fields: ### Test Request [#test-request] This message is sent back and forth between the FIX server and the client in response to [Heartbeat](fix-api#heartbeat) messages as a means of connectivity check. The **Test Request** message includes the following fields: ### Resend Request [#resend-request] This message is sent by the client or FIX server to initiate the retransmission of messages, which may be required upon detecting a gap in the sequence numbers or losing a particular message. The **Resend Request** message includes the following fields: ### Reject [#reject] This message is sent by the FIX server upon receiving a malformed message from the client. The possible reason for rejection is specified in the `<373> SessionRejectReason` field. This message is unrelated to a trade-level rejection ([Order Cancel Reject](fix-api#order-cancel-reject)) issued when a FIX server is unable to place a requested order. The **Reject** message includes the following fields: #### Possible reasons [#possible-reasons] When the FIX server sends a [Reject](fix-api#reject) notification informing the client that a session-level request has been rejected, the `<373> SessionRejectReason` field can be set to one of the following values specifying the reason for message rejection: * `0` — an invalid tag number * `1` — a required tag is missing * `2` — a tag isn’t defined for this message type * `3` — a tag is undefined * `4` — a tag has no value assigned * `5` — an assigned value is incorrect (out of range) for this tag * `6` — an incorrect value data format * `7` — an issue related to decryption * `9` — an issue related to `CompID` * `10` — an accuracy issue related to `<52> SendingTime` * `11` — an invalid `<35> MsgType` * `12` — an XML validation error * `13` — the same tag appears more than once * `14` — a tag is specified not in the required order * `15` — a wrong order of repeating group fields * `17` — a non-“Data” value includes a field delimiter (an SOH character) * `99` — other (unspecified) reason ### Sequence Reset [#sequence-reset] This message is sent by the client or FIX server to indicate to the recipient the sequence number of the next message from the sender, immediately following the Sequence Reset message. This may be necessary to recover from a disconnect, in case if some messages were lost or their resending is not desirable. The **Sequence Reset** message includes the following fields: ### Logon [#logon] This message is sent by the client to initiate a FIX session. The **Logon** message includes the following fields: ### Logout [#logout] This message is sent by the client or FIX server to terminate a session. When terminated, the possible reason is specified in the `<58> Text` field. The **Logout** message includes the following fields: ## Demo mode [#demo-mode] The B2CONNECT FIX server supports a Demo mode that allows clients to establish a test connection and simulate quoting and trading sessions. Contact your account manager to obtain a set of settings and credentials. ## Quoting [#quoting] After connecting to the FIX server and establishing a live quoting session, the client can send a [Market Data Request](fix-api#market-data-request) to subscribe to quote updates streamed by B2CONNECT. To subscribe to multiple symbols, the client should send a separate [Market Data Request](fix-api#market-data-request) for each symbol. Upon successful subscription to a selected symbol, the FIX server starts streaming market data updates by sending [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) messages each time the market data is updated. The quote updates are streamed continuously for the entire duration of a FIX session. If a subscription request can’t be executed for some reason (for example, when a requested symbol isn’t found), the FIX server responds with a [Market Data Request Reject](fix-api#market-data-request-reject) message providing detailed information about an error. To terminate a specific subscription and stop receiving the updates, the client can send a [Market Data Request](fix-api#market-data-request) with the `<263> SubscriptionRequestType` set to `2` (standing for “Unsubscribe”). Upon sending a [Logout](fix-api#logout) request, the current session is closed and subscriptions to all ticker symbols are terminated. ### Market Data Request [#market-data-request] This message is sent by the client to start receiving up-to-date quoting data for a specified ticker symbol. The **Market Data Request** message includes the following fields: ### Market Data Request Reject [#market-data-request-reject] This message is sent by the FIX server to reject a [Market Data Request](fix-api#market-data-request) with invalid values. The **Market Data Request Reject** message includes the following fields: #### Possible reasons [#possible-reasons-1] The `<281> MDReqRejReason` field can be set to one of the following values specifying the reason for request rejection: * `0` — the specified symbol isn’t recognized * `1` — a duplicate `<262> MDReqID` * `2` — insufficient bandwidth * `3` — insufficient permissions * `4` — the specified `<263> SubscriptionRequestType` isn’t supported * `5` — the specified `<264> MarketDepth` isn’t supported * `6` — the specified `<265> MDUpdateType` isn’t supported * `8` — the specified `<269> MDEntryType` isn’t supported ### Market Data — Snapshot/Full Refresh [#market-data--snapshotfull-refresh] Such messages are continuously sent by the FIX server after the client subscribes to a ticker symbol. A new message is sent with each market data update. The **Market Data — Snapshot/Full Refresh** message includes the following fields: ## Trading [#trading] **Place an order** After establishing a trading session with the FIX server, the client can place a new order by sending a [New Order Single](fix-api#new-order-single) message. In response to this, the FIX server sends back an [Execution Report](https://docs.b2connect.b2broker.com/en/fix-api.html#execution-report) with the `<150> ExecType` field set to `A`, indicating that the order is placed successfully. If the order can’t be placed (for example, due to lack of credit funds or other issues), the report is sent with `<150> ExecType` set to `8`. After placing the order, the FIX server sends a separate report with `<150> ExecType` set to `F` each the order status changes: * If the order is executed partially, `<39> OrdStatus` is set to `1`. * When the order is fully filled, `<39> OrdStatus` is set to `2`. **Cancel an order** To cancel an open order, the client can send an [Order Cancel Request](fix-api#order-cancel-request). If the order is canceled (either explicitly by a trader, or automatically due to timeout), the [Execution Report](fix-api#execution-report) is sent with `<150> ExecType` set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled, and `<151> LeavesQty` indicates the unfilled amount. If an order can’t be canceled for any reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. ### New Order Single [#new-order-single] This message is sent by the client to place a new order with specified parameters. The **New Order Single** message includes the following fields: ### Order Cancel Request [#order-cancel-request] This message is sent by the client to cancel an open order in its entire remaining amount. This request is assigned a unique `<11> ClOrdID` and is treated as a separate order. Upon successful cancellation of the order, an [Execution Report](fix-api#execution-report) is sent with the `<39> OrdStatus` field set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled. If the order can’t be canceled for some reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. The **Order Cancel Request** message includes the following fields: ### Order Cancel Reject [#order-cancel-reject] This message is sent by the FIX server upon receiving an [Order Cancel Request](fix-api#order-cancel-request) that can’t be fulfilled. The **Order Cancel Reject** message includes the following fields: ### Execution Report [#execution-report] This message is sent by the FIX server upon successfully placing or cancelling an order, or any change to the order status (such as a complete or partial execution). Among other data, the report indicates: * the current order status at the moment of report creation (`<39> OrdStatus`) * the most recent change in the order status, which is being reported (`<150> ExecType`) The **Execution Report** message includes the following fields: Explore the liquidity providers and FIX platforms supported by B2CONNECT Explore the liquidity providers and FIX platforms supported by B2CONNECT Find step-by-step instructions on most common user scenarios Find step-by-step instructions on most common user scenarios Explore the B2CONNECT FIX API reference Explore the B2CONNECT FIX API reference ## August 31, 2026 [#august-31-2026] ### New features [#new-features] #### Monthly traded volume reports [#monthly-traded-volume-reports] Following the daily turnover reports introduced in the previous release, **B2CONNECT** now also produces a monthly notional **Turnover Report** for each hub and delivers it to the Slack channels and email addresses of your choice, with the CSV and PDF attached to the message itself. The monthly report covers a full calendar month and uses the same breakdown as the daily one: traded volume per trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators set the monthly publication time per hub alongside the daily schedule, produce a report for any past month on demand with **Publish now**, and re-download earlier months from the report archive. Where the daily report keeps reporting teams current on activity, the monthly report gives management, finance, and account managers the period figures they reconcile and invoice against — replacing the month-end roundups these teams previously assembled by hand. If a month isn't yet fully covered by the platform's data, the report says so explicitly, so a partial period is never mistaken for a complete one. #### Multiple margin accounts on one FIX connector [#multiple-margin-accounts-on-one-fix-connector] A single FIX connector can now serve many margin accounts on a hub. The taker platform names the account on each order in the standard FIX **Account** field (Tag 1), **B2CONNECT** routes the order to the matching margin account, and returns the same value on every execution report. Previously, every margin account needed a FIX connector of its own. A platform running several White Labels, or serving a large number of end clients, can now keep them all on one connector, with each account's positions, margin, and commissions kept entirely separate. The client reference sent with an order (Tag 526) is now carried through to reporting as well. It is stored with the execution and appears in the **Trading Report** under **Hub Reports**, so back-office and reconciliation teams can trace any fill back to the end client that placed it. #### Pegged-price instruments [#pegged-price-instruments] **B2CONNECT** now supports instruments priced at a fixed rate against another instrument instead of from live venue quotes. The rate is configured once, and the platform publishes it continuously, refreshing the order book on a short cycle so connected platforms always receive a current price. This turns what previously called for a bespoke deployment into a standard configuration option — most commonly for stablecoins held at parity with their reference currency, and for any instrument a platform chooses to offer at an administered rate. *** ### Improvements [#improvements] #### Reporting built for the highest trading volumes [#reporting-built-for-the-highest-trading-volumes] The reporting layer's data intake has been reworked to keep up with the busiest hubs. Balance and completed-order data is collected in batches in the same way as execution data, so reports stay current even when a hub is at peak activity, and the highest-volume platforms no longer need to weigh reporting coverage against throughput. Order identifiers have also been unified across the platform: the identifier assigned when an order reaches the hub is now the same one that appears in **Hub Reports**. Back-office teams reconciling a report against their own records work from one identifier throughout, with no cross-referencing between two numbering schemes. #### Steadier operation through brief internal interruptions [#steadier-operation-through-brief-internal-interruptions] **B2CONNECT** services now ride out short interruptions to the platform's internal messaging and reconnect on their own, rather than restarting. Quoting, trading, and reporting services all behave this way, so a momentary infrastructure hiccup no longer turns into a visible restart on a live hub. #### Clearer feedback when uploading a configuration [#clearer-feedback-when-uploading-a-configuration] When an instance configuration file is uploaded in the **B2CONNECT** Web UI, validation errors are now reported in full, naming what in the file needs attention. Administrators previously saw only a generic server error and had to find the cause themselves. *** ### Resolved issues [#resolved-issues] * Resolved two issues affecting hedge accuracy in **Systematic Hedging**. In certain scenarios, a hedge amount was rounded to the instrument's decimal precision rather than to the increment the liquidity provider actually accepts, and a partially filled hedge on the external leg could be booked internally in full instead of proportionally. Hedge sizes now follow each provider's increment, and partial fills are booked in proportion to what was filled. * Resolved two issues that could occasionally cause a fill to be counted twice, or an already-applied fill to be reversed, when the platform re-processed an internal message. Every fill is now identified uniquely, so positions and profit and loss remain accurate. ## July 30, 2026 [#july-30-2026] ### New features [#new-features-1] #### Daily turnover reports delivered to Slack and email [#daily-turnover-reports-delivered-to-slack-and-email] B2CONNECT now produces a Turnover Report for each hub automatically, once a day, and delivers it to the Slack channels and email addresses of your choice. Both the CSV and the PDF arrive as ready-to-open attachments on the message itself, so recipients read the report without opening the Web UI or holding platform credentials. Daily volume becomes visible to management, account managers, and back-office teams alike. Each report covers the previous trading day and breaks traded volume down by trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators control delivery from the B2CONNECT Web UI: * Set the daily publication time for each hub, or switch the schedule off. * Produce a report on demand with **Publish now**. * Subscribe Slack channels and email recipients under **Business notifications**, alongside the platform's other notifications. * Re-download any past report from the report archive. This is the next step in the rollout of **TRAM** (Tracking, Reporting, Alerting, and Monitoring), the unified reporting and observability layer that brought **Hub Reports** to the Web UI in the April release. Where Hub Reports covers reports requested on demand for individual margin accounts, daily turnover reporting replaces the manual, spreadsheet-based volume roundups that reporting teams previously assembled by hand. #### HTX USDT-M Futures upgraded to API V5 [#htx-usdt-m-futures-upgraded-to-api-v5] B2CONNECT has been upgraded to HTX API V5 for USDT-M perpetual futures across the full path: market data, funding data, symbol information, and trading. HTX has retired the legacy API behind these instruments, so the upgrade keeps this liquidity available on a supported interface. Brokers sourcing HTX perpetual futures liquidity through B2CONNECT keep uninterrupted market data and order flow, with no action required on their side. B2CONNECT now also confirms the collateral mode on every HTX connection when it starts, so a change made to the account on the exchange side can no longer cause order placement to fail without an evident cause. *** ### Improvements [#improvements-1] #### More efficient liquidity provider connections [#more-efficient-liquidity-provider-connections] Liquidity provider connections on a hub now make more efficient use of its infrastructure, while each connection stays isolated from the others and is monitored independently. A new liquidity provider also goes live sooner. The change is being enabled progressively. #### Order recovery after an interruption [#order-recovery-after-an-interruption] After a connection to a liquidity venue is interrupted, B2CONNECT now sizes its recovery request to the length of the interruption instead of using a fixed window, so orders placed during a longer outage are still picked up and reconciled. *** ### Resolved issues [#resolved-issues-1] The issues below occurred infrequently and only under specific conditions. Some may have affected production environments; most were identified in testing before they could. * Resolved an issue where, in rare cases, the connection to a liquidity venue did not re-establish itself after a network drop, leaving the affected instruments without fresh quotes until the service was restarted. Connections now detect a silent drop on their own, reconnect, and restore every affected instrument. * Resolved two issues that could occasionally leave funding data for perpetual futures failing after an instrument's mapping changed. Quotes recovered on their own, but funding rate, mark price, and funding interval could remain affected. Funding data now follows mapping changes as quotes do. * Resolved two issues affecting connection setup and quote acceptance in certain scenarios: a liquidity provider credentials element was rejected as too long when configuring a connection, and quotes for certain FX instruments arriving from a liquidity aggregator hub were rejected because of a mismatch in how the quote's entry count was determined. ## June 29, 2026 [#june-29-2026] ### Improvements [#improvements-2] #### Systematic Hedging under high-frequency flow [#systematic-hedging-under-high-frequency-flow] Systematic Hedging, introduced in the previous release, has been hardened to stay reliable under high-frequency, high-volume flow such as copy-trading and HFT bursts. B2CONNECT shapes the incoming client flow so that only the residual net position is routed to each liquidity provider (LP), keeping order placement comfortably within venue API rate limits even during tick storms. In the B2CONNECT Web UI, the real-time Risk Status view and its cumulative order-accumulation status bar now update accurately at very high request rates, so risk teams keep a precise, live picture of how exposure is building and when it will hedge. #### More flexible symbol and instrument naming [#more-flexible-symbol-and-instrument-naming] The liquidity aggregator integration now supports independent taker-side and maker-side symbols. Previously both legs shared a single venue name, causing a platform to distribute the LP’s symbols to the FIX clients. B2CONNECT now resolves the incoming FIX symbol against a dedicated taker symbol and maps it to the liquidity aggregator catalog name separately — so brokers can keep their own client-facing symbology regardless of an LP’s naming. Asset and trading instrument names can now also include the ampersand (`&`) character. Such symbol names are accepted directly, removing the previous need to substitute `AND`. #### Reduced noise from stale-liquidity alerts [#reduced-noise-from-stale-liquidity-alerts] Stale-liquidity alerts triggered by delisted symbols now fire once instead of repeating, cutting alert noise for monitoring teams when a venue delists an instrument. *** ### Resolved issues [#resolved-issues-2] * Resolved an issue where a market-data subscription on WebSocket liquidity venues (such as Kraken, Huobi, and Binance) could remain silent after a connector reconnect, leaving the affected symbols without fresh quotes — and FIX clients receiving only invalidations — until the connector was restarted. Such subscriptions now recover automatically. * Resolved an issue in the liquidity aggregator integration where a transient quote-cancel message was treated as a permanent subscription rejection, silently stopping quote publishing for the symbol until a restart. Transient cancels no longer drop the subscription, so streaming resumes as soon as the venue sends the next quote. ## May 29, 2026 [#may-29-2026] ### New features [#new-features-2] #### Systematic Hedging [#systematic-hedging] **B2CONNECT** introduces **Systematic Hedging**, a new execution option that complements — and does not replace — standard straight-through processing (STP). When enabled for a symbol, **B2CONNECT** aggregates incoming client flow into a managed risk position, nets opposing buy and sell volume, and hedges only the net residual to the liquidity provider (LP). This gives risk teams tighter control over exposure and lower execution costs. And because only net positions are hedged, platforms send far fewer orders to their LPs — staying comfortably within API rate limits and easing the load on each provider, so every LP connection goes further. Hedging stays fully under the risk team's control and is set per symbol: trigger by accumulated volume, a timer, a schedule, or manually; tune the hedge ratio and lock-routing behavior; or keep routing large orders straight through. The **B2CONNECT** Web UI adds a **Symbol Hedging Configuration** page, a real-time **Risk Status** page, and a master toggle, and risk-position state is restored automatically after any restart — so exposure is never lost or double-counted. #### B2CORE integration [#b2core-integration] **B2CONNECT** now integrates with **B2CORE**, the **B2BROKER** ecosystem's CRM — the centralized control center for a brokerage's front-end client experience and back-end administrative operations. By connecting margin accounts on the **B2CONNECT** hub directly to **B2CORE**, the integration gives B2B clients who power their trading platforms with **B2CONNECT** seamless account onboarding and a streamlined day-to-day experience, with account creation, funding, and balance management all handled from one control center. It also puts the wider advantages of the **B2BROKER** ecosystem within reach on a single, connected stack. Administrators set up and manage the connection from a new **B2CORE Integration** page in the **B2CONNECT** Web UI. #### Tiered commission profiles [#tiered-commission-profiles] **B2CONNECT** now supports **tiered commission profiles**, which automatically lower the commission rate as an account's traded volume grows. Administrators define volume thresholds and the rate that applies beyond each one; **B2CONNECT** tracks cumulative volume over the chosen period — for example, a calendar month — and steps the rate down as each threshold is reached, including on liquidation orders. For brokers, this turns growing volume into lower costs: the more flow through the hub, the lower their own per-trade commission — rewarding scale and protecting margins as the business grows. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## April 30, 2026 [#april-30-2026] ### New features [#new-features-3] #### Tiered margin profiles [#tiered-margin-profiles] **B2CONNECT** now supports tiered margin profiles, allowing Administrators to apply different margin rates to different slices of an account's notional exposure. Each profile can define up to five threshold–rate pairs per symbol, so brokers can mirror the bracketed margin schedules used by major liquidity providers — without falling back on inflated blanket rates that deter retail traders or on manual, position-by-position adjustments. This delivers predictable, schedule-aligned leverage on every tranche of a client's position and removes a recurring source of operational overhead for risk and operations teams. #### Hub Reports under TRAM [#hub-reports-under-tram] A new **Hub Reports** section is now available under **TRAM** (Tracking, Reporting, Alerting, and Monitoring) in the **B2CONNECT** Web UI, bringing reporting for margin accounts together in a single place. Back-office operators can request, track, and download reports directly from the platform — an important milestone in the rollout of TRAM, the unified reporting and observability layer for B2CONNECT. The initial release of Hub Reports ships with three reports: * **Consolidation Statement** — a complete picture of an account's activity and exposure for any reporting period, including opening and closing balances, deposits, withdrawals, fees, opening and closing equity, unrealized PnL, used and free margin, margin utilization, and a dedicated **Open Positions** section listing each position's symbol, direction, average price, unrealized PnL, and margin. Account names are populated automatically, so each statement is clearly attributed. * **Trading Report** — per-trade execution details for one or more margin accounts over a chosen date range, delivered as a CSV. Each row includes the connection used, taker login and order identifiers, executed price and volume, and commission, giving back-office and reconciliation teams everything they need to audit individual fills. * **Turnover (Traded Volume) Report** — aggregated traded volume per account and per symbol for the selected period, supporting fee schedules, rebate calculations, and periodic client reviews. *** ### Improvements [#improvements-3] #### Binance Futures WebSocket endpoints [#binance-futures-websocket-endpoints] **B2CONNECT** has been migrated to **Binance**'s new WebSocket URL architecture for perpetual futures, which separates traffic into dedicated public, market, and private channels. Brokers connecting to Binance Futures via B2CONNECT will continue to receive uninterrupted market data and order updates after Binance retires the legacy WebSocket URLs on **2026-04-23**, with no action required on the broker's side. #### Stream update reliability for Incoming Connectors [#stream-update-reliability-for-incoming-connectors] Subscription updates on **Incoming Connectors** are now more resilient under load. The platform allows more time for new streams to take effect and automatically retries on transient failures, preventing the rare cases where a slow update could leave a maker's symbols without fresh quotes until the next resubscription cycle. *** ### Resolved issues [#resolved-issues-4] * Resolved a consistency issue in the oneZero quoting integration where unsubscribing and immediately resubscribing to a symbol could occasionally fail with a duplicate-request error, leaving the symbol without market data until the next resubscription cycle. Resubscriptions are now handled atomically. ## March 2, 2026 [#march-2-2026] ### New features [#new-features-4] #### Automatic account liquidation on stop-out [#automatic-account-liquidation-on-stop-out] **B2CONNECT** now automatically liquidates open positions when an account's equity falls to the stop-out level, eliminating the need for manual intervention during margin events. The liquidation process executes iteratively — the system sends liquidation orders for all active positions, waits for each to reach a final state, and then evaluates whether the account has recovered before scheduling the next iteration. If the account's margin recovers above the stop-out threshold at any point, liquidation halts immediately. The engine is designed for operational reliability: if a restart occurs mid-liquidation, the process resumes safely without duplicating or missing orders. Execution uses live market pricing to ensure liquidation orders reflect current conditions, preventing margin miscalculations during volatile periods. The waiting period before liquidation begins and the retry policy between iterations are configurable. *** ### Improvements [#improvements-4] #### Account cache reliability [#account-cache-reliability] The account management system now supports per-account cache reinitialization. When a cache error is detected, only the affected account's state is rebuilt rather than triggering a broader reset. This targeted recovery approach improves stability and reduces the potential for stale account data to affect margin calculations or order routing during error-recovery scenarios. *** ### Resolved issues [#resolved-issues-5] There have been no customer-facing issues reported in this release. ## February 27, 2026 [#february-27-2026] ### New features [#new-features-5] #### New B2CONNECT website and deep Insights [#new-b2connect-website-and-deep-insights] This February release is dedicated to documentation updates. Alongside the ongoing expansion of our integrations-related docs, we've launched the new **B2CONNECT** product website and introduced the **Insights** section— deep-dive articles aimed at brokers, exchanges, and liquidity providers building multi-asset liquidity infrastructure. *** ### Improvements [#improvements-5] #### Liquidity engine performance, stability, and security enhancements [#liquidity-engine-performance-stability-and-security-enhancements] We've delivered a set of improvements across the quoting and trading engine to increase overall performance and operational robustness. These updates include several security and stability hardening primarily related to the underlying technology stack and runtime components that support core execution workflows. *** ### Resolved issues [#resolved-issues-6] There have been no customer-facing issues reported in this release. ## January 30, 2026 [#january-30-2026] ### New features [#new-features-6] #### Incoming Connectors: Trading Settings tab [#incoming-connectors-trading-settings-tab] A new dedicated **Trading Settings** tab is now available for Incoming Connectors, allowing the Hub Administrators to configure symbols directly within the connector setup. This streamlines onboarding of new liquidity providers and simplifies ongoing symbol configuration and updates. *** ### Improvements [#improvements-6] #### Improved FIX credentials compatibility [#improved-fix-credentials-compatibility] FIX credential settings for supported liquidity aggregators are now more aligned with the standard FIX naming convention, ensuring more consistent configuration and reducing setup friction. #### More descriptive error messages [#more-descriptive-error-messages] Incoming Connector pages now display clearer, human-readable error messages in two common cases: when credential validation fails, and when the Administrator tries to enable trading for a symbol that’s disabled in Hub settings. These messages help identify the issues, so troubleshooting is more straightforward. *** ### Resolved issues [#resolved-issues-7] * Generated FIX credentials no longer start with an underscore in `SenderID` or `TargetID`, resolving compatibility issues with counterparties that reject such values. ## December 22, 2025 [#december-22-2025] ### New features [#new-features-7] #### Perpetuals data over FIX: funding rate, mark price & funding interval [#perpetuals-data-over-fix-funding-rate-mark-price--funding-interval] B2CONNECT now enriches FIX market‑data streams with `FundingRate`, `MarkPrice`, and `FundingInterval` fields, allowing any FIX‑compatible platform to price and offer perpetual futures out of the box. These parameters are delivered alongside standard quote updates in the FIX contract, eliminating the need for custom side channels or additional integrations to pass funding data. #### Interest on idle cash and unused margin (AMS) [#interest-on-idle-cash-and-unused-margin-ams] The **AMS** module now supports paying interest on idle cash and unused margin via dedicated **Interest rate profiles** in the Web UI. Administrators can configure per‑asset interest rates and a daily posting time in UTC; B2CONNECT then accrues interest automatically and posts it once per day as separate **Interest** transactions on client accounts. Brokers, exchanges, and other trading platforms are empowered to create a clear incentive for end-users (traders) to keep extra funds in their accounts, strengthening client retention and serving as a strong competitive differentiator. *** ### Improvements [#improvements-7] #### Maker credentials management inside Incoming Connectors [#maker-credentials-management-inside-incoming-connectors] Trading and quoting Maker credentials are now configured directly within each Incoming Connector. Administrators can add, revoke, and review credentials in the same place where they manage the connection, reducing context switching and keeping connectivity and access control aligned per connector. #### Target maker [#target-maker] A new **Target maker** control has been added to the Incoming Connectors page, making it straightforward to set or review which maker is currently used for routing. This improves transparency around active maker selection and simplifies switching and validating liquidity sources. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. ## October 30, 2025 [#october-30-2025] ### New features [#new-features-8] #### New docs section: Supported FIX platforms [#new-docs-section-supported-fix-platforms] With this release, we’ve added a new [FIX platforms](supported-venues/fix-platforms) section to our documentation, showcasing trading platforms compatible with B2CONNECT via the **FIX protocol**. This new catalog includes baseline configuration guides and is linked to our FIX API reference. Integration teams can now quickly verify FIX compatibility and access the appropriate configuration templates from a single location, streamlining the setup process. *** ### Improvements [#improvements-8] #### Deep order recovery on LP disconnects [#deep-order-recovery-on-lp-disconnects] We’ve moved from a conservative recent‑orders snapshot to a controlled step‑by‑step rebuild that thoroughly recovers pending orders after a disconnect. As before, requests respect each Liquidity Provider’s API limits; the updated pacing keeps us right at the safe edge, delivering a far higher recovery count without triggering rate‑limit bans. Expect more complete catch‑ups on high count bursts and during volatile periods. *** ### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. ## September 30, 2025 [#september-30-2025] ### New features [#new-features-9] #### Internal risk warehousing (formerly B-Book) [#internal-risk-warehousing-formerly-b-book] B2CONNECT clients can now execute selected symbols internally within the crypto-native liquidity hub, retaining spread and reducing external fees. This new execution model provides per-symbol control to enable internal execution where it’s commercially advantageous, empowering clients to optimize their risk-return profiles with unprecedented precision. The configuration can be managed via CSV. #### Partial risk internalization (formerly C-Book) [#partial-risk-internalization-formerly-c-book] B2CONNECT clients can now optimize risk management with configurable order splitting between external hedging and internal execution. Set hedge ratios per symbol (0-100%) to determine the split, where the internal portion mirrors external fill pricing and proportions exactly. This approach reduces commission costs while maintaining risk control and supports both market and limit order flows. #### Price invalidation for synthetic symbols [#price-invalidation-for-synthetic-symbols] Synthetic markets now support invalidation signals the same way as organic symbols, providing consistent invalidation behavior across all symbol types. This development unlocks safe production deployment of the invalidation feature, providing traders with more reliable price feeds and reducing the risk of stale quotes across the entire trading ecosystem. #### Liquidity acquisition configuration via incoming connectors [#liquidity-acquisition-configuration-via-incoming-connectors] The configuration of liquidity acquisition service has been migrated from a global CSV to a structured, connector‑based flow. The new approach includes bulk asset upload capabilities, automated symbol-to-maker listing matching, and quoting CSV configuring, reducing setup time and potential errors while enabling more granular control over individual service instances. *** ### Improvements [#improvements-9] #### WebUI modernization [#webui-modernization] The Admin panel interface has been enhanced delivering improved usability. The following upgrades land across the **AMS accounts**, **AMS profiles**, **Notifications**, **Incoming Connectors** and **Symbols** sections: * **Navigation enhancements**: * Streamlined menu structure with fewer clicks to access key data. * Relocated Notifications to Hub settings for better organization. * Expanded table layouts for improved data visibility. * **Single Sign-On**: * Centralized identity provider with standards-based SSO. * Unchanged sign-in experience for end users. * Continued user management capabilities for B2CONNECT administrators. Additionally, the sidebar has been redesigned, with rebuilt left navigation reflecting the new information architecture, making the **Liquidity**, **Symbols**, **Accounts**, and **Settings** sections easier to access. #### AMS profiles: CSV import/export [#ams-profiles-csv-importexport] The **Commission** and **Margin Requirements** profiles setup has been accelerated through an import wizard and one‑click CSV export. These enhancements optimize workflows particularly when working with large instrument lists. #### Asset management [#asset-management] B2CONNECT administrators are now provided with enhanced control over asset configurations with built-in safeguards to prevent deletion of referenced assets. This ensures system integrity while providing the flexibility to clean up obsolete or unused assets. *** ### Resolved issues [#resolved-issues-10] * Fixed an issue with trading parameter calculations for instruments with contract sizes. The system now correctly converts all trading parameters using contract size multipliers, ensuring accurate minimum order amounts, price steps, and notional values are communicated through the FIX SecurityList endpoint. This fix particularly benefits trading of derivative contracts where the underlying instrument differs from the quoted contract size. ## August 29, 2025 [#august-29-2025] ### New features [#new-features-10] #### New docs section: Supported exchanges [#new-docs-section-supported-exchanges] With this release, we've introduced a detailed [Supported exchanges](supported-venues/exchanges) section in our documentation, offering a comprehensive reference for each exchange our platform supports. This addition promotes clarity and easy access, allowing B2CONNECT users to quickly compare and reference available capabilities across exchanges at a glance. *** ### Improvements [#improvements-10] #### Explicit default STP setting [#explicit-default-stp-setting] To prevent unexpected behavior and reduce reliance on exchange policy defaults, we now explicitly set a fixed internal default STP (Self-Trade Prevention) mode in our API calls. This ensures consistent and predictable trade execution across all environments, regardless of future changes by liquidity providers. *** ### Resolved issues [#resolved-issues-11] There have been no customer-facing issues reported in this release. ## July 31, 2025 [#july-31-2025] ### New features [#new-features-11] #### Granular asset management via Web UI [#granular-asset-management-via-web-ui] B2CONNECT administrators now benefit from enhanced control and efficiency in asset management with new export/import options integrated into the B2CONNECT Web UI: * **Bulk asset export**: Efficiently export assets to CSV for reporting or backup purposes, streamlining administrative tasks and protecting essential configuration data. * **Bulk asset import**: Effortlessly import multiple assets from CSV files, reducing manual entry, minimizing errors, and ensuring asset uniqueness through built-in validation rules. #### Alerts system for swap charge issues [#alerts-system-for-swap-charge-issues] The system monitoring has been enhanced by implementing automated notifications for failed swap charges. These real-time notifications provide detailed explanations of failures, facilitating quick troubleshooting, and boosting system reliability. Common issues addressed include missing market rates, symbol data discrepancies, infrastructure issues, and internal errors. *** ### Improvements [#improvements-11] #### Enhanced compatibility with Binance [#enhanced-compatibility-with-binance] To ensure continued compatibility and accuracy, B2CONNECT services have been updated to align with recent changes in the Binance API. This enhancement makes certain that the minimum notional values provided through the B2CONNECT FIX API SecurityList endpoint are always accurate, preventing order rejections due to incorrect amounts. Additionally, the Binance Spot adapter has been updated to meet the latest WebSocket API requirements, ensuring smooth order updates and improved platform reliability. #### Advanced raw message logging [#advanced-raw-message-logging] A significant enhancement has been added to order placement and execution workflow. A key point is the implementation of advanced raw message logging. This enables B2CONNECT to log all raw incoming and outgoing messages during its communication with a supported liquidity provider, thus enabling precise troubleshooting and rapid issue resolution at the LPs end. #### Improved error handling [#improved-error-handling] Another improvement in the order placement and execution workflow includes the refined logic for handling timeout errors. An order is now considered placed if such an error occurs, providing a definitive status and preventing uncertainty during order execution. #### Rate limiting for reliable connectivity [#rate-limiting-for-reliable-connectivity] The reconnect algorithm for a supported liquidity provider has been improved by integrating a robust rate-limiting mechanism. This enhancement caps the number of reconnect attempts to an optimal value, reducing the chance of IP bans and maintaining stable, uninterrupted connectivity. #### Reduced trading service startup time [#reduced-trading-service-startup-time] With this release, the bulk-load order event recovery mechanism has been implemented. By efficiently processing large volumes of order events during system startup, this update significantly reduces the time required to restore services after a restart or unexpected outage. As a result, traders experience minimal downtime, ensuring continuous access to the trading platform and improving overall operational efficiency. *** ### Resolved issues [#resolved-issues-12] There have been no customer-facing issues reported in this release. ## June 30, 2025 [#june-30-2025] ### New features [#new-features-12] #### Advanced multi-provider liquidity orchestration [#advanced-multi-provider-liquidity-orchestration] This release introduces a groundbreaking update in liquidity infrastructure management: B2CONNECT now features liquidity orchestration across multiple liquidity providers and trading platform types. Key enhancements include: * Liquidity acquisition from multiple providers and its distribution to diverse trading platforms and market data consumer types. * Price feed across all asset classes, including forex, CFDs, indices, metals, and crypto (both spot and derivatives), accessible via both single or multiple connectors. * Uninterrupted liquidity with automated order routing based on symbol availability and robust failover policies. #### Advanced spread control [#advanced-spread-control] B2CONNECT administrators can now precisely control the maximum allowable spread in order books, significantly enhancing liquidity and boosting trader confidence. They can set and manage maximum spread limits to avoid sharp market data fluctuations, and track anomalies through detailed metrics. #### Symbol-based price invalidation [#symbol-based-price-invalidation] B2CONNECT introduces sophisticated symbol-based price invalidation to ensure price accuracy: * **Web interface management**: Configure, view, and manage price invalidation parameters directly through the Web UI. * **CSV import**: Import symbols via CSV files that include detailed price invalidation parameters. * **Real-time logic**: Implement comprehensive real-time price invalidation across all stages for consistent and precise quoting and trading. #### Aggregated execution reports [#aggregated-execution-reports] Execution reporting now supports fill aggregation, optimizing reports for platforms such as cTrader. This feature consolidates multiple fills into a single, coherent execution report. B2CONNECT administrators can enable or disable aggregation settings to tailor reporting to the trading platform preferences. Alerts for overfilled aggregation scenarios provide timely insights for effective risk management. #### Automated swap fee charging [#automated-swap-fee-charging] B2CONNECT now streamlines swap charge management. B2CONNECT administrators can easily set up Swap Profiles and apply them to trading accounts. The built-in Swap Charges Planner helps schedule and run swap charges efficiently. Migration to an optimized Account Configuration system provides superior performance and reliability. *** ### Improvements [#improvements-12] #### Enhanced precision handling for FOK orders [#enhanced-precision-handling-for-fok-orders] Handling of Fill-or-Kill (FOK) orders has been improved to guarantee compatibility across all liquidity providers, even when the order amount precision differs from trading platform specifications. #### Standardized order cancellation for Liquidity Takers [#standardized-order-cancellation-for-liquidity-takers] The order cancellation support has been improved for liquidity aggregators and other liquidity consumers, ensuring more responsive and reliable order lifecycle management. #### Symbol integration into account configuration [#symbol-integration-into-account-configuration] Symbol management is now seamlessly incorporated into account configuration to maintain consistency across liquidity settings and to simplify administrative tasks. #### Streamlined UX [#streamlined-ux] The B2CONNECT WebUI has been upgraded, focusing on user experience and performance enhancements. These improvements feature a more intuitive color scheme and streamlined design, offering a modern and visually appealing interface. The user flow has been optimized, making navigation more straightforward and efficient. Additionally, component performance has been boosted, reducing load times and enhancing overall responsiveness for a better user experience. *** ### Resolved issues [#resolved-issues-13] * Fixed an issue where an order cancellation request might be mishandled if received before the system processed the initial order confirmation from a liquidity provider. ## May 30, 2025 [#may-30-2025] ### Improvements [#improvements-13] #### Enhanced FIX API SecurityList endpoint [#enhanced-fix-api-securitylist-endpoint] Improved the liquidity metadata handling to ensure that order placements, based on the liquidity parameters provided via the SecurityList FIX endpoint, are compatible across multiple liquidity streams. This upgrade aggregates liquidity parameters for symbols across multiple providers, combining them into universally supported values. As a result, orders can be placed across several liquidity providers either simultaneously or in a failover mode, ensuring compatibility with all involved providers. #### Improved handling of negative spreads [#improved-handling-of-negative-spreads] Enhanced management of negative spreads has been achieved through more efficient filtering of Level 2 quotes and incremental updates. This improvement targets asset prices that could cause negative spreads in liquidity distributed to trading platforms and other consumers via the FIX protocol. The newly updated business logic effectively and efficiently filters out such quotes to prevent the negative spreads from appearing in the distributed liquidity. #### Enhanced resilience when processing fast subscribe/unsubscribe sequences [#enhanced-resilience-when-processing-fast-subscribeunsubscribe-sequences] B2CONNECT FIX server can robustly handle fast subscribe/unsubscribe sequences by liquidity aggregators, even when these aggregators do not strictly adhere to the FIX protocol standard, reusing the same request IDs. The newly implemented algorithm reliably handles such cases, eliminating even the intermittent subscription failures. *** ### Resolved issues [#resolved-issues-14] * Fixed an issue, where orders were re-sent (placed again) if one of the supported liquidity providers returned an unrecognized error message. Such messages are now categorized under a unified system, resulting in conserving the API rate limits on redundant order placements and reducing the risk of IP bans. * Fixed an issue where, after replacing the API credentials of a supported liquidity provider with new ones, the system continued subscribing to the execution reports stream using the old credentials until restarted. This fix ensures that the credentials can be replaced live, without the restart of services. ## March 31, 2025 [#march-31-2025] ### New features [#new-features-13] #### New integration with Bybit [#new-integration-with-bybit] B2CONNECT has launched a new adapter for **Bybit**, providing full support for perpetual futures contracts. This integration leverages B2CONNECT's robust infrastructure, allowing access to Bybit's market data and trading functionalities. It ensures seamless trading and quoting, enabling client platforms to offer advanced trading options and enhanced user experience. Benefit from efficient order execution and reliable price feeds — all within the B2CONNECT ecosystem! #### Advanced Trade API support for Coinbase integration [#advanced-trade-api-support-for-coinbase-integration] With this release, B2CONNECT introduces full support for **Coinbase Advanced Trade API**, replacing the deprecated Coinbase Pro API. This update ensures uninterrupted access to Coinbase’s liquidity, benefiting from the superior capabilities and performance of the Advanced Trade API. This upgrade affirms B2CONNECT commitment to delivering cutting-edge liquidity solutions, ensuring clients always have access to the best available liquidity infrastructure. *** ### Improvements [#improvements-14] #### Improved symbol specification management and real-time configuration [#improved-symbol-specification-management-and-real-time-configuration] The process for managing symbol specifications during bulk import has been significantly enhanced. Users can now interactively review and selectively edit symbol specifications directly within the import interface. This improvement enables on-the-fly adjustments, ensuring higher accuracy and flexibility when dealing with large sets of symbols. #### Binance Futures adapter enhancements [#binance-futures-adapter-enhancements] Several improvements have been implemented for the Binance Futures adapter, increasing its reliability and stability: * **Execution report deduplication**: Logic has been added to effectively deduplicate execution reports from Binance Futures. This resolves issues caused by occasional duplicate reports originating from the LP side, ensuring accurate order state tracking. * **Order state recovery rate limiting**: A rate limiter has been implemented for requests related to order state recovery. This proactive measure prevents potential rate limit violations on the Binance Futures platform, safeguarding against temporary bans or request throttling during high-activity periods. These updates contribute to a more robust and resilient integration with Binance Futures. *** ### Resolved issues [#resolved-issues-15] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December 24, 2024 🎄 [#december-24-2024-] #### New features [#new-features-14] ##### Taker orders routing to multiple LPs [#taker-orders-routing-to-multiple-lps] This newly released feature allows orders received through a single FIX connector to be routed to multiple liquidity providers. This functionality enables sophisticated order placement and execution strategies through: * **Failover mechanism**: Enables B2CONNECT to maintain each Taker connector linked to multiple liquidity sources and to dynamically reroute orders among them in case a provider becomes unavailable. * **Symbol-based order routing**: Caters to cases where a particular symbol may be unavailable with one liquidity provider, but listed on others. This feature allows for dynamic routing of orders to the most suitable liquidity source based on the specific trading symbol. This feature significantly enhances access to a wider range of trading instruments and improves fault tolerance for liquidity distribution at supported trading venues via both quoting and trading sessions. ##### Incoming connectors creation [#incoming-connectors-creation] B2CONNECT administrators can now create and configure connections to Makers via the Web UI. The solution supports a variety of protocols (WSS, REST, FIX), offering flexible and robust connectivity options. By streamlining the setup process, it enhances the user experience, making it easy to integrate incoming connectors. ##### Order status recovery at WebSocket disconnect [#order-status-recovery-at-websocket-disconnect] This feature ensures the recovery of pending order statuses in case a WebSocket connection is disrupted or unavailable. It's specifically designed for WSS+REST trading integration, allowing retrieval of a placed order status even if the execution report can't be extracted from a WebSocket data stream B2CONNECT subscribed to. This solution largely eliminates cases where an order is placed on the liquidity provider but is not correctly confirmed on the Taker platform due to WebSocket issues. The implementation significantly enhances execution quality and mitigates market risks. #### Improvements [#improvements-15] ##### Symbol creation interface [#symbol-creation-interface] The B2CONNECT Web UI now features a dedicated interface for adding symbols. This enhancement utilizes existing base and quote assets, building on the recent release of the Asset and Asset Classes management UI. This feature is in addition to the bulk settings import functionality, allowing for individual symbol creation and management. #### Resolved issues [#resolved-issues-16] There have been no customer-facing issues reported in this release. *** ### November 29, 2024 [#november-29-2024] #### New features [#new-features-15] ##### Taker FIX credentials management via the Web UI [#taker-fix-credentials-management-via-the-web-ui] The latest B2CONNECT release introduces a brand new Web UI Section in the Liquidity Hub administrative interface, designed for managing FIX protocol credentials. These authorization details are vital for B2CONNECT customers, including digital asset exchanges, brokerages, crypto payment gateways, and other liquidity consumers, to connect to the Liquidity Hub. Following the trend of previous improvements, such as the Maker API keys management interface, this update enables B2CONNECT administrators to efficiently generate and distribute FIX credentials. Once the credentials are generated and validated, B2CONNECT administrator can transfer them to a Taker platform so that their clients can authorize when connecting to the B2CONNECT FIX server. Credentials are automatically updated across B2CONNECT services, ensuring seamless client connectivity. This development marks a significant stride toward achieving comprehensive connectivity and streamlined liquidity distribution within B2CONNECT's growing infrastructure. #### Resolved issues [#resolved-issues-17] There have been no customer-facing issues reported in this release. *** ### October 31, 2024 [#october-31-2024] #### New features [#new-features-16] ##### Faster order placement and execution on the Binance spot platform [#faster-order-placement-and-execution-on-the-binance-spot-platform] B2CONNECT Liquidity Hub has implemented an advanced adapter to the WebSocket API for the Binance (spot) trading platform. This upgrade allows for faster order placement, thereby improving the trading experience and enhancing the liquidity distribution quality. By employing a high-end connectivity technology, trade-related messages are now transmitted through a bidirectional full-duplex protocol. When assessed against previous benchmarks, the order round-trip time on Binance (spot) has been shortened significantly. This advancement will be beneficial to any trading platform or liquidity taker client, substantially enhancing their user experience in order execution. #### Improvements [#improvements-16] ##### Enhanced Admin interface for configuring trading credentials [#enhanced-admin-interface-for-configuring-trading-credentials] B2CONNECT administrators can now independently configure trading credentials via the web interface, ensuring a faster and more secure process. This improvement simplifies the procedure of entering API keys using a dynamic, maker-specific form tailored with relevant fields, thereby streamlining operations. The system automatically validates the entered API keys to minimize errors. This is another addition to the rapidly expanding capabilities of the Liquidity Engine Web UI. #### Resolved issues [#resolved-issues-18] There have been no customer-facing issues reported in this or previous releases. *** ### September 30, 2024 [#september-30-2024] #### New features [#new-features-17] ##### Fully-featured liquidity adapter for Crypto.com [#fully-featured-liquidity-adapter-for-cryptocom] The full-blown liquidity acquisition adapter to **Crypto.com** is now available immediately to all B2CONNECT Liquidity Hub clients connecting via the FIX API. Crypto.com is a top-ranked cryptocurrency exchange platform that has recently been gaining traction among B2B clients as a direct market access enabler. With the introduction of the new connectivity option, B2CONNECT clients can now enhance their offerings with an expanded range of trading pairs. This feature also empowers them to diversify effectively, mitigating various risks such as counterparty, regulatory, and so on. The adapter enables access to price feeds (Level 2 quotes) on the trading platform and supports order placement, execution, and execution confirmation. Besides, its implementation ensures that these two main processes, getting quotes and trading, can be done in parallel, with the highest possible throughput and lowest network latency. This is the next step in B2CONNECT’s mission to enhance access to liquidity for its B2B clientele — digital asset exchanges and brokerages. We’re excited to provide trading platform operators with new opportunities to differentiate themselves by offering the trading community a wider range of trading options and better UX. ##### Liquidity configuration via CSV [#liquidity-configuration-via-csv] The B2CONNECT Web UI has been enhanced with the bulk import option of liquidity settings via a CSV file. This new feature enables B2CONNECT administrators to import an unlimited list of markets along with advanced liquidity parameters such as markups, volume modifiers, market depth, price and volume precision, and so on. Additional fields for defining synthetic instruments are provided to configure synthetic cross legs, quote sources, inversion, and more. The new interface validates the CSV file upon upload and also stores a history of imported settings. The latter empowers the B2CONNECT Hub operators to always have a fresh copy of the setup available for export as a CSV file, making it easier to enter adjustments, re-upload the configuration, and apply new liquidity settings. *** ### August 29, 2024 [#august-29-2024] #### New features [#new-features-18] ##### Faster Perpetual Futures trading via a high-end communication protocol [#faster-perpetual-futures-trading-via-a-high-end-communication-protocol] With this release, the B2CONNECT team has implemented a new integration with a fresh WebSocket API introduced by the Binance Futures platform earlier this year. This is a new option in addition to the time-tested REST API trading. The new connectivity technology uses a bidirectional, full-duplex protocol to transmit trade-related messages, which drastically increases execution quality. The average route time for trades shows an up to fourfold improvement over previously measured round-trip benchmarks. This is a true moonshot advancement in order execution quality that will allow any trading platform or other liquidity taker to offer exceptional trader UX improvements throughout their entire user base. ##### Concurrent connections to multiple API endpoints [#concurrent-connections-to-multiple-api-endpoints] This new feature allows B2CONNECT liquidity adapters to connect simultaneously to multiple endpoints associated with private and public APIs (where available). This enables access to digital resources on both types of endpoints at the same time. This advanced architecture improves resource availability and eliminates a single point of failure, giving B2CONNECT liquidity acquisition and distribution services the ability to simultaneously access market and trading data across various API clusters. The primary benefit of this new feature from a client perspective is much more reliable, fault-tolerant price feeds, order placements, and execution confirmations, improving UX while reducing market risks at the same time. #### Improvements [#improvements-17] * Trading log entries and error messages from both B2CONNECT internal services and external sources (such as supported liquidity providers) are now categorized and given a unified content and format before being transmitted to taker platforms. This ensures that messages are organized in a consistent manner and are better prepared for human consumption. This improvement is aimed at enhancing UX and reducing the load on a technical support team. * An improved B2CONNECT FIX server shutdown procedure has been implemented, which allows for graceful state saving and restoration, as well as prevents data loss due to interruptions of quoting and trading sessions. This enhancement ensures orderly logouts across all platforms connected via the FIX protocol, and availability of FIX messages after a restart. #### Resolved issues [#resolved-issues-19] * Fixed an issue where, in some scenarios, third-party FIX clients had issues reconnecting to the B2CONNECT FIX server after a logout. We have also ensured that a Logout message is consistently sent upon a client’s logout, which in rare cases may have been skipped prior to this release. * Fixed an issue that infrequently caused situations where after setting the order book depth to decrease, the number of levels would sometimes not increase back after reverting the settings. *** ### March 13, 2024 [#march-13-2024] #### New features [#new-features-19] ##### Liquidity distribution to the B2TRADER Brokerage Platform (BBP) [#liquidity-distribution-to-the-b2trader-brokerage-platform-bbp] With this release, the B2CONNECT team is excited to announce that the emerging B2TRADER Brokerage Platform has been added to our growing list of supported trading venues. This addition further advances our commitment to delivering top-notch connectivity to trading platforms and liquidity providers. The key updates encompass a bespoke order execution flow as well as custom FIX API endpoints that streamline the retrieval of available markets and contract specifications. With these enhancements, our industry-standard FIX protocol implementation enables a robust connection between the newly added platform and the liquidity providers supported by B2CONNECT. This integration empowers BBP’s clients to embrace flexible business models and adjustable execution strategies. And, as a result, further boost their success by providing exceptional user experiences to their end users — the members of the trading communities. ### November 10, 2023 [#november-10-2023] #### New features [#new-features-20] ##### Maker-integration with cTrader via the FIX protocol [#maker-integration-with-ctrader-via-the-fix-protocol] With this release, the B2CONNECT team is pleased to announce the achievement of a significant milestone in our ongoing quest to provide exceptional connectivity to both trading platforms and liquidity providers: we have successfully integrated B2CONNECT Liquidity Hub with **cTrader**. With this integration, B2CONNECT Liquidity Hub can now distribute the liquidity to cTrader, a complete trading platform solution for the forex and CFD brokers, via the FIX protocol. On one hand, this furnishes our clients running trading platforms with the ultimate access to liquidity. On the other hand, this empowers liquidity providers to implement comprehensive distribution solutions. This release marks the paradigm shift in the connectivity approach by including trading platform integrations alongside the liquidity providers and liquidity aggregators — our focus previously. This is a major step forward in expanding our ecosystem to include taker-venues, making our product a versatile liquidity distribution solution that meets the needs of a wide range of industry players in the dynamic world of trading. This new integration enables the provision of unique liquidity streams empowering our clients to differentiate themselves in a competitive and highly volatile market. Retail and institutional brokers, crypto exchanges, and liquidity providers can leverage our performant liquidity distribution solutions powered by industry-standard communication protocols and fast APIs built on scalable frameworks. *** ### October 20, 2023 [#october-20-2023] #### New features [#new-features-21] ##### Full support for Bitfinex Derivatives [#full-support-for-bitfinex-derivatives] Following the Bitfinex Spot support implemented earlier this year, we are pleased to announce full support for Bitfinex Derivatives with this release. It has been done per popular client request to support and improve diversification of perpetual futures liquidity flows, following the collapse of a global cryptocurrency derivatives player late last year. With this release, trading platforms powered by the B2BROKER technology receive additional benefits and opportunities, such as: * expand your offer with additional trading instruments * increase market depth due to additional liquidity source * improve liquidity, including faster and more flexible price feeds and better execution quality * diversify liquidity streams by the additional source of liquidity and avoid a single point of failure * differentiate yourself from competing platforms and, at the same time, delight your users by creating unique liquidity streams that have just become available from the newly supported platform. Among other features, the trading API and pre-execution model are fully supported and immediately available to client venues using the FIX protocol and relying upon the B2CONNECT’s signature FIX API (v1.2 and later). #### Improvements [#improvements-18] * A new tutorial has been added to the B2CONNECT Product guide, illustrating the process of setting up a connection to Coinbase. We took a special care to highlight the required credentials and help clients find them easily. *** ### September 29, 2023 [#september-29-2023] #### New features [#new-features-22] ##### FIX API 1.2 [#fix-api-12] With this release, B2CONNECT introduces a new version 1.2 of FIX API, which is an expanded and improved version of the previous implementation: * The Business Message Reject has been deleted. * The [Sequence Reset](fix-api#sequence-reset) message has been added. * The following tags have been added to the [Market Data Request](fix-api#market-data-request) message: `<267> NoMDEntryTypes` (required), `<269> MDEntryType` (required). * The following tag has been added to the [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) message: `<299> QuoteEntryID`. * The following tag has been added to the [New Order Single](fix-api#new-order-single) message: `<1> Account`. * The following tags have been added to the [Execution Report](fix-api#execution-report) message: `<64> SettlDate`, `<75> TradeDate`, `<103> OrdRejReason`. * The following tag has been added to the [Order Cancel Reject](fix-api#order-cancel-reject) message: `<39> OrdStatus` (required). The [FIX API specification](fix-api) has been updated to reflect the changes as well as to become more clear and consistent. *** ### May 12, 2023 [#may-12-2023] #### New features [#new-features-23] ##### A new form for entering API keys [#a-new-form-for-entering-api-keys] The B2CONNECT Web UI has been updated to display a customized form for entering API keys for each of the supported hedging platforms. As a result, the issues with entering the credentials have been eliminated. Since every platform features a different set of fields for entering the API keys, this form was updated to display the authorization fields as they are provided by each hedging platform and to prevent any ambiguity arising from the difference in the field names. #### Improvements [#improvements-19] * The contents of Web UI controls and field descriptions have been revised to afford a more intuitive interface. * The look and feel of the B2CONNECT Web UI has been enhanced by updating some of its most commonly used visual elements. #### Resolved issues [#resolved-issues-20] * Fixed an issue causing the API key editing window to hang when an entry for a hedging platform was absent in the configuration. Such exceptions are now handled, and the stability of the UI has increased as a result. * Fixed an issue due to which empty fields were erroneously assigned zero values after updating the hedging configuration. * Fixed an issue due to which duplicate entries could be displayed for clients on the Hedging Status tab. * Fixed an issue due to which incorrect values were submitted in certain scenarios when enabling or disabling hedging on the Hedging Status page of the Web UI. *** ### April 21, 2023 [#april-21-2023] #### Improvements [#improvements-20] ##### Liquidity provider validation before accepting incoming orders [#liquidity-provider-validation-before-accepting-incoming-orders] The order execution reliability has been greatly improved as a result of including a check for the actual availability of the supported liquidity providers before the B2CONNECT Liquidity Hub services can go forth and accept the incoming orders from a taker platform. Following the update of the B2CONNECT liquidity distribution services, they now always ensure that the connected liquidity providers are ready to execute a placed order, in which case the order is then accepted for execution on the connected trading venue serving as a liquidity consumer. ##### Type-agnostic execution of orders [#type-agnostic-execution-of-orders] If the order type that was set by a taker platform isn’t recognized as a valid execution option, the B2CONNECT liquidity distribution services can be configured to emulate the required order type by assigning a different type to the order. This way you can further ensure that the placed orders will be filled regardless of their types, and their execution quality will match the expectations of your end-users to the fullest possible extent. ##### Repeated requests for order placement [#repeated-requests-for-order-placement] The B2CONNECT order placement services have been revised to enable them to retry order placement if a target liquidity provider platform is unable to fill an order for a transient reason. If the dedicated B2CONNECT service recognizes the returned error as transient (as opposed to intrasient errors, such as those arising from connection failures), the service then works around this issue by automatically sending a repeated request for order placement, which increases the chances that the order will be eventually filled. This is especially useful in times of increased market volatility resulting in drastic increase in traders’ activity, which may overwhelm the liquidity provider services making it difficult to fulfill all the requests for orders execution. #### Resolved issues [#resolved-issues-21] * Fixed some issues affecting the B2CONNECT notification service. These include occasional service stability issues arising from an incorrect data format, as well as the issue due to which a user identifier defined in hedging configuration could not be resolved if this user’s trading platform was left unspecified. * Fixed an issue that affected the adapter used to connect to one of the supported liquidity providers and prevented restarting the service and restoring the connection after the liquidity provider has disconnected the communication protocol. * Fixed some minor issues with the B2CONNECT Web UI due to which it could be difficult for users to replace the API keys in certain scenarios. * Fixed an issue with the Hedging Reports section of the B2CONNECT Web UI due to which the Amount field in the Order Details section could be occasionally assigned incorrect data. *** ### March 10, 2023 [#march-10-2023] #### New features [#new-features-24] ##### Hedging on Bitfinex [#hedging-on-bitfinex] Bitfinex, a global cryptocurrency exchange and spot trading venue, is now supported as a new hedging platform. As is well known, diversification is the key to thriving, regardless of market conditions. This is why with the two most recent releases we specifically focused on providing the widest variety of connectivity options to our global-minded clients, while offering them the opportunity to hedge market risks on suitable platforms in as many regions and jurisdictions as possible with a view of achieving the maximum geographical and regulatory diversity. The newly released trading adaptor for the Bitfinex API is the next step on the B2CONNECT’s journey aimed at empowering its discerning B2B clients, which include cryptocurrency exchanges and crypto brokers. In the meantime, our main goal remains constant: we are eager to not only delight trader communities by ensuring a fantastic user experience, but also to offer trading platforms broad opportunities for spreading risks and allow them to take a savvy approach to exposure in a wide range of market situations. #### Improvements [#improvements-21] ##### Enhanced support for trading instruments engineered as contracts [#enhanced-support-for-trading-instruments-engineered-as-contracts] We have significantly expanded the contract specification capabilities for some of the supported crypto assets by encompassing all popular methods of defining trading instruments. With the enhanced contract sizes, the price and/or amount can be configured in any combinations while designing contracts for various symbols, with taking into consideration both the contracts that are priced by amount and those evaluated by face value regardless of their amount. #### Resolved issues [#resolved-issues-22] * Fixed an issue due to which the adaptor used for price discovery on one of the supported liquidity providers could hang in certain scenarios. * Fixed an issue which hampered the efficiency of the cloud resources utilization by making multiple subscriptions to quotes for the same asset if liquidity for this asset was used to maintain price feeds for several symbols. * Fixed an issue which caused intermittent disconnection of the FIX protocol after restarting one of the supported liquidity aggregators. * Fixed an issue related to number formats which occasionally appeared in hedging reports. As a result, the scientific EXP format used for some of the fields has been replaced with a more user-friendly financial format. *** ### February 17, 2023 [#february-17-2023] #### New features [#new-features-25] ##### Hedging on Kraken [#hedging-on-kraken] As part of our relentless pursuit of providing crypto asset exchanges and brokers seamless access to the widest possible choice of hedging platforms, we are pleased to announce full support for the Kraken trading API, which opens new horizons for trading venues relying on B2CONNECT Liquidity Hub in terms of risk transfer and supplying the price feed. This is a major landmark for B2CONNECT, made possible by enhancing the previously released adapter used for connecting to this well-established bitcoin trading platform and cryptocurrency exchange which is based in San Francisco. As a result, both Level 2 quotes and hedging for all symbols traded on Kraken are now available to B2CONNECT clients. #### Improvements [#improvements-22] ##### Extended documentation [#extended-documentation] [A new tutorial](how-to-articles/how-to-properly-configure-api-keys-on-kraken) has been added to B2CONNECT documentation, illustrating the process of obtaining the API keys required to enable hedging on Kraken using the newly introduced hedging adapter. Paying special attention to keeping our documentation up-to-date and complete, we invite you to learn more about B2CONNECT by exploring our Product Guide and encourage you to contact us if you have any suggestions or need further assistance. #### Resolved issues [#resolved-issues-23] * Fixed an issue which caused the hedging engine to hang up immediately after entering the API keys for connecting to some of the hedging platforms in certain scenarios. * Fixed an issue which prevented simultaneous placement of multiple hedging orders, causing instead their consecutive placements which resulted in slightly delayed execution. * Fixed an issue which caused recurrent switching between the main and backup liquidity providers in certain scenarios. *** ### January 27, 2023 [#january-27-2023] #### New features [#new-features-26] ##### Level 2 quotes supported for Bitfinex spot liquidity [#level-2-quotes-supported-for-bitfinex-spot-liquidity] Yet another major cryptocurrency exchange Bitfinex has been integrated, ensuring steady supply of spot asset liquidity from this global platform. This highly anticipated development opens exciting new opportunities for operators of crypto trading venues, since it is hard to overestimate the importance of being able to connect to unique liquidity sources. For those who are determined to survive the ongoing “crypto winter” and excel in a highly competitive environment, this is a great opportunity to appeal to extremely discerning trader communities with the best possible offering, which includes a wide array of trading instruments and guarantees tighter spreads and remarkable market depth. This is undoubtedly great news both for the exchanges powered by matching engines, such as B2TRADER, and for third-party crypto exchanges and brokers connected to B2CONNECT via the FIX protocol (either using the B2CONNECT proprietary FIX API or solutions relying on liquidity aggregators, such as oneZero and PrimXM). #### Improvements [#improvements-23] ##### Improved handling of Level 2 quotes [#improved-handling-of-level-2-quotes] The performance of locally maintained extended order books with a virtually unlimited number of price levels (up to 5,000 and beyond) has been enhanced, thanks to implementation of an improved solution, which enables combining multiple price feeds into a single data stream, as opposed to one-to-one channel subscriptions that were previously supported. This has resulted in a drastic performance boost for the price discovery engine, along with a notable increase in the frequency of Level 2 quote updates. #### Resolved issues [#resolved-issues-24] * Fixed an issue that caused occasional generation of empty reports due to incorrect logging of executed trades. * Fixed an issue that prevented subscription to more than a hundred trading instruments due to a bug in the adaptor used to connect to one of the supported liquidity providers. * Fixed an issue related to data exchange with message-oriented middleware, which caused occasional rejection of orders placed using the FIX protocol. * Fixed an issue due to which in certain scenarios the hedging engine attempted to place trades on one of the supported liquidity provider platforms despite the corresponding API keys being missing. * Fixed an issue due to which requests to place offset orders were occasionally sent to hedging platforms even when the order volume was zero after applying the trading rules governing decimal precision of order amounts on these platforms. ### December 16, 2022 [#december-16-2022] #### New features [#new-features-27] ##### Support for multiple accounts on a single hedging platform [#support-for-multiple-accounts-on-a-single-hedging-platform] Automated hedging can now be performed simultaneously on two or more accounts on the same hedging platform for routing offset trades with a purpose of hedging market risks. First and foremost, the B2CONNECT team is committed to empowering its user base — that is, operators of trading venues, such as spot crypto exchanges and brokerages — and putting their best efforts to implement as flexible and efficient hedging policies as possible. With that in mind, this newly added feature is aimed at supporting multiple accounts on a single hedging platform, while ensuring precise order placements, timely delivery of execution confirmations and in-depth reporting for each account used to make offset trades on a given liquidity provider platform. #### Improvements [#improvements-24] ##### Unmatched execution quality due to asynchronous placement of orders [#unmatched-execution-quality-due-to-asynchronous-placement-of-orders] The B2CONNECT order placement engine relying on trading sessions maintained using the FIX protocol has been vastly improved by adding support for asynchronous placement of large numbers of orders submitted for execution on liquidity provider platforms, which has resulted in unprecedented speed and unrivaled execution quality. ##### Extended infrastructure for engineering of synthetic instruments [#extended-infrastructure-for-engineering-of-synthetic-instruments] A new improvement to the B2CONNECT synthetics engine has significantly extended the range of available sources of quotes suitable for engineering synthetic trading instruments, such as synthetic crosses, fractional markets and inverted pairs. Accessible price feeds are not only received from a B2CONNECT instance hosting the synthetics engine itself, but also from any other instance within the Liquidity Hub ecosystem. #### Resolved issues [#resolved-issues-25] * Fixed an issue related to the reporting service: when a single order was filled by way of multiple executions on a particular hedging platform, only one of the executions was recorded. * Fixed a bug related to the [SimpleFIX Go library](https://github.com/b2broker/simplefix-go/) implementing the FIX protocol, which could have caused an issue with the logon sequence if a client used a different FIX protocol implementation. * Fixed an issue causing a resource leak in the synthetics engine that could have given rise to intermittent stability issues. In addition, another resource leak has been eliminated in an adapter used to connect to one of the supported spot cryptoasset liquidity providers, ensuring overall stability of the service, its reliability and uninterrupted uptime. ### November 25, 2022 [#november-25-2022] #### New features [#new-features-28] ##### Direct integration of the B2CONNECT FIX server with PrimeXM [#direct-integration-of-the-b2connect-fix-server-with-primexm] The B2CONNECT Liquidity Hub is now capable of distributing liquidity as a maker to PrimeXM. Client connections to this leading liquidity aggregation platform are powered by the industry-standard FIX protocol, and the liquidity bridged by B2CONNECT can now be distributed directly on PrimeXM for its subsequent distribution across other trading venues. Both the quoting and trading sessions are supported, providing immense benefits to trading venues participating in the B2CONNECT ecosystem and offering them new exciting opportunities to grow their business and differentiate from competitors in both the scope and performance of trading instruments available both to their users and the trading community as a whole. #### Improvements [#improvements-25] ##### Automatic validation of markups [#automatic-validation-of-markups] The price construction mechanism featured by B2CONNECT has been further improved by adding validation to the key parameters entered for price markups. If the markup values assigned to the BID and ASK sides are asymmetric, a warning is issued prompting a venue operator to correct the entered values so that unequal markup amounts are not placed on both sides of the order book. ##### More data for tracking orders and matching elements of the hedging flow [#more-data-for-tracking-orders-and-matching-elements-of-the-hedging-flow] The logging and reporting functionality provided by various B2CONNECT services has been enhanced by listing external execution identifiers assigned by connected liquidity providers along with their B2CONNECT-assigned equivalents. This way, order matching has become much quicker, also facilitating subsequent analysis of trades. Moreover, orders have also become easier to track thanks to newly introduced granular timestamps. #### Resolved issues [#resolved-issues-26] * Fixed an issue due to which the order book was reset upon receiving out-of-sequence incremental updates for Level 2 quotes from one of the supported liquidity providers. * Fixed an issue related to one of the supported liquidity providers: a command to subscribe to incremental updates was ignored for all trading instruments if it couldn’t be executed only for some of them. * Fixed an issue related to the B2CONNECT FIX protocol: non-sequential numbers were assigned to certain FIX messages. * Fixed a rarely occurring issue related to the B2CONNECT Web UI: toggling a certain switch when setting up one hedging platform could result in misconfiguration of another hedging platform. * Fixed an issue related to the reporting and alerting service used for sending messages to a Slack channel: in some cases, incorrect data was being reported. *** ### October 14, 2022 [#october-14-2022] #### New features [#new-features-29] ##### Liquidity from and hedging on FTX [#liquidity-from-and-hedging-on-ftx] We are happy to announce yet another major achievement in our quest for unrivaled connectivity for B2CONNECT across the spot crypto liquidity space: with this release, FTX, a top-rated global crypto exchange, has been supported, once again letting B2CONNECT assert itself as a flagship liquidity hub and price discovery engine. The liquidity for all markets represented on FTX is immediately available for any exchange powered by the B2TRADER matching engine as well as to any trading platform connected to B2CONNECT via the FIX API. Along with supplying the price feed for spot markets, the newly introduced connection adapter radically extends the range of price risk hedging options offered by the B2CONNECT hedging engine. #### Improvements [#improvements-26] ##### DB connectivity monitoring [#db-connectivity-monitoring] When it comes to the cloud infrastructure accommodating the B2CONNECT services, we put our best efforts to not only ensure its highest performance and extreme reliability, but also envision efficient ways to monitor and maintain connectivity. In keeping true to our principle — trust, but verify — we have implemented automated detection of connectivity issues related to managed cloud database services. ##### Optimal subscription management [#optimal-subscription-management] Superb performance is the cornerstone on which rests the success of the B2CONNECT liquidity platform, and it’s been proved time and again during its development that the key to achieving the highest degree of efficiency is constant optimization. This time, it has been ensured that the liquidity hub only subscribes to the symbols that take part in liquidity distribution. This saves the cloud resources due to removal of subscriptions which are not currently in demand and further improves the overall platform performance. #### Resolved issues [#resolved-issues-27] * Fixed an issue due to which one of services stopped after removing a subscription to a price feed. * Fixed an issue due to which a mandatory time-in-force parameter value wasn’t sent when placing hedging orders of a certain type on a particular hedging platform. *** ### September 23, 2022 [#september-23-2022] #### New features [#new-features-30] ##### Conversion of derivative contract lot sizes to smaller and larger tradable amounts [#conversion-of-derivative-contract-lot-sizes-to-smaller-and-larger-tradable-amounts] With this release, you can split derivative contracts and reform contract specifications with underlying digital assets to change the contract lot size and lot price. This is a major development, since it enables quoting and trading fractional and, inversely, consolidated crypto derivative contracts. For example, if an instrument is traded at a liquidity provider venue in lots of 1000, such derivatives can now be traded in lots of one to a million on a taker side, with the contract quotes readily adjusted to the new contract sizes. When the orders are placed for executions on liquidity provider venues, they are adjusted to meet the lot size requirements of each venue. #### Improvements [#improvements-27] ##### The order book state may be preserved indefinitely [#the-order-book-state-may-be-preserved-indefinitely] The adapter used to connect to liquidity providers has been further improved by adding the option to hold the last value of a quote indefinitely. A good case for this is dealing with acquisition of quotes when the asset price changes only intermittently even though the connection to the liquidity provider is alive. ##### The current state of Level 2 quotes is now reset upon disconnection [#the-current-state-of-level-2-quotes-is-now-reset-upon-disconnection] This improvement is related to the previous one: it has been ensured that even when the asset price is configured to handle infrequent refreshing of quotes, once connection to a liquidity provider goes down, the state of Level 2 quotes is reset until connection to the source of quotes is renewed. #### Resolved issues [#resolved-issues-28] * Fixed an issue due to which, when asset volume is denominated with high decimal precision, small order amounts could be truncated to zero and error messages may be sent by liquidity providers. It is now ensured that hedging is handled properly, and in cases when orders are so small that they would be rejected by liquidity provider venues, they are not sent there for execution. * Fixed an issue which caused race conditions. This has resulted in improved stability and performance of a hedging agent along with an adapter used to fetch asset quotes from a liquidity provider venue. * Fixed an issue related to recording of time values. It has been ensured that timing is now properly recorded and corrected for ongoing order execution requests. * Fixed an issue concerning a service responsible for handling the FIX protocol. The service is now capable of resuming the price feed after connection to the liquidity taker was reinstated. * Fixed an issue due to which upon entering a long numerical value on a Web UI form, its last digit was switched to zero. *** ### September 2, 2022 [#september-2-2022] #### New features [#new-features-31] ##### Updated documentation [#updated-documentation] A new section has been added to the B2CONNECT documentation providing a user interface overview and illustrating how to accomplish the most common tasks. Refer to the **Product guide** to learn about the hedging functionality provided by B2CONNECT. #### Improvements [#improvements-28] With this release, various changes have been introduced to B2CONNECT user interface, which include the following improvements: * A table header in the Hedging configuration section has become fixed, making it easier to see the field captions when scrolling down the page. * All buttons have been provided with tooltips describing their functionality. * The minimum screen resolution (960px) is now supported on all product pages. *** ### August 12, 2022 [#august-12-2022] #### New features [#new-features-32] ##### Full support for Huobi Futures [#full-support-for-huobi-futures] Huobi Futures, a top-rated derivative exchange platform, has been fully supported. As a result, robust supply of level 2 quotes has been ensured across the entire range of trading instruments, including but not limited to futures, swaps and perpetual swaps available on the newly supported platform. This new level of liquidity has been provided following a major update of a recently released Huobi Spot Adapter, which was greatly extended to allow B2CONNECT clients to explore all the advantages offered by Huobi-powered trading venues. The trading API is also supported, which opens new opportunities for best price execution and radically expands the range of options available to B2CONNECT Liquidity Hub clients in the realm of market risk mitigation while allowing them to offer their end users the tightest spreads and deepest order books across today’s markets. Among other features, pre-execution model is fully supported and immediately available to client venues utilizing the FIX protocol and relying upon the B2CONNECT signature FIX API. #### Improvements [#improvements-29] ##### Increased consistency of synthetic quotes [#increased-consistency-of-synthetic-quotes] The engine responsible for engineering synthetic cross pairs and fractional trading instruments has received yet another boost in functionality to increase the consistency of synthetic quotes by eliminating any outlying values when calculating spreads. ##### Extra validation ensuring decimal precision of asset prices [#extra-validation-ensuring-decimal-precision-of-asset-prices] Arguably, when it comes to cryptocurrencies and other types of digital assets, the issue of decimal precision may be challenging for some legacy trading platforms and liquidity aggregators that primarily deal with fiat instruments and traditional securities. In contrast, B2CONNECT ensures that liquidity is always ingested, handled and distributed with superb efficiency, regardless of decimal precision and numerical value range of asset prices. With an additional layer of validation added to its liquidity engine, B2CONNECT makes sure that decimal precision values are always handled in strict accordance with the client specification, throughout the entire liquidity processing pipeline. #### Resolved issues [#resolved-issues-29] * Fixed an issue due to which supported platforms could sometimes fail to subscribe to level 2 quotes provided by B2CONNECT. * Fixed an issue due to which the final status of an order execution could be recorded incorrectly in certain scenarios involving one of the supported hedging platforms. *** ### July 1, 2022 [#july-1-2022] #### New features [#new-features-33] ##### Hedging reports — New section in Web UI [#hedging-reports--new-section-in-web-ui] On a newly introduced Hedging Reports page, you can find the history of hedging orders, view comprehensive order data and drill down to the minute details of each execution. The data on order placement requests and hedging platform responses is readily available, along with the information related to timing of each step along the order processing pipeline. You can filter the reports by various criteria, including different types of order and counterparty IDs, order placement and execution data, as well as various time intervals. The table layout is configurable, making it possible to reorder the columns and display or hide any column according to your preferences. #### Resolved issues [#resolved-issues-30] * Fixed various usability issues to improve the user experience. * Fixed an issue which prevented access to inputs due to an overlapping menu. *** ### June 10, 2022 [#june-10-2022] #### New features [#new-features-34] ##### A tenfold increase in Level 2 quotes update speed [#a-tenfold-increase-in-level-2-quotes-update-speed] The rate of Level 2 quote updates has been increased ten times compared to the previous release, enabling liquidity feeds to be refreshed with an interval of 100 ms. This feature allows B2CONNECT Liquidity Hub clients to initiate and maintain the most up-to-date order books that enhance user experience for traders on the supported exchange and broker platforms, as well as make risk management aspects of trading venue operations more predictable. #### Improvements [#improvements-30] ##### API rate limits implementation [#api-rate-limits-implementation] The B2CONNECT Liquidity Hub hedging engine’s reliability has been given yet another boost with the implementation of support for request rate limits. This ensures optimal uptime for API connections employed for the purposes of trade executions and reporting. ##### Heartbeats and graceful connection termination [#heartbeats-and-graceful-connection-termination] Health checks and connection handling safeguards have been added to ensure a seamless connection to liquidity provider data. As a result, unmatched reliability in managing Level 2 quote feeds has been achieved. #### Resolved issues [#resolved-issues-31] * Fixed timeout issues that could affect reliability of full-duplex communication channels-while connecting to certain liquidity providers via API. * Fixed an issue with the mechanism responsible for restoring an API connection upon its interruptions in certain corner cases. * Fixed an issue due to which the Filled Amount field in hedging order execution reports could contain incorrect values. *** ### May 20, 2022 [#may-20-2022] #### New features [#new-features-35] ##### Markups as a function of order book depth [#markups-as-a-function-of-order-book-depth] B2CONNECT Liquidity Hub clients can now apply multiple markups based on the price level defined for Level 2 quotes. Together with variable volume modifiers introduced earlier this year, this feature empowers the trading venue operators to manage the liquidity of their order books to a highest precision, thus improving the user experience while mitigating market risks. #### Improvements [#improvements-31] ##### Improved logics for applying markups [#improved-logics-for-applying-markups] The algorithms used for applying both constant and multi-tiered markups have been revised. This has resulted in improved quality of liquidity distribution after applying markups. ##### More granular analytics with new data included in hedging order execution reports [#more-granular-analytics-with-new-data-included-in-hedging-order-execution-reports] More data about orders is now recorded by the B2CONNECT reporting engine. A new field has been added to store the order status information provided by hedging platforms. Furthermore, a new status has been included to distinguish expired orders from those canceled for other reasons. #### Resolved issues [#resolved-issues-32] * Fixed an issue that caused a leak of resources during disconnections occurring as a result of intermittent network failures. * Fixed several issues that occurred in rare scenarios. Reliability and high availability of services responsible for liquidity supply in various market conditions has been ensured as a result. *** ### April 29, 2022 [#april-29-2022] #### New features [#new-features-36] ##### Yet more liquidity from Huobi Global [#yet-more-liquidity-from-huobi-global] The B2CONNECT Liquidity Hub is celebrating a new major update: we worked hard to introduce a fully featured adapter for the top-rated crypto exchange Huobi Global. Both the Level 2 quote and hedging adapters have become available to all B2CONNECT Ecosystem participants. This highly anticipated component has boosted both the breadth and depth of the crypto spot liquidity offering, carrying a great advantage for supported digital asset exchanges, including B2TRADER. For the liquidity hub as a platform, this also ensures increased availability and improved failover capability. The influx of liquidity from the new source will also benefit the client venues integrated with B2CONNECT via FIX API. #### Improvements [#improvements-32] ##### Optimized market data delivery [#optimized-market-data-delivery] The parser of market data coming from one of the world's largest crypto exchanges has been optimized, which resulted in a significant improvement in the adapter performance. Latency has been reduced by an order of magnitude, and the quality of market data and overall reliability have been considerably improved. ##### More flexible hedging with enhanced time-in-force settings [#more-flexible-hedging-with-enhanced-time-in-force-settings] A hedging adapter for one of the major crypto-asset exchanges has been revamped, extending our offering to encompass the full range of trading parameters available for orders placed in the context of market risk hedging. With the newly introduced time-in-force options, our clients are free to devise more flexible and ultimately more efficient hedging strategies. #### Resolved issues [#resolved-issues-33] * Fixed an issue which didn't allow the hedging agent to record certain fields when trades were rejected by a hedging platform. * Fixed an issue which affected processing of incoming and outgoing messages used by one of the supported protocols, when some messages could be blocking other ones at a high load. A considerable potential bottleneck has been prevented as a result. * Fixed an issue that could affect order book consistency for one of the supported exchanges. * Fixed an issue that could have impact on the stability of some of the B2CONNECT services if reports were received in an incorrect format. * Fixed an issue that could result in a failure to cancel a previously placed order while executing a hedging strategy on one of the supported hedging platforms. ### April 8, 2022 [#april-8-2022] #### New features [#new-features-37] ##### Comprehensive integration with Bittrex Global [#comprehensive-integration-with-bittrex-global] A new adapter has been introduced to enable price discovery and market risk hedging on Bittrex Global. Connection to this global crypto exchange drastically extends the range of trading instruments and hedging options provided by B2CONNECT. ##### Hedging on Coinbase [#hedging-on-coinbase] A new adapter has been introduced to enable spot asset hedging on the Coinbase crypto exchange. For B2CONNECT Liquidity Hub clients who already came to appreciate the advantages of seamless Coinbase connection, this improvement signals complete integration with this major crypto trading platform, opening the opportunity for superior spot asset hedging. #### Improvements [#improvements-33] ##### Extended price feed options [#extended-price-feed-options] The price feed can now be streamed in the form of order book snapshots. Adding up to incremental feed updates, this further ensures even and reliable streaming of prices. ##### New performance benchmark reached [#new-performance-benchmark-reached] Over 200% increase in B2CONNECT performance has been secured thanks to optimization of the data interchange mechanism, which resulted in a major reduction of latency and more judicious use of computing resources. Smart use of cloud resources and bandwidth directly translates into the amount of trading instruments which a B2CONNECT instance can handle efficiently. This also implies increased market depth and higher frequency of symbol quote updates, along with a much better quality of order execution and improved bottom line. #### Resolved issues [#resolved-issues-34] * Fixed an issue impairing the reliability of streaming order book data in rare scenarios. * Fixed an issue which occasionally caused a resource leak in cases when specific configuration parameters were missing. The stability of the hedging services has improved as a result. * Fixed an issue causing occasional inversion of sides when hedging trades were placed on certain platforms. *** ### March 18, 2022 [#march-18-2022] #### New features [#new-features-38] ##### Streamlined order book consolidation [#streamlined-order-book-consolidation] With this release, B2CONNECT supports consolidation of Level 2 quotes with unlimited market depth into any order book, according to flexible configuration rules. As a result, B2CONNECT clients can stream a price feed with a specified liquidity distribution to fill an order book with fewer levels while preserving the overall market depth. This way the B2CONNECT platform, with its support for virtually unlimited market depth, becomes even easier to integrate with trading venues whose market depth is limited to just a dozen or a hundred order book levels. At present, this functionality is available only for services accessible via FIX API. ##### Improved SimpleFIX Go documentation [#improved-simplefix-go-documentation] The official documentation for the SimpleFIX Go library has been updated. This state-of-the-art library makes for a major contribution to open source on behalf of B2BROKER, providing an up-to-date FIX engine implementation out of the box while featuring high performance and employing a highly sought-after Go technology stack. The library is available at [https://github.com/b2broker/simplefix-go](https://github.com/b2broker/simplefix-go/) offering the global developer community a quick and easy approach to integrate FIX messaging pipelines into modern trading solutions powered by Go as well as ensure a closer integration with well-proven products from the B2BROKER family. #### Improvements [#improvements-34] ##### Support for liquidity with virtually unlimited order book depth [#support-for-liquidity-with-virtually-unlimited-order-book-depth] As a result of this improvement, nearly unlimited number of Level 2 quotes is now supported when it comes to the actual number of price levels in the order book, which includes (but is not limited to) order books featuring 1,000+ levels that are currently supported. ##### Extended configuration of Level 2 quotes [#extended-configuration-of-level-2-quotes] The set of configuration parameters required for consolidation of Level 2 quotes into a custom price feed has been extended to include the options that define the number of price levels being consolidated into a target order book, volume distribution settings and the rules for discovering prices at specific order book levels. #### Resolved issues [#resolved-issues-35] * Revamped a service responsible for switching the source of Level 2 quotes in the case when the counterparty starts supplying incorrect order book data. Continuous operation of price discovery services has been ensured as a result. * Fixed an issue that caused inversion of hedging trade sides in certain scenarios. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-39] ##### Pre-trade execution control [#pre-trade-execution-control] B2CONNECT now supports pre-trade execution control that enables the trading venues integrated via the FIX API to connect to the B2CONNECT Liquidity Hub as takers. When connected as a taker, a venue receives Level 2 quotes, it can place orders and receive confirmations when a maker executes the orders. ##### FIX API documentation [#fix-api-documentation] Basic [FIX API specification](fix-api) has become available to help independent trading venues and liquidity providers integrate B2CONNECT Liquidity Hub into their solutions via the FIX API. #### Improvements [#improvements-35] ##### Pricing Service streams prices with markups already applied [#pricing-service-streams-prices-with-markups-already-applied] A specialized B2CONNECT service providing top-of-the-book prices (that is, Level 1 quotes) is now streaming quotes with configurable markups already applied, as opposed to the earlier implementation, with only the raw quotes provided so that markups had to be applied explicitly upon receiving the markup values via separate REST APIs. The newly introduced approach is much easier and less time-consuming. #### Resolved issues [#resolved-issues-36] * Fixed an issue that resulted in the lot size not being taken into account when placing hedging orders on certain hedging platforms. * Fixed issues that affected the stability and performance of the B2CONNECT hedging engine. *** ### February 4, 2022 [#february-4-2022] #### New features [#new-features-40] ##### Full support for Kraken spot liquidity [#full-support-for-kraken-spot-liquidity] Trading venues participating in the B2CONNECT Ecosystem can now take advantage of ready access to spot liquidity on one of the top-ranked cryptocurrency exchanges — yet another milestone for B2CONNECT continuing on its mission of diversifying access to liquidity, be it crypto spot markets, crypto derivatives or other popular trading instruments. #### Improvements [#improvements-36] ##### Improved support for Poloniex API [#improved-support-for-poloniex-api] The Poloniex connection adapter has been updated following the changes to the API of this leading digital assets exchange, which resulted in enhanced performance and improved connection stability. ##### Extended integration with B2TRADER [#extended-integration-with-b2trader] With this release, B2CONNECT features even deeper integration with B2TRADER, a flagship matching engine and crypto assets exchange platform. As a result, more efficient delivery of trading reports and faster execution of hedging orders have become possible. #### Resolved issues [#resolved-issues-37] * Fixed an issue related to the Poloniex adapter and causing inconsistencies in Level 2 quotes under certain circumstances. * Fixed a reporting-related issue to ensure that the fees and commissions data is properly received and reflected in hedging reports. * Fixed issues causing occasional quote feed inconsistencies arising immediately after updating the configuration of some of the B2CONNECT services. *** ### January 14, 2022 [#january-14-2022] #### New features [#new-features-41] ##### Volume modifiers variable by price level [#volume-modifiers-variable-by-price-level] B2CONNECT Liquidity Hub clients can now configure a volume modifier (otherwise known as multiplier) as a function of market depth. Risk management precision can be ensured by fine-tuning liquidity distribution data in the order book. ##### Execution of hedging orders on Binance Futures [#execution-of-hedging-orders-on-binance-futures] A new adapter has been introduced for execution of hedging orders on Binance Futures, a major platform specializing in crypto derivatives. Combined with instruments for perpetual futures trading, this new service creates truly exciting opportunities for B2CONNECT Liquidity Hub clients. ##### Hedging of spot assets with Binance perpetual futures [#hedging-of-spot-assets-with-binance-perpetual-futures] Spot asset trades can be hedged with perpetual futures. B2CONNECT clients can reduce costs and improve the cash flow by applying more attractive strategies. #### Improvements [#improvements-37] * A new adapter has been introduced for connection to Gemini, another major cryptocurrency exchange providing spot liquidity for B2CONNECT clients. * A new adapter has been introduced for execution of hedging orders on the Poloniex crypto exchange. #### Resolved issues [#resolved-issues-38] * Fixed an issue that could result in omission of some trade parameters in the hedging orders trade history. * Fixed an issue that could cause an order timeout error despite normal execution of actual trades. ### December 17, 2021 [#december-17-2021] #### New features [#new-features-42] ##### Hedging configuration in the B2CONNECT Admin panel [#hedging-configuration-in-the-b2connect-admin-panel] Introducing a new Admin panel with a convenient user interface featuring useful hedging configuration options, allowing you to: * Specify the minimum and maximum amount at which to execute hedging orders, and define different hedge ratios for each order side. * Map some of the hedging order symbols to other symbols, meaning that you can hedge using any symbols apart from those present in a particular instrument. These options can find a variety of applications. For example, you can hedge by forcibly splitting large orders and executing each portion separately. ##### Hedging status — New section in Web UI [#hedging-status--new-section-in-web-ui] On a new Hedging Status page, you can manage and monitor trading venues and hedging platforms to solve any of the following tasks: * Run or stop the hedging process. * Connect hedging platforms to client exchanges or disconnect them according to your risk transfer preferences. * Manage API keys provided by the connected hedging platforms. *** ### December 3, 2021 [#december-3-2021] #### New features [#new-features-43] ##### FIX integration — Another major liquidity distribution platform supported [#fix-integration--another-major-liquidity-distribution-platform-supported] A new adapter has been introduced for connection to another major platform specializing in margin trading. This is a welcome addition to a rich set of connectivity options available to B2CONNECT Liquidity Hub clients. ##### Simultaneous connection to a number of ecosystem makers [#simultaneous-connection-to-a-number-of-ecosystem-makers] Any venue participating in the B2CONNECT ecosystem (or *ecosystem taker*) can now establish a live connection with multiple *ecosystem partners*, enjoying simultaneous access to multiple liquidity streams and gaining a competitive edge on the turbulent hedging market #### Improvements [#improvements-38] * The identifier assigned to executions by an exchange is now being tracked throughout the entire succession of hedging operations. This greatly improves the quality of end-to-end analytics available to risk managers employed at venues participating in the B2CONNECT ecosystem. * The hedging order placement process has been streamlined, resulting in improvements to the prioritization engine, which ensures the fastest possible routing of orders resulting in timely and efficient risk transfer coming handy to any risk management strategy. * In anticipation of possible connection failures or other issues compromising continuous liquidity flow from ecosystem makers, both the price feed and hedging can be configured to prescribe automatic switching to another ecosystem partner or external liquidity provider, followed by switching back to use them again as soon as the connection is restored. #### Resolved issues [#resolved-issues-39] * Fixed an issue that could compromise reliability of order routing services in some scenarios. Fault tolerance is now ensured in potentially disruptive cases, such as when trading symbols are found to be misconfigured or missing from a hedging configuration. *** ### November 12, 2021 [#november-12-2021] #### New features [#new-features-44] ##### The VWAP and total volume included in reports [#the-vwap-and-total-volume-included-in-reports] Hedging orders exceeding a certain amount (configurable) can be executed in multiple portions. The total hedging volume and Volume Weighted Average Price are included into a corresponding report. ##### 100 price levels — Market depth milestone passed [#100-price-levels--market-depth-milestone-passed] Liquidity can now be provided with a market depth of more than 100 order book levels, which in practice implies virtually infinite order book. The previous milestone, with a maximum of 100 levels in the order book, has been reached and passed — the actual market depth now depends solely on the available computing resources. ##### Flexible user roles and granular access permissions [#flexible-user-roles-and-granular-access-permissions] It is now possible to configure and assign custom user roles, dynamically if required. This approach to maintaining access permissions ensures proper access control granularity, promising an easier way to manage a multitude of permissions across various system modules. #### Improvements [#improvements-39] * Data exchange between various product services via the internal messaging system has been optimized, resulting in sturdier interoperability and reduced consumption of cloud resources. * Currency pairs can now be inverted, which adds up to the range of hedging parameters available for synthetic instruments. They can be modeled on any of the symbols in a pair, regardless of whether they are notionally considered base or quoted. #### Resolved issues [#resolved-issues-40] * Fixed an issue that imposed an unreasonable limit upon the order book depth. *** ### October 22, 2021 [#october-22-2021] #### New features [#new-features-45] ##### Synthetic Engine integration [#synthetic-engine-integration] The Synthetics Engine has become an integral part of the B2CONNECT Liquidity Hub ecosystem. ##### Notional values as hedging order limits [#notional-values-as-hedging-order-limits] The set of hedging configuration parameters has been extended, making for a much more flexible risk management: when configuring limit settings of your hedging orders, you can list both a base asset and a notional symbol which may be quoted in any asset, including fiat currencies. ##### More order types, hedging with time-in-force settings [#more-order-types-hedging-with-time-in-force-settings] The set of available time-in-force options has been extended. Apart from a variety of market orders, you can place limit orders and configure their slippage settings. #### Improvements [#improvements-40] * Precise timing is now an important aspect of analytics available to B2CONNECT Liquidity Hub clients. The time of order execution at a hedging platform is now being tracked, opening doors for new insights inspired by accurate execution data. * It is now possible to specify the minimum and maximum amount for hedging orders. The amount limits are adjusted to the hedge ratio. #### Resolved issues [#resolved-issues-41] * Fixed an issue compromising the stability of an internal service monitoring the status of sources supplying Level 2 quotes to B2CONNECT. Continuous streaming of liquidity feeds is now ensured. *** ### June 10, 2021 [#june-10-2021] #### New features [#new-features-46] ##### RESTful API with Swagger documentation [#restful-api-with-swagger-documentation] RESTful API has been provided to lay the ground for a graphical user interface and further integration between B2CONNECT and other B2BROKER products featuring a UI. ##### External liquidity providers as venues for price risk hedging [#external-liquidity-providers-as-venues-for-price-risk-hedging] Trades executed on B2TRADER can now be hedged automatically, by forwarding price risks to an external liquidity provider, such as Binance. ##### Direct hedging upon external liquidity providers for B2BX clients [#direct-hedging-upon-external-liquidity-providers-for-b2bx-clients] Direct hedging of price risks via external liquidity providers has become possible. You can execute hedging orders on Binance or any other platform connected to a client exchange participating in the B2CONNECT ecosystem and receiving liquidity from B2BX. ##### Currency conversion for values displayed in reports [#currency-conversion-for-values-displayed-in-reports] A new service has been introduced, tracking conversion rates and allowing you to convert the reported order size and trade total values into any currency. #### Improvements [#improvements-41] ##### Extended hedging parameters [#extended-hedging-parameters] The set of hedging parameters has been extended, enabling B2CONNECT clients to: * configure hedge parameters based on trader account identifiers * define a hedge ratio based on the trade side (buy or sell) * map a hedging instrument to another spot market symbol (for instance, you can hedge BTC/USDT trades with BTC/USDC orders) ##### Improved trade placement and execution analytics [#improved-trade-placement-and-execution-analytics] More data about each trade is now provided by B2TRADER, improving end-to-end analytics derived from hedging requests and responses. ##### Synthetics engine supports inversion [#synthetics-engine-supports-inversion] When designing synthetic instruments, components of synthetic cross pairs can now be inverted. #### Resolved issues [#resolved-issues-42] * Fixed an issue causing the hedging agent to drop connection in case of empty credentials having been specified for any API member in the configuration. * Fixed an issue preventing operation of some of the markets available to a pricing service. * Fixed an issue related to a price discovery gateway and resulting in improper application of market depth constraints to some of the trading instruments. *** ### February 18, 2021 [#february-18-2021] #### New features [#new-features-47] ##### Internal hedging on B2TRADER [#internal-hedging-on-b2trader] Introducing a new hedging agent, named Hedgehog, for redirecting trading orders placed on one platform to another venue. ##### Authorization based on JSON Web Token [#authorization-based-on-json-web-token] A new JWT-based service has been implemented, enabling authorization of clients connecting to B2CONNECT. Among other things, this makes it possible to identify transactions made on different B2TRADER platforms with a view of subsequent hedging. ##### Tracking of hedging orders [#tracking-of-hedging-orders] A new service has been implemented for gathering statistics and analytics necessary to properly monitor execution of hedging orders. #### Improvements [#improvements-42] ##### Timeout customization for individual instruments [#timeout-customization-for-individual-instruments] Custom timeouts can now be configured separately for each instrument. Using this option, you can reset the instrument's order book and switch to another price source, ensuring price quotation reliability for low-liquidity instruments. ##### Improved price feed [#improved-price-feed] The price feed reliability has been ensured, while the overall performance has improved. ##### New metrics for performance monitoring [#new-metrics-for-performance-monitoring] New metrics have been added for tracking the status and performance of B2CONNECT services to identify and prevent any possible failures. #### Resolved issues [#resolved-issues-43] * Fixed an issue preventing constructed quote (market) updates for some instruments by checking that a corresponding symbol is mapped. 了解与 B2CORE 集成的交易平台、支付服务提供商及其他第三方解决方案 了解与 B2CORE 集成的交易平台、支付服务提供商及其他第三方解决方案 深入了解 B2CORE Back Office 用户界面 深入了解 B2CORE Back Office 用户界面 B2CORE Back Office 中常见管理任务和配置的分步指南 B2CORE Back Office 中常见管理任务和配置的分步指南 部署适用于 iOS 和 Android 的品牌移动应用 部署适用于 iOS 和 Android 的品牌移动应用 通过我们的指南快速高效地识别和解决常见问题 通过我们的指南快速高效地识别和解决常见问题 B2CORE API 受限,且\_不\_向公众开放。 如果您需要 API 文档,请提交一份支持工单,并清晰详细地说明您的预期使用场景。全面说明您计划如何使用 API,将帮助我们准确评估您的需求,并尽量减少后续问题或延误。 Back Office API — clients, accounts, finance, verification, and admin operations. Front Office API — the client-facing B2CORE HTTP API. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Explore the Back Office and learn how to launch your own partnership programs Explore the Back Office and learn how to launch your own partnership programs Discover IB Room and join a partner plan to begin attracting new clients while earning rewards Discover IB Room and join a partner plan to begin attracting new clients while earning rewards ## September 3, 2026 [#september-3-2026] ### New features [#new-features] #### IP whitelist for API apps [#ip-whitelist-for-api-apps] Access to the B2CORE IB API can now be limited to specific IP addresses. In **Preferences** > **Apps**, each app has a new **IP Whitelist** field where you can enter up to 50 IPv4/IPv6 addresses or CIDR ranges. Requests from any other address are rejected. An empty list keeps the previous behavior and allows requests from any IP address. *** #### Inherited registration type [#inherited-registration-type] A new **Inherited** registration type is available for IB types. Clients who sign up using a partner's referral link are added to the partner's program automatically, but only if the referring partner already participates in that program. Clients who sign up without a referral link, or whose partner is in a different program, are not added, and the program isn't shown in the B2CORE UI, so clients can't apply for it themselves. This is designed for invitation-only programs where every referral should land in the same program as the partner who brought them, without manual assignment in the Back Office. *** ### Improvements [#improvements] * A **Trading Volume** tab has been added to the **Reports** page in the IB Room. Partners can now view their own total trading volume in USD per day for a selected period and track their progress towards the next tier without asking the broker. * A **Level** column has been added to the **Platform Deposits** and **Platform Withdrawals** reports in the IB Room. It shows the level of the client in the partner's structure. *** ## Past releases [#past-releases] ### August, 2026 [#august-2026] #### New features [#new-features-1] ##### Client Deposits and Client Withdrawals [#client-deposits-and-client-withdrawals] New **Client Deposits** and **Client Withdrawals** sections list deposits and withdrawals made by IB clients through their B2CORE wallets. These operations are aggregated along the IB chain, which makes it possible to report deposits, withdrawals and the NET result for each IB branch, including sub-IB clients. Both lists show the client's name and email and can be filtered by them. To avoid confusion, the existing **Deposits** and **Withdrawals** sections, which list operations on trading accounts, have been renamed **Platform Deposits** and **Platform Withdrawals**. The same names are used on the **Reports** page in the IB Room. #### Improvements [#improvements-1] * Client tag restrictions for Back Office users now also apply to the **Accounts**, **Trades**, **Rewards** and **Clicks** sections of **Introducing Brokers**, and to partner details. Users restricted by client tags see only the rows that belong to clients within their tags, as they already do on the **Clients** page. * When data masking is enabled for a partnership program, the **Name** and **Email** columns are hidden from the **Client List** report in the IB Room instead of showing masked values. *** ### July, 2026 [#july-2026] #### New features [#new-features-2] ##### Savings Rebates [#savings-rebates] A new **Savings Rebates** reward model is now available. Brokers can reward partners when their referred clients invest in savings plans. A savings program defines the rebate rate for each level of the partner chain and is linked to an IB type, in the same way as a CPA program. Rebates are calculated and paid daily. Programs, acquisitions and payments are managed in the new **Savings Rebates** section of the Back Office. Partners get a **Savings Rebates** widget on the dashboard and a **Savings Rebates** tab on the **Reports** page in the IB Room, listing the rebates earned per client, program and level. Savings Rebates is disabled by default. Contact your B2BROKER integration team to enable it. ##### New IB Room widgets and reports [#new-ib-room-widgets-and-reports] The Partner Dashboard has been extended with new widgets: * **Performance overview** — key indicators for a selected period: new clients, active traders, trading volume, deposits, withdrawals and reward amount. * **Top Clients** — the partner's top clients by reward amount, with their trading volume. * **Transactions** — recent wallet transactions, the same data as the **Transactions** report. * **NET Deposit Summary** and **NET Deposit Top Clients** — deposits, withdrawals and the NET result for the partner's clients, including sub-IB clients. A new **NET Deposits** tab has been added to the **Reports** page, listing deposits, withdrawals and the NET amount per client. The **Transactions** and **Rewards by Symbol** widgets are now part of the default dashboard layout, so partners see them without adding widgets manually. #### Improvements [#improvements-2] * A new rewards distribution mode is available on request. By default, rewards for the whole partner chain are calculated from the payment plan of the client's direct partner, and each partner above receives their level's share of it. In the new mode, each partner in the chain is paid according to their own IB type and payment plan at their own level. If a partner in the middle of the chain is missing or inactive, that link is skipped and the partners above keep their original levels. Contact your B2BROKER integration team to enable it. * The **Min position lifetime** platform setting now applies to both the open and the close side of a position. If a position is closed earlier than the configured lifetime, no reward is generated for either side. Previously, the open-side reward could still be paid for such positions when the **Open & Close** option was used. * Deposits and withdrawals that are edited or deleted on the trading platform are now updated or removed in the **Platform Deposits** and **Platform Withdrawals** lists and in the related reports. *** ### May, 2026 [#may-2026] #### New features [#new-features-3] ##### CPA (Cost-Per-Acquisition) payment plans [#cpa-cost-per-acquisition-payment-plans] A new **Cost-Per-Acquisition (CPA)** payment model is now available. Brokers can reward partners when a referred client reaches a milestone, such as completing **registration**, passing **KYC verification**, or making a **minimum deposit**. *** ##### Granular access permissions [#granular-access-permissions] Access to the **Introducing Brokers** section can now be controlled with greater precision. The broad **View** and **Edit** permissions have been split into per-section permissions, so Back Office roles can be granted access to exactly the sections they need — for example, viewing **Reports** without the ability to edit **Payment plans**. *** #### Improvements [#improvements-3] * A **date range** filter has been added to an individual partner's payment report, making it easier to review rewards over a specific period. *** #### Resolved issues [#resolved-issues] * Resolved an issue where exporting trades for a specific client could be very slow for partners with large trade histories. These exports now complete significantly faster. *** ### April, 2026 [#april-2026] #### New features [#new-features-4] ##### Platform Spread and Platform Markup payment plans [#platform-spread-and-platform-markup-payment-plans] Two new payment plans are now available — **Platform Spread** and **Platform Markup**. They reward partners based on the actual spread and markup applied on the trading platform, captured automatically per symbol, rather than values estimated from a configured ratio. #### Improvements [#improvements-4] * The process that recalculates statistics and reports has been reworked for greater speed and reliability. Partner and program figures now refresh more consistently, even for brokers handling large data volumes. *** ### March, 2026 [#march-2026] #### New features [#new-features-5] ##### IB chain reassignment [#ib-chain-reassignment] New **“Reassign Users”** UI added. Brokers can now reassign an entire IB sub-branch from one partner to another in a single operation. This significantly simplifies the reassignment process, making it faster and less prone to errors than moving branches manually one by one. #### Improvements [#improvements-5] * A **Position lifetime** column has been added to the **Trades** table. *** ### February, 2026 [#february-2026] #### New features [#new-features-6] ##### TradeLocker platform integration [#tradelocker-platform-integration] The **TradeLocker** platform is now supported, enabling brokers to connect TradeLocker to their partnership program and reward partners on the same terms as other platforms. Support covers accounts, symbols, trading groups, trades, and payment plans, all manageable from the Back Office. #### Improvements [#improvements-6] * Added a new **IB Program Type** restriction. *** ### January, 2026 [#january-2026] #### New features [#new-features-7] ##### Asynchronous data exports [#asynchronous-data-exports] Exporting large data sets from the **Introducing Brokers** section — including trades, payments, accounts, and rewards — now runs asynchronously in the background. Brokers can continue working while an export is prepared and download the file once it's ready, rather than waiting on the page or risking a timeout. This makes it possible to export much larger data sets reliably. ### December, 2025 [#december-2025] #### New features [#new-features-8] ##### B2TRADER platform integration [#b2trader-platform-integration] The B2TRADER platform is now integrated with B2CORE IB, enabling brokers to connect B2TRADER to their IB setup and start rewarding partners on the same terms as other platforms. All payment plans are supported, so you can keep existing partner configurations and apply the same reward logic across supported environments. ##### Spread payment plan for cTrader [#spread-payment-plan-for-ctrader] The Spread payment plan is now available for the cTrader platform, allowing brokers to reward partners based on a percentage of the spread. This option aligns cTrader with the spread-based rewards model already available on other platforms, so you can keep a consistent approach to partner payouts. #### Improvements [#improvements-7] * Reports for deposits and withdrawals have been reimplemented to improve consistency and performance. The updated reporting logic is designed to present results in a clearer, more stable way. ### October, 2024 [#october-2024] #### New features [#new-features-9] ##### New Spread payment plan for MT5 platform [#new-spread-payment-plan-for-mt5-platform] The IB team is excited to introduce the much-anticipated Spread payment plan for the MetaTrader 5 platform. This innovative plan enables brokers to reward their partners based on a percentage of the spread, significantly expanding their referral reach across various markets. ##### Tier volume in USD [#tier-volume-in-usd] From now on, trading volume for tiers can be set not only in lots, but in USD as well, offering brokers increased flexibility in IB types configuration. #### Improvements [#improvements-8] * The **IB** column has been added to the **Clients** page. It shows the partner's name who referred the client and serves as a link to the partner details. * The **Payments** > **Methods** page has been removed from the Back Office due to the potential for unforeseen issues arising from modifying or deleting payment methods. For the same reason, it’s no longer possible to delete platforms through the Back Office. * When creating a new IB type, a default tier with empty parameters will no longer be automatically created, as previously done. #### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. *** ### August, 2024 [#august-2024] #### New features [#new-features-10] ##### Migration to PostgreSQL [#migration-to-postgresql] Our team is happy to announce that the migration from MongoDB to PostgreSQL has been successfully completed. Although this is mostly an internal technical enhancement, end-users will notice that the IB application now runs faster and more stable. ##### Min. position lifetime for cTrader [#min-position-lifetime-for-ctrader] For the cTrader platform, the **Min position lifetime** option has been added. The logic is exactly the same as for MT platforms: if a position was closed earlier than the Min position lifetime, it’s not taken into account in rewards calculations. The **Min position lifetime, sec.** field is now available in the cTrader platform preferences. #### Improvements [#improvements-9] * IDs of new partners are now in UUID format, not an index number, as it was before. This change eliminates the need for the **Encrypted** setting on the **Promo** > **Landings** > **Links** page. Existing IDs retain the numeric format, the **Encrypted** setting continues to work for them. All existing referral links remain working. * Information on clients’ accounts is now available on a separate **Accounts** tab in IB details. * Payment of rewards has become faster, thanks to technical improvements that allow for parallelization of the process. * Now running the system processes from the Back Office is disabled by default. It’s aimed at avoiding potential overloads of the database and application. Contact our technical support team if you need to restart a process. * To improve system performance, process logs are no longer stored in the database. As a result, the **Introducing brokers** > **Logs** section has been removed from the Back Office menu, and the **Logs** column has been removed from the **Introducing brokers** > **Processes** page. * To improve system performance, data storage limits have been implemented in the database: * Processes: 1 month * Deposits: 1 year * Withdrawals: 1 year * Trades: 1 year ### March 21, 2023 [#march-21-2023] #### New features [#new-features-11] ##### cTrader integration with IB [#ctrader-integration-with-ib] cTrader has been integrated with B2CORE IB, allowing you to connect the cTrader platform to your IB instance by navigating to **Introducing Brokers** > **Platforms** > **Platforms**. #### Resolved issues [#resolved-issues-2] * Fixed an issue due to which it was impossible to create a payment plan for all symbols in a trading group as it was only created for the selected symbol. * Fixed an issue due to which the trade opening time wasn’t updated according to the time zone set on the MetaTrade4 platform. * Fixed an issue due to which the position lifetime didn’t match the time difference between opening and closing a position. * Fixed an issue due to which the clients’ deposit and withdrawal operations weren’t displayed in the **Introducing Brokers** section. * Fixed an issue due to which duplicate records were displayed for deposit and withdrawal operations. ### April 12, 2022 [#april-12-2022] #### New features [#new-features-12] ##### Brand new IB section [#brand-new-ib-section] The IB section featuring new design and extended functionality for running partnership programs has been introduced in the B2CORE UI. For details, refer to the **For partners** section. ##### Max amount payment plan [#max-amount-payment-plan] A new **Max amount** payment plan has been introduced with this release. With this plan, you can pay partners a fixed amount for each lot traded by their clients, in the same way as with the Lot payment plan, but with the opportunity to set the maximum reward amount regardless of the number of levels and specify the exact amount which a partner receives at each level. For details, refer to [Payment plans](broker-guide/payment-plans#max-amount). ##### Data on deposits, withdrawals and trades [#data-on-deposits-withdrawals-and-trades] The **Deposits**, **Withdrawals**, and **Trades** tabs have been added to IB details in the B2CORE Back Office. The tabs display data on deposits, withdrawals, and trades of all clients of a selected partner. The export feature as well as filtering and sorting options are available. *** ### March 29, 2022 [#march-29-2022] #### New features [#new-features-13] ##### Deposits & withdrawals data [#deposits--withdrawals-data] The **Deposits** and **Withdrawals** sections have been added to **Platforms**. They display data on deposits/withdrawals of all clients on all trading accounts, indicating the date-time, account, amount, and currency as well as the unique identifier of the operation on the trading platform. *** ### March 15, 2022 [#march-15-2022] #### New features [#new-features-14] ##### Platform disabling [#platform-disabling] A new feature that enables you to turn off a trading platform without deleting it has been implemented. A new **Status** field (Enabled/Disabled) has been added to the platform details in **Platforms** > **Platforms**. ##### Account disabling [#account-disabling] A new feature that allows you to disable trading accounts without deleting them has been implemented. Disabled accounts are excluded from data sync and reward payment. A new **Enabled** field (Yes/No) has been added to the account details in **Platforms** > **Accounts**. ##### Filter by account type [#filter-by-account-type] This feature is aimed at closer integration with PAMM, MAM, and B2COPY. It helps to distinguish trading accounts from investment accounts. A new **Account type** field has been added to **Platforms** > **Accounts**, **Platforms** > **Trades** and **Payments** > **Rewards**. When opening a trading account, its type is obtained from B2CORE. When changing the type of an accounts group in B2CORE, the type is updated for all accounts. ##### Trading volume in USD [#trading-volume-in-usd] The **Trading volume, USD** column has been added to the **Introducing brokers** section and **Clients** tab in broker details. Filtering by non-zero/zero trading volume (Yes/No) is available. The **USD Trading volume** field has also been added to the **Payment report**, **Reports** tab in partner details and IB type details, to the trade details and payment details. ##### Deposits & withdrawals data [#deposits--withdrawals-data-1] The **Deposits** and **Withdrawals** tabs have been added to the client details in **Program** > **Clients** and account details in **Platforms** > **Accounts**. They display data on deposits/withdrawals, indicating the date-time, account, amount, and currency of the operation. ##### Contract size [#contract-size] A new **Contract size** field has been added to the symbol details, trade details and payment details. *** ### March 1, 2022 [#march-1-2022] #### New features [#new-features-15] ##### Partners and clients data import [#partners-and-clients-data-import] Customers who switch to B2CORE from other systems can now import data of their partners and clients into B2CORE IB. #### Improvements [#improvements-10] * Languages and themes of banners in selectors are now displayed in alphabetical order in the B2CORE UI. *** ### February 15, 2022 [#february-15-2022] #### New features [#new-features-16] ##### Deposits & withdrawals details [#deposits--withdrawals-details] Dates, currencies, amounts, and account numbers of deposits and withdrawals have been synchronized with MT4 and MT5. ##### Trading volume in USD [#trading-volume-in-usd-1] Trading volume in USD is now calculated for each trade. #### Improvements [#improvements-11] * The capability to sort banners by size has been added to the B2CORE UI. The banners are ordered by their width. If two banners have the same width, their length is taken into account. * The Client tag field has been added to the client’s details. Before, it was displayed only on the Clients tab in the partner’s details. *** ### February 1, 2022 [#february-1-2022] #### New features [#new-features-17] ##### PDO Driver v3 [#pdo-driver-v3] MetaTrader 4, MetaTrader5, and B2CORE Payment Method have migrated to the PDO driver v3. ##### B2CORE admin tags [#b2core-admin-tags] Access to the data of B2CORE Back Office sections can now be restricted using tags specified for the admin. See [B2CORE Back Office Guide](https://docs.b2core.b2broker.com/en/back-office-guide.html) for more details. ##### Languages priority [#languages-priority] The Priority property has been added to the Languages tab of **Promo** > **Landing** > **Links**. ##### Symbol group trades [#symbol-group-trades] The Trades tab has been added to the trading group details. On this tab, you can see and export a list of trades in the symbol group. #### Improvements [#improvements-12] * The **Base currency code** and **Quote currency code** fields have been added to **Platforms** > **Symbols**. Filtering and sorting by these fields are supported. *** ### January 18, 2022 [#january-18-2022] #### New features [#new-features-18] ##### WEBAPI v4 driver [#webapi-v4-driver] Sync of trading groups and trading symbols can now be run with the newly integrated WEBAPI v4 driver. ##### Drivers priority [#drivers-priority] The **Priority** property has been added to drivers, with prioritization logic similar to that of rate providers: first, the driver with the highest priority is taken, in case of failure — the next backup driver, and so on. If all drivers return a failure, the service reports that the function can't be performed. This property has been added to the **Drivers** tab in **Platforms** > **Platforms**. When creating a driver, it's automatically assigned the lowest priority; the priority can be changed when a driver is being edited. #### Improvements [#improvements-13] * A validation by platform ID has been added to the B2CORE Back Office, which prohibits connecting the same trading platform multiple times. ### December 21, 2021 [#december-21-2021] #### New features [#new-features-19] ##### Converter platform support [#converter-platform-support] Starting with this release, partners can receive rewards for the exchange operations performed by their clients. Currency pairs data is taken from the Currency pairs section of the B2CORE Back Office. Rewards are paid in the base currency of the partner's account, regardless of the currency pair of the exchange operation. The Commission payment plan is available. Rewards for exchange operations on demo accounts aren't processed. ##### Customizing link languages [#customizing-link-languages] For links in **Promo** > **Landings**, language customization has been added. You can configure separate URLs for each language of the landing page on the **Languages** tab, which has been added to the **Link** editing page. #### Improvements [#improvements-14] * From now on, when clients and partners are deleted from the B2CORE Back Office, their details such as name, email and account number are still displayed in the rewards history. * The **Platforms** section has been optimized to display information about various trading platforms: unused fields have been hidden to reduce the amount of displayed data and make it more accessible. * Sorting by the **Registrations**, **Clicks**, **Click Conversion Rate** fields has been added to the sections **Promo** > **Banners** > **Banners** and **Promo** > **Landing** > **Links**. *** ### December 7, 2021 [#december-7-2021] #### New features [#new-features-20] ##### Concurrency integration [#concurrency-integration] The concurrency framework has been implemented along with parallel processing of commands for synchronizing data with trading platforms, calculating rewards, crediting money to accounts and canceling rewards. The performance is expected to increase on average by 500%. ##### Support for B2CORE multi-currency accounts [#support-for-b2core-multi-currency-accounts] A new version of the **Payment method** for IB has been developed, which is compatible with multi-currency accounts of the B2CORE. It's important that this feature doesn't imply multi-currency payments: rewards are still paid in the original account currency or base currency. #### Improvements [#improvements-15] * The **Landing page** selector has been removed from banners create/edit pages. *** ### October 26, 2021 [#october-26-2021] #### New features [#new-features-21] ##### Export feature [#export-feature] The **Export** button is added to the number of sections and tabs and allows to download available data. For most sections, unless stated otherwise, the data is downloaded in CSV format, and retains all filters and a structure of the original table. The **Export** button is only visible to users with granted **Export** permissions. Explore the new feature here: * **Banners** — Introducing brokers > Program > Introducing Brokers > Edit > Banners tab. * **Links export** — Introducing brokers > Program > Introducing Brokers > Edit > Links tab. * **Currencies** — Introducing Brokers > Payments > Currencies section. * **Account transactions** — Introducing brokers > Payments > Accounts > Edit > Transactions tab. * **Transaction rewards** — Introducing brokers > Payments > Accounts > Edit > Transactions > Edit > Rewards tab. * **Logs** — Introducing brokers > Logs section. * **Countries** — Introducing brokers > Preferences > Location > Countries section. * **Accounts** — Introducing Brokers > Payments > Accounts section. The data in the Accounts section is downloaded in CSV format, and retains all filters and a structure of the original table except for the Balance field, which doesn't get exported. *** ### October 12, 2021 [#october-12-2021] #### New features [#new-features-22] ##### Transactions export [#transactions-export] List of transactions in the **Introducing Brokers** > **Payments** > **Transactions** section can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. The export feature for this and other sections and tabs is only available to users with Export permissions. ##### Symbols export [#symbols-export] List of symbols can now be exported in the **Introducing Brokers** > **Platforms** > **Symbols** and **Introducing brokers** > **Programs** > **Types** > **Symbols** tab sections via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Trades export [#trades-export] Trades data for a particular account or a client can now be exported via the **Export** button located on **Trades** tab in **Introducing Brokers** > **Platforms** > **Accounts** and **Introducing Brokers** > **Clients** sections. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Accounts export [#accounts-export] List of all accounts or accounts belonging to a specific client can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. To explore the feature navigate to **Introducing brokers** > **Platforms** > **Accounts** or **Introducing brokers** > **Clients** > **Account** tab. ##### Clicks statistics export [#clicks-statistics-export] Clicks data on the **Introducing brokers** > **Program** > **Introducing brokers** > **Clicks** tab can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. #### Improvements [#improvements-16] * Newly generated QR codes in the **Promo** section are now displayed in a smaller size. *** ### September 28, 2021 [#september-28-2021] #### New features [#new-features-23] ##### Clients and trading groups export [#clients-and-trading-groups-export] List of Introducing brokers clients and **Platform** > **Groups** can now be exported to a CSV file via the new **Export** button that replaced the **Excel** and **CSV** buttons. This feature is only available to users that have **Export** permissions. All entries in an exported data set are sorted in the same way they were in the original table. #### Improvements [#improvements-17] * Users can now see when a particular program's tier or level was created and updated. * Date-time in all sections is now displayed in a single format: `Mon. DD, YYYY HH:MM:SS`, for example: Jan. 21, 2021 11:28:06. Month abbreviations consist of the first three characters of the month name. Months with four-character names, such as June, aren't abbreviated. * Paxios currency new alias is updated in currency details. #### Resolved issues [#resolved-issues-3] * Fixed the Client ID filter error in Preferences > Security > Authorizations, Preferences > Security > Authentications. *** ### September 14, 2021 [#september-14-2021] #### New features [#new-features-24] ##### Tiers and levels settings export [#tiers-and-levels-settings-export] Tiers and levels settings of an IB Program can now be exported to a CSV file via the new **Export** button (that replaced the **Excel** and **CSV** buttons). This feature is only available to users that have Export permissions. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Introducing Brokers** > **Program** > **Types** > **details** > **Tiers** and **Levels** tab. ##### Clicks records export [#clicks-records-export] Clicks records export is now available to users with **Export** permissions via the new **Export** button. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Promo** > **Analytics** > **Clicks**. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-25] ##### Export and import permissions for Introducing brokers [#export-and-import-permissions-for-introducing-brokers] New **Export permission** and **Import permission** groups have been added to the **System** > **Groups** > **Introducing brokers** section of the B2CORE Back Office. ##### Geolocation update button [#geolocation-update-button] It has become possible to update your database to the latest version by clicking the **Update** button on the **Database** tab in the **Preferences** > **Location** > **Geolocation** section. ##### QR code generation [#qr-code-generation] It has become possible to generate QR codes for a partner link. A new feature is available in the **Program** > **Introducing brokers** section on the **Links** tab of the partner’s detailed information. #### Improvements [#improvements-18] * Only the languages, that are enabled in the **System** > **Localization** section, are now being displayed if you click the localization button next to the **Name** and **Description** fields of the **Preferences tab** in the **Introducing brokers** > **Program** > **Types** section. * You can now filter trading groups by multiple parameters at the same time. To do that, type in a list of groups separating them with space, comma, or colon in the filter field. * Symbol settings import support is available for macOS and Windows. *** ### August 03, 2021 [#august-03-2021] #### Improvements [#improvements-19] * The list of trading instruments is now synchronized and displayed in the **Symbols** section of the B2CORE Back Office. *** ### July 20, 2021 [#july-20-2021] #### New features [#new-features-26] ##### New Description field [#new-description-field] A new **Description** field has been added to IB types. In this field you can specify more information about the partnership program. ##### QR codes colors and icons [#qr-codes-colors-and-icons] Color and icon configurations for QR codes generation are added to the B2CORE Back Office. ##### Link to Release notes [#link-to-release-notes] You can navigate to Release notes from the **Updates** section of the B2CORE Back Office. #### Improvements [#improvements-20] * IB types, partners and clients are combined in the **Program** section in the B2CORE Back Office to optimize the convenience of B2CORE IB use. * To create a new IB type, specify only its name, description, type of registration, approval, and currency for rewarding partners. * When registering in the type with disabled approval option, the partner redirects immediately to the IB Room with no need to refresh the page. * The size of the distributive is now 2 times smaller. It speeds up the installation and updating processes, minimizes the amount of space needed on the hard drive and optimizes the hosting costs. * The troubleshooting is faster and more accurate, and the problems can be solved in a few seconds due to the improved diagnostics of the geographical location service. *** ### July 6, 2021 [#july-6-2021] #### Improvements [#improvements-21] * On the **Payment plans** tab of a symbol, you can now configure how much the broker pays for trades with this symbol for all IB types or edit these values in one place. This is especially useful when new symbols appear on trading platforms: on the list of symbols, sort and filter by date to select recently added symbols, then set up payment plans for all types at once on one page. * In the details of a partner, the number of levels for which the broker pays this partner is now explicitly displayed. When changing the IB type, the number of levels automatically changes according to the IB type settings. To set up individual conditions for a partner, the broker can select Custom Levels and specify the number of Master Levels for which the partner receives a reward. * The **encrypted links** configuration is moved from IB type settings to **Links** to make the setup more convenient. To enable or disable encryption for a link, open the edit link and set the value to Enabled or Disabled. * It's now possible to see not only levels for which the broker pays partners, but also those for which the broker doesn't pay. Partners still can see only paid levels which are configured in the IB type or individually for a partner. The Show hidden levels option can be enabled in the IB type, it's disabled by default. #### Resolved issues [#resolved-issues-4] * Fixed an issue with filtering by 0. You can now filter entries by any value including 0, for example, find crypto currency 0x. * In the partners app, fixed a filter that incorrectly displayed the list of rewards for the specified time period — not including the end date. For the end date, the time was set to 00:00, which caused incorrect selection and made it impossible to view the rewards of one day. The end date is now set to 23:59. *** ### June 22, 2021 [#june-22-2021] #### Improvements [#improvements-22] * Added currencies signs. * Special characters are now allowed in the Alias field for currency. * For payment plan, number of digits after the decimal separator now matches the currency settings (minor unit value). All non-significant zeros after the decimal separator are hidden for readability. * A new type of client request has been added to quickly filter requests related to Introducing brokers in the B2CORE Back Office. #### Resolved issues [#resolved-issues-5] * Fixed sorting and filters by country, latitude, longitude and position lifetime. *** ### June 8, 2021 [#june-8-2021] #### Improvements [#improvements-23] * Base and quote currencies were added to symbol details, trades details, and reward details. * Reward states naming was improved. The following states are now available: * **Done** — the reward was successfully credited to the partner’s account * **Pending** — the reward was calculated, but not yet credited to the partner’s account * **Canceled** — the reward was canceled and debited from the partner’s account * In the **trade details**, fields naming and order were reworked and improved. The data is now split into two tabs — **Trade data** and **Rewards**. * In the **reward details**, fields naming and order were reworked and improved. The data is now split into two blocks — **reward data** and **trade data**. * In the **symbol details**, fields naming and order were reworked and improved. The data is now split into two tabs — **Symbol** and **Payment plan**. * All top-ranked cryptocurrencies with a market capitalization of over $1B added to the default configuration to make the setup process easier. *** ### May 26, 2021 [#may-26-2021] #### New features [#new-features-27] ##### Min position lifetime [#min-position-lifetime] New parameter was added to MT4 and MT5 platforms in Introducing brokers. If a position was closed earlier than the min position lifetime, it's not taken into account in rewards calculating. ##### Symbols import [#symbols-import] It's now possible to import symbol settings, as a CSV file, in IB types. The **Import** button is available on the **Symbols** tab of the **IB type details** in the B2CORE Back Office. You can now export settings, change the formula, and then import the settings file in the same or in a different IB type. #### Improvements [#improvements-24] * Tier name was added. * Added MaxMind geolocation service diagnostics. * Added PostgreSQL reporting support for MT5. #### Resolved issues [#resolved-issues-6] * Fixed displayed number of digits after decimal separator for JYP. *** ### April 27, 2021 [#april-27-2021] #### New features [#new-features-28] ##### Reports [#reports] The Reports section has been added. At the moment, Acquisition report and Payment report are available with date range filters, grouping by hour, day, week, month, year. IB also provides performance indicators with actual value, absolute, and relative change compared to the previous period, as well as traffic analytics: group by country, geographic region, traffic source. ##### Symbols export [#symbols-export-1] It's now possible to export symbol settings to a CSV file. The Export button is available on the Symbols tab of IB type details. ##### New rates provider integrated [#new-rates-provider-integrated] A new rates provider has been integrated — **Open Exchange Rates**. #### Improvements [#improvements-25] * Reworked and optimized the naming of entities related to Symbols. * Another update in rates providers: B2BINPAY Rate Provider was removed. * Open positions on MetaTrader 4 added to trading session syncing. * Position ID added to trading session syncing. * Payment Level UX improved. * Added Diagnostic failure details. *** ### March 16, 2021 [#march-16-2021] #### New features [#new-features-29] ##### Lot size [#lot-size] A new **Lot size** field has been added for cent groups in the **Platforms** > **Groups** section. ##### Geolocation service [#geolocation-service] A new IP intelligence and online fraud prevention tool - **MaxMind** has been added to **Preferences** > **Location** > **Geolocation**. ##### Location data [#location-data] New fields: **Latitude**, **Longitude** and **Country** have been added to clicks statistics data in **Promo** > **Analytics**. ##### Country of residence [#country-of-residence] A new **Country of residence** field has been added to IB’s and client’s **Personal data** tabs. ##### Countries [#countries] A new **Countries** section has been added to **Preferences** > **Location**, displaying a list of countries divided into the following fields: Name, Alpha-2 code, Alpha-3 code and Numeric code, which conforms to the [ISO-3166 standard](https://www.iso.org/iso-3166-country-codes.html). ##### Geographic regions [#geographic-regions] A list of Geographic regions in M49 Standard Country or Area Codes for Statistical Use (United Nations GeoScheme) has been added. ##### Geospatial queries support [#geospatial-queries-support] Added Geospatial Queries support within GeoJSON objects: points and polygons. ##### Clicks and registrations stats [#clicks-and-registrations-stats] Statistics on banner clicks and the following registrations are added to **Promo** > **Analytics**. *** ### March 2, 2021 [#march-2-2021] #### New features [#new-features-30] ##### User-Agent info for link clicks [#user-agent-info-for-link-clicks] To **Promo** > **Analytics** > **Clicks**, a new field **User-Agent** has been added to display information about the software, such as browser and operating system, used by people who clicked on partners’ affiliate links. ##### Extended settings for Master levels [#extended-settings-for-master-levels] A new setting is added to Master partners that allows to override the number of Levels a Master partner is paid for. ##### HTTP version preference [#http-version-preference] Added HTTP Protocol Version (1.0, 1.1, 2.0) preference to deal with Expect: 100-continue header. *** ### February 16, 2021 [#february-16-2021] #### New features [#new-features-31] ##### Rewards data export [#rewards-data-export] Brokers can now export information about all rewards paid within a particular IB type or to a particular partner via the new **Export** button added to **Program** > **Introducing Brokers** / **Type** > **Edit** > **Rewards** tab. ##### Master partner settings [#master-partner-settings] A new feature that allows brokers to individually set the Number of Levels and Master Level Ratio for Master partners has been added to the Personal data tab of an IB. ##### Trading session sync by trading account number [#trading-session-sync-by-trading-account-number] A new **Trading account number** option has been added and allows a broker to synchronize the trading session for the selected trading account from the admin panel. ##### Banners [#banners] New **Banners**, **Themes**, **Languages** and **Sizes** subsections have been added to the Promo > Banners section, allowing the broker to create and manage the banners in an easier and more efficient way. ##### Prevented attacks log [#prevented-attacks-log] A new **Security** > **Attacks** section has been added that displays all prevented brute-force attacks. ##### System incidents log [#system-incidents-log] A new **Security** > **Incidents** section has been added that displays information about all security incidents registered in the systems such as: invalid client ID, invalid client secret or invalid access token. ##### Blacklist and Whitelist settings for an API access [#blacklist-and-whitelist-settings-for-an-api-access] New **Blacklist** and **Whitelist** sections have been added and allow admin users to manage which IPs get access to APIs. *** ### February 2, 2021 [#february-2-2021] #### New features [#new-features-32] ##### IB type change [#ib-type-change] A new option has been added that allows brokers to change partner’s type. ##### Rewards cancellation [#rewards-cancellation] A new option has been added that allows brokers to cancel trade rewards. ##### Tier rolling period [#tier-rolling-period] A new **Tier period** field has been added to the **Program** > **Types** > **Edit** > **Preferences** tab, allowing the broker to customize the duration of each tier in rolling days. ##### Trading groups archiving [#trading-groups-archiving] Brokers can now archive trading groups, accounts, and symbols that were removed from trading platforms. ##### Rewards per transaction [#rewards-per-transaction] A new **Rewards** tab, that contains a list of all rewards for a specific transaction, has been added to transaction details in **Payments** > **Transactions**. #### Improvements [#improvements-26] * The process of setting up landing links for partners is simplified. ### December 22, 2020 [#december-22-2020] #### New features [#new-features-33] ##### Encrypted tokens [#encrypted-tokens] Encrypted tokens option has been added to **Promo** > **Landings** > **Links**. ##### Tier calculation [#tier-calculation] Tiers can now be calculated by the number of active clients referred by a partner. ##### Position settings in payment plan [#position-settings-in-payment-plan] A new **Position** field has been added to the **Platforms** > **Symbols** > **Edit** > **Payment plan** tab and indicates whether the payments are made for a closed or an open position, or for both. ##### Bulk update of trading groups [#bulk-update-of-trading-groups] An option to bulk update the settings of the trading groups has been added. ##### 145 new filters [#145-new-filters] Data filtering across the entire **Introducing Brokers** section has been made even better with around 145 of new filters. *** ### December 8, 2020 [#december-8-2020] #### New features [#new-features-34] ##### Program rewards statistic [#program-rewards-statistic] Report on all rewards payable in a particular program type has been added to **Program** > **Types** > **Edit** > **Reports** tab. ##### Partner’s rewards statistic [#partners-rewards-statistic] Report on all rewards payable to a particular partner has been added to **Introducing brokers** > **Edit** > **Reports** tab. ##### Export of partners and clients data [#export-of-partners-and-clients-data] Data in the **Introducing brokers** > **Program** > **Introducing brokers** and **Introducing brokers** > **Program** > **Clients** sections can now be exported via the newly added export function in CSV or Excel formats. *** ### November 24, 2020 [#november-24-2020] #### New features [#new-features-35] ##### Payments and trades data export [#payments-and-trades-data-export] Data in the **Trades** and **Payments** sections can now be exported in CSV or Excel formats. ##### Restricted registration [#restricted-registration] A new **Restricted registration** type has been added to **Program** > **Types** > **Edit** > **Preferences** and allows a selective acquisition of new partners for a particular partnership program. *** ### November 17, 2020 [#november-17-2020] #### New features [#new-features-36] ##### New payment systems [#new-payment-systems] Three new rate providers have been integrated: **B2BINPAY**, **CoinMarketCap** and **European Central Bank**. ##### Custom rate provider [#custom-rate-provider] With the new **Custom rate provider** feature, brokers can now create their own crypto currency exchange rates. ##### Support for multi-language links [#support-for-multi-language-links] Multi-language links support has been added to the B2CORE URI. ##### System logs [#system-logs] The **Logs** section has been added and provides detailed information about all system events. ##### Network diagnostics [#network-diagnostics] Network diagnostic is added and allows to individually or in bulk test the connection of drivers in **Platforms**, **Rates** and **Geolocation** sections. ##### Unix socket support [#unix-socket-support] **Unix socket** support has been added to the **Payment method** connection settings. ##### AWS deployment support [#aws-deployment-support] Support for deployment on AWS has been added. *** ### September 22, 2020 [#september-22-2020] #### New features [#new-features-37] ##### Client details [#client-details] Brokers can now view full client details in the **Partner** > **Referral** section of the B2CORE UI. ##### Reward details [#reward-details] Brokers can now view full partner rewards details in the **Partner** > **Rewards** section of the B2CORE UI. #### Improvements [#improvements-27] * A majorly improved **Introducing brokers** section of the B2CORE Back Office that now displays all data available in the partnership program. * The **Client chain** field has been added to the client’s **Personal data** tab and indicates which partner referred a particular client to the broker. The chain data is presented in the following format: Partner's name → Client's name. Browse IB API operations in the sidebar. They are generated from the public OpenAPI specification synced into this repository. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Understand the basics and learn everything you need to start using the B2TRADER API Understand the basics and learn everything you need to start using the B2TRADER API Consult an in-depth reference describing REST API requests and responses Consult an in-depth reference describing REST API requests and responses Explore the supported WebSocket API methods and streams Explore the supported WebSocket API methods and streams Connect to the FIX 4.4 API for market data streaming and order execution Connect to the FIX 4.4 API for market data streaming and order execution The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. ## September 2026 [#september-2026] ### Resolved issues [#resolved-issues] #### FIX API stabilization [#fix-api-stabilization] This release includes reliability improvements to the FIX API's market-data streaming, resolving cases where a session could stop receiving updates without any visible error. #### Errors raised after response headers no longer abort the stream [#errors-raised-after-response-headers-no-longer-abort-the-stream] A failure that occurred while a `GET` response body was still being serialized aborted the HTTP/2 stream, which client libraries reported as a transport error rather than an API error. Such a failure is now returned as a normal error response. ## August 2026 [#august-2026] ### New features [#new-features] #### Public MCP endpoints for external AI agents [#public-mcp-endpoints-for-external-ai-agents] Two public Model Context Protocol (MCP) surfaces are now available per deployment: `mcp-read-only` (market data, portfolio, history, and analytics tools) and `mcp-full-access` (adds order placement, cancellation, position close, and triggers). Both authenticate through the platform's existing Keycloak identity provider; MCP clients that construct their own authorize URL are now redirected server-side to the external identity provider instead of landing on the login form. ## July 2026 [#july-2026] ### New features [#new-features-1] #### Trading API: Retry time-in-force for market orders [#trading-api-retry-time-in-force-for-market-orders] A new `Retry` time-in-force has been added for market orders, alongside the existing `Ioc`. A `Retry` order aims to fill the full requested volume by repeatedly filling the unfilled remainder at current market prices. `Ioc` remains the default; manual close-position actions on CFD and Perpetual Futures markets now use `Retry` by default. Some generated API clients validate time-in-force as a closed enum and reject an unrecognized value. Regenerate your client against the current contract before this value appears in a request or response you consume. ## June 2, 2026 [#june-2-2026] ### Improvements [#improvements] #### Trading API: Stop orders for closed markets [#trading-api-stop-orders-for-closed-markets] The **Trading API** now accepts **Stop** orders for markets that are closed according to their trading calendar. The order is stored and activates automatically when the market reopens, instead of being rejected at submission. #### Reports API: full account history [#reports-api-full-account-history] Trading reports can now be generated for the entire account history. The previous **92-day** limit has been removed, and an **All data** range is now available for report generation. #### Trading API: market asset identifiers [#trading-api-market-asset-identifiers] The `baseAssetId` and `quoteAssetId` fields have been added to the v6 `/markets` responses, allowing clients to resolve the base and quote assets of each market without additional lookups. #### Accurate unrealized PnL [#accurate-unrealized-pnl] Unrealized PnL returned by the API is now calculated using the correct order book side for each position direction, improving the accuracy of PnL values in position and margin responses. *** ### Resolved issues [#resolved-issues-1] * Resolved an issue where `WebhookAlert` order reason and position modifier values were returned as numeric codes instead of API enum strings in History API `/v2/orders` responses. ## April 9, 2026 [#april-9-2026] ### New features [#new-features-2] #### Equity Curve API [#equity-curve-api] The History API now provides `POST /api/history/v1/equity-curve`, returning account equity data points for a requested date range with daily, weekly, or monthly aggregation. #### Trading credit in API responses [#trading-credit-in-api-responses] Broker-issued **trading credit** is now exposed through the API. The account margin data response and the real-time margin stream include the current credit amount in the Reference Asset (`creditInRAT`). Credit is included in the account equity and excluded from the withdrawable amount. *** ### Improvements [#improvements-1] #### Webhook Trading API: webhook URL in key listing [#webhook-trading-api-webhook-url-in-key-listing] The list webhook API keys response now includes the `webhookUrl` field, so the configured webhook endpoint can be retrieved for each key. ## March 16, 2026 [#march-16-2026] ### New features [#new-features-3] #### Webhook Trading API [#webhook-trading-api] A new **Webhook Trading API** has been added, enabling automated order creation via webhook alerts with API key authentication. **Key points:** * Create and manage webhook API keys for secure authentication * Receive trading alerts and create orders automatically * Idempotency supported via deduplication ID * Market type resolved from the symbol prefix (spot, CFD, perpetual) #### Public Account ID [#public-account-id] A new `publicAccountId` field has been added across all API endpoints, providing a human-readable account identifier as an alternative to internal UUIDs. **Affected APIs:** * Trading API — account-related responses and filters * Settings API — account configuration endpoints * History API — all REST endpoints and WebSocket streams * Reports API — report responses and filters #### Long-term trading data history [#long-term-trading-data-history] Date range restrictions have been removed from **Order History** and **Closed Positions** endpoints, allowing access to full trading history without time-based limitations. *** ### Improvements [#improvements-2] #### Transfer subtype field [#transfer-subtype-field] A new `subtype` field has been added to transfer responses in the History API to distinguish **Negative Balance Protection** transfers from manual ones. #### Rounded position prices [#rounded-position-prices] The `positionPriceInRAT` values are now properly rounded in closed position API responses according to the Reference Asset (RAT) scale. *** ### Resolved issues [#resolved-issues-2] * Resolved an issue where `/total-swaps` requests returned HTTP 504 timeout errors. ## March 11, 2026 [#march-11-2026] ### Added FIX API documentation [#added-fix-api-documentation] Added new FIX API section covering Market Data and Trading sessions via the FIX 4.4 protocol. ## March 11, 2026 [#march-11-2026-1] ### Initial version [#initial-version] ## March 2, 2026 [#march-2-2026] ### New features [#new-features-4] #### Trading Terminal AI assistant [#trading-terminal-ai-assistant] A new **AI assistant** has been added to the Trading Terminal, providing traders with an intelligent widget for market analysis and trading support. *** ### Improvements [#improvements-3] #### Public Account ID (preview) [#public-account-id-preview] The `publicAccountId` field has been added to account-related API responses as a preview, ahead of the full rollout across all endpoints. ## February 25, 2026 [#february-25-2026] ### New features [#new-features-5] #### Funding Rates API [#funding-rates-api] New API endpoints have been added for retrieving funding rate data synchronized from **B2CONNECT**, including funding rates, mark price, and funding interval for Perpetual Futures markets. **Key points:** * Funding rate values streamed in real time * Mark price used for position valuation when available from LP * Funding interval synchronized per market configuration * FIX API contract extended with funding data fields #### OHLC Candlestick API [#ohlc-candlestick-api] A new API endpoint has been added for retrieving OHLC (candlestick) data, supporting both **Spot** and **Perpetual Futures** markets. Minute-level candle data is now stored for up to 5 years. OHLC candle data streaming is also available via the WebSocket API using gRPC transport, providing real-time candlestick updates. #### Favorite markets [#favorite-markets] A new **Favorite markets** feature has been added, allowing traders to manage personalized market lists via the Trading API. #### Comment field for orders and positions [#comment-field-for-orders-and-positions] A new `comment` field has been added to order and position responses across REST, WebSocket, and History APIs. The comment can be set when placing an order and is propagated to the associated position and execution records. #### B2COPY Integration API [#b2copy-integration-api] New API endpoints have been added for **B2COPY** and IB (Introducing Broker) integrations, including special account types for copy trading. The `isCopyTradingAccount` field has been added to the `/api/v1/total-fundings` endpoint. *** ### Improvements [#improvements-4] #### FIX API: enhanced request throughput [#fix-api-enhanced-request-throughput] The FIX API trading request processing has been optimized to support up to 100 requests per second per connection. All `TimeInForce` types are now supported, including **GTD** (Good Till Date). #### Multilingual support [#multilingual-support] Trading API, Settings API, and Reports API endpoints now support multilingual content with full Unicode character support, enabling localized responses for configurable fields, report names, and templates. #### Stop Market order calculation [#stop-market-order-calculation] The **Value** and **Amount** calculation for **Stop Market** orders has been corrected for **Spot** markets. **Slippage Rate** has been removed from **CFD** and **Perpetual Futures** order calculations. #### Trading API: empty categories hidden [#trading-api-empty-categories-hidden] Empty market categories are now automatically excluded from Trading API responses, reducing unnecessary data in category listings. #### Balance API: zero balance for all assets [#balance-api-zero-balance-for-all-assets] Assets without prior balance operations now return a zero balance in API responses instead of being omitted. #### Cross-rate market configuration [#cross-rate-market-configuration] Markets used exclusively for cross-rate calculations can now be disabled for trading while remaining active for rate conversion. #### History API: extended contracts [#history-api-extended-contracts] Positions and Events API responses have been extended with additional fields. The `updatedAt` field is now available as a sorting and filtering parameter in History Server API endpoints. #### Settings API: market update endpoint [#settings-api-market-update-endpoint] The market update endpoint has been changed from `PATCH` to `PUT` semantics, requiring the full market object in the request body. *** ### Resolved issues [#resolved-issues-3] * Resolved an issue where `takeProfitPrice` and `stopLossPrice` values were missing from the History Server `/v2/orders` endpoint responses. * Resolved an issue where bulk order cancellation returned a successful result for non-existing orders. * Resolved an issue where bulk order cancellation returned a successful result for orders that could not be cancelled. * Resolved incorrect error codes returned when `closePositionLotAmount` was set to `0`, a negative value, or an empty string. * Resolved an issue where the WebSocket Book stream continued sending prices with an outdated tick size after market parameter changes. * Resolved an issue where negative spreads in the **Market Data API** were not handled correctly. * Resolved an issue where orders could not be created when using the default 24/7 calendar. * Resolved an issue where the `/external-orders` API returned `null` for `rejectReason` although the Trading Server received a reason from the LP. Customize your Trading Terminal and configure settings Customize your Trading Terminal and configure settings Explore and manage all available trading widgets Explore and manage all available trading widgets Learn basic terms and values used across the platform Learn basic terms and values used across the platform API reference — operations generated from the live OpenAPI specification. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. 快速了解 B2TRANSLATE,并熟悉基础知识和关键术语 快速了解 B2TRANSLATE,并熟悉基础知识和关键术语 探索 B2TRANSLATE 界面,并开始管理您的产品翻译 探索 B2TRANSLATE 界面,并开始管理您的产品翻译 ## 2026 年 7 月 9 日 [#july-9-2026] ### 新功能 [#new-features] #### 通知 [#notifications] **B2TRANSLATE** 现已包含通知中心。侧边栏底部的铃铛会显示未读通知数量徽章,点击后可打开面板查看最新通知,例如已完成的 AI 翻译、已准备好的导出内容或已完成的导入。打开 **所有通知** 可查看完整历史记录,也可以单独或一次性将所有通知标记为已读。 通知还可以推送到应用外部,例如 **电子邮件**、**Slack** 或 **Telegram**。工作区管理员可以设置这些渠道,并选择每类事件的接收人。 *** #### 账户设置页面 [#account-settings-page] 侧边栏中新增的 **账户** 项会打开专门的 **设置** 页面,将您的个人选项集中在一处,其中包含 **个人 API 令牌** 和 **更改密码** 标签页。 *** ### 改进 [#improvements] #### 更改自己的密码 [#change-your-own-password] 现在,您可以通过 **账户** > **更改密码** 自行更改登录密码,无需联系管理员。 *** #### 重新设计的导航 [#redesigned-navigation] 界面语言、通知和退出登录控件已移至侧边栏底部,以便更快访问。**个人 API 令牌** 现在通过新的 **账户** > **设置** 页面进行管理,取代了原来的个人资料菜单。 *** ### 已解决的问题 [#resolved-issues] 此版本未报告任何面向客户的问题。 ## 2026 年 6 月 29 日 [#june-29-2026] ### 改进 [#improvements-1] #### 现代化界面 [#modernized-interface] **B2TRANSLATE** 界面已基于现代技术栈重新构建。您使用的一切都保留在原来的位置——此次更新刷新了界面基础,并为更快交付新功能铺平道路。 ## 2026 年 5 月 14 日 [#may-14-2026] ### 改进 [#improvements-2] #### Customer 角色的租户语言管理 [#tenant-language-management-for-the-customer-role] 拥有 **Customer** 角色的用户现在可以直接在 **编辑项目** 模态框中管理其租户的语言列表——无需请求管理员协助即可添加或删除语言。 为防止意外更改,**Customer** 用户的租户名称字段现在为只读。 ## 2026 年 4 月 29 日 [#april-29-2026] ### 新功能 [#new-features-1] #### 翻译版本历史记录 [#translation-version-history] 每个翻译键现在都会保留每种语言最近 10 个目标值的审计记录。在翻译视图中,打开历史记录对话框即可查看是谁在何时更改了翻译以及之前的值,并可一键恢复任意早期版本。这可防止翻译因意外编辑和 AI 覆盖而受到影响。 *** ### 改进 [#improvements-3] #### 个人 API 令牌——自定义过期时间 [#personal-api-tokens--custom-expiration] 创建或轮换 **个人 API 令牌** 时,现在可以通过日历选择器精确选择过期日期,最长可设置为一年后。这取代了此前的固定预设选项,并符合要求定期轮换凭据的企业安全策略。 *** #### 新增语言:希伯来语和蒙古语 [#new-languages-hebrew-and-mongolian] **希伯来语** 现已支持完整的从右到左(RTL)显示,**蒙古语** 也已添加并采用正确的复数形式。两种语言均立即可用于每个项目,并可进行 AI 翻译。 ## 2026 年 3 月 31 日 [#march-31-2026] ### 新功能 [#new-features-2] #### 个人 API 令牌 [#personal-api-tokens] **B2TRANSLATE** 现已支持 **个人 API 令牌**——一种用于以编程方式访问 API 的新身份验证方法。用户可以生成长期有效的令牌,将 **B2TRANSLATE** 与外部工具和自动化工作流集成,而无需共享其登录凭据。 * 可在 **个人资料** 页面生成和管理个人令牌 * 令牌支持所有 V2 API 端点 * 可配置的令牌过期时间:1、6、12 或 24 小时 * 可随时撤销令牌以保障安全 ## 2026 年 3 月 17 日 [#march-17-2026] ### 新功能 [#new-features-3] #### 自定义语言排序 [#custom-language-ordering] 现在,您可以自定义项目中语言的显示顺序。可从 **项目** 页面上的 **三点菜单** 或项目内部打开 **语言顺序** 模态框,然后通过拖放将语言排列为您偏好的顺序。自定义顺序将应用于整个项目中的语言下拉菜单和列表。 若要恢复默认的字母排序,请在模态框中点击 **重置为默认值**。 ## 2026 年 2 月 10 日 [#february-10-2026] ### 新功能 [#new-features-4] #### 紧凑模式 [#compact-mode] **个人资料菜单** 中新增了 **紧凑模式** 开关,可让您减少所有 UI 组件的间距和密度。此选项为希望一次在屏幕上查看更多内容的用户提供了更紧凑的界面。 *** ### 改进 [#improvements-4] #### BCP 47 语言支持 [#bcp-47-language-support] B2TRANSLATE 现已支持语言代码的 **BCP 47 标准**,可提供更精确的语言识别和区域变体处理。系统在翻译端点中保持与旧格式代码的向后兼容性,确保现有集成可继续无缝运行。语言表中的每种语言现在均包含描述性标签,以提高可读性。 #### 统一搜索和筛选器 [#unified-search-and-filters] 所有系统页面中的搜索输入字段和筛选控件现已标准化,在整个平台中提供一致的用户体验。无论您在哪个页面工作,这种统一方式都能让您更轻松地查找和筛选内容。 *** ### 已解决的问题 [#resolved-issues-1] 此版本未报告任何面向客户的问题。 ## 2026 年 1 月 13 日 [#january-13-2026] ### 改进 [#improvements-5] #### AI 模型升级 [#ai-model-upgrade] B2TRANSLATE 已将其 AI 翻译引擎从 Chat GPT 4.0 升级到 **Chat GPT 5.2**,在所有支持的语言中提供了更好的翻译质量和更高的性能。 #### 通过键盘快捷键增强搜索 [#enhanced-search-with-keyboard-shortcuts] 通过新增用于快速访问搜索功能的键盘快捷键,导航得到了简化。用户现在可以按 **⌘/**(**Ctrl+/**)和 **⌘K**(**Ctrl+K**)立即打开搜索功能,从而更快地查找键并浏览项目。 *** ### 已解决的问题 [#resolved-issues-2] 此版本未报告任何面向客户的问题。 ## 2025 年 12 月 12 日 [#december-12-2025] ### 改进 [#improvements-6] #### 重新设计的翻译页面 [#redesigned-translations-page] **翻译** 页面已重新组织,以提供更清晰的视图和更流畅的编辑体验: * 键标识符现在占据单独的行,并包含类别徽章和最后更新时间戳。 * 翻译列拥有更清晰的标签,每列均显示语言徽章,因此您始终知道正在编辑哪种语言。 * 使用 AI 翻译、重置为源翻译和保存为空等操作归类在直观的图标下,便于发现和使用。 * 全局控件——语言选择器、搜索字段、筛选面板、键导入和 CSV 上传——位置保持一致且更易查找。 *** ### 已解决的问题 [#resolved-issues-3] 此版本未报告任何面向客户的问题。 ## 2025 年 9 月 30 日 [#september-30-2025] ### 改进 [#improvements-7] 此版本在**多种语言中引入了全面的默认翻译**,并通过 ChatGPT 集成为管理员提供了**自动化批量翻译功能**,从而简化本地化工作流并加速全球部署。 ## 2025 年 9 月 10 日 [#september-10-2025] ### 新功能 [#new-features-5] #### 复数形式支持 [#pluralization-support] B2TRANSLATE 现已包含全面的复数形式支持,可在所有语言中准确翻译**依赖数量的字符串**。该功能满足了处理会随数量变化的字符串这一关键需求,例如“1 个文件”与“3 个文件”,这对于具有**复杂复数规则**的语言尤为重要。 系统会根据键格式和目标语言的组合智能检测是否需要使用复数形式。当需要使用复数形式时,B2TRANSLATE 会根据 Unicode 复数形式规则,为每个键自动生成多个输入字段。每种形式均包含说明正确用法的上下文标签,例如“一个”“少数”或“许多”,帮助译者了解应在何时应用每种形式。此功能与 AI 翻译完全兼容。 有关详细信息,请参阅[处理复数形式](user-guide/manage-translations/handle-plural-forms)。 所有现有的非复数字符串均可继续完全正常运行,确保与当前项目和工作流完全向后兼容。 *** ### 改进 [#improvements-8] #### 更清晰的翻译层级 [#clearer-hierarchy-of-translations] 默认翻译和自定义翻译的管理变得更加直观。**挂锁图标** 已被移除,其功能已由更具声明性的选项取代:**重置为默认值** 和 **保存为空**。**翻译** 字段中的工具提示会显示 WebUI 当前使用的是哪一项默认翻译。 #### 增强的键显示和项目导航 [#enhanced-key-display-and-project-navigation] 项目界面经过重新设计,可为翻译键提供更好的可见性和更灵活的组织方式。此前,**类别** 为必填项,并可能导致部分键被隐藏。现在,系统默认显示所有项目键的完整列表,使译者能够立即访问其全部翻译范围。 **类别** 已重新定位为可选的**筛选**工具,同时仍保留其自动分配功能。译者现在可以处理任何键,无论其是否被分配到类别。此改进对于保持翻译一致性尤其有利,因为相似的键现在会一同显示在统一列表中,而不是可能被隐藏在不同的类别部分。当需要时,仍可应用类别筛选器来缩小键列表范围,以便集中处理。 此外,**翻译页面** 已重新组织,以实现更清晰的结构和显示: * 默认翻译已归入单一列中。 * 已添加语言图标。 * 有关键何时添加或更新的信息已移至键详情中。 *** ### 已解决的问题 [#resolved-issues-4] 此版本未报告任何面向客户的问题。 ## 2025 年 8 月 4 日 [#august-4-2025] ### 改进 [#improvements-9] 此版本专注于为平台管理员带来益处的幕后改进。此次虽然没有为您带来新功能,但这些更新有助于确保一切顺畅运行。 ## 2025 年 6 月 27 日 [#june-27-2025] ### 新功能 [#new-features-6] #### 平台 [#platforms] 此版本引入了新的 **平台** 实体。平台是产品中的独立分区,例如 Web、iOS、Android。每个平台都有自己的一组类别,而同一产品内的所有平台共享同一组语言。目前,此功能仅为 `b2core` 产品类型启用。 平台由管理员添加和配置。如果一个项目只有一个平台,用户体验将保持不变。但是,如果添加了多个平台,**类别** 页面上会显示相应的标签页,用户必须先选择一个平台才能提供翻译。 *** ### 改进 [#improvements-10] * 内部改进:新增了一个端点,用于更新 **翻译** 页面语言选择模态框中的语言列表。 *** ### 已解决的问题 [#resolved-issues-5] * 修复了类别中键搜索的问题。 ## 2025 年 5 月 20 日 [#may-20-2025] ### 新功能 [#new-features-7] #### 翻译下载/上传功能 [#translation-downloadupload-functionality] 通过此版本,我们实现了翻译下载/上传功能。现在,您可以将特定语言的选定翻译以 CSV 格式导出,以便进行外部编辑。编辑后,您可以将 CSV 上传回 B2TRANSLATE,从而实现更快捷、更轻松的翻译批量更新和管理。此外,系统还会提供消息,指示导出/导入尝试成功或失败。 有关详情,请参阅[这篇文章](user-guide/manage-translations/download-and-upload-translations)。 #### 键复制按钮 [#copy-buttons-for-keys] 为了进一步改善用户交互,我们在翻译页面的每个键名称旁添加了复制按钮。此更新让您能够轻松将完整键名称复制到剪贴板。复制按钮会附带视觉确认提示,以表示复制操作成功。此功能兼容包括 Chrome、Safari 和 Firefox 在内的主流 Web 浏览器,确保提供一致的用户体验。 #### 阿拉伯语、波斯语和乌尔都语的 RTL/LTR 光标 [#rtlltr-cursor-for-arabic-farsi-and-urdu-languages] 编辑器现已支持从右到左(RTL)和从左到右(LTR)语言,从而增强了翻译处理能力。文本方向现在会根据所选语言自动调整,优化文本显示且不会产生失真。所有方向下的光标移动和文本选择均流畅顺滑,这些改进已无缝集成,不会影响既有编辑器功能。此更新可确保所有支持语言均具有可靠的文本管理能力,为您提供直观的翻译体验。 *** ### 已解决的问题 [#resolved-issues-6] * 修复了 Firefox 浏览器中图标显示不正确的问题。 ## 2025 年 3 月 26 日 [#march-26-2025] ### 新功能 [#new-features-8] #### 使用 ChatGPT 进行 AI 翻译 [#ai-translations-with-chatgpt] 通过此版本,我们升级了与 ChatGPT 的集成,以便为用户启用 AI 翻译。请注意,此功能默认未启用,必须针对每个项目明确申请。使用 AI 进行翻译存在限制:对于每个使用 ChatGPT 集成的项目,都会提供每月额度,AI 翻译费用会自动从该分配余额中扣除。 除默认语言(通常为英语)外,所有项目语言均可使用 AI 翻译。此功能会将**默认翻译(EN)**翻译为您选择的语言,并将其添加到**翻译**字段中。有关详细信息,请参阅[使用 AI 翻译](user-guide/manage-translations/translate-with-ai)。 #### 新增 Customer 角色 [#new-customer-role] 新增了 **Customer** 用户角色。它类似于原先的 **Editor** 角色,但通过提供对 AI 驱动翻译的访问权限扩展了功能。 无论各自项目中是否启用了 AI 翻译功能,当前分配为 **Editor** 角色的所有用户都将无缝迁移至 **Customer** 角色。 *** ### 改进 [#improvements-11] * 为提升用户体验和导航效率,所有下拉菜单中均新增了**搜索字段**。这使用户能够快速在较长列表中找到特定项目,从而简化整体交互。 * 顶栏中新增了**用户头像**图标。将鼠标悬停其上,即可查看您的电子邮件和角色信息以及**退出登录**按钮。语言选择已从顶栏移除,但仍可在主菜单中使用。 *** ### 已解决的问题 [#resolved-issues-7] 此版本未报告任何面向客户的问题。 ## 2025 年 2 月 11 日 [#february-11-2025] ### 新功能 [#new-features-9] #### 增强安全性 [#enhanced-security] 通过此版本,双因素身份验证(2FA)已更新为要求使用身份验证器应用程序,其中 **Google Authenticator** 为主要选项,而 **Twilio Authy** 则为 Google Authenticator 在某些地区可能无法使用时的替代选项。 登录 B2TRANSLATE 时,您现在会收到提示,要求按照屏幕上的说明设置身份验证器应用程序以生成 2FA 验证码。出于安全原因,在提供凭据后,您每次登录时都需要输入应用程序中的验证码。 *** ### 已解决的问题 [#resolved-issues-8] 此版本未报告任何面向客户的问题。 *** ## 过往版本 [#past-releases] ### 2024 年 12 月 🎄 [#december-2024-] #### 新功能 [#new-features-10] ##### UI 增强 [#ui-enhancements] 最新版本为用户界面带来了多项增强,提供更直观、更流畅的体验。 * 在 **项目** 页面中,项目类型现已组织到标签页中,提供更紧凑、更结构化的视图。 * 主菜单现可折叠,使用更加方便。 * **翻译** 页面进行了以下更新: * 为便于编辑翻译,输入字段现支持自动完成和语法高亮。 * **发送翻译** 菜单已移至表格上方,以便快速访问。 * **筛选器** 按钮变得更加醒目。 * 分页始终位于页面底部。 * 在 **登录** 页面中,密码现在默认隐藏。此外,还为遇到登录问题的用户添加了支持链接。 #### 改进 [#improvements-12] * 通过重构某些端点进行了后端增强,迈出了提升性能和速度的第一步。 * 已实施设计系统组件,旨在提升代码可重用性、可维护性和可扩展性。 * 引入了用于收集指标的新服务,以支持更好的监控和分析。 #### 已解决的问题 [#resolved-issues-9] 此版本未报告任何面向客户的问题。 *** ### 2024 年 10 月 [#october-2024] #### 新功能 [#new-features-11] ##### WebUI 已翻译为 20 种语言 [#webui-translated-into-20-languages] 我们很高兴地宣布,B2TRANSLATE WebUI 现已提供 20 种语言版本。除英语外,您现在还可以使用法语、德语、意大利语、波兰语、葡萄牙语、俄语、西班牙语、乌克兰语、土耳其语、阿拉伯语、印尼语、印地语、乌尔都语、波斯语、日语、韩语、越南语和中文(繁体及简体)使用 B2TRANSLATE。此更新改善了全球社区的用户体验。我们已在主菜单中添加语言选择选项,使其易于使用且更加直观。 #### 改进 [#improvements-13] Yandex.Metrika 和 Webvisor 已集成至 B2TRANSLATE,以便我们更深入地分析数据并更好地识别可用性问题。 ### 2024 年 9 月(第 2 部分) [#september-2024-part-2] #### 新功能 [#new-features-12] ##### 集成 AI 以增强翻译 [#ai-integrated-for-enhanced-translation] 通过此版本,**DeepL** 和 **ChatGPT** 已作为翻译服务集成。 主要更新包括: * **AI 工作流**:为整个项目或单个语言分配特定的 AI 工作流。 * **译者权限**:为 AI 用户配置译者权限。 * **术语表功能**(仅适用于 DeepL):将术语添加到术语表中,以确保已定义术语的翻译保持一致。 * 以及更多功能。 这些 AI 服务集成将提升翻译效率、质量和交付速度。 *** ### 2024 年 9 月 [#september-2024] #### 新功能 [#new-features-13] ##### 用于更快修改翻译的语言选择器 [#language-selector-for-faster-translation-modifying] 继近期简化翻译管理的更新后,**翻译** 页面新增了语言选择器。此前,用户在修改多种语言的翻译时必须不断返回语言列表。现在,选择一个类别会直接进入键列表。您可以使用此页面上的新选择器切换语言,从而显著减少设置翻译所需的时间。 #### 改进 [#improvements-14] * 添加新项目时,现在加载速度更快,并会显示动态预加载器。 * 项目列表中的 **新键** 列已移除。此项更改通过减少 **项目** 页面的杂乱并通过键数据缓存提升性能来改善用户体验。 * 搜索引擎现在可在页面重新加载后保留搜索结果,从而提供一致的用户体验。 * 切换至搜索结果的下一页时,页面会自动滚动至顶部,提供更直观的体验。 *** ### 2024 年 6 月 [#june-2024] #### 改进 [#improvements-15] ##### 简化默认翻译管理 [#simplified-default-translations-management] **翻译** 页面新增了一列,用于显示所选语言的默认翻译,与英语翻译相区分。此前仅提供英语翻译,但现在用户可以轻松编辑全部 22 种支持语言的翻译。 ##### 新项目类型 [#new-project-types] 新增了两种项目类型:`pbsr-v2` 和 `pbsr-admin`。 *** ### 2024 年 4 月 [#april-2024] 我们非常高兴地宣布发布 **B2TRANSLATE 版本 2**,其中包含新功能和增强功能,可改善您的翻译工作流。以下是此版本的新内容: #### 新功能 [#new-features-14] ##### 来自 Template 项目的预翻译键 [#pre-translated-keys-from-the-template-project] 现有项目中,Template 项目键的预加载翻译现已适用于所有支持的语言。 对于新项目,用户现在可以灵活选择预加载全部语言,或仅选择所需的特定语言。 ##### 用户可编辑的翻译 [#user-editable-translations] 我们引入了让用户修改各自语言中预翻译键的功能。这种灵活性使用户能够根据其特定项目要求或偏好微调翻译。 ##### 反馈表单 [#feedback-form] 主菜单中现已提供全新的反馈表单。用户可以直接从 B2TRANSLATE 平台提供反馈,使 B2TRANSLATE 团队能够收集洞察、解决问题并持续改善用户体验。 :tada: **祝您翻译愉快!** The following table provides an overview of liquidity provider platforms that are supported by B2CONNECT and outlines the B2CONNECT adaptor connectivity capabilities when connecting to a corresponding platform. [^1]: 20 for WSS B2CONNECT supports connectivity to multiple FIX-enabled trading platforms across various asset classes. Access or distribute liquidity with the [B2CONNECT FIX API](../fix-api). The table below outlines the supported platforms and their integration capabilities. Orders with the `GTC` Time in force are currently supported as `IOC`. 1, 2 Supported under the External Maker Specification. To properly connect Binance to B2CONNECT Hub using an Ed25519 key, you need to: ### Get a list of trusted IP addresses from B2CONNECT [#get-a-list-of-trusted-ip-addresses-from-b2connect] Contact your Account Manager to obtain a list of B2CONNECT IP addresses. You'll need them later, to properly configure a list of trusted IPs. ### Create Ed25519 keys [#create-ed25519-keys] 1. Download and install the Asymmetric Keys Generator. 2. Generate private and public Ed25519 keys. Follow the **How to create an Ed25519 key pair?** section of the [Binance instruction](https://www.binance.com/en/support/faq/detail/6b9a63f1e3384cf48a2eedb82767a69a) for step-by-step guidance. ### Register your Ed25519 keys on Binance [#register-your-ed25519-keys-on-binance] Follow the **How to register my Ed25519 key on Binance?** section of the [Binance instruction](https://www.binance.com/en/support/faq/detail/6b9a63f1e3384cf48a2eedb82767a69a) for step-by-step guidance. ### Edit restrictions [#edit-restrictions] Add previously acquired B2CONNECT IP addresses as trusted IPs to the allowlist of newly registered API keys. ### Configure the connection on the B2CONNECT side [#configure-the-connection-on-the-b2connect-side] Contact your Account Manager for guidance on integrating the keys into the B2CONNECT settings. When creating API keys on the Kraken platform, on the **Add API key** page, set the **Nonce window** field to `10000000000` (one followed by ten zeros). To avoid typos when entering this value, you can copy it above and paste it into the form as follows: Generate Kraken API keys This is required for proper handling of time variables (nanoseconds in this case). 本指南概述了您需要遵循的步骤,以正确准备您的 Android 应用通过 Google 审核、获得批准并成功发布到 Google Play。 这些说明提供截至发布日期的一般指导。您负责在 Google Play Console 中完成所有必填字段。提供不正确或不完整的信息可能导致 Google 对您的开发者账号发出警告、施加限制或予以停用。 ## 第 1 步:合规检查点 [#step-1-compliance-checkpoint] 在创建并提交您的 Android 应用以供 Google 审核之前,请确定您希望应用可用的国家/地区,并确保您持有每个国家/地区所需的全部许可证和合法授权。 此过程可能需要一些时间,因此请提前取得必要许可证,以确认您有权提供在您的 B2CORE 实例中配置的所有交易工具,并在 Google Play 审核期间提供此信息。 要详细了解 Google Play 关于金融服务和加密货币的政策,请参阅其 **政策中心**,尤其是以下内容: * [基于区块链的内容](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA) * [了解 Google Play 关于加密货币交易所和软件钱包的政策](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA) ## 第 2 步:准备所需应用信息 [#step-2-prepare-required-app-information] 准备以下信息,这些信息将在 Google Play Console 中创建您的应用并将其提交给 Google 审核时需要用到。 ### 支持和法律信息 [#support-and-legal-information] 提供以下详细信息: * **隐私政策 URL** — 指向公开可访问网页的链接,该网页说明您的应用如何收集、使用、存储和保护用户数据。 对于在 Google Play 上发布的 Android 应用,隐私政策是强制要求,即使您的应用仅收集极少的数据。该页面必须: * 公开可用。 * 托管在您的网站或其他可靠的公共域名上。 * 明确说明收集哪些数据、如何使用这些数据,以及用户如何请求删除账号或移除数据。 * **演示账号** — Google 可在审核过程中使用的演示账号(有关详细信息,请参阅[第 3 步:在 B2CORE UI 中创建并配置演示账号](#step-3-create-and-configure-a-demo-account-in-the-b2core-ui))。 * **Google 联系邮箱** — 用于接收 Google 官方通信的电子邮件地址。此邮箱将与您在 Google Play Console 中的开发者账号关联。 * **公开的开发者联系信息** — 在 Google Play 上向用户显示的联系信息,必须包括: * 支持邮箱 * 联系电话号码 * 网站 URL ### 商店详情信息 [#store-listing-information] 为您的应用准备以下商店详情: * 应用名称 * 简短说明(最多 80 个字符) * 完整说明(最多 4,000 个字符) * 图形素材(可由 B2CORE 团队提供)。如需获取,请联系 [android-support@b2broker.com](mailto:android-support@b2broker.com) 或您的客户经理。 ## 第 3 步:在 B2CORE UI 中创建并配置演示账号 [#step-3-create-and-configure-a-demo-account-in-the-b2core-ui] 为了能够审核您应用的所有功能,Google 审核人员需要访问演示账号。因此,您需要按如下方式配置演示账号: * 通过完成已配置 KYC 流程的所有步骤来验证您的演示账号。 * 在 Back Office 中,检查并启用将在您的移动应用中展示的所有 B2CORE UI 模块。每个模块都必须正确配置,以确保您的移动应用不会在审核期间被 Google 拒绝。 * 如果您的应用允许用户转移或兑换资产,您还需要确保演示账号中有足够的资金,以便 Google 审核人员也能够检查转移和兑换功能。 ## 第 4 步:以组织身份在 Google Play Console 注册 [#step-4-register-in-the-google-play-console-as-an-organization] 要发布您的 Android 应用,您需要以组织身份在 [Play Console](https://play.google.com/console/signup) 注册并创建开发者账号。 之后,在每次 Android 版本发布时,B2CORE 团队都会为您提供新的应用软件包(`.aab` 文件),而您将负责管理应用的日常维护。 有关更多信息,请参阅[开始使用 Play Console](https://support.google.com/googleplay/android-developer/answer/6112435?hl=en\&ref_topic=3450769\&sjid=9872213577143447449-NA)。 ## 第 5 步:在 Play Console 中创建新应用 [#step-5-create-a-new-app-in-the-play-console] 要创建应用: 登录 [Google Play Console](https://play.google.com/console/)。 选择您的开发者账号。 要开始创建新应用,请点击 **创建应用**。 填写应用详细信息: * 在 **应用名称** 字段中,输入您的应用名称。这是您的应用在 Google Play 上显示的名称。 * 在 **默认语言** 下拉列表中,选择 **English**。 * 在 **应用或游戏** 部分,选择 **应用**。 * 在 **免费或付费** 部分,选择 **免费**。 应用详细信息 添加 Google Play 用户可用于就您的应用联系您的电子邮件地址。 在 **声明** 部分,接受应用开发者声明并确认遵守政策。 声明 点击 **创建应用**。 创建应用后,您将被重定向到信息中心以继续设置应用。如果您没有被自动重定向,可以随时在 Play Console 的 **首页** 菜单中点击您的应用来访问它。 ## 第 6 步:在 Play Console 信息中心设置您的应用 [#step-6-set-up-your-app-on-the-play-console-dashboard] 在此步骤中,请提供 Google Play 要求的所有应用相关信息。 要提供应用信息: 在 Play Console 中,选择您的应用。 点击信息中心 **设置您的应用** 部分中的每个链接,并填写所需详细信息。 Play Console 信息中心 ### 设置隐私政策 [#set-privacy-policy] * 在此部分中,输入指向您隐私政策的链接,该政策应说明您如何处理敏感用户和设备数据。 * 点击 **保存** 以返回信息中心。 ### 应用访问权限 [#app-access] * 在此部分中,选择 **我的应用中的全部或部分功能受到限制** 选项。 应用访问权限 ### 广告 [#ads] * 在此部分中,选择 **否,我的应用不包含广告** 选项。 * 点击 **保存** 以返回信息中心。 ### 内容分级 [#content-ratings] * 在 **类别** 部分,填写以下内容: * **电子邮件地址** — 指定您的联系邮箱。 * 选择 **所有其他应用类型** 选项。 * 勾选复选框以 **同意使用条款**。 内容分级 — 类别 * 在 **问卷** 部分,对以下所有项目选择 **否**: * 下载的应用 * 用户内容分享 * 在线内容 * 推广或销售有年龄限制的产品或活动 * 其他 内容分级 — 问卷 * 在 **摘要** 部分,验证显示的摘要并点击 **保存**。 ### 目标受众和内容 [#target-audience-and-content] * 在 **目标受众** 中,勾选 **18 岁及以上** 复选框。选择此复选框将把您重定向到 **摘要** 部分。 * 如有必要,您可以填写之前的部分,例如 **应用详细信息**、**广告** 和 **商店展示**。 目标受众和内容 * 在 **摘要** 部分,验证显示的摘要并点击 **保存**。 ### 数据安全 [#data-safety] * 阅读 **概览** 部分。 * 在 **数据收集和安全性** 部分中,按如下所示选择选项,并提供一个 URL,指向您的 B2CORE UI 中可删除账号的部分。URL 必须遵循以下格式: `https://{your-Front-Office-URL}/profile-info` 请务必将 `{your-Front-Office-URL}` 替换为您的 B2CORE UI 域名。 确保您的 B2CORE 实例支持账号删除。这是 Google Play 的要求,Google Play 或用户可能随时对此进行检查。不遵守此要求可能导致您在 Google Play Console 中的开发者账号被停用或遭到永久封禁。 数据收集和安全性 * 在 **数据类型** 部分,填写以下内容: * **位置**:B2CORE 不收集此类数据。 * **个人信息**:指定客户在您的 B2CORE 实例中注册时必须提供的数据。这通常包括(但不限于)“姓名”、“电子邮件地址”、“电话号码”或其他信息。 * **财务信息**:B2CORE 不收集此类数据。 * **健康和健身**:B2CORE 不收集此类数据。 * **消息**:B2CORE 不收集此类数据。 * **照片和视频**:B2CORE 不收集此类数据。 * **音频文件**:B2CORE 不收集此类数据。 * **文件和文档**:B2CORE 不收集此类数据。 * **日历**:B2CORE 不收集此类数据。 * **联系人**:B2CORE 不收集此类数据。 * **应用活动**:B2CORE 收集“应用互动”数据。 * **网页浏览**:B2CORE 不收集此类数据。 * **应用信息和性能**:B2CORE 收集“崩溃日志”和“诊断”数据。 * **设备或其他 ID**:B2CORE 不收集此类数据。 * 在 **数据使用和处理** 部分,您将看到一组与应用收集的数据相关的问卷。 * 按照以下示例完成 **个人信息** 部分中的问卷: 个人信息 * 按照以下示例完成 **应用信息和性能** 及 **应用活动** 部分中的问卷: 崩溃日志 * 在 **预览** 部分,验证显示的摘要并点击 **保存**。 ### 政府应用 [#government-apps] * 对显示的选项选择 **否**。 政府应用 * 点击 **保存** 以返回信息中心。 ### 金融功能 [#financial-features] * 勾选您的应用所提供功能对应的复选框。 请确保仅选择您的应用实际提供的功能。这些功能可能与下方示例中显示的内容不同。 金融功能 * 点击 **保存** 以返回信息中心。 ### 健康应用 [#health-apps] * 选择 **我的应用不具有任何健康功能** 选项,然后点击 **下一步**。 * **文档** 部分不需要执行任何额外操作。 * 点击 **保存** 以返回信息中心。 ### 商店设置 [#store-settings] * 在 **应用类别** 部分,填写以下内容: * 在 **应用或游戏** 选项中,选择 **应用**。 * 在 **类别** 中,选择 **财务**。 * 在 **商店详情联系信息** 部分,输入将在 Google Play 上向用户显示的电子邮件地址、电话号码和网站。 * (可选)在 **外部营销** 部分,您可以勾选 **在 Google Play 之外宣传我的应用** 复选框。 商店设置 ### 设置您的商店详情 [#set-up-your-store-listing] * 在 **详情素材** 部分,填写以下内容: * **应用名称** * **简短说明** * **完整说明** 详情素材 * 在 **图形素材** 部分,附加 B2CORE 团队提供的图形素材。点击 **添加素材**,逐个上传每项图形素材,并为每项素材选择适当类别。 * 添加所有提供的素材后,点击 **保存**。 ### 提交应用信息以供审核 [#send-app-information-for-review] 您提供的所有应用信息都必须提交给 Google 审核。在主菜单中点击 **发布概览**,然后点击 **提交 X 项更改以供审核**。 ## 第 7 步:上传用于正式发布的应用软件包 (.aab) [#step-7-upload-the-app-bundle-aab-for-a-production-release] 要在 Google Play Console 中上传您的应用软件包并配置正式发布: 在 Play Console 中,选择您的应用。 导航至 **测试和发布** > **正式版**。 打开 **国家/地区** 标签页,根据允许您分发应用和提供服务的许可证,选择您希望应用可用的国家/地区。 点击右上角的 **创建新版本**。 创建新版本 点击 **更改签名密钥**。 Google Play 使用基于加密密钥的应用签名来验证您的应用的真实性和安全性。 正确配置 **Google Play App Signing** 对于确保安全部署至关重要;在适用的情况下,也能确保现有 `.apk` 用户顺利迁移至 Google Play 版本。 更改签名密钥 下载加密公钥。 * 选择 **从 Java 密钥库上传新的应用签名密钥** 选项。 * 点击 **下载加密公钥**(选项 1)。 下载加密公钥 通过电子邮件将下载的 `.pem` 文件格式密钥发送给 B2CORE 团队,邮箱为 [android-support@b2broker.com](mailto:android-support@b2broker.com),或通过您的客户经理发送。 B2CORE 团队将生成应用签名密钥,使用提供的公钥对其进行加密,并将其与使用相同密钥签名的 `.aab` 格式应用一同返还给您。此过程可能需要一些时间。 收到 **已签名的应用软件包**(`.aab`)和 **应用签名密钥归档文件**(`.zip`)后,返回 **测试和发布** > **正式版** > **版本** > **未命名版本**。 在 **版本** 页面上,点击 **编辑版本**。 上传收到的 **应用签名密钥**(`.zip`)。 * 选择 **上传应用签名密钥 (.zip)** 选项。 * 点击 **上传生成的 ZIP**(选项 4)。 上传应用签名密钥 上传收到的 **应用软件包**(`.aab`)。 * 拖放提供的 `.aab` 文件。请勿修改它。 * 上传后,确保未显示任何错误。 您可能会看到以下警告消息。这是预期情况,可以安全忽略。 **警告** `This App Bundle contains native code, and you've not uploaded debug symbols. We recommend that you upload a symbol file to make your crashes and ANRs easier to analyze and debug.` 填写 **版本详细信息**。 * 上传 `.aab` 文件后,**版本名称** 字段会自动填写。 * 在 **版本说明** 字段中,粘贴 B2CORE 团队提供的版本说明,或将该字段留空。 版本详细信息 点击 **下一步**。 检查版本信息,并确保没有以红色突出显示的错误。 您可能会看到以下警告消息。这是预期情况,可以安全忽略。 **警告** `This App Bundle contains native code, and you've not uploaded debug symbols. We recommend that you upload a symbol file to make your crashes and ANRs easier to analyze and debug.` 开始发布。 * 点击 **保存** 以提交应用供 Google 审核。 * 您将被重定向到 **发布概览**,您必须在此点击 **提交 X 项更改以供审核**。 应用审核和发布可能需要数天时间。审核结果可能是在 Google Play 上成功发布,也可能是被拒绝并提供原因。如果您在解决拒绝问题时遇到困难,请通过 [android-support@b2broker.com](mailto:android-support@b2broker.com) 联系 B2CORE 团队。 ## 第 8 步:获批后:应用监控 [#step-8-after-approval-app-monitoring] 应用获批后,请定期检查其可用性和政策合规性,以避免执法措施。 未执行这些检查可能导致违反政策、应用被下架、您的 Play Console 开发者账号被停用或永久终止,且通常不会事先通知。 ### 检查应用可用性 [#check-app-availability] 确认应用在所有允许的国家/地区中均可在 Google Play 上看到,并且安装和基本功能按预期运行。 ### 检查合规性 [#check-compliance] 确保您的应用详情、隐私政策和国家/地区分发范围与您当前的许可证和法律授权保持一致。 ### 监控政策状态 [#monitor-policy-status] 定期检查 **监控和改进** > **政策和计划** > **政策状态** 中是否有任何需要处理的事项。 ### 审核应用内容 [#review-app-content] 定期检查 **监控和改进** > **政策和计划** > **应用内容** 中是否有任何需要处理的事项。确保所有应用信息均为最新信息。 ### 监控 Google Play 通信 [#monitor-google-play-communications] 定期检查与您的 Google Play Console 关联的联系邮箱,并及时回应任何通知。 Google Play 政策和部署流程会定期变化。如果您发现本说明中有任何缺失或过时的信息,请通过 [android-support@b2broker.com](mailto:android-support@b2broker.com) 联系我们以获取帮助或说明。 除了创建独立的桌面解决方案外,B2CORE 还可协助您发布适用于 iOS 和 Android 的品牌移动应用。 要在 App Store 上发布您的应用,您需要考虑各种政策问题,以确保严格遵守所有指南和法规,这可能并非一项简单的任务。 本文档提供了有关如何正确准备您的 iOS 应用的详细说明,以加快其审批和在 App Store 上成功发布的速度。 本文档中提及的所有商标、徽标和品牌名称均为其各自所有者的财产。本文档中使用的所有公司、产品和服务名称仅用于识别目的。使用这些名称、商标和品牌并不意味着获得认可。 ## 第 1 步:准备加密货币交易许可证 [#step-1-prepare-the-licenses-for-trading-crypto] 首先,在开始构建并提交您的 iOS 应用以供审核之前,您需要确定该应用将在哪些国家/地区提供,并特别注意获取在这些国家/地区提供服务所需的全部许可证。 此过程可能十分耗时,您必须提前获取所有必需的许可证,以确保您获准交易 B2CORE 解决方案中配置的所有工具,然后将这些许可证交给 App Store 审核团队。 App Store Connect — 国家和地区可用性 许可证要求是强制性的,交易业务服务许可必须由 Apple 授予。要详细了解专门适用于加密货币的许可证要求,请参阅 [App Store 审核指南 - 3.1.5 加密货币](https://developer.apple.com/app-store/review/guidelines/#cryptocurrencies)。 ## 第 2 步:在 B2CORE UI 中创建并配置演示账户 [#step-2-create-and-configure-a-demo-account-in-the-b2core-ui] 为了能够审核您应用的所有功能,App Store 审核团队需要访问演示账户。因此,您需要按如下方式配置演示账户: * 完成 KYC 流程中的所有步骤以验证您的演示账户。 * 在 Back Office 中,检查并启用将在您的移动应用中展示的所有 B2CORE UI 模块。必须正确配置每个模块,以确保您的移动应用不会在审核期间被 App Store 拒绝。 * 如果您的应用允许用户转移或兑换资产,您还需要确保演示账户中有足够的资金,以便 App Store 审核团队也能够检查转移和兑换功能。 ## 第 3 步:以组织身份加入 Apple Developer Program [#step-3-enroll-in-the-apple-developer-program-as-an-organization] 要开设 Apple Developer 账户,您必须提供以下信息: * 您的 D-U-N-S 编号 * 您的法人实体状态 * 您的法定约束授权 * 您的网站地址 要发布您的 iOS 应用,您需要以组织身份加入 Apple Developer Program,然后通过将您的访问凭据发送至我司电子邮件 [ios-admin@b2broker.com](mailto:ios-admin@b2broker.com),与 B2CORE 团队共享您的开发者账户访问权限。 此后,B2CORE 团队将在每次 iOS 发布时为您上传新的应用构建版本,而您将负责管理应用的日常维护(详情请参阅[第 8 步:通过新版本更新您的应用](deploying-your-ios-app#step-8-update-your-app-with-new-releases))。 有关一般信息,请参阅 [加入前须知 — Apple Developer Program](https://developer.apple.com/programs/enroll/)。 有关分步说明,请参阅[以组织身份加入 Apple Developer Program](https://developer.apple.com/support/app-account/)。 ## 第 4 步:向 B2CORE 团队授予访问权限和管理员权限 [#step-4-grant-access-and-admin-permissions-to-the-b2core-team] 为了使 B2CORE 团队能够在 App Store Connect 中配置您的应用,您需要向我们的团队授予以下管理员权限。请按如下步骤操作: 1. 在 App Store Connect 中,切换至 **用户和访问**。 2. 在 **人员** 选项卡中,使用 B2BROKER 公司电子邮件 [ios-admin@b2broker.com](mailto:ios-admin@b2broker.com) 添加新人员。 3. 在 **角色** 部分中,启用 **管理员** 角色。 4. 在 **其他资源** 部分中,确保按如下方式启用所有权限: * **访问报告** * **访问证书、标识符和配置文件**,其中包括: * **访问云管理的分发证书** * **访问云管理的 Developer ID 证书** * **创建应用** App Store Connect — 用户和访问 ## 第 5 步:向您的客户经理提供所有必要信息 [#step-5-provide-all-necessary-information-to-your-account-manager] 请联系您在 B2BROKER 的客户经理,告知开发团队他们必须为发布准备您的应用。 您需要向客户经理提供以下信息,这些信息将转交给开发团队: * 有关许可证的信息,以及您的 B2CORE 演示账户凭据。 * 您的 B2CORE UI 实例 URL。 * 您公司的法定名称,以及您的 Apple Developer 账户名称(通常与以组织身份创建 Developer Account 时指定的公司名称一致)。 您的 Apple Developer 账户必须以 LLC 形式注册在您的组织名下;不允许使用个人账户。 * Developer Account 所有者的电子邮件地址。 此外,您还需要提供以下信息: * 您的 iOS 应用名称(不得超过 16 个字符)。 * 应用的主要语言(默认设置为英语)以及用于本地化的支持语言列表。 * 您对应用图标的偏好设置(例如所需的配色方案)。 * 您对 App Store 产品页面中显示的应用截图的偏好设置。 在您的客户经理联系 B2CORE 开发团队后,他们将准备您的应用并将构建版本上传至 App Store。随后,该应用将显示在 App Store Connect 中,并标明其版本,其状态设置为 **准备提交**。 App Store Connect — 准备提交 ## 第 6 步:指定定价、可用性和隐私选项 [#step-6-specify-the-pricing-availability-and-privacy-options] 在 App Store Connect 中,配置以下应用设置: * **定价和可用性** 在此部分中,您需要指定以下选项: * 我们建议您免费提供移动应用,并将 **价格计划** 字段设置为 `US$0.00 (Free)`。 * 将 **税务类别** 字段设置为 `App Store software`。 * 在 **可用性** 部分中,根据您获得的许可证,选择您的应用将可用的国家/地区。 * 对于此部分中的其他选项,您可以保留默认设置。 App Store Connect — 定价和可用性 * **应用隐私** 在此部分中,指定 **隐私政策 URL**,该 URL 必须与您为 B2CORE UI 实例指定的 URL 相同。 App Store Connect — 应用隐私 接下来,点击 **开始使用** 并完成问卷,以指定您的应用数据收集政策: * **联系信息** 默认情况下,您的应用将收集用户的电子邮件地址。 根据您应用的配置,它还可能收集其他数据,例如用户名、电话号码、用户地址和其他联系信息。请确保根据 B2CORE Back Office 中指定的选项标明收集的数据。 * **标识符** 默认会收集 **用户 ID** 数据。 不会收集 **设备 ID** 数据。 * **用户内容** 会收集用户照片和视频。 * **其他用户内容** 在此页面中,选择 `App Functionality` 和 `Other Purposes`。 以下示例说明了发布标准 iOS 应用的客户必须指定的数据收集设置: * **与您关联的数据**: * **联系信息** * **用户内容** * **标识符** * **不与您关联的数据**: * **诊断数据** * **联系信息**: * **姓名** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **电子邮件地址** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` 对于问题 **您或您的第三方合作伙伴是否将电子邮件地址用于跟踪目的?**,请选择答案 `No, we do not use email addresses for tracking purposes.` * **电话号码** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **实际地址** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **其他用户联系信息** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **用户内容**: * **照片或视频** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **其他用户内容** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **标识符**: * **用户 ID** * `Used for Other Purposes` 和 `App Functionality` * `Linked to the user's identity` * **诊断数据**: * **崩溃数据** * `App Functionality` 要了解更多信息,请参阅 [App Store 上的应用隐私详细信息](https://developer.apple.com/app-store/app-privacy-details/)。 ## 第 7 步:指定 Apple 审核团队将用于登录的演示账户 [#step-7-specify-a-demo-account-from-which-the-apple-review-team-will-log-in] 应用上传至 App Store Connect 后,您需要指定在[第 2 步](deploying-your-ios-app#step-2-create-and-configure-a-demo-account-in-the-b2core-ui)中创建的演示账户。App Store 审核团队将使用此账户登录并审核您的应用。 要指定演示账户,请按如下步骤操作: 1. 在 App Store Connect 中,切换至 **应用审核** > **准备提交**。 在 **应用审核信息** 部分中,启用 **需要登录** 复选框,然后指定演示账户的登录名和密码。 2. 在 **联系信息** 部分中,指定负责配置 App Store Connect 的人员的联系信息。 App Store 审核团队将联系此人,告知应用是否被接受或拒绝,或是否需要任何其他信息。 3. 在 **备注** 字段中,添加许可证链接并附上其扫描件(如有)。 您在[第 6 步](deploying-your-ios-app#step-6-specify-the-pricing-availability-and-privacy-options)的 **可用性** 部分中选择的每个国家/地区都必须提供许可证。必须将链接添加在有关如何找到删除账户按钮的信息下方。 4. 在 **备注** 字段中,添加以下文本: > 该应用不依赖任何第三方 API,包括任何可能危及用户数据的 API。该应用仅使用自定义 REST API 与后端通信,以提供金融服务。此 API 由我公司开发并拥有。因此,我们保证 API 的正常运行。 App Store Connect — 应用审核信息 5. 指定以下字段: * **推广文本** * **描述** * **此版本的新功能** * **关键词** * **支持 URL** * **营销 URL** * **版本** * **版权** App Store Connect — 其他信息 要详细了解这些字段,请参阅[平台版本信息](https://developer.apple.com/help/app-store-connect/reference/platform-version-information)。 6. 点击 **添加以供审核**,将您的应用提交给 App Store 团队审核。 当您的应用审核并获批后,其状态将更改为 `Ready for Distribution`。 ## 第 8 步:通过新版本更新您的应用 [#step-8-update-your-app-with-new-releases] B2CORE 团队将在每次 iOS 发布时为您在 App Store Connect 中上传新的应用构建版本。 您需要创建新的应用版本,将新构建版本添加到该版本中,并将其提交给 App Store 团队审核。 ### 创建新的应用版本 [#create-a-new-app-version] 当 B2CORE 团队通知您有新的 iOS 发布版本时,请在 Apple Store Connect 中创建新的应用版本,向其中添加新的构建版本,并将其提交给 App Store 团队审核。 仅当当前应用版本处于 `Ready for Distribution` 状态时,您才能创建新版本。如果由于某种原因,当前应用版本未提交审核且处于可编辑状态,请[使用新构建版本更新当前版本](deploying-your-ios-app#update-the-current-app-version-with-a-new-build),而不要创建新版本。 有关所有可能状态的完整列表,请参阅[应用和提交状态](https://developer.apple.com/help/app-store-connect/reference/app-and-submission-statuses)。 1. 在 Apps 中,选择您的应用。 2. 在 **Distribution** 选项卡中,点击侧边栏 **iOS App** 部分显示的 **添加** 按钮 (+)。 3. 在 **新版本** 弹出窗口中,输入新版本号(例如 `1.24.0`),然后点击 **创建**。 您可以在 **TestFlight** 选项卡中查看为应用版本上传的完整版本和构建版本列表。 4. 审核新版本元数据。 创建新版本时,当前版本中的元数据将自动转移至新版本。有关版本属性的说明,请参阅[平台版本信息](https://developer.apple.com/help/app-store-connect/reference/platform-version-information)。 5. 点击页面右上角的 **保存**。 6. 将最新的应用构建版本添加至新创建的版本: * 向下滚动至 **构建版本** 部分,然后点击该部分旁显示的 **添加** 按钮 (+)。 * 在 **添加构建版本** 弹出窗口中,选择版本号\_最高\_的构建版本,然后点击 **完成**。 App Store Connect — 添加构建版本 App Store Connect — 选择最新构建版本 7. 将发行说明添加至 **此版本的新功能** 字段。每个 iOS 发布版本的 RN 可在[此处](../release-notes/release-notes-mobile)找到。 这些 RN 可能并不完全适用于您的应用,因此您可能需要编辑它们,仅包括与您应用功能相关的更新。例如,如果 RN 提到您的应用不支持的交易平台更新,请从 **此版本的新功能** 字段中省略该项。 8. 点击页面右上角的 **保存**。 9. 点击 **添加以供审核**,将新的应用版本提交给 App Store 团队审核。 当您的新应用版本审核并获批后,其状态将更改为 `Ready for Distribution`。 ### 使用新构建版本更新当前应用版本 [#update-the-current-app-version-with-a-new-build] 如果您当前的应用版本在 App Store Connect 中未处于 `Ready for Distribution` 状态,则在新的 iOS 发布版本可用时,您无法创建新的应用版本。请改为为当前版本选择新的构建版本,并将其提交给 App Store 团队审核。 1. 在 Apps 中,选择您的应用。 2. 在侧边栏中,选择您要上传新构建版本的应用版本。 您只能对具有某一可编辑状态的版本执行此操作。 有关所有可能状态的完整列表,请参阅[应用和提交状态](https://developer.apple.com/help/app-store-connect/reference/app-and-submission-statuses)。 3. 向下滚动至 **构建版本** 部分。 4. 要移除先前的构建版本,请将鼠标悬停在该构建版本上,然后点击构建版本行右侧显示的 **删除** 按钮 (-)。 App Store Connect — 移除构建版本 5. 添加最新构建版本: * 点击 **构建版本** 部分旁显示的 **添加** 按钮 (+)。 * 在 **添加构建版本** 弹出窗口中,选择版本号\_最高\_的构建版本,然后点击 **完成**。 App Store Connect — 添加构建版本 6. 在 **版本** 字段中,将版本号更新为与新 iOS 发布版本一致。例如,将 `1.23.0` 更改为 `1.24.0`。 7. 将发行说明添加至 **此版本的新功能** 字段。每个 iOS 发布版本的 RN 可在[此处](../release-notes/release-notes-mobile)找到。 这些 RN 可能并不完全适用于您的应用,因此您可能需要编辑它们,仅包括与您应用功能相关的更新。例如,如果 RN 提到您的应用不支持的交易平台更新,请从 **此版本的新功能** 字段中省略该项。 8. 点击页面右上角的 **保存**。 9. 点击 **添加以供审核**,将新的应用版本提交给 App Store 团队审核。 当您的新应用版本审核并获批后,其状态将更改为 `Ready for Distribution`。 **仪表板**页面可快速概览所选期间内的关键财务指标,帮助您分析整体表现和财务活动。 ## 访问仪表板 [#access-to-the-dashboard] **仪表板**面向在 **Statistics** 类别下被分配 `Access to Finance Dashboard` 权限的用户开放,并会在登录 Back Office 后显示。对于其他 Back Office 用户,**仪表板**将被隐藏,且其登录后会被重定向至 **Clients** > **General** 页面。 有关用户组和权限的更多详情,请参阅[如何添加用户组并授予权限](../how-to-articles/manage-system-settings/how-to-add-a-user-group-and-grant-permissions)。 默认情况下,系统会显示当天的财务指标。您可以选择以下期间之一: * 今天 * 昨天 * 过去 7 天 * 过去 30 天 * 过去 90 天 * 本月 * 上月 * 自定义范围 您还可以使用位于指标区块上方的以下筛选条件来筛选显示的指标: * **客户类型** * **司法管辖区** * **国家/地区** * **经理** * **客户标签** 如要重置所选筛选条件和期间,请点击 **Reset** 按钮。 Dashboard 仪表板会显示以下信息: ## 入金 [#deposits] * **总入金** — 所选期间内的入金总额(以 USD 计)。该指标根据 [Finance > Deposits](finance/deposits) 中的 **Final amount (USD)** 列计算。仅包含处于最终状态的已完成入金。 * **平均入金** — 所选期间内的平均入金金额,计算方式如下: `Total deposit / Number of deposits` ## 出金 [#withdrawals] * **总出金** — 所选期间内的出金总额(以 USD 计)。该指标根据 [Finance > Payouts](finance/payouts) 中的 **Final amount (USD)** 列计算。仅包含处于最终状态的已完成出金。 * **平均出金** — 所选期间内的平均入金金额,计算方式如下: `Total withdrawal / Number of withdrawals` ## 汇总 [#summary] * **净入金** — 所选期间内的净入金金额(以 USD 计),计算方式如下: `Total deposit − Total withdrawal` B2CORE 是一款功能完善的 CRM,提供完整的自定义和访问控制选项。 ## 授权和权限 [#authorization-and-permissions] B2CORE 提供完整的个性化和访问控制选项。用户访问通过应用不同用户组权限进行控制。 激活 B2CORE 个人资料后,您可以使用管理员提供的凭据登录 Back Office。 如果登录时遇到错误,请检查登录名和密码,以及输入语言和 Caps Lock 状态。如果一切看似正确,请联系管理员确认您的个人资料状态。 ## 常规界面选项 [#general-interface-options] Back Office 用户界面在所有页面中保持统一,确保一致的外观和体验,并提供一组通用的基本选项。本文档介绍如何调整页面上显示的数据、如何筛选和排序这些数据,以及如何将其导出到文件。 ### 顶部栏选项 [#the-top-bar-options] 在典型的 Back Office 页面顶部,您可以看到包含以下元素的顶部栏: * **☰ 主菜单**按钮 点击以展开或折叠主菜单。 * **后端版本** 当前部署的 Back Office 版本。 * **服务器时间** GMT+0 的固定系统时间。该时间无法更改,可确保 B2CORE 中所有交易、日志和活动的准确性和一致性。 * **打开个人区域**链接 点击该链接可访问与您的 Back Office 关联的 B2CORE UI 的**登录**页面。 * **铃铛**图标 点击以查看待处理的客户请求。新请求的数量显示在计数徽章上。 * **警告**图标 点击以查看平台连接警报,例如有关当前无法访问的交易平台的通知。活动警报的数量显示在计数徽章上。 * 显示用户个人资料中电子邮件地址的面板 在页面右上角,点击显示您电子邮件地址的个人资料按钮,可访问**退出登录**按钮和**启用 2FA**选项(如果已启用双重身份验证,则为**禁用 2FA**)。 双重身份验证 (2FA) 是强制性的,必须为 Back Office 中的所有用户个人资料启用。 要通过基于时间的一次性密码 (TOTP) 为您的用户个人资料启用 2FA,请点击**启用 2FA**,然后在弹出窗口中点击**确定**。接下来,按照显示的说明使用 Google Authenticator 设置 2FA。 启用 2FA 后,登录 Back Office 时请先输入登录名和密码,然后输入 Google Authenticator 应用中的验证码。 ### 通用选项 [#common-options] 以下按钮可在大多数 Back Office 页面中找到。 * 表格上方: * create button — 用于添加新条目的**创建**按钮 * export button — 用于将表格数据导出为 CSV 文件的**导出**按钮 * 用于选择多个表格条目并对其执行批量操作的**选择**和**全选**按钮(如可用) * 表格标题中: * search button — 用于应用自定义筛选条件的**搜索**按钮 * reset button — 用于重置自定义筛选条件的**重置**按钮 * 表格行中: * edit button — 用于深入查看数据并访问详细信息的**编辑**按钮 * delete button — 用于删除条目的**删除**按钮 页面元素可能作为超链接,可点击以深入查看详细信息。对此数据的访问权限根据分配给特定用户组的权限进行维护。 ### 筛选和排序 [#filtering-and-sorting] 在整个 Back Office 中,数据通常以表格形式组织。表格数据可以排序和筛选。 可用于排序数据的列会在列标题中标有向上和向下箭头(不可排序时不显示箭头)。您可以点击这些箭头,一次按一列以升序或降序排序数据。 除排序顺序外,您还可以指定多个条件来筛选列数据。 筛选可用时,相应的输入字段会显示在列标题中。输入字段因数据格式而异,例如文本、数字、日期、时间或列表。 为便于按日期筛选,可能会显示开始日期和结束日期两个字段,以便您定义一个时间段。 要启用或禁用筛选条件,请点击**搜索**和**重置**按钮。 ### 分页 [#pagination] 您可以在多个页面中显示表格数据,并指定每页显示的记录数量(找到的记录总数显示在页面大小选择器旁边)。 要在页面之间导航,请点击**上一页**或**下一页**,或者点击特定页码。 ### 可见性 [#visibility] 要选择要包含在表格中的数据字段,请点击**列可见性**,然后勾选或取消勾选要显示或隐藏的列。应用后,新的可见性设置将对所有 Back Office 用户生效(特定字段的可见性取决于授予特定用户的访问权限)。 ### 数据导出 [#data-export] 大多数 Back Office 页面上的数据都可以导出为 CSV 或 XLSX 文件。 为此,请点击**导出**按钮,选择文件格式,然后选择将数据下载到您的计算机,或发送到您个人资料中的电子邮件地址。 生成的文件中的数据与当前可见性设置以及已应用的排序和筛选条件一致。 使用此菜单可访问 **介绍经纪人(IB)** 产品的功能,该产品旨在支持帮助您拓展客户群的推荐计划。通过这些计划,您可以鼓励现有客户成为合作伙伴,并为您的经纪业务吸引新的交易者。作为回报,合作伙伴可获得其推荐客户交易活动所产生收入的一定比例,从而建立互利共赢的合作关系。 如果您的 Back Office 中没有此菜单,请联系您的客户经理,了解如何获取和实施 IB 计划。 有关 IB 的更多信息,请参阅[产品文档](https://docs.ib.b2core.b2broker.com/)。 在此页面上,您可以查看客户在 B2CORE UI 中提交给 HelpDesk 的工单被标记为已解决后留下的反馈。 系统会为每个已提交反馈的工单提供以下信息: **Id** 客户向 HelpDesk 提交的工单标识符。 点击工单标识符可在 SupportPal 或 Zendesk 中查看工单详情。 *** **Email** 客户电子邮件地址。 *** **Comment** 反馈文本。 *** **Date** 提交反馈的日期和时间。 *** **Status** 客户满意度评分。可能的值: * 非常满意 * 满意 * 一般 * 不满意 * 非常不满意 *** **Subject** 工单主题。 如果工单被重新打开后再次解决,客户可以提交更新后的反馈,该反馈将作为新记录添加到 **工单反馈** 页面。 以下是 B2CORE 支持的通信平台列表: **另请参阅** [如何管理通信平台](../how-to-articles/manage-communication-platforms) 以下是与 B2CORE 集成的 KYC 提供商列表。配置[验证级别](../back-office-guide/verification/levels)时,您可以使用内置 KYC 提供商,或依靠受支持的第三方 KYC 提供商来验证客户身份。 下方列出了每个 KYC 提供商可验证的文件组名称,以及说明各提供商如何在 B2CORE UI 中执行验证流程的详细信息。 **另请参阅** [如何管理验证选项](../how-to-articles/manage-verification-options) ## CRM 和自动化系统 [#crm--automation-systems] 以下 CRM 平台可连接到 B2CORE,以简化销售流程并自动化客户管理工作流: ## 客户支持平台 [#customer-support-platforms] 以下平台已与 B2CORE 集成,提供用于管理客户工单和增强支持互动的解决方案: ## 市场分析和交易信号工具 [#market-analysis--trading-signals-tools] 以下平台已与 B2CORE 集成,为客户提供市场分析工具和交易信号: ## 数据分析工具 [#data-analytics-tools] 以下平台已与 B2CORE 集成,用于收集和分析 B2CORE UI 及移动应用中的客户操作数据,从而提供有关用户行为、参与度和业务成果的洞察: 以下是与 B2CORE 集成的支付系统列表。这些系统可用于配置将在 B2CORE UI 中向您的客户提供的[入金](../back-office-guide/system/deposit-system#deposit-methods)和[出金方式](../back-office-guide/system/payout-system#payout-methods)。 对于每个支付系统,都会标明其是否支持入金、出金或两者兼有。此外,您还可以找到可在 B2CORE UI 中显示为入金和出金方式图标的图标。这些图标用于在其他方式中轻松识别使用特定支付系统的方式。 ## 支付系统服务(PSS) [#payment-system-service-pss] 对于每个支付系统,还会说明其是否支持通过新的 **支付系统服务(PSS)** 连接到 B2CORE。该服务通过提供单一连接来支持系统提供的一系列入金和出金选项,从而增强集成效果。当该系统作为收银台系统运行,将来自多个来源的付款整合并处理到一个统一系统中时,这种方式尤其有效(详情请参阅[如何通过 PSS 添加入金和出金方式](../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss))。 如果您打算通过 PSS 连接支付系统,请先联系您的客户经理,以确认您的 B2CORE 实例是否提供 PSS 支持的连接。 ## 移动应用中对 PSS 方式的支持 [#support-for-pss-methods-in-mobile-apps] 从 iOS 1.30.0 版本和 Android 2.8.0 版本开始,iOS 和 Android 移动应用现已支持 PSS 支付方式,包括入金和出金。 **另请参阅** [如何管理支付方式](../how-to-articles/manage-payment-methods) 以下是 B2CORE 支持的交易平台和中心,以及其具体功能和特性的详细信息。 ## 交易平台 [#trading-platforms] ## 交易中心 [#trading-hubs] ### 2025 年 12 月 [#december-2025] **v1.31 (iOS)** 此版本包括: * **应用现已支持储蓄** 客户现在可以直接在应用中访问**储蓄**。他们可以查看并订阅储蓄计划、以所需币种创建钱包、监控活跃计划、添加资金、跟踪利息支付,以及在需要时于计划到期日前提取资金。
储蓄中心 订阅储蓄计划 分期付款
* **优化总余额计算** 应用**仪表板**中显示的总余额现在会反映所有钱包和交易账户的合并余额,并与 B2CORE UI 中显示的总额完全一致。 * **新增活动部分** 应用中新增了**活动**部分,在一个位置提供所有交易的完整历史记录。客户现在可以轻松跟踪其充值、提现、转账和兑换,也可以搜索特定币种的交易。可从标签栏以及**首页**和**钱包**页面访问**活动**部分。使用**下拉刷新**可快速更新该部分并查看最新信息。
活动 币种搜索
* **支持跟单交易、PAMM 和 MAM** 应用现已通过网页视图支持来自 **B2COPY** 的跟单交易、PAMM 和 MAM 功能。这使客户能够通过**服务**部分直接从应用访问这些服务。 * **用于跟踪提现的区块链浏览器链接** 客户现在可以直接从应用中跟踪区块链上的提现交易。对于加密货币钱包,Bitcoin、Ethereum 和 Bitcoin Cash 的提现可使用指向 `https://www.blockchain.com/explorer` 的链接,从而更便于交易监控并提高透明度。 * **通过 B2BINPAY V3 和 Coinsbuy V3 充值的静态支付详情** 通过 **API V3** 连接时,应用现已支持通过 **B2BINPAY** 和 **Coinsbuy** 充值的**静态支付详情**。借助静态支付详情,客户可以直接在应用中生成一个或多个特定区块链的充值地址。这些地址将保存供日后使用,并可用于后续充值。 此外,通过 **B2BINPAY V3** 和 **Coinsbuy V3** 的加密货币充值流程已得到改进,提供清晰的**费用明细**和**参考金额**显示,从而带来更好的透明度和更顺畅的充值体验。 * **支付表单全面集成 B2TRANSLATE** 应用中的支付表单现已全面集成 [B2TRANSLATE](https://docs.b2translate.b2broker.com/)(原 Weblate)。现在可通过 B2TRANSLATE 自定义并将 PSS 连接的充值和提现方式的动态表单所有组件标签以及验证错误消息翻译为多种语言。 * 修复错误并进行优化,以确保更顺畅、更高效的用户体验。 *** ### 2025 年 11 月 [#november-2025] **v1.30.2 (iOS)** * 此版本为错误修复版本,可改善应用体验。 *** ### 2025 年 9 月 [#september-2025] **v1.30.0 (iOS)** 此版本包括: * **扩展多语言支持** 通过集成 [B2TRANSLATE](https://docs.b2translate.b2broker.com/)(原 WEBLATE),应用现已支持最多 **35 种语言**的本地化。主要优势包括: * 在应用中提供与 B2CORE UI 相同的语言选项。 * 通过 B2TRANSLATE 自定义每种支持语言的翻译。 * 使用单一工具 B2TRANSLATE 同时维护应用和 B2CORE UI 的翻译。 * 通过消除语言障碍提升可扩展性和客户满意度。 集成功能已部署,但仍需将支持语言的翻译添加到 B2TRANSLATE。完成此流程后,完整本地化功能即可使用。
Ar Ch
* **应用现已支持 PSS 充值和提现方式** 通过 Back Office 中的 [支付系统服务 (PSS)](../integrations/payment-systems#payment-system-service-pss) 配置的提现方式现已可在应用中使用。这完成了对先前已集成的**充值方式**以及通过 PSS 连接的**提现方式**的支持。 * **应用现已支持奖励金** 客户现在可以直接在应用中访问和管理奖励金,包括充值奖励金。奖励金支持 **MT4/5** 和 **cTrader**。 奖励金将作为**信用资金**添加至客户的交易账户,从而增加交易资金和保证金。满足奖励金要求后,奖励金额将转换为真实资金并可提现;否则将过期。
奖励金计划 订阅奖励金计划 活跃奖励金计划
* **交易账户界面焕新** **交易**部分已更新,带来更直观、更无缝的体验,使客户能够: * 轻松开设交易账户。 * 通过更少步骤为账户充值。 * 流畅进入交易。
交易账户 交易账户详情
* **反馈表单** 客户现在可以在应用内快速将其体验评为正面或负面,并可选择提供更详细的评论。反馈表单会在多次启动应用或进行金融操作后自动显示,也可随时通过**个人资料**菜单访问。可通过分析工具跟踪反馈数据。
反馈表单 从个人资料分享反馈
* 修复和优化,以确保稳定性能和可靠性。 *** ### 2025 年 7 月 [#july-2025] **v1.29.1 (iOS)** 此版本包括错误修复和性能优化,以带来更好的应用体验。 *** ### 2025 年 6 月 [#june-2025] **v1.29 (iOS)** 此版本包括: * **应用现已支持通过 PSS 配置的充值方式** 通过 Back Office 中的 [支付系统服务 (PSS)](../integrations/payment-systems#payment-system-service-pss) 配置的充值方式现已可供用户直接在应用中使用。 请注意,应用暂不支持通过 PSS 的提现方式。 * **多语言支持** (Beta) 应用现已支持 16 种新的界面语言,包括**阿拉伯语**、**波兰语**、**德语**、**俄语**、**波斯语**、**中文**、**法语**、**泰语**、**意大利语**、**印度尼西亚语**、**印地语**、**越南语**、**葡萄牙语**、**捷克语**、**日语**和**韩语**。 可直接在应用中的**个人资料** > **语言**切换语言。 所有语言目前均处于 Beta 阶段,后续更新将持续改善翻译。
个人资料 > 语言 语言列表
* **重新设计的钱包** **钱包**界面已更新,采用更简洁、更现代的设计,包括: * 焕新的钱包卡片设计 * 显示投资组合的**预计总额** * 可快速访问充值及其他金融操作 * 增强的钱包详情,包括总余额和可用余额、最近交易,以及清晰突出的操作按钮。
钱包列表 隐藏余额 钱包详情
* **增强充值体验** 重新设计的流程使用户可以更轻松、更快速地完成充值。
增强充值 充值表单
* **支持收藏 cTrader 账户** 用户现在可以将 cTrader 账户标记为收藏。标记后,这些账户将显示在**收藏交易账户**小组件中,便于直接从**首页**页面快速轻松地进入交易。 收藏 cTrader 账户 * **支持服务中的自定义磁贴** 现在可将自定义磁贴添加至**服务**部分,以将用户链接到支持您的经纪业务的第三方服务或外部资源。必须在**Back Office**中进行配置,并指定磁贴名称和重定向 URL。配置完成后,自定义磁贴将显示在应用的**服务**下。 在 Back Office 中,配置自定义菜单链接的选项将随 [2025 年 6 月发布版本](release-notes#july-2-2025)提供。 * **通过前往充值选项简化账户创建** 已简化账户创建流程,以清楚指示何时需要最低充值金额。如果资金不足以开设新的交易账户,用户将看到所需金额以及**前往充值**按钮,鼓励快速入金并更快开始交易。 前往充值 * 优化整体应用性能,提供更快、更稳定、更灵敏的用户体验。 *** ### 2025 年 3 月 [#march-2025] **v1.28 (iOS)** 此版本包括: **改进注册和引导体验** 应用中面向新客户的注册和引导流程已得到改进: * **应用快速概览**:在访问**注册**和**登录**表单前,客户现在会看到通过多个页面展示主要功能的简要应用概览。此改进旨在提高注册转化率并吸引更多潜在客户。
灵活充值 所有钱包集中一处 所有账户操作 轻松跟踪每个钱包
* **焕新设计**:**注册**和**登录**表单已重新设计,以提供更好的用户体验。
登录 注册
* **增强安全性**:现在必须在注册期间设置密码。设置后无法禁用。启用 Face ID 仍然是可选的。 如果客户此前未设置密码或启用 Face ID,这些步骤现在将在登录期间包含。
设置密码 启用 Face ID
* **验证**:引导流程中已添加完成验证的提示,鼓励客户验证身份、进行首次充值并更快开始交易。 完成验证 **一键访问交易** 客户现在可以通过在应用中从其账户点击**交易**来访问 MT4、MT5 和 cTrader 交易终端,使交易更加便捷。要启用此功能,请在 B2CORE Back Office 中导航至**产品** > **平台**后,在平台详情中指定**Web 终端 URL**(详情请参阅[如何从 B2CORE UI 和移动应用启用一键访问网页交易终端](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals))。 账户卡片上的交易按钮 *** ### 2024 年 12 月 [#december-2024] **v1.27 (iOS)** 此版本包括: * **使用密码增强安全性** 现在可在注册或登录期间设置密码,以确保更高的应用安全性。 * **可选生物识别认证** 已引入 Face ID 或 Touch ID 等生物识别选项,作为快速安全访问的额外安全层。 * **支持 Amplitude 分析** 应用现已支持 Amplitude 平台,使您能够获取有关客户在应用内操作的分析数据。请联系您的客户经理,以获取设置和使用 Amplitude 分析的协助。 * 错误修复和改进,涉及应用界面的显示和可用性,以带来更无缝的用户体验。 *** ### v1.26 (iOS) [#v126-ios] * 此版本带来内部增强和幕后修复,以提升应用性能并改善用户体验。 *** ### v1.25 (iOS) [#v125-ios] 此版本包括: * **重新设计的充值部分** 可通过**服务** > **金融**访问的**充值**部分已重新设计,以带来更顺畅的充值体验。您现在可以轻松选择钱包和充值币种,然后选择一种支持的支付方式。选择后,您将收到充值地址,或可输入银行详情以完成交易。 此外,在充值前,您可以查看当前汇率,并在**参考金额**部分根据该汇率计算预计金额。 * 应用性能已增强,以提供更快、更无缝的体验。 *** ### v1.24 (iOS) [#v124-ios] 此版本包括: * **应用服务** 我们很高兴推出新的应用服务功能,使您能够更轻松地查找支持的服务,例如交易、金融、HelpDesk、IB 等,并了解即将提供的功能。此功能使您能够: * 直接从首页访问服务 * 搜索所需服务 * 点击服务磁贴以快速导航至所需服务。 * **集成 Zendesk** 已集成 Zendesk 客户支持平台,提供工单、在线聊天和 AI 工具。点击 HelpDesk 按钮可从应用导航至 Zendesk 界面,无需任何额外授权。 * **增强 IB Room** IB Room 的增强包括有关客户和奖励的详细信息,使您能够: * 查看使用您的推荐链接注册的 Direct IB 和 Sub-IB 客户列表。对于每位客户,您可以查看其总交易量和您获得的奖励金额详情。 * 查看支付到您钱包的奖励列表,并导航至奖励详情。 * **密码验证** 设置新密码时,现在会验证其是否符合安全标准,以确保满足所需长度和必要字符要求。 * 错误修复和改进,带来更完善、更友好的交互体验。 *** ### v1.23 (iOS) [#v123-ios] 此版本包括: * **集成 B2TRADER Brokerage Platform** 随着此版本发布,我们非常高兴地宣布集成 B2TRADER Brokerage Platform,为您提供全面的交易体验: * 单点登录:登录应用并导航至 BBP 平台,无需额外授权。 * 包含详细余额的账户列表:通过全面查看账户余额来掌控资金。创建和重命名账户,使资金井然有序。 * 资产余额页面:查看资产详情,包括可用资金和冻结资金金额,并可选择隐藏零余额资产。 * 订单簿和价格图表:监控交易数据并作出买卖决策,可快速访问下单页面。 * K 线图和折线图:在图表类型之间切换并滚动查看历史数值。 * 限价和市价订单:使用所有支持的有效期设置下达限价和市价订单(市价:IOC、FOK;限价:IOC、FOK、GTC、GTD、Day)。 * 订单列表:访问未成交订单和历史订单列表,轻松导航至订单参数和详情,并提供快速取消或重复订单的选项。 * **重新设计的仪表板** 重新设计的仪表板提供以下增强功能: * **新小组件**:使用总余额、最近交易、收藏交易账户(现在仅显示已收藏的 MT4 和 MT5 账户)和 IB 计划等新小组件。 * **组织仪表板**:根据您的偏好,通过拖放小组件轻松组织仪表板。 * **支持横幅**:仪表板现在可以显示横幅。 * **个人资料信息**:现在可在仪表板顶部查看您的个人资料名称和图片。 * **快速导航至 HelpDesk**:如支持,可点击顶部栏中的按钮快速访问 HelpDesk。 * **Apple store 信息**:现在可以在下载前查看最新应用版本的新功能。 * 错误修复和改进,提供更顺畅、更精简的用户体验。 *** ### v1.22 (iOS) [#v122-ios] 此版本包括: * **集成 CentroID** 已添加对 CentroID 的支持,提供与各种交易平台和流动性来源的连接。现在您可以添加 CentroID 保证金账户,并在这些账户上进行交易。 * **Introducing Brokers (IB)** 个人资料菜单中现已提供 IB Room 选项。使用它可注册成为推荐计划合作伙伴并创建您的专属推荐链接。吸引新交易者,根据您新推荐客户的交易活动赚取奖励,并使用 IB Room 仪表板跟踪计划表现。 * 错误修复和改进,以确保更无缝、更高效的用户体验。
### 2025 年 12 月 [#december-2025-1] **v2.9.0 (Android)** 此版本包括: * **通过 B2TRANSLATE 支持应用多语言** 应用现已通过 [B2TRANSLATE](https://docs.b2translate.b2broker.com/) 支持 **14 种语言**的本地化。主要优势包括: * 在应用中提供与 B2CORE UI 相同的语言选项。 * 通过 B2TRANSLATE 自定义每种支持语言的翻译。 * 使用单一工具 B2TRANSLATE 同时维护应用和 B2CORE UI 的翻译。 * 通过消除语言障碍提升可扩展性和客户满意度。 集成功能已部署,但仍需将支持语言的翻译添加到 B2TRANSLATE。完成此流程后,完整本地化功能即可使用。 * **优化总余额计算** 应用**仪表板**中显示的总余额现在会反映所有钱包和交易账户的合并余额,并与 B2CORE Web 中显示的总额完全一致。 * **交易详情中的拒绝原因** 对于被管理员拒绝的交易,拒绝原因现在会在交易详情中清晰显示。 拒绝原因 * **支持跟单交易、PAMM 和 MAM** 应用现已通过网页视图支持来自 **B2COPY** 的跟单交易、PAMM 和 MAM 功能。这使客户能够通过**服务**部分直接从应用访问这些服务。 * **通过 B2BINPAY V3 和 Coinsbuy V3 充值的静态支付详情** 通过 **API V3** 连接时,应用现已支持通过 **B2BINPAY** 和 **Coinsbuy** 充值的**静态支付详情**。借助静态支付详情,客户可以直接在应用中生成一个或多个特定区块链的充值地址。这些地址将保存供日后使用,并可用于后续充值。 此外,通过 **B2BINPAY V3** 和 **Coinsbuy V3** 的加密货币充值流程已得到改进,提供清晰的**费用明细**和**参考金额**显示,从而带来更好的透明度和更顺畅的充值体验。 * **支付表单全面集成 B2TRANSLATE** 应用中的支付表单现已全面集成 [B2TRANSLATE](https://docs.b2translate.b2broker.com/)(原 Weblate)。现在可通过 B2TRANSLATE 自定义并将 PSS 连接的充值和提现方式的动态表单所有组件标签以及验证错误消息翻译为多种语言。 * 错误修复和改进,以确保更无缝、更高效的用户体验。 *** ### 2025 年 9 月 [#september-2025-1] **v2.8.0 (Android)** 此版本包括: * **Google Play 应用部署** 现在可将您的应用部署并发布到 **Google Play**,使客户能够轻松从商店直接下载、安装并接收未来更新。 * **应用现已支持 PSS 充值和提现方式** 通过 Back Office 中的 [支付系统服务 (PSS)](../integrations/payment-systems#payment-system-service-pss) 配置的提现方式现已可在应用中使用。这完成了对先前已集成的**充值方式**以及通过 PSS 连接的**提现方式**的支持。
Ar Ch
* **完整个人资料信息** 应用中的**个人资料** > **个人资料**信息部分现在与 B2CORE UI 完全一致,并新增了**姓名**、**电子邮件**、**出生日期**、**国家/地区**、**电话**、**客户 ID**和**昵称**字段。敏感数据默认隐藏,可点击显示;而**昵称**可直接在应用中更新。 个人资料信息 * **增强安全性的设备管理** 在**个人资料** > **安全**中,新增了**设备管理**部分。它显示有关用于登录其个人资料的设备、IP 地址和位置的日志数据,并允许客户直接从应用终止当前活跃会话。这使客户可以更好地控制会话,并有助于防止未经授权的访问。
设备管理 设备详情 终止会话
* **使用 Google Authenticator 简化 2FA 设置** 通过 **Google Authenticator** 应用启用 2FA 的流程已简化,步骤更少且流程更直观。 2FA 设置 * 修复和优化,以确保稳定性能和可靠性。 *** ### 2025 年 8 月 [#august-2025] **v2.7.0 (Android)** 此版本包括: * **反馈表单** 用户现在可以直接在应用中分享体验。反馈表单会在多次启动应用后或进行任何金融操作时自动显示,允许快速给出正面或负面评分,并可选择添加评论。也可随时通过**个人资料**菜单提交反馈。
反馈表单 提现后的反馈
* **UI 改进** 应用外观已得到增强,带来视觉上更简洁、更精致的体验,包含焕新的部分和改进的小组件布局: * UI 元素采用更圆润的设计 * 焕新的**总余额**和**IB**部分 * 改进的**最近交易**和**钱包**小组件布局。 仪表板 * 提升性能和稳定性,带来更快、更可靠的体验。 *** ### 2025 年 6 月 [#june-2025-1] **v2.6.0 (Android)** 此版本包括: * **应用现已支持通过 PSS 配置的充值方式** 通过 Back Office 中的 [支付系统服务 (PSS)](../integrations/payment-systems#payment-system-service-pss) 配置的充值方式现已可供用户直接在应用中使用。 请注意,应用暂不支持通过 PSS 的提现方式。 * **应用现已支持奖励金** 用户现在可以直接在应用中查看和订阅 **MT4/5** 和 **cTrader** 上的奖励金计划。如果用户没有合适的交易账户,可在订阅过程中创建所需账户。 满足计划要求后,奖励金额将记入用户余额并可用于提现。
奖励金计划 活跃奖励金计划 订阅奖励金计划
* **服务:所有主要功能集中一处** 应用中新增了**服务**部分,为用户提供对所有可用服务和功能的集中访问。每项服务均以磁贴形式呈现,并重定向至相应菜单。可通过拖放轻松重新排列磁贴。 服务 * **支持服务中的自定义磁贴** 可将自定义磁贴添加至**服务**部分,以将用户链接到支持您业务的第三方服务或外部资源。必须在**Back Office**中进行配置,并指定磁贴名称和重定向 URL。配置完成后,自定义磁贴将显示在应用的**服务**下。 在 Back Office 中,配置自定义菜单链接的选项将随 [2025 年 6 月发布版本](release-notes#july-2-2025)提供。 * **通过 SumSub 进行应用内验证** 现已支持直接在应用内通过 **SumSub** 完成完整验证流程,无需外部重定向。这种精简体验使引导期间的 KYC 流程更快、更直观。 * **用于跟踪提现的区块链浏览器链接** 用户现在可以直接从应用中轻松跟踪区块链上的**提现交易**。加密货币钱包包含一个指向 `https://www.blockchain.com/explorer` 的链接,仅适用于 Bitcoin、Ethereum 和 Bitcoin Cash 的提现。这简化了交易监控并增强透明度。 区块链浏览器链接 * 优化整体应用性能,提供更快、更稳定、更灵敏的用户体验。 *** ### 2025 年 5 月 [#may-2025] **v2.5.0 (Android)** 此版本包括: 性能优化和错误修复,以改善整体用户体验。 *** ### 2025 年 4 月 [#april-2025] **v2.4.0 (Android)** 此版本包括: **焕新的注册和引导流程** * **应用预览**:在进入**注册**或**登录**表单前,客户现在会看到简要引导,通过多个页面重点介绍应用的主要功能。这从一开始就提升了用户旅程,并鼓励更快注册。
灵活充值 所有钱包集中一处 所有账户操作 轻松跟踪每个钱包
* **改进设计**:**注册**和**登录**表单已重新设计,以提供更顺畅、更直观的用户体验。
登录 注册
* **增强安全性**:为更快速、更安全地访问应用,现会在引导期间提示客户使用指纹启用生物识别认证。 如果客户此前未设置指纹认证,此步骤将在登录期间包含。 启用后,也可使用指纹在应用中确认付款。客户可随时在**个人资料** > **设置**中管理此功能。
启用指纹认证 使用指纹确认付款
* **验证**:引导流程现包含额外的**验证步骤**,鼓励客户在注册后立即完成 KYC。此改进简化了流程,使客户能够访问完整功能、进行首次充值并更快开始交易。 完成验证 * 应用已优化,可提供更快、更稳定、更灵敏的体验。 *** ### 2025 年 3 月 [#march-2025-1] **v2.3.0 (Android)** 此版本包括: * **内部转账** 应用现已支持内部转账,客户可通过指定收款人的**客户 ID**和**账户 ID**,向同一经纪商内的其他客户转账。资金即时到账且不收取佣金。 应用内内部转账 * **通过提现地址白名单增强安全性** 通过在**安全**部分启用**提现白名单**选项并添加受信任的提现地址来保护您的提现。启用后,资金只能提现至指定地址,从而防止未经授权的交易。 应用中的提现白名单 * **一键访问交易** 客户现在可以通过在应用中从其账户点击**交易**来访问 MT4、MT5 和 cTrader 交易终端,使交易更加便捷。要启用此功能,请在 B2CORE Back Office 中导航至**产品** > **平台**后,在平台详情中指定**Web 终端 URL**(详情请参阅[如何从 B2CORE UI 和移动应用启用一键访问网页交易终端](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals))。 账户卡片上的交易按钮 *** ### 2024 年 12 月 [#december-2024-1] **v2.2.0 (Android)** 此版本包括: * **Introducing Brokers (IB)** 应用现已支持 IB 功能,使管理您的推荐活动更加轻松。通过此更新,您可以: * **探索并加入 IB 计划**:使用**首页**页面上的**IB 计划**小组件查看所有可用 IB 计划并加入新计划。 * **IB 客户**:查看按不同层级组织的推荐客户列表。 * **跟踪 IB 奖励**:监控您获得的奖励并查看付款详情。此外,您可以跟踪 IB 钱包余额并直接从应用提现。 * **自定义 IB 推荐链接**:在**高级链接**部分配置每个计划的推荐链接参数,以优化推荐策略。 * **交易账户增强功能** 应用现在提供更多 MT4/5 和 cTrader 账户选项,包括: * **基本账户参数**:直接在账户详情中查看余额、净值、可用资金、信用和杠杆等参数。 * **净值图表**:使用现已适用于每日、每周和每月周期的净值图表分析账户表现。 * **扩展交易数据**:通过**挂单**、**未平仓头寸**和**交易历史**标签访问更详细的交易数据。 * 归档交易账户的功能。 * 重命名账户以便更好组织的功能。 * 错误修复和界面改进,带来更无缝、更友好的体验。 *** ### 2024 年 11 月 [#november-2024] **v2.1.0 (Android)** 此版本包括: * **支持兑换** 现在可在**金融**部分访问兑换功能,使您能够在不同币种之间转换,包括法币兑换加密货币及反向兑换。进行兑换时,您可以查看实时汇率并根据需要刷新,以掌握交易的最新汇率。 * **集成 Zendesk** 通过集成 Zendesk 客户支持,您现在可以直接从应用的**个人资料菜单**轻松创建、提交和跟踪支持工单。 要在应用中使用 Zendesk,必须在 Back Office 中设置 Zendesk 配置。这包括建立到 Zendesk 的外部连接,以及在此前使用 SupportPal 的情况下遵循[从 SupportPal 切换到 Zendesk](../how-to-articles/manage-system-settings/how-to-switch-from-supportpal-to-zendesk)的步骤。 * **收藏钱包** 现在可以在应用中将钱包添加到收藏,以便更轻松地组织和快速访问钱包。 * **更多交易账户选项** 现在可在账户详情中使用重命名和归档交易账户的选项,从而为您的账户管理提供更大灵活性。 * 已实施错误修复和性能增强,以提供更顺畅、更灵敏的用户体验。 *** ### 2024 年 10 月 [#october-2024] **v2.0.0 (Android)** 此版本包括: * **支持 MT4/5 和 cTrader 账户** 现在您可以在应用中开设模拟和真实 MT4/5 及 cTrader 账户、向账户充值和从账户提现,并实时监控账户交易参数,例如余额、净值、信用和可用保证金。 * **新增交易历史部分** 在新的交易历史部分查看完整的充值、提现和转账历史,以及每笔交易的详细信息。 * **用于个人资料安全的密码更改** 为便于您确保个人资料安全,安全部分现在包含更改个人资料密码的选项。 * **使用 QR 码登录 B2CORE UI** 现在可以使用您已登录的应用扫描 B2CORE UI **登录**页面上的 QR 码,无需输入凭据即可访问。 *** ### 2024 年 9 月 [#september-2024] **v1.0.0 (Android)** 我们很高兴宣布发布适用于 Android 的 B2CORE 应用,您可以将其作为自己的品牌应用启动。这使您能够为客户提供访问 B2CORE 功能的额外平台。 **应用下载** 目前,Android 应用可通过 APK 文件下载和安装。要使 APK 可从您的 B2CORE UI 下载,请参阅[如何配置移动应用下载设置](../how-to-articles/manage-system-settings/how-to-configure-settings-for-mobile-app-downloads)。 此版本包括: * **注册** 可通过在开始页面点击注册选项,在应用中完成注册。 * **仪表板** 登录应用后将显示仪表板,其中包含总余额、最近交易和钱包小组件,顶部显示横幅。 * **个人资料菜单** 通过点击屏幕左上角访问,个人资料菜单使您能够: * 上传个人资料照片 * 查看当前验证等级并完成 KYC 验证以达到更高级别 * 访问安全设置,例如通过 Google Authenticator 或 SMS 的 2FA、反钓鱼代码等 * 显示应用版本以及指向额外资源的自定义链接列表。 * **钱包** 显示您的钱包列表,并分为加密货币和法币类别。顶部显示所有钱包折算为 USD 的预计总额。您可从此部分充值、提现和转账。 点击钱包后,可以查看详细信息,包括可用余额、冻结金额和交易历史。 * **金融** 此部分用于充值、提现和转账。每种交易类型下均显示最近交易,使您可以基于先前交易通过预填字段快速发起新交易。 * **交易** 此部分支持 B2TRADER Spot Brokerage Platform,提供对其广泛交易特性和功能的访问。
## 2026 年 8 月 31 日 [#august-31-2026] ### 新功能 [#new-features] #### 客户标签 [#client-labels] B2CORE 现已支持**客户标签**——客户记录上的简短彩色标记,可在后台办公室中轻松识别和筛选客户群组。系统标签由 B2CORE 自动分配并保持最新状态:**Deposited** 标签标记至少成功入金过一次的客户,另有独立标签用于标记介绍经纪商合作伙伴及其客户。此外,经纪商可以创建自己的自定义标签,并手动逐个或批量将其分配给客户。 标签会显示在客户表格视图和客户卡片中,也会包含在客户导出中,并可用作**拥有所有标签**和**不拥有任何标签**筛选条件。标签仅对后台办公室用户可见,客户永远不会看到它们。 有关详细信息,请参阅[客户标签](../back-office-guide/system/client-labels)。 #### 国家封锁名单 [#country-blocklist] 经纪商现在可以按国家/地区阻止访问 B2CORE UI。系统会根据访问者的 IP 地址检测其所在国家/地区;如果该国家/地区位于封锁名单中,访问者将完全无法使用 B2CORE UI:他们不会看到登录或注册表单,而是会看到全屏的**访问被阻止**页面。与注册配置文件中的国家黑名单不同,后者仅会在注册表单中隐藏国家/地区,而国家封锁名单会完全阻止访问平台,帮助经纪商在其获许可的市场范围内开展业务。 #### 系统汇率提供商 [#system-rate-provider] B2CORE 现已包含由 B2Broker 汇率服务支持的内置 **System** 汇率提供商。经纪商不再需要仅为了获取汇率而设置和维护与 B2BINPAY、Fixer 或 CoinGecko 等外部提供商的连接:System 提供商无需任何凭据,开箱即用。 ### B2CORE UI 更新 [#b2core-ui-updates] * 在加密货币**提现**表单中,金额限额现在会与所选的**区块链网络**相匹配,而非显示整个币种的单一限额。 * 即使钱包币种没有可用汇率,现在也会显示**钱包卡片**,以便客户始终可以看到钱包及其余额。 * 在旧版银行入金详情中,复制单个收款信息时现在仅复制**其值**而不包含标签,因此复制的数据可以直接粘贴到银行应用中。 ### 支付系统更新 [#payment-system-updates] * **XTC Pay** 现已通过 **PSS** 集成,同时支持入金和提现。 * 对于 **Ozow**,入金方式配置中新增了 **Verified ID flow** 选项。启用后,客户已验证的证件号码——在注册表单中作为自定义字段收集——会以只读值显示在入金表单中,并随付款一同传递给 Ozow,以便提供商将付款与付款人的已验证身份进行匹配。该选项默认禁用;如果客户资料中缺少证件号码,则不会发起入金。 * 对于 **BridgerPay**,卡片提现中新增了 **Hide CVV field** 选项,适用于提供商不要求 CVV 的配置。 * 对于 **Skrill**,现已支持 **ZAR** 入金和提现。 * 对于 **KoraPay**,移动支付提现现已支持 **EGP** 和**埃及**。 ### 改进 [#improvements] * B2CORE UI 中的**菜单项**现在可以通过更多方式进行限制。除验证等级和客户类型外,还可以根据客户的 **IB 上级**或**国家/地区和司法管辖区**显示或隐藏菜单项,使用与产品相同的限制机制。现有的限制会自动迁移并保持当前行为。 * 面向介绍经纪商的 CPA 支付计划现已支持将**交易活动**作为独立条件,因此奖励可以完全基于交易量,无需强制要求入金条件。仍必须至少设置一项交易条件。 * 在**邮件** > **系统** > **队列**中,投递失败的电子邮件现在可以通过新的 **requeue** 操作手动再次发送。当 B2CORE 因邮件提供商端错误而停止自动重试时,此功能将非常有用。 * 账户表格视图及其导出中新增了**已归档**筛选条件,可更轻松地区分活跃账户和已归档账户。属于已移除交易平台的账户现在也可以显示,而不再从列表中消失。 * 对于介绍经纪商,**客户入金**和**客户提现**表格视图现在会显示客户名称和电子邮件,而非仅显示客户 ID。此外,对冲交易不再为以零利润平仓的那一侧生成奖励——可根据经纪商请求启用此行为。 * 对于 **Intercom**,经纪商现在可以选择使用客户的 **ID** 或**电子邮件**作为 Intercom 用户标识符,并可向其添加**前缀**。当多个系统共享同一个 Intercom 工作区时,该前缀可防止标识符冲突。 * 另外三类事务性电子邮件——**交易账户归档请求**、**客户验证请求**和**客户转账请求**——已迁移至新的电子邮件模板引擎。 * 客户请求现在会存储请求发送时使用的 **IP 地址**,并在旁边显示为该地址检测到的国家/地区,从而在后台办公室用户审核请求时提供更多背景信息。 * 后台办公室 API 现已支持添加和删除客户**电话号码**,IB 版本页面还会额外报告 IB 微服务的版本。 * B2CORE UI 的多项性能已得到改进:菜单现已缓存,账户、入金和出金方式、小组件、横幅、产品币种和资料数据的加载速度均有所提升。在 B2COPY 方面,发件箱处理已得到优化,过时记录现在会自动清理。 ### 已解决的问题 [#resolved-issues] * 在 IB Room 中,快速切换报告不再导致之前打开的报告筛选条件仍被保留。 * 在**绩效概览**小组件中,更改筛选条件后 KPI 磁贴和图表现在会同时更新,不再出现小组件似乎卡住的情况。 * 后台办公室中的 **IB 类型**选择器不再限制为 1000 个群组。它们现在在服务器端搜索,因此无论经纪商拥有多少 IB 类型,都可以找到。 * 在 IB 模块中重命名**平台群组**时,不再因先前删除的群组而出现唯一性错误导致失败。 * IB 奖励金额现在会根据交易的佣金和单个隔夜利息值计算。此前隔夜利息被重复计算,而佣金被忽略。 * 已归档或已删除交易账户不再导致 IB 奖励被跳过。是否支付奖励现在仅取决于账户的**Disabled**状态。 ## 2026 年 7 月 31 日 [#july-31-2026] ### 新功能 [#new-features-1] #### 客户自定义字段 [#client-custom-fields] 经纪商现在无需开发人员参与,即可在后台办公室中为客户记录定义自己的**自定义字段**。可以创建不同类型的字段——文本、电子邮件、电话、数字、日期、下拉菜单和多选——并将其组织为分组和进行翻译,以便每个经纪商都能准确收集其流程所需的客户数据。客户卡片中新增的**自定义字段**选项卡允许后台办公室用户查看和编辑特定客户的已存储值。 有关详细信息,请参阅[自定义字段](../back-office-guide/system/custom-fields)和[自定义字段选项卡](../back-office-guide/clients/general/custom-fields-tab)。 #### 新注册设置 [#new-registration-settings] **系统** > **注册**中的新**注册设置**现已可用,并将替代旧版注册向导。注册配置文件可直接在后台办公室中配置——包括字段、注册选项、条款与条件以及自定义字段——使经纪商更容易设置注册流程,客户也更容易完成注册。结合自定义字段,一个配置文件可以涵盖从仅包含电子邮件地址和密码的单页表单,到多步骤引导流程的各种场景。 未来几个版本中,所有经纪商都将从注册向导迁移至注册配置文件。如果您使用 B2CORE 移动应用,请暂时保持现有注册向导启用:旧版本应用中的客户仍依赖于它们。有关详细信息,请参阅[如何迁移至新的注册设置](../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings)和[注册](../back-office-guide/system/registration)。 #### 面向介绍经纪商的储蓄返佣 [#savings-rebates-for-introducing-brokers] 除 CPA 之外,介绍经纪商现已可使用新的 **Savings** 返佣计划类型。它不奖励交易活动,而是在合作伙伴的客户投资储蓄计划时向合作伙伴支付奖励,多级奖励会沿 IB 链路分配,付款则每天自动处理。与 CPA 计划一样,Savings 计划可在后台办公室中关联至合作伙伴计划,合作伙伴可通过专用小组件和报告在 IB Room 中跟踪其储蓄返佣。 #### CPA 计划的入金层级和交易条件 [#deposit-tiers-and-trading-conditions-for-cpa-programs] CPA 计划现在支持更精确的奖励规则。最低入金条件可拆分为多个**层级**,新的 **Deposit Measure** 选项定义了应根据哪个金额进行检查——**Gross**(所有客户入金之和,与此前相同)或 **FTD**(仅首笔入金)。此外,支付入金奖励之前可要求满足可选的**交易门槛**:交易笔数、最低持仓时长、每个交易品种组的手数交易量或名义交易量,并可选择排除对冲持仓。现有计划将保持当前行为——不带门槛的 Gross——直到经纪商选择启用新功能。 #### 新 IB Room 小组件和报告 [#new-ib-room-widgets-and-reports] IB Room 仪表板新增了小组件和报告,为合作伙伴提供更清晰的客户群和奖励概览: * **NET 入金汇总**——所选期间的总入金、提现和净入金,以及相较于上一期间的变化。 * **NET 入金顶级客户**——按净入金计算的合作伙伴顶级客户,可点击跳转至完整的 **NET 入金**报告。 * **绩效概览**和**顶级客户**——关键合作伙伴绩效指标及最有价值的客户,可作为小组件和报告使用。 * **交易**和**按交易品种划分的奖励**——两者现已成为默认 IB Room 仪表板布局的一部分。 相应的后台办公室 API 和 IB API 端点为这些小组件提供支持,因此集成商也可以使用相同的数据。 #### 后台办公室中的状态检查 [#status-checks-in-the-back-office] B2CORE 现在会按计划对经纪商配置运行自动化的**状态检查**,并在后台办公室中报告结果。检查涵盖实盘和模拟交易平台的连接、视觉自定义以及注册可用性。当检查失败时,顶部栏中的客户请求图标旁会显示警告指示器;专门的状态页面则会以时间线形式展示每项检查的历史记录,从而更容易及早发现和调查配置或连接问题。 #### 新 PS 集成 [#new-ps-integrations] **Skrill**(Paysafe 的一部分)现已通过 **PSS** 集成,同时支持入金和提现。新的基于 PSS 的连接取代了旧版 Skrill 集成。 ### B2CORE UI 更新 [#b2core-ui-updates-1] * 经纪商的**徽标**现在可以显示在 B2CORE UI 的加载屏幕上,而非通用的加载条,从第一个页面开始保持品牌体验。该选项默认禁用。 * 较长的菜单项标签现在会换行显示为**多行**,而非被截断,因此翻译后的菜单名称或描述性菜单名称仍可完整阅读。 * 客户登录后显示的**通行密钥**提示现在可以为暂时不希望推广免密码登录的经纪商禁用。 * 简化注册流程的 **ID 现已包含在 URL 中**,因此可以分享特定注册流程的直接链接。 * 在验证步骤中,请求处理期间**下一步**按钮现在会显示加载指示器;如果提交的数据无法处理,消息提示条会说明原因。 ### 支付系统更新 [#payment-system-updates-1] * 对于 **UniPayment**,现已支持 **INR** 入金。 * 对于 **PayRetailers**,提现现已支持**尼日利亚**,并且可为每个国家/地区配置多种货币。 * 对于 **BridgerPay**,名字和姓氏字段现已新增可配置验证规则,减少因不受支持的姓名格式而被提供商拒绝的出金。 * 对于 **B2BINPAY** 和 **Coinsbuy**,提现表单已简化——字段组名称不再显示在字段上方。 * 对于加密货币入金,现已支持在客户入金钱包中设置自定义**区块链标签**,并在后台办公室中显示,使地址所属网络更加清晰。 * 随着币种品牌重塑,**TON** 现在在整个 B2CORE 中显示为 **GRAM**。 ### 改进 [#improvements-1] * 客户的**资料修改请求**现在会在不重置客户 KYC 验证的情况下处理。更新资料数据的客户会保留其验证等级和已完成的验证步骤,无需再次通过 KYC。 * 客户**营销数据**已扩展:其余营销字段已添加至客户记录,广告平台的点击标识符——**Google Ads**、**Cointraffic**、**Bitmedia** 和 **Impact.com**——现已被捕获,以便经纪商将转化归因于产生这些转化的营销活动。 * 对于 **Adjust**,注册、KYC 和入金事件现在通过 Adjust S2S API 以服务器到服务器方式发送,使转化跟踪不再依赖客户的设备和浏览器。 * 对于 **RudderStack**,后端事件现在还会包含客户的**电子邮件**、**电话**和所使用的**支付方式**,从而支持更精确的细分和营销活动分析。 * 简化注册配置中新增了**国家黑名单**。黑名单国家/地区会从注册流程中的所有国家/地区选择器中隐藏,帮助经纪商在其获许可的市场范围内开展业务。 * 在**客户** > **请求**中,表格视图和导出中新增了**方式**筛选条件,且**方式**列现在会针对所有状态的请求显示,而不再仅针对已处理请求显示。 * 客户**标签**现已包含在入金导出中,客户提现钱包表格视图中新增了包含创建时间的**日期**列。 * 当无法创建交易账户时返回的错误不再暴露内部交易平台详细信息,例如平台群组名称。 * 另外两类事务性电子邮件——**管理员 2FA 确认代码**和**管理员访问权限已授予**通知——已迁移至新的电子邮件模板引擎;管理员凭据电子邮件中的生成密码现在也更易于复制。如果经纪商不希望发送,一些新的电子邮件模板也可以禁用。 * 多个方面的性能已得到改善:IB 类型(群组)导出现通过异步导出管道运行,余额缓存预热已集中化并从导出和报告中移除,从而显著加快**财务**报告;批量操作处理大型 CSV 文件时也不再耗尽内存。 * 对于介绍经纪商,平台数据流已得到强化:断连更少、不会遗漏交易,且交易平台与 IB 模块之间的延迟更低。将新平台添加到 IB 模块时,缓存实体的初始同步现在会自动开始,无需手动触发。 * 在 IB API 中,交易品种端点现在会返回与每个交易品种关联的**支付计划**,并可按计划筛选,因此可通过一次调用获取某个交易品种的计划。 * 生产构建的浏览器控制台现在会显示自我 XSS 警告,阻止客户粘贴从第三方收到的代码。 ### 已解决的问题 [#resolved-issues-1] * 对于 **SumSub**,重复申请人不再中断验证结果的处理。验证决策现在会应用于正确的客户,而不再丢失。 * 批量操作任务在处理大型 CSV 文件时不再卡在 **New** 状态。 * 现在无法将电子邮件模板配置为扩展自身,此前这可能耗尽可用内存并导致客户账户端点不可用。 * 在**转账**页面上,当**目标**账户的币种不再与所选**来源**账户匹配时,目标账户现在会被重置,从而防止无效的转账组合。 * 提现:失败尝试后,幂等键现在会重新生成,因此修正后的请求不再被视为重复请求而遭拒绝。 * 验证等级更改后,客户菜单现在会立即重建,无需手动刷新页面。 * 对于 **PayRetailers** 入金,支付方式选择器现在仅显示为该入金方式配置的方法,而不再显示所有可用方法。 * IB Room 仪表板的默认日期范围现在会规范化至每日边界,因此报告和小组件不再加载不完整的当天数据。 * 区块链已禁用的币种不再显示在入金和提现方式选择器中。 * 在细粒度权限拆分后,现在可以再次从交易品种页面创建和编辑支付计划。 ## 2026 年 6 月 30 日 [#june-30-2026] ### 新功能 [#new-features-2] #### 按区块链设置加密货币入金和提现佣金 [#per-blockchain-crypto-deposit-and-withdrawal-commissions] 对于 **B2BINPAY** 和 **Coinsbuy**,经纪商现在可以针对每个区块链网络分别配置限额和佣金(例如 USDT 的 ERC-20 与 TRC-20),而非针对每种币种使用统一费率。客户可选择其网络,并在确认前查看准确费用以及预计到账或出金金额,使经纪商能够准确计价网络成本,并让客户预先清楚了解全部费用。 #### 面向介绍经纪商的 CPA 计划 [#cpa-programs-for-introducing-brokers] B2CORE 现在支持面向介绍经纪商的 \*\*CPA(按获客成本)\*\*计划和支付计划,使经纪商能够设置灵活、基于规则的合作伙伴报酬,而不再采用一刀切的模式。CPA 计划现在直接关联至合作伙伴计划,因此合作伙伴加入附带 CPA 的计划后即可自动获得奖励——无需手动针对每个推荐链接进行设置,并减少配置错误。新的 API 端点为合作伙伴的 CPA 小组件和报告提供支持。 #### B2TRADER Web 终端访问 [#b2trader-web-terminal-access] 经纪商现在可以为 B2TRADER 平台配置 **Web 终端 URL**,与其他平台相同,使客户能够直接从客户门户一键访问交易终端。 #### IB 交易对账流程 [#ib-trades-reconcile-process] 交易同步流程中新增了更轻量级的**对账**选项。它仅重新发送未能成功传递的交易,而非重新同步全部数据,使经纪商能够在服务中断后以更快、更安全的方式弥补数据缺口,且不会受到完整重新同步的影响。 ### B2CORE UI 更新 [#b2core-ui-updates-2] * 注册期间,**国家/地区**字段现在会根据访问者检测到的位置自动预填,减少新客户的手动输入。 * 客户门户现在会从浏览器检测界面**语言**,因此新访问者从一开始便会以熟悉的语言看到门户。 * 简化注册表单现在被拆分为**多个页面**,使更长的注册流程更易完成。 * 现在可为经纪商配置中尚不可用的功能显示\*\*“即将推出”\*\*屏幕。 ### 支付系统更新 [#payment-system-updates-2] * **Volet** 现已默认向所有经纪商提供。 * 对于 **B2BINPAY** 和 **Coinsbuy**,现已支持入金地址目标地址,并可在支付详情中显示自定义**区块链标签**,使客户更容易理解加密货币入金。 * 对于 **Flutterwave**,经纪商现在可通过新的配置选项选择使用结算金额还是扣款金额作为交易金额。 * CoinsBuy V3 汇率提供商新增了**测试连接**操作,因此经纪商可以直接在后台办公室中验证集成。 ### 改进 [#improvements-2] * **IB 限制**现已应用于入金和出金方式,因此合作伙伴及其客户仅能看到可供其使用的支付选项。 * **后台办公室仪表板**现已支持筛选,包括按客户类型、司法管辖区和国家/地区筛选,从而更容易专注于特定细分群体。 * 支付配置中方式和操作网格之间的导航已得到改进,可加快后台办公室操作。 * 支付系统配置现在会显示密钥字段的**指纹和脱敏预览**,因此操作人员可确认存储的是哪项凭据,而不会暴露其内容。 * 手动设置的客户**司法管辖区**现在会被锁定,不会被基于国家/地区的自动映射覆盖,并提供明确指示以及便捷的解除锁定方式。 * **法币**的精度现已无法编辑,防止意外错误配置。 * 更改客户的**电子邮件**现在会将更新同步至 B2TRADER,确保平台记录保持一致。 * 对于 **cTrader**,产品币种现在会根据 cBroker 的入金资产进行筛选,因此仅提供相关币种。 * 新的后台办公室 API 端点允许集成商写入客户**营销数据**,新的 `/api/v2/countries` 端点则返回国家/地区列表。 * 数据导出、入金和出金列表、客户 API、IB 支付表格以及大型 CSV 导入的性能均已提升,使这些操作在大规模场景下更快、更可靠。 ### 已弃用的功能 [#deprecated-functionality] * 旧版 **Volet** 和 **BFT365** 支付提供商集成已移除。它们已由新的基于 PSS 的连接取代。 ### 已解决的问题 [#resolved-issues-2] * 保存企业客户资料时,不再通过自动国家/地区映射覆盖手动设置的司法管辖区,从而防止客户被归入错误的监管实体。 * 交易更新端点现在接受小数佣金值。 * 对于介绍经纪商,B2TRADER 交易现在会在必要时回退使用账户币种,并且按账户计算的交易量和奖励会正确限定至当前查看的合作伙伴。 * IB 报告和账户筛选条件现在接受字母数字 ID。 * IB 支付导出预览表格现在可以水平滚动,使宽表导出更易于查看。 ## 2026 年 5 月 31 日 [#may-31-2026] ### 新功能 [#new-features-3] #### 全新的内置身份提供商 [#built-in-brand-new-identity-provider] B2CORE 现已内置自己的身份提供商。经纪商可让客户使用 **Apple**、**Google** 或任何其他符合 **OIDC** 标准的提供商注册和登录,提供更快速、更熟悉的登录体验。现也支持**通行密钥**,为客户提供安全的免密码登录方式。B2CORE 还可自行充当受信任的身份提供商,因此第三方应用和内部应用可提供“使用 B2CORE 登录”选项,并通过 OIDC 验证客户身份,无需管理单独的凭据。 迁移至新身份提供商的工作已经开始,并将在 2026 年 6 月底前完成所有经纪商的迁移。 #### B2CONNECT 集成 [#b2connect-integration] B2CORE 现已与 B2Broker 的多资产流动性和交易连接中心 **B2CONNECT** 集成。经纪商可将 B2CORE 直接连接到 B2CONNECT 作为交易平台,使其客户可以在 B2CORE 中访问由 B2CONNECT 提供支持的交易品种和流动性。 ### B2CORE UI 更新 [#b2core-ui-updates-3] * 嵌入式自定义页面(iframe 菜单项)现在会遵循客户所选的界面语言,因此第三方工具将以与门户其余部分相同的语言打开。 * 交易平台密码现在会在账户创建后向客户显示一次,使客户更容易保存需要该密码的平台凭据。适用于 MT4/MT5。 * 可以启用新的即时验证流程,在客户执行操作后立即提示其完成 KYC,帮助新注册客户更快完成验证。 ### 支付系统更新 [#payment-system-updates-3] * 出金审批流程中新增了**系统预检查**。提现现在会在处理前根据 PSS 支付层进行验证,从而降低批准后续可能被 PSP 拒绝的出金的风险。 * 对于 **B2BINPAY** 和 **Coinsbuy**,兑换现在会计算反向汇率,并且提现表单中冗余的 **Label** 字段已移除。 * 对于 **PayRetailers**,入金和提现状态变更现在通过 webhook 通知接收,使交易状态自动保持最新。 * 对于 **BridgerPay** 卡片提现,电子邮件字段现在始终为必填项,并且名字和姓氏会预填,从而减少出金失败尝试。 * 对于 **Volet** 银行卡提现,新增了额外的表单验证和持卡人地址。 ### 改进 [#improvements-3] * **幂等键**现已在 `makeDeposit` 和 `makeWithdrawal` API 端点以及后台办公室手动入金和提现表单中受支持。重试请求会安全地返回原始交易,而非创建重复交易,为集成商提供可靠的重试行为。 * 账户**自动创建规则**已重构为专用部分,提供明确的按触发条件配置选项,使经纪商能够更清晰、更细粒度地控制何时为客户自动开设交易账户。 * 对于通过 **PSS** 进行的加密货币出金,目标钱包地址现在会通过 SumSub 验证,并根据客户白名单进行校验,从而防止提现至未经授权的地址。 * 在创建兑换表单中,拥有相应权限的操作人员现在可以手动输入汇率,从而完全控制由管理员发起的兑换。 * 对于 **TradeLocker**,所有产品和币种现在均启用对冲。 * **交易**表格现已包含来源账户和目标账户编号列,账户编号现在也会显示在转账账户选择器中,从而更容易识别涉及的账户。 * 手动创建入金现在支持**发票**和**交易 ID**字段,以便更好地进行对账。 * 与 **ActiveCampaign** 和 **SendGrid** 的联系人同步现在会自动定时执行,使营销受众保持最新。 * 对于通过 **iDenfy** 进行的 KYC,在桌面端发起并在移动端继续的验证现在会通过 webhook 自动完成,从而简化移动端交接流程。 * 从 **SumSub** 接收的电话号码现在会标记为已确认,因此客户无需重新验证已在 KYC 期间完成验证的号码。 * 当缺少所需权限的用户尝试更改客户验证等级或权限时,**后台办公室**现在会清晰显示“访问被拒绝”消息。 * 通过 API 创建账户时现在可以提供平台凭据,且 `api/v2/accounts` 现在会返回 `updateTime` 并支持按其排序。 * 注册中的出生日期字段现在会将输入限制在合理的日期范围内,减少无效注册数据。 ### 已弃用的功能 [#deprecated-functionality-1] * **客户** > **服务**功能已从后台办公室中移除。 * **系统** > **本地化**部分已移除,同时移除了其所依赖的旧版语言管理功能。语言现在完全通过 B2TRANSLATE 管理。 ### 已解决的问题 [#resolved-issues-3] * 当汇率提供商不可用时,管理员发起的兑换不再以 1.0 的汇率被静默保存;操作现在会使用正确汇率。 * 对于 **cTrader**,现在使用国家/地区列表的本地副本,避免外部列表不可用时出现错误。 * **Centroid** 可用资金计算已修正。 * 审计日志小组件现在会显示某项操作的所有已更改字段。 * 已删除客户现在会从电话号码唯一性检查中排除,因此新客户可以复用已移除账户释放的号码。 * 已修复多个不正确的语言和区域设置代码及名称。 * 已修正不同时间范围内权益图的粒度。 ## 2026 年 4 月 30 日 [#april-30-2026] ### 新功能 [#new-features-4] #### 新 PS 集成 [#new-ps-integrations-1] 现已新增对以下支付系统的支持: * **Columis**——支持入金 * **Volet**——支持入金和提现 #### Intercom 帮助台集成 [#intercom-helpdesk-integration] B2CORE 现已与 **Intercom** 集成,使经纪商能够在 Web、iOS 和 Android 应用中向客户提供应用内实时聊天和支持服务。Intercom 身份验证在服务器端安全处理,因此凭据不会暴露给客户。 #### 新电子邮件模板系统 [#new-email-template-system] 现已推出重新设计的电子邮件模板系统。经纪商现在可以直接从后台办公室自定义默认事务性电子邮件——例如欢迎邮件和通知——无需开发人员参与,即可更快速地使电子邮件符合其品牌形象。所有电子邮件模板将很快迁移至此处。 #### 客户门户中的可嵌入自定义页面 [#embeddable-custom-pages-in-the-client-portal] 经纪商现在可以将自己的页面或第三方页面作为自定义菜单项直接嵌入 B2CORE 客户门户,并可选择每个菜单项在同一标签页、新标签页或嵌入式 iframe 中打开。新的身份验证端点让这些嵌入式服务能够安全识别已登录客户,无需单独登录。有关详细信息,请参阅[如何将您的应用作为 iframe 集成到 B2CORE 中](../how-to-articles/manage-system-settings/how-to-integrate-your-app-as-iframe-in-b2core)。 ### B2CORE UI 更新 [#b2core-ui-updates-4] * B2TRADER 交易账户现在提供专用且易读的**显示编号**,并会在客户门户、后台办公室和数据导出中一致显示。 * 注册页面新增了**登录按钮**,使回访客户更容易切换至登录界面。 ### 支付系统更新 [#payment-system-updates-4] * 对于 **B2BINPAY** 和 **Coinsbuy**,EUROC 稳定币现在会按更新后的 **EURC** 代码识别,确保币种正确显示和处理。 * 对于 **BridgerPay**,卡号后四位现在会存储并显示在提现支付快照中,使识别用于出金的卡片更加容易。 ### 改进 [#improvements-4] * 表单字段和支付系统配置字段现已支持**提示**,因此经纪商可在入金和提现表单中向客户显示内联指引,并减少支持请求。 * **财务**部分新增了**司法管辖区**筛选条件,帮助在多个法律实体下运营的经纪商按司法管辖区缩小财务记录范围。 * 对于通过 **SumSub** 进行的 KYC,客户提交的问卷答案现在可在后台办公室中查看。 * 更新客户**验证等级和权限**的权限现在独立于通用客户信息读取权限,因此经纪商可以独立向后台办公室用户授予或限制此功能。 * **Active Campaign** 连接现在可通过检查连接操作直接在后台办公室中测试。 * 现在可以在视觉自定义中配置 **Apple touch icon**,因此当客户将 B2CORE UI 添加至主屏幕时会显示品牌图标。 ### 已弃用的功能 [#deprecated-functionality-2] * 多个不再受支持的旧版支付提供商集成已移除,并已由基于 PSS 的连接替代。其中包括 **SticPay**、**Sqala**、**Help2Pay** 和 **KoraPay**。 ### 已解决的问题 [#resolved-issues-4] * 对于 **MT4/MT5**,客户国家/地区现在会使用每个平台自身的国家/地区字典进行映射,确保将正确的国家/地区发送至交易平台。 * 登录推送通知现在会显示易读文本,而非原始代码。 * 新创建的账户现在会在创建后立即出现在账户列表中。 * 已修复从右至左(RTL)布局中的币种图标间距。 * 提现金额验证已修正。 * **转账**导出现在会正确填充内部客户类型,并包含客户标签。 * 在**储蓄**中,“隐藏不可用计划”筛选条件现在还会隐藏客户余额不足以加入的计划。 ## 2026 年 3 月 31 日 [#march-31-2026] ### 新功能 [#new-features-5] #### 简化注册流程 [#simplified-registration-flow] 现已推出新的精简注册流程,旨在减少引导期间的阻力,并帮助新客户更快完成注册。经纪商可以通过后台办公室中的相应设置启用和配置简化流程。 ### B2CORE UI 更新 [#b2core-ui-updates-5] #### 加密货币入金计算器 [#calculator-for-crypto-deposits] B2CORE UI 的静态入金流程中新增了计算器。客户现在可以在完成入金前估算金额并查看兑换详情,使通过静态支付方式进行的入金更加清晰和可预测。 ### 支付系统更新 [#payment-system-updates-5] * 对于通过 **B2BINPAY** 和 **Coinsbuy** 进行的加密货币入金,现在会在区块链名称旁显示网络协议(例如 Ethereum (ERC-20)、BSC (BEP-20) 或 TRON (TRC-20))。这有助于客户选择正确网络,并减少入金错误。 * 对于 **KoraPay** 银行账户提现,现在可以配置目标国家/地区,因此会针对每个国家/地区显示正确的银行列表。这使得尼日利亚和南非等更多非洲市场能够使用本地银行提现。 * 对于 **BridgerPay**,入金方式现在可以配置为将结账页面直接打开至单一支付选项——例如信用卡、电汇或加密货币——使经纪商能够更严格地控制入金体验。 * 对于 **Sqala**,PIX 入金中新增了易读的**通过 PIX 支付的代码**字段,使巴西客户更容易识别并复制正确的支付代码。此外,已移除通过 Sqala 进行 BRL 交易的平台端最低和最高金额限制。 ### 改进 [#improvements-5] * 视觉自定义中新增了**配色方案生成器**,使生成一组一致且符合品牌形象的 B2CORE UI 主题颜色更加容易。 * 外部连接中新增了一个选项,用于控制集成密钥是否与 B2CORE UI 共享以用于客户生成的事件。对于 **RudderStack** 等分析连接,禁用该选项会使密钥不出现在公共系统信息端点中,防止被滥用。 * 客户**司法管辖区**现已包含在关键财务报告中(如客户财务、交易和余额报告),以及**入金**、**出金**、**转账**和**兑换**导出文件中,帮助在多个法律实体下运营的经纪商快速识别每位客户和每笔交易。 * 在**奖金** > **奖金分配**中,奖金名称筛选条件已被文本搜索取代,使操作人员可以快速按名称查找特定奖金计划。 * 临时奖金列表现在可以筛选为仅显示未领取的计划,因此客户始终可以看到仍可使用的优惠。 * **交易**导出现在包含所有记录,而不再仅包含当前可见页面,使其与其他**财务**部分保持一致。 * KYC 上传表单现在会在提交前验证所需文件的最低数量;如果客户未上传足够的文件,系统会立即显示本地化消息。 * 客户无法再同时提交多个账户删除请求;如果已有请求处于待处理状态,则无法创建新请求。 ### 已弃用的功能 [#deprecated-functionality-3] * 继上一个版本发布的弃用通知后,**邮件** > **营销**功能已从后台办公室中移除。 ### 已解决的问题 [#resolved-issues-5] * 默认加密货币列表现在使用正确的精度值。 * 在**储蓄**中,更新预设时现在会验证预设名称。 * B2CORE UI 中的语言下拉菜单现在会保留服务器定义的顺序,而不再按字母顺序重新排序语言。 ## 2026 年 2 月 28 日 [#february-28-2026] ### 新功能 [#new-features-6] #### 新 PS 集成 [#new-ps-integrations-2] 现已通过 **PSS** 新增对以下支付系统的支持: * **We Payment**——支持入金和提现 #### Acuity Trading 集成 [#acuity-trading-integration] B2CORE 现已与市场分析工具和交易信号提供商 **Acuity Trading** 集成。完成配置后,经纪商可以让客户直接在 B2CORE 中访问 Acuity Trading 的研究和分析功能,从而丰富交易体验并扩展产品服务。 #### Adjust 分析集成 [#adjust-analytics-integration] B2CORE 现已支持与移动衡量和营销分析平台 **Adjust** 集成。配置后,B2CORE 会将来自 B2CORE UI、iOS 和 Android 应用的归因和事件数据发送至 Adjust,帮助经纪商跟踪用户获取情况并衡量营销活动的表现。 #### 后台办公室中的日志记录 [#journal-log-in-the-back-office] 后台办公室现已推出新的**日志记录**功能,首先应用于客户详情。它提供完整的审计追踪,显示谁创建、更新或删除了记录、具体修改了什么,以及每个事件的操作人和时间戳。日志记录可供被分配相应权限的后台办公室用户使用。 #### 重新设计的限制管理 [#redesigned-restrictions-management] 限制管理界面已重新设计。后台办公室产品编辑页面现在提供专用的**限制**选项卡,列出所有生效中的限制——如允许的国家/地区和所需验证等级——因此管理员无需离开页面即可快速查看哪些用户有资格使用某项产品。 #### 储蓄预设的访问限制 [#access-restrictions-for-savings-presets] 储蓄预设现在可以按照**客户类型**、**司法管辖区**、**国家/地区**和**验证等级**配置访问限制,类似于产品和奖金已有的限制。未满足条件的客户将看不到该预设,从而帮助经纪商遵守不同司法管辖区的监管要求。 ### B2CORE UI 更新 [#b2core-ui-updates-6] * B2CORE UI 中的入金和提现流程已进一步精简,带来更加流畅直观的体验。 * 客户现在可以为模拟账户选择**首选币种**。 * 表格显示密度已改进以提升可读性,且**资料信息**部分的自适应布局已针对较小屏幕进行优化。 ### 支付系统更新 [#payment-system-updates-6] * 区块链\*\*交易 ID(哈希)\*\*现在会保存在后台办公室的入金和提现详情中并显示,也可通过后台办公室 API 获取。这使得直接在区块链上查询加密货币交易更加容易。 * 新的后台办公室 API v2 端点允许支付辅助应用以编程方式在 **In Progress**、**Success** 和 **Failed** 状态之间移动入金、提现和静态入金,使支付操作更加自动化。 ### 改进 [#improvements-6] * 具有相应权限的 Back Office 用户现在可以直接从 **Clients** > **Documents** 表格中**删除错误上传的客户文件**,无需再联系支持团队进行文件清理。 * **Documents** 表格现在包含 **Uploaded by** 和 **Uploaded at** 列,并支持排序和筛选,管理员可以轻松查看每份文件由谁提交及提交时间。 * 对于通过 **SumSub** 进行的 KYC,收到最终拒绝的客户现在仍可再次尝试验证。SumSub 连接设置中的新选项 **Allow new verification tries on reject** 可控制此行为。 * 验证级别的 **Mobile description** 字段现支持 **HTML** 内容,使经纪商能够创建在移动应用中向客户显示的更丰富描述。 * 与司法管辖区关联的客户标签,现在会在客户国家/地区变更、完成 KYC,或管理员将司法管辖区变更应用于所有客户时自动分配或更新。手动设置以及与司法管辖区无关的标签将被保留。 * 通过改进错误处理和日志记录,数据导出更加可靠;现在也能在入金和出金导出中正确处理大规模高精度数字。 * 客户的 Back-Office API 端点 (`/api/v2/clients`) 现在除创建时间外还支持按**更新时间**排序,从而实现更好的同步工作流。 * 整体平台性能已得到提升:后端应用已迁移至新的现代化应用服务器,以加快 API 响应速度;账户总余额端点的汇率缓存也已优化。 ### 已弃用功能 [#deprecated-functionality-4] * 已移除多项不再受支持的旧版支付服务提供商集成。这些集成已由基于 PSS 的连接取代,包括:AlgoGateway、ExLink、ChipPay(出金)、PayRetailers、BitWallet、Payelata、NicePay、ISmartPay、EeziePay、NinePay、Chillpay、Epay、POLiPay、PayTrust88、SolidPayments、RpnPay、Axcess、LionPay 和 Ozow。 * 作为持续弃用基于 SMS 身份验证的一部分,注册向导中已移除手机确认步骤。新客户在注册期间不再需要通过 SMS 确认其电话号码。 * Back Office 中的 **Mailing** > **Marketing** 部分现已添加弃用通知。 ### 已解决问题 [#resolved-issues-6] * 现在会以所有已启用语言的正确翻译返回测验和测试详细信息。 * Back Office 中 SumSub KYC 字段名称的翻译已改进。 * 在 **Transfers** 页面上,没有相应权限的客户现在无法使用兑换选项。 * 没有匹配预设的储蓄计划现在可以被正确处理。 * 已修复涉及不同币种时 PSS 出金表单的验证问题。 * 对于 **PayRetailers**,现在可以正确识别入金状态(CANCELED 被视为 CANCELLED)。 ## 2026 年 1 月 31 日 [#january-31-2026] ### 新功能 [#new-features-7] #### 通过 Back-Office API 管理汇率提供商 [#rate-providers-management-via-the-back-office-api] 新增了用于列出汇率提供商和更新自定义汇率值的 Back-Office API v2 端点。这使经纪商能够以编程方式管理和覆盖 B2CORE 中使用的汇率,从而简化与外部汇率来源及自动化工作流的集成。 #### RudderStack 的后端分析事件 [#backend-analytics-events-for-rudderstack] 当 **RudderStack** 被配置为外部连接时,B2CORE 现在会自动向该平台发送关键后端事件,例如入金、出金、注册和验证决策。此功能补充了现有的前端分析,并为依赖 RudderStack 的经纪商提供更完整的客户行为视图。 ### B2CORE UI 更新 [#b2core-ui-updates-7] #### Cookie 同意 [#cookie-consent] B2CORE UI 现已添加 Cookie 同意模态窗口,允许客户按照隐私要求查看并接受 Cookie 的使用。 ### 支付系统更新 [#payment-system-updates-7] * PSS 方法的支付表单现在会自动从客户档案中预填已知的客户数据,例如姓名、电子邮箱和地址。客户在进行入金或出金时,无需重新输入已提供的信息。 * 对于 **KoraPay**,向银行账户出金的功能已改进,以实现更可靠的处理。 * **PaymentAsia** 现支持 **MXN**(墨西哥比索)货币代码。 ### 改进 [#improvements-7] * 后端图片,包括 **Sign In** 页面和菜单页眉的徽标,现在通过 Back Office 中的 **System** > **Visual customization** 菜单进行管理,而非单独的部分。登录背景徽标和平台徽标现在也可以上传为 **SVG** 格式。 * 登录安全通知已改进以减少垃圾信息。现在仅当从**新设备**或**新 IP 地址**登录时才会向客户发出提醒,而不是每次登录时都提醒,使安全警报更具意义。 * 现在可以正确同步从 Back Office 禁用客户的 TOTP(验证器应用)双重身份验证,确保变更能可靠生效,且客户不再被要求进行 2FA。 * 在 B2CORE 移动应用中使用 **Zendesk** 时,支持请求现在会通过正确的消息渠道路由,确保移动端客户能够联系到正确的支持队列。 * 现在可以在 **System** > **External connections** 中为外部连接表单组添加备注,使配置更易于记录和维护。 * 已优化 **Finance** 页面中按**客户**和**类型**筛选交易的性能,同时获取奖金的忽略交易品种组现在也更快。 * 当由于账户没有入金或出金权限而无法完成操作时,现在会显示清晰的错误信息。 ### 已解决问题 [#resolved-issues-7] * 现在可以正确编辑 B2CORE UI 的自定义菜单项,并且在 **Promotion** > **Menu** 中创建子菜单项不再失败。 * **System** > **External connections** 中的多选控件现在可按预期工作。 * 现在可以成功从 **Bonuses** 部分导出数据。 * 已修正 B2CORE UI 中横幅的位置。 * 创建公告时,现在会为文本和按钮文本设置默认值。 ## 2025 年 12 月 18 日 [#december-18-2025] ### 新功能 [#new-features-8] #### 新 PS 集成 [#new-ps-integrations-3] 在此版本中,已通过 **PSS** 添加对以下新支付系统的支持: * **LuqaPay** – 仅支持出金 * **Visionpay (HILZI)** – 支持入金和出金 * **Ozow** – 仅支持入金 * **B2BINPAY**(通过 API v3)– 支持静态入金和出金 * **Coinsbuy**(通过 API v3)– 支持静态入金和出金 #### Salesforce 集成 [#salesforce-integration] B2CORE 现支持 **Salesforce** 集成,可将客户数据从 B2CORE Back Office 无缝同步至 Salesforce。您可以借此集中管理客户信息,并利用 Salesforce 工具处理业务流程。有关详细信息,请参阅[如何集成 Salesforce](../how-to-articles/manage-system-settings/how-to-integarte-salesforce)。 #### Twilio SendGrid 集成 [#twilio-sendgrid-integration] B2CORE 现可与 **Twilio SendGrid** 集成,支持将客户数据从 B2CORE Back Office 自动同步至 SendGrid 联系人。该集成让您能够直接通过 SendGrid 管理邮件投递、营销活动、联系人细分及相关通信任务。有关详细信息,请参阅[如何集成 Twilio SendGrid](../how-to-articles/manage-communication-platforms/how-to-integarte-sendgrid)。 #### 通过 B2CORE UI 中的 Profile 更新地址 [#address-updates-via-the-profile-in-the-b2core-ui] 现在可以在 B2CORE UI 的 **Profile** 菜单中为 `individual` 客户启用地址更新功能。若要允许客户更改其国家/地区和居住地址,请在 Back Office 的 **System** > **Settings** 中配置新的 **Address updating** 选项。该选项允许您选择地址变更的处理方式: * **Admin approval required**:管理员必须通过 Back Office 中的客户请求批准该变更。此选项仅在您的 KYC 流程*不包含*地址验证时适用。 * **Repeated verification required**:客户的验证级别将被重置,并且必须使用新地址再次完成 KYC。此选项仅在您的 KYC 流程*包含*地址验证时适用。 有关详细信息,请参阅 **System** > **Settings** 文档中的[客户档案](../back-office-guide/system/settings#client-profile)部分。 #### B2CORE UI 铃铛图标中的新通知 [#new-notifications-in-the-bell-icon-in-the-b2core-ui] B2CORE UI 和移动应用顶部栏中的 **bell** 图标现在会显示新通知计数器,并在点击后打开 **Notifications** 面板。在此版本中,该面板会显示有关**新登录尝试**、**新登录设备**以及**密码**或 **2FA 方法变更**的提醒,全部归类在 **Security** 类别下。客户可以通过该面板打开 **Notifications** 页面,在其中查看所有通知、浏览完整详细信息,并快速导航至其档案中的 **Security** 部分。 未来更新将支持更多通知类型。 铃铛图标中的通知 ### B2CORE UI 更新 [#b2core-ui-updates-8] #### Transaction History 中新增 All 标签 [#new-all-tab-in-transaction-history] 在 **Transaction History** 中,新增了 **All** 标签,允许客户在一个位置查看所有类型的交易并按状态进行筛选。 交易历史 #### 支持 Zendesk 聊天机器人 [#support-for-the-zendesk-chatbot] 当您将 **Zendesk** 作为 B2CORE 的 HelpDesk 系统使用时,现在可以在 B2CORE UI 中启用 Zendesk 聊天机器人。此增强功能提供了更流畅的 HelpDesk 体验,客户无需额外授权即可提问、快速找到所需信息,并无缝切换至人工客服。有关详细信息,请参阅[如何添加 Zendesk 聊天机器人](../how-to-articles/manage-system-settings/how-to-configure-a-connection-to-zendesk#how-to-configure-the-zendesk-chatbot)。 #### 增强的静态 Dashboard [#enhanced-static-dashboard] 上一版本推出的具有固定小部件的静态 **Dashboard** 已进一步增强,以改善易用性和清晰度。 **Last Transactions** * 仅当相关的 **Transaction History** 菜单已启用时,该小部件才会显示在 **Dashboard** 上。如果菜单被隐藏,该小部件不会出现在 **Dashboard** 上。 * 小部件中的法定货币始终使用两位小数精度。所有其他货币遵循 Back Office 中为每种货币配置的小数位设置。 * 如果客户没有交易历史记录,**All** 按钮将在小部件中隐藏。交易出现后,该按钮将显示,允许客户直接从小部件查看完整历史记录。 包含交易历史的 Dashboard **Portfolio** 小部件中显示的标签现在取决于相关的 **Wallets** 和 **Platforms** 菜单是否已启用: * 如果两个菜单均已启用,小部件将显示 **Wallets**、**Trading Platforms** 和 **All** 标签,允许客户查看其所有钱包和交易账户的总投资组合价值。 * 如果任一菜单被禁用,相应标签将在小部件中隐藏。 **Trading Accounts** 仅当相关的 **Platforms** 菜单已启用时,该小部件才会显示在 **Dashboard** 上。如果菜单被隐藏,该小部件不会出现在 **Dashboard** 上。 包含 Wallets 和 Trading accounts 的 Dashboard * **自动提交验证码表单** 在需要验证码确认操作的表单中,例如登录、更改密码或其他操作,现在输入验证码后会自动提交表单,客户无需点击 **Continue** 按钮,流程更加顺畅。 ### 支付系统更新 [#payment-system-updates-8] #### 支付输入快照 [#payment-input-snapshots] 在 B2CORE Back Office 中,现在可以查看客户使用 **PSS** 方法时在入金和出金表单中输入的信息。这些数据有助于管理员在批准或拒绝出金请求时做出明智决策,并加快对潜在支付相关问题的调查。 该信息位于新增的 **Payment input snapshot** 部分,该部分已添加至: * **Finance** > **Deposits** 中的入金详细信息。 * **Finance > Payouts** 中的出金详细信息。 * **Clients** > **Requests** 中的客户请求,包括:**Payout** 请求、**PS Deposit Assistance** 请求和 **PS Withdrawal Assistance** 请求。 #### 简化 PS Deposit Assistance 请求处理 [#streamlined-handling-of-ps-deposit-assistance-requests] 当因与相应支付系统达到同步截止期限而触发 **PS Deposit Assistance** 请求时,**Clients** > **Requests** 中不再创建单独的请求。此类情况现在必须直接在入金详细信息中处理,从而减少不必要的协助请求数量。 #### 支付表单全面集成 B2TRANSLATE [#full-b2translate-integration-for-payment-forms] B2CORE UI 和移动应用中的支付表单现已全面集成 [B2TRANSLATE](https://docs.b2translate.b2broker.com/)(原 WEBLATE)。现在可以通过 B2TRANSLATE 自定义并翻译 PSS 连接的入金和出金方法动态表单中所有组件的标签,以及验证错误消息,支持多种语言。这可确保所有金融工作流中的本地化保持一致。 ### 改进 [#improvements-8] * 现在在批准客户的**转账**和**内部转账**请求时,会检查源账户余额以确保有足够资金。如果余额不足以进行转账,则无法批准该请求,并会显示错误信息:`Application approve failed. Insufficient funds on source account`。 * 在 **Bonuses** > **Bonus distribution** 中,新增 **Created by** 列,显示为客户添加奖金的 Back Office 用户的电子邮箱和 ID。点击 ID 可打开相应 Back Office 用户的档案。 * Back Office 中 **Finance** > **Exchange** 页面的加载速度已显著提升,尤其适用于大数据量。该页面的兑换数据导出也已加速。 * 现在可以根据客户的**司法管辖区**和**国家/地区**限制 B2CORE UI 主菜单项目的可见性,从而更精细地控制客户可访问的功能。 ## 2025 年 10 月 1 日 [#october-1-2025] ### 新功能 [#new-features-9] #### 新 PS 集成 [#new-ps-integrations-4] 现已通过 **PSS** 添加对以下新支付系统的支持: * **Payrock** – 支持入金和出金 * **Proxpay** – 支持入金和出金 * **KoraPay** – 已新增向银行账户出金的选项。 #### 推出入金静态支付详情 [#introducing-static-payment-details-for-deposits] 从此版本开始,通过已集成支付系统进行的入金方法将逐步支持**静态支付详情**。此前签发的支付信息(例如加密货币地址或银行详情)将为客户保存,使其可以随时将该信息重复用于不同金额的入金。 在此版本中,**B2BINPAY** 和 **Coinsbuy** 方法提供静态入金详情。客户可以在 B2CORE UI 中生成入金地址并保存以供日后使用,或者创建新的特定区块链地址,所有地址均会保存以便后续入金。 #### 包含关键财务指标的 Dashboard [#the-dashboard-with-key-financial-metrics] 对于在 **Statistics** 类别下被分配 `Access to Finance Dashboard` 权限的用户,登录 Back Office 后现在会打开 **Dashboard**。**Dashboard** 显示关键财务指标,包括**总入金**、**总出金**和**净入金**,帮助用户快速查看所选期间的财务结果和活动(请参阅 [仪表板](../back-office-guide/dashboard))。 ### B2CORE UI 更新 [#b2core-ui-updates-9] #### 重新设计的静态 Dashboard [#redesigned-static-dashboard] B2CORE UI 的 **Dashboard** 已重新设计,为客户的投资组合和财务状况提供清晰、直观的概览。**Dashboard** 现在是一个固定、不可自定义的页面,包含以下小部件: * **Portfolio**:显示总余额,并可查看钱包和交易账户之间的资产配置。显眼的 **Deposit** 按钮让客户能够快速添加资金。此外,还可以通过该小部件访问**转账**、**兑换**和**出金**等其他金融交易。 * **Last Transactions**:显示近期金融交易及其状态的列表,以供快速查看,并可访问完整的 **Transaction History**。 * **Trading Accounts**:显示活跃账户、标记为收藏的账户或具有非零余额的账户,便于快速访问;并提供一键创建新账户或前往交易的选项。 #### 清晰显示验证请求状态 [#clear-display-of-verification-request-statuses] 客户现在可以更轻松地跟踪其验证请求的状态。**Dashboard** 和 **Verification** 页面上的新横幅会在请求提交后显示待处理状态,并提供指向 **Document verification** 部分的直接链接,客户可在此监控文件状态。 #### 更准确的入金和出金预估金额 [#more-accurate-indicative-amounts-for-deposits-and-withdrawals] 已重新设计客户在 B2CORE UI 中发起入金和出金时显示的预估金额计算方式。这些金额现在会更准确地反映客户在执行后将收到的最终结果,并考虑佣金和汇率。 ### 改进 [#improvements-9] * 对于 **DXtrade**,现在可以在 Back Office 中配置产品时添加 **Account number prefix**。该前缀会添加到 DXtrade 账号的开头,以帮助区分例如真实账户和模拟账户,或单个 DXtrade 基础设施内属于不同品牌的账户(请参阅[如何集成 DXtrade](../how-to-articles/manage-platforms/how-to-integrate-dxtrade))。 * 对于 **ShuftiPro**,地址验证现支持文件类型 `any`。它允许客户提交包含其姓名和地址的任意文件,而非特定类型的文件,使 KYC 流程更加灵活和便捷(请参阅[如何使用 ShuftiPro](../how-to-articles/manage-verification-options/how-to-use-shuftipro))。 * 现在会根据司法管辖区设置中定义的**国家/地区**和**客户类型**组合,为客户分配司法管辖区(请参阅[司法管辖区](../back-office-guide/clients/jurisdictions))。 * 从 1.30.0(iOS)和 2.8.0(Android)版本起,移动应用现支持 PSS 支付方式,包括入金和出金。 * 已优化 Back Office 中表格的加载。尤其是,即使需要处理大量账户,**Clients** > **Accounts** 列表现在也能更快加载。 * 对于从 B2CORE Back Office 通过 **Twilio** 呼叫客户,如果您的账户中有多个活跃的 Twilio 号码,现在可以选择使用哪个电话号码。这使您能够选择最合适的本地号码,提高成功联系的可能性并增强客户信任。 现在可以录制从 B2CORE Back Office 通过 Twilio 发出的呼叫,录音会保存在您的 Twilio 账户中以供日后播放。 * **Export** 选项已增强,可从 Back Office 中提供此选项的页面更可靠地导出数据。 * 在 **Bonuses** > **Bonus distribution** 中,**Ignored symbol groups** 字段现在为可选项,在手动向客户发放奖金时可以留空。如留空,客户交易的可用组中的所有交易品种都会计入其交易量,以满足奖金要求。 * B2CORE UI 和移动应用中的横幅定向功能已改进。除**国家/地区**和**验证级别**外,现在还可以按**客户类型**和**司法管辖区**应用限制,以便更精确地控制可见性。 * 在 B2CORE UI 中保存的出金预设里,支付方式现在会与所选出金方式相匹配,并且会清晰显示货币。此前会显示 Back Office 中使用的技术方法名称,导致不一致。 ## 2025 年 7 月 2 日 [#july-2-2025] ### 新功能 [#new-features-10] #### 新 PS 集成 [#new-ps-integrations-5] 现已通过 **PSS** 添加对以下新支付系统的支持,均可进行入金和出金: * **FundPay** * **Jetapay** * **PayRetailers** * **TopChange Pay** 此外,**AlfredPay** 现支持出金。 #### 与 SumSub Fraud Prevention 集成 [#integration-with-sumsub-fraud-prevention] 现在支持通过 **SumSub Fraud Prevention** 对法币和加密货币**入金**及**出金**进行交易监控。 发起此类交易时,系统会自动通过 **SumSub** 进行检查,并将结果返回至 B2CORE。结果会显示在入金和出金详情的 **Transaction monitoring** 部分,以及相应客户请求中,并可在请求批准或拒绝前查看。此外,**Finance** > **Deposits/Payouts** 中新增的 **KYT status** 列会显示交易监控结果。 这也改进了 B2CORE 中的**自动出金**,使其在不影响合规性的情况下能够更快处理。 若要使用此功能,您必须在 SumSub 账户中启用并正确配置 **SumSub Fraud Prevention**,并在 B2CORE Back Office 中启用 **SumSub** 外部连接(请参阅[如何配置 SumSub 连接](../how-to-articles/manage-verification-options/how-to-use-sumsubstance#how-to-configure-a-connection-to-sumsub))。 #### 与 ActiveCampaign 集成 [#integration-with-activecampaign] 现在可以使用 B2CORE 中的客户数据开展定向电子邮件营销活动,并与 **ActiveCampaign** 平台无缝同步。此集成功能可通过以下方式实现更高效、数据驱动的电子邮件营销和通知: * 在 B2CORE Back Office 中配置至 **ActiveCampaign** 的外部连接。 * 将客户数据从 B2CORE 自动同步到 **ActiveCampaign**。 * 创建电子邮件列表,以提升客户留存率并通过 **ActiveCampaign** 提供更个性化的互动。 有关详细信息,请参阅[如何集成 ActiveCampaign](../how-to-articles/manage-communication-platforms/how-to-integrate-activecampaign)。 #### 支持 B2CORE Web 和移动应用中的自定义菜单项 [#support-for-custom-menu-items-in-the-b2core-web-and-mobile-apps] 现在可以向 B2CORE UI 和移动应用中显示的菜单添加自定义项目。在移动应用中,此功能自 **iOS** v1.29 和 **Android** v2.6.0 起受支持。 可以在 **Promotion** > **Menu** 中配置自定义项目,指定其名称、客户将被重定向到的 URL 以及图标。点击后,客户将被重定向至支持您业务的第三方外部资源或网页(请参阅[如何添加自定义菜单项](../how-to-articles/manage-advertising-options/how-to-add-custom-menu-items))。 ### B2CORE UI 更新 [#b2core-ui-updates-10] #### 改进的 Total Balance 小部件 [#improved-total-balance-widget] 该小部件已改进,可显示钱包和交易账户的余额,以及整体投资组合价值,从而提供全面的财务概览。 #### B2TRADER 账户相关增强功能 [#enhancements-related-to-b2trader-accounts] B2TRADER 账户处理引入了以下改进: * **新的 B2TRADER Accounts 小部件**:现在可以通过 B2CORE UI **Dashboard** 上的专用小部件方便地查看和访问在 B2TRADER 平台创建的账户。交易者只需单击一下即可登录交易界面并立即开始交易。 * **支持 Netting 账户**:除 **Hedging** 外,现在还支持执行类型为 **Netting** 的 B2TRADER 账户。这使交易者能够选择适当的类型来规划和调整其交易策略。要启用 Netting 账户,必须在 B2CORE Back Office 的 **Products** 菜单下配置单独的产品。 * **支持模拟账户**:现在可以通过 B2CORE UI 创建具有预设余额的 B2TRADER 模拟账户,使交易者能够安全练习使用交易界面。要启用模拟账户,必须在 B2CORE Back Office 的 **Products** 菜单下配置单独的产品。 #### 改版的 Sign Up 和 Sign In 页面 [#revised-sign-up-and-sign-in-pages] **Sign Up** 和 **Sign In** 表单已重新设计,布局更简洁、视觉外观更佳、整体用户体验更好,包括: * 在确认期间显示客户的电子邮箱或电话,以明确验证码发送位置。 * **Back** 按钮现在会让客户返回上一步,而不会重置表单。 ### 改进 [#improvements-10] * 移动应用现在部分支持 PSS 支付方式。自 **iOS** v1.29 和 **Android** v2.6.0 起可使用*入金*方式。暂不支持通过 PSS 使用*出金*方式。 * 现在可以根据客户的**国家/地区**、**客户类型**、**验证级别**、**司法管辖区**或**介绍经纪商 (IB)** 限制客户使用奖金预设和临时奖金。这些限制可单独应用或组合应用,从而实现更精细的访问控制。 如果将限制应用于用于发放自动入金奖金的奖金预设,则仅会向符合指定条件的客户发放这些奖金(请参阅[Bonus presets](../back-office-guide/bonuses/bonus-presets#details)和[Temporary bonuses](../back-office-guide/bonuses/temporary-bonuses#details))。 * 在 **Bonus** > **Bonus distribution** 页面上,新增 **Expired at** 列,用于显示已发放奖金计划到期或已到期的日期和时间。此改进使您能够更轻松地监控客户账户上的奖金时间线,并鼓励客户在到期前满足奖金要求。 * 司法管辖区处理已增强。现在可以在 Back Office 的客户详细信息中手动分配或更改客户的司法管辖区。可以编辑司法管辖区的国家/地区列表,并选择将变更应用于现有客户,或仅应用于更新后注册的客户(请参阅[司法管辖区](../back-office-guide/clients/jurisdictions))。 * 对于通过 **ShuftiPro** 进行的 KYC,**Show OCR form** 现可在 **System** > **External connections** 的 ShuftiPro 连接设置中启用或禁用。此表单可让客户查看、确认或在必要时编辑从其提交文件中提取的信息。 * 现在可以从 Back Office 客户档案中的 **Contacts** 标签删除已确认的电话号码。为此,Back Office 用户必须被分配 `Update clients` 权限。删除后,该电话号码可用于注册新的客户档案。 * **Clients** > **Requests** 页面已改进,包含支持筛选选项的 **Country** 列,使您更容易按客户所在地识别请求。此外,**Processing date** 列现在会显示请求被批准或拒绝的时间,帮助您评估其处理时长。 * 在 **System** > **Visual customization** 中,作为徽标上传的图片现在只能使用 `SVG` 格式。 ### 已解决问题 [#resolved-issues-8] * 已解决通过 **WireDocument** 提供商上传入金支持文件时发生的内部服务器错误。入金请求现在可以正常进行,不会出现错误。 ## 2025 年 4 月 18 日 [#april-18-2025] ### 新功能 [#new-features-11] #### 新 PS 集成 [#new-ps-integrations-6] 在此版本中,我们集成了新的支付系统 **AlfredPay**。它支持入金,并通过 PSS 连接实现全面集成。 #### 持续将支付系统迁移至 PSS [#ongoing-migration-of-payment-systems-to-pss] 更多系统已成功迁移至 **Payment System Service (PSS)**。 您可以在[Integrations > Payment systems](../integrations/payment-systems)中查看 PSS 支持的支付系统完整列表。它们在 **PSS-supported** 列中标记为 Yes。 此前通过非 PSS 连接配置的支付方式仍然可用并完全正常运行 — **PayPal** 除外,该方式现在仅通过 PSS 提供支持。 通过 PSS 连接的支付方式尚不支持 **iOS** 和 **Android** 应用,因此客户目前只能通过 B2CORE UI 使用这些支付方式。 #### B2CORE UI 的视觉自定义 [#visual-customization-for-the-b2core-ui] 现在可以通过 Back Office 中新的 **System** > **Visual customization** 菜单个性化 B2CORE UI 的外观和样式,使其更好地体现您的品牌。可用选项包括: * 为 B2CORE UI 的浅色和深色主题上传自定义徽标。 * 调整浅色和深色主题的颜色。 * 为 B2CORE UI 的 **Sign In** 和 **Sign Up** 页面设置和更新背景图片。 * 添加自定义脚本,例如用于聊天机器人集成或分析跟踪。 有关详细信息,请参阅[视觉自定义](../back-office-guide/system/visual-customization)。 ### B2CORE UI 更新 [#b2core-ui-updates-11] #### 增强的入金和出金 [#enhanced-deposits-and-withdrawals] B2CORE UI 中的入金和出金工作流已简化,使流程对客户而言更快速、更直观。 主要增强功能包括: * **更轻松地选择支付方式**:根据所选钱包币种以及用于入金或出金的币种,系统仅向客户显示可用的支付方式,帮助其快速选择最合适的选项而不会产生混淆。 * **清晰的佣金**:选择支付方式并输入入金或出金金额后,将显示适用于该方式的佣金公式,并自动计算费用。这有助于客户在选择首选方式时做出明智决策。 * **实时汇率更新**:当入金或出金涉及货币兑换时,客户现在可以手动刷新汇率以查看最新数值。刷新汇率是可选操作,仅用于清晰展示。交易时应用的汇率始终是最新的,因此即使不手动刷新也能确保兑换准确。 * **交易摘要**:选择支付方式并输入入金或出金金额后,客户现在可以在继续前查看详细的交易摘要。摘要包括待入金或出金金额、将收到的金额、当前兑换汇率及任何适用佣金。 * **交易状态和通知**:客户现在可实时收到交易状态更新,有助于减少不确定性并尽量减少支持请求。 * **重新设计的图标**:支付方式的更新图标现在与整体设计更加协调。 #### 简化的 B2BINPAY 入金表单 [#simplified-b2binpay-deposit-form] 在 B2CORE UI 中,B2BINPAY 入金表单不再显示金额、预估金额或兑换汇率字段,因为客户在 B2CORE UI 中提交请求并获取入金地址后,资金会在区块链上处理交易时入账,因此这些字段并无必要。 #### 预览 B2CORE UI 核心功能 [#preview-of-key-b2core-ui-features] 客户现在可以在通过展示主要 UI 页面的新图库访问 **Sign Up** 和 **Sign In** 表单之前,简要预览 B2CORE UI 功能。此增强功能旨在通过提供信息丰富的 UI 预览来提高注册转化率并吸引潜在客户。 #### 注册后自动登录 [#automatic-sign-in-after-registration] 成功完成注册后,新客户现在会立即登录 B2CORE UI,无需在 **Sign In** 页面输入凭据。 #### 引导流程中的验证 [#verification-in-the-onboarding-process] 新客户现在会在注册后立即被提示完成身份验证,简化引导流程以鼓励更快完成验证、进行首次入金并更快开始交易。客户仍可选择跳过此步骤并稍后完成。如跳过,**Dashboard** 上会显示提示客户完成 KYC 的友好横幅。 #### 面向新客户的交互式 UI 提示 [#interactive-ui-hints-for-new-clients] 首次登录 B2CORE UI 的新客户现在会在各个页面中获得关键元素的引导提示,帮助其快速了解基本功能并高效开始使用 B2CORE。 #### 个人信息更新 [#personal-info-update] 客户现在可以通过 **Profile Info** 菜单直接在 B2CORE UI 中更新个人信息。对个人数据的任何更改都会重置客户的验证级别,要求其再次完成 KYC 流程。 #### Savings 菜单中的简化资金管理 [#streamlined-fund-management-in-the-savings-menu] 当客户订阅储蓄计划但缺少足够资金加入时,现在会收到提示,可直接从 **Savings** 菜单向储蓄计划存入资金或为其钱包充值。 此外,如果客户订阅储蓄计划时没有所需钱包,系统将提供创建所需币种新钱包的选项。 #### Dashboard 中增强的小部件管理 [#enhanced-widget-management-in-the-dashboard] **Dashboard** 通过一组旨在改善布局清晰度和易用性的新小部件管理选项变得更加直观: * 添加多个小部件时,它们现在会自动对齐,以提供更整洁、更有条理的视图。 * 小部件不能再被缩小至低于最小尺寸,确保所有内容保持清晰易读。 * 小部件现在会自动吸附到位,使您更容易安排和维护结构化的仪表板布局。 #### 无缝授权至 Zendesk [#seamless-authorization-to-zendesk] 登录 **Zendesk** 时,客户将被重定向至 B2CORE UI 的 **Sign In** 页面。登录后,系统会自动将其带回 **System** > **External connections** 中连接详情指定的 Zendesk 页面,从而确保更快、更顺畅的支持体验。 ### 改进 [#improvements-11] * 在 **Bonuses** > **Bonus distribution** 中,现在可以查看客户交易账户上与发放或扣除特定奖金相关的交易历史。此信息位于奖金详情的 **Bonus transactions** 标签中。此外,具有相应权限的 Back Office 用户可以重试失败的奖金交易(请参阅[Bonus transactions](../back-office-guide/bonuses/bonus-distribution#bonus-transactions))。 * 对于储蓄计划,**Cancellation penalty** 现在可以设置为投资金额的百分比,从而为罚金计算提供更大灵活性。客户投资金额越高,提前取款时的罚金就越高。罚金百分比可应用于 Fixed 和 Flexible 策略的计划(请参阅[如何创建储蓄计划](../how-to-articles/manage-savings-programs/how-to-create-a-savings-program))。 * 到 2025 年 5 月底,杠杆参数将不再直接应用于 **TradeLocker** 平台上的账户。取而代之的是,杠杆将按平台中的交易品种进行配置。因此,B2CORE 不再支持 TradeLocker 账户的杠杆参数。 * 现在可按国家/地区和司法管辖区限制验证级别,使您能够基于客户所在地和客户类型创建不同的 KYC 流程(请参阅[如何按司法管辖区或国家/地区限制验证级别的使用](../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-restrict-the-use-of-verification-levels-by-jurisdiction-or-country))。 * 已向 **Systems** > **External connections** 添加筛选选项。现在可以通过应用 **ID**、**Caption**、**Name**、**Provider** 或 **Status** 筛选器,快速找到所需的连接。 ### 已弃用功能 [#deprecated-functionality-5] 与 **Google reCaptcha** 的集成已弃用,不再受支持。已从 **Registration** 和 **Authorization** 向导中移除 reCaptcha 步骤,并且它将不再出现在 B2CORE UI 的 **Sign Up** 和 **Sign In** 页面上。 *** ## 过往版本 [#past-releases] ### 2024 年 12 月 🎄 [#december-2024-] #### 新功能 [#new-features-12] ##### 推出支付系统服务 (PSS) [#introducing-the-payment-system-service-pss] 我们很高兴宣布推出 B2CORE **支付系统服务 (PSS)**,这是一项强大的功能,旨在简化与外部支付提供商及聚合多种支付解决方案的收银系统之间的连接。通过 PSS 配置与支付提供商的单一连接,您可以让客户使用该提供商提供的多种入金和出金选项,并充分利用其优势。 可通过 PSS 连接至 B2CORE 的支付系统会在[集成 > 支付系统](../integrations/payment-systems)中标示。此前的集成方式仍适用于这些系统,确保现有连接可以继续使用。 如果您计划通过 PSS 连接支付系统,请先联系您的客户经理,以确认您的 B2CORE 实例是否支持 PSS 连接。 ##### 新增 PS 集成 [#new-ps-integrations-7] 已集成以下新支付系统: * **Paymid** – 支持入金 * **PayRetailers** — 支持入金 * **Ozow** – 支持入金和出金 * **iSmartPay** – 支持以 THB 入金和出金。 ##### 增强 DXtrade 集成 [#enhanced-dxtrade-integration] 与 DXtrade 平台的集成已全面升级,现已完全可用,可通过 Back Office 和 B2CORE UI 开设和管理客户训练账户,以及进行入金、出金和转账(请参阅[如何集成 DXtrade](../how-to-articles/manage-platforms/how-to-integrate-dxtrade))。 ##### 按司法管辖区划分客户 [#client-segmentation-by-jurisdiction] 现已支持按司法管辖区划分客户。在 Back Office 中,您可以在 **客户** > **司法管辖区**内将国家分配至特定司法管辖区。完成配置后,系统将根据客户注册时选择的国家/地区,自动将其分配至正确的司法管辖区。此功能可帮助您有效管理来自不同司法管辖区的客户、向特定国家/地区分配经理,并根据司法管辖区限制其访问客户的权限(请参阅[客户 > 司法管辖区](../back-office-guide/clients/jurisdictions))。 #### 全新 B2CORE UI [#new-b2core-ui] 约一年前首次推出的重新设计版 B2CORE UI 现已全面实施、启用并针对流畅使用进行了优化。随着本次发布,它正式取代此前的界面;旧界面已停止维护且不再可用。 #### 改进 [#improvements-12] * **导入数据**模块已更新,可在将客户、账户及 IB 相关数据导入 B2CORE 时提供更友好的体验。此功能让您能够快速开始使用现有客户群中的 B2CORE,无需复杂的迁移流程(请参阅[导入数据](../back-office-guide/system/import-data))。 * 在 Back Office 的 **奖金** > **奖金发放**页面上手动向客户发放奖金时,您现在可以为这些奖金指定标题。这些标题将显示给 B2CORE UI 中的客户,帮助他们区分已发放的奖金(请参阅[如何手动向客户发放奖金](../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients))。 * **系统** > **设置**中新增了 **启用的双重身份验证提供商**设置,您可以借此控制 B2CORE UI 中向客户显示和提供哪些 2FA 方法。您可以同时选择 Google Authenticator 和短信确认,也可以只选择其中一种。 * 现在可通过调整 Back Office 中 **系统** > **设置**下 **信息显示**部分的相应设置,显示或隐藏 B2CORE UI 客户资料中的 **昵称**字段。 * 对于支持网页交易终端的平台(例如 **cTrader** 和 **DXtrade**),您现在可以直接从 B2CORE UI 启用对这些终端的一键访问。要进行设置,请在导航至 **产品** > **平台**后,在平台详情中指定 **网页终端 URL**。指定后,B2CORE UI 的账户卡片上将显示 **交易**按钮,客户只需单击一次即可打开网页终端(请参阅[如何从 B2CORE UI 启用一键交易访问](../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals))。 对于 **cTrader**,终端将直接打开 B2CORE UI 中单击 **交易**按钮时所对应的账户,客户无需再搜索所需账户。 * 对于 **cTrader**,现在通过 B2CORE 创建账户时,客户的名字和姓氏会自动传输至 cTrader 平台上相应的 **名字**和 **姓氏**字段。 * 对于通过 B2CORE 创建的 MetaTrader 4/5 账户,您现在可以控制出于报告目的应用于这些平台账户的 **发送报告**选项。Back Office 的 **产品** > **平台**中新增了 **在平台上使用报告**设置。该设置默认启用,确保创建账户时会激活 **发送报告**选项。 * 您现在可以为添加至 **构造器**方式的自定义字段标题添加本地化翻译。在 B2CORE UI 中切换语言时,字段名称将根据所选语言显示(请参阅[如何为构造器入金或出金方式添加自定义字段](../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method))。 * **用户** > **组**中可分配给 Back Office 用户组的权限列表已扩展,新增了只读权限。这些权限允许 Back Office 用户查看指定部分的详细信息,但不能进行更新: * `View banners` – 允许查看 **推广** > **横幅**中的横幅配置。 * `View menu` – 允许查看 **推广** > **菜单**中 B2CORE UI 菜单的配置。 * `View client rights` – 允许查看 **系统** > **客户权限**中分配给各验证级别的权限。 * `View rates` – 允许查看 **货币** > **汇率**中的汇率。 * `View groups` – 允许查看 **用户** > **组**中分配给 Back Office 用户组的权限。 * `View mailing` – 允许查看 **邮件** > **营销**和 **邮件 > 系统**中的邮件发送服务及 SMTP 提供商配置。 * 交易详情中的 **汇率**字段(例如 **财务** > **入金**或 **财务** > **出金**中的交易)现在以只读形式显示。这确保用于将入金或出金金额换算为最终货币的汇率无法被修改。 * B2CORE UI 中的客户现在无需提交需要 Back Office 管理员审批的请求,即可归档模拟账户。 * B2CORE UI 注册表单电话号码字段中显示的国家/地区及国旗,现在会根据客户的 IP 地址自动识别。这通过免除客户在下拉列表中手动搜索其国家/地区的步骤,简化了注册流程。 * B2CORE UI 的账户详情中新增了 **切换**选项,客户无需返回账户列表并搜索所需账户,即可在所选平台上快速切换交易账户。 #### 已弃用功能 [#deprecated-functionality-6] * 与 **Acrobat Adobe Sign** 的集成已弃用,不再受支持。 * **事件日历**已停止使用,不再可用。 *** ### 2024 年 10 月 [#october-2024] #### 新功能 [#new-features-13] ##### 新增 PS 集成 [#new-ps-integrations-8] 本次发布集成了新的支付系统 **paypay89**,支持入金和出金。支持的货币包括 THB、IDR 和 VND,并以 USDT 进行结算。 ##### 推出 cTrader 奖金 [#introducing-bonuses-on-ctrader] 我们很高兴宣布支持 **cTrader** 奖金。通过此次更新,您现在可以在客户入金时自动向其发放奖金、配置奖金预设,以及为 **cTrader** 创建临时奖金计划,其功能与 **MT4/5** 已提供的功能类似。 ##### 集成 RudderStack 以增强分析功能 [#integration-of-rudderstack-to-enhance-analytics] 新增了与 **RudderStack** 平台的集成,以增强分析能力。您可以在 Back Office 的 **外部连接**部分配置与 **RudderStack** 的连接。该平台收集新客户注册数据,并帮助评估旨在获客的营销活动。收集到的数据随后可发送至 Amplitude、Google Analytics 或其他[数据分析工具](https://www.rudderstack.com/integration/?type=Destination)。 ##### 移动应用下载设置 [#mobile-app-download-settings] 在 **系统** > **设置**中,**移动端**部分现在包含用于配置下载 iOS 和 Android 品牌移动应用按钮的选项。这些按钮将与下载说明一起显示在 B2CORE UI 中(详情请参阅[系统 > 设置](../back-office-guide/system/settings#mobile))。 #### 改进 [#improvements-13] * 对于使用 **KoraPay** 作为支付提供商的入金和出金方式,新增了 **商户承担费用**配置选项。该选项可设置为 **是**或 **否**,用于确定提供商收取的佣金是加至客户指定的入金或出金金额,还是从该金额中扣除。 * 向经理分配新客户的流程已显著更新。现在会优先将新客户分配给默认经理,并考虑国家/地区限制。若默认经理因这些限制无法被分配,或未设置默认经理,系统将按顺序在现有经理间分配客户,不再依赖其优先级索引(详情请参阅[客户 > 经理](../back-office-guide/clients/managers))。 * 您现在可以从 Back Office 轻松打开 B2CORE UI 的 **登录**页面。顶部栏新增了 **打开个人区域**链接,可让您快速访问与 Back Office 关联的 B2CORE UI。 * 现在禁止将 **cTrader** 产品配置为创建美分账户,因为 cTrader 平台不支持美分账户。如尝试配置,系统将显示错误消息。 * 在 **cTrader** 产品中,**邮件**选项现在始终设为 **不发送**,且无法更改。这表示通过 B2CORE 创建 cTrader 账户时,不会向客户发送凭据。这是因为所有 cTrader 账户均绑定至同一个 cTrader ID,且该 ID 仅使用一个密码。 * 横幅现在可以配置为仅向所选国家/地区及指定验证级别的客户显示(详情请参阅[如何按国家/地区和验证级别限制横幅显示](../how-to-articles/manage-advertising-options/how-to-create-a-banner#how-to-restrict-banner-display))。 * 在奖金预设中,**忽略的交易品种组**字段现可按需留空。 * 原名为 **若余额 \< 0 则销毁**的奖金选项已重命名为 **若净值 \< 赠金则销毁**,以更准确地反映其功能。 * 通过 B2CORE 创建 **MetaTrader 5** 账户时,客户的名字和姓氏现在会正确保存至 MT5 平台的独立字段中,而非合并至单一字段。 * 在 Back Office 中,您现在可以打开和拒绝与因归档或删除而无法再访问的交易账户相关的待处理客户请求。 * 若 **验证** > **级别**页面中创建的验证级别已分配给活跃客户,则无法再将其删除。尝试删除这些级别将触发错误消息。 * 如果在 Back Office 中指定了验证级别描述,这些描述现在会显示在新版 B2CORE UI 中,帮助用户轻松了解每个级别相关的操作和权益。 * **SumSub** 中已批准的验证请求状态现在会准确显示在 Back Office 中。此前,只有在打开这些请求后状态才会更新。 #### 已弃用功能 [#deprecated-functionality-7] * Back Office 中可查看客户钱包和出金的 **B2BINPAY**部分已弃用。不过,仍可配置并使用通过 **B2BINPAY** 的入金和出金方式。 *** ### 2024 年 7 月 [#july-2024] #### 新功能 [#new-features-14] ##### MT4 和 MT5 平台的新 WEBAPI 2.0 连接 [#new-webapi-20-connections-for-mt4-and-mt5-platforms] 现在使用 WEBAPI 2.0 建立与 MT4 和 MT5 的连接。当您现有的连接迁移至 WEBAPI 后,MT4 和 MT5 的平台连接设置将位于 **产品** > **平台**中相应平台的详情内,而不再位于 **系统** > **外部连接**中(详情请参阅[平台](../back-office-guide/products/platforms)中的 **MetaTrader 4/5**)。 与之前一样,真实账户和模拟账户需要使用不同的平台。因此,必须在 **产品** > **平台**中为真实账户和模拟账户分别配置两个不同的平台(MT4 和 MT5 各需两个)。 ##### 增强兑换 [#enhanced-exchanges] 现在可将客户在 B2CORE UI 中发起的特定货币对兑换配置为需要管理员批准。要为特定货币对启用 **兑换**类型请求,请在 Back Office 中导航至 **货币** > **货币对**,并将相关货币对的 **创建兑换请求**选项设为 **是**。管理员批准后,此类兑换将使用已批准请求中指定的汇率执行。详情请参阅[如何启用特定货币对的兑换请求](../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs)和[如何更新兑换请求中的汇率](../how-to-articles/manage-currencies/how-to-update-rates-in-exchange-requests)。 ##### PS 集成 [#ps-integrations] 经过品牌重塑后,原名为 **Advcash** 的 **Volet** 支付提供商仍可用于 B2CORE 的入金和出金。 #### 改进 [#improvements-14] * 为了提高 Back Office 登录的安全性,2FA 唯一支持的方式现为基于时间的一次性密码 (TOTP),例如由 Google Authenticator 生成的密码。使用电子邮件验证码的 2FA 已停止支持。点击顶部栏中的电子邮件地址并选择 TOTP 选项,即可启用 TOTP 2FA。 * 对于通过 ShuftiPro 进行的地址验证,您现在可以使用 **标准地址**或 **增强地址**验证计划。现已支持这两种 ShuftiPro 计划,可进行全面的地址验证。 * 从 **客户** > **常规**页面导出数据时,若在 **列可见性**选项中选择并在页面上显示,您现在可以在导出文件中包含 **标签**和 **昵称**列。 * 在 **系统** > **外部连接**页面配置与 **CentroID** 的连接时,单击 **测试连接**按钮后,系统现在会同时检查连接性和凭据。 * 通过 B2CORE 创建 cTrader 账户时,客户资料中指定的国家/地区现在会自动添加至 cTrader 平台上的账户设置。 * 对于 **Sticpay** 支付,交易 ID 现在会包含在 **财务** > **入金**和 **财务** > **出金**的 **发票**列中。此改进让您可以轻松匹配 Back Office 中列出的 Sticpay 交易与支付提供商端的交易。 * 现在,若在 Back Office 中相应入金方式的配置内指定了图标名称,B2CORE UI 中将显示 **Praxis** 的图标。 *** ### 2024 年 6 月 [#june-2024] #### 新功能 [#new-features-15] ##### 支持新的交易平台 [#support-for-a-new-trading-platform] 本次发布后,B2CORE 集成的平台套件扩展至包含 **TradeLocker**。现在可以通过 Back Office 和 B2CORE UI 开设模拟和真实 TradeLocker 账户、进行转账(包括在其他交易平台开设的账户之间进行转账),以及查看 TradeLocker 账户统计信息,例如余额、净值、赠金、杠杆和可用资金。 ##### Zendesk 集成 [#zendesk-integration] 客户支持平台 **Zendesk** 已与 B2CORE 集成,提供工单、在线聊天和 AI 工具,以实现更好的客户互动。客户提交和管理工单时,将从 B2CORE UI 重定向至 Zendesk 界面。 ##### 使用 ShuftiPro 进行标准地址验证 [#standard-address-verification-with-shuftipro] 现已可通过 **ShuftiPro** KYC 提供商进行地址验证。您现在可以要求客户使用以下文档类型验证其地址及任何其他地点(例如城市或国家/地区):`rent_agreement`、`bank_letter_receipt`、`employer_letter` 和 `utility_bill`。 ##### 增强储蓄模块 [#enhanced-savings-module] **储蓄**模块已增强,支持在储蓄计划中使用更多设置,包括 `Fixed` 和 `Flexible` 策略。储蓄计划让客户可以投资其资金以赚取利息,从而被动增长其加密资产,类似于传统银行储蓄账户。 ##### 集成 Notabene [#integration-with-notabene] 已实施与 **Notabene** 的集成,这是对 **B2BINPAY** 支付提供商的重要补充。此集成为该提供商提供加密货币 **Travel Rule** 的合规能力,从而确保更高的安全性和监管合规性(请参阅[如何集成 B2BINPAY](../how-to-articles/manage-payment-methods/how-to-integrate-b2binpay))。 #### 新 B2CORE UI 更新 [#new-b2core-ui-updates] * 新版 B2CORE UI 现已提供 **奖金**页面。客户现在可以在同一页面查看所有奖金计划,并筛选仅显示其可参与的计划。显示奖金计划详情的卡片已重新设计,可清晰说明获得奖金必须满足的条件,例如所需交易手数或各计划结束前的剩余天数。 * 增强的交易账户详情现在可向客户提供更全面的信息和统计数据。例如,客户现在可以按不同时间段缩放 **净值**图表,并查看账户在所有时间内的总体净值。此外,在 **交易历史**选项卡中,客户可以在挂单和持仓之间切换,并按日期和方向进行筛选。 * 新增了 **收藏的交易账户**小组件。该小组件显示客户标记为收藏的 MT4 和 MT5 交易账户,可快速在平台和账户类型(真实和模拟)之间切换,以查看所需账户及其余额。 * 入金和出金流程已简化,以提供更直观的体验。改进包括在用于选择选项的下拉列表中提供自动建议、取消不必要的分组,以及优化 QR 码显示。 * 现在可在 Back Office 的 **推广** > **横幅**页面配置横幅设置,从而在 B2CORE UI 的任意页面上显示横幅,例如仪表盘、钱包、入金、出金或其他页面。 #### 改进 [#improvements-15] * 现在可为 cTrader 账户选择 **保证金计算类型**,例如 **净额**、**总和**或 **最大值**。此选项已添加至 **产品** > **产品**页面中 cTrader 产品的设置。 * 现在可在 **客户** > **经理**页面设置默认经理。若符合国家/地区限制,默认经理会自动分配给所有新客户,无需手动分配。 * **系统** > **用户** > **组**页面上的 **管理员**组无法再被删除,且其权限无法修改。该组中的用户现在拥有全部权限。如需限制特定 Back Office 用户的权限,请创建单独的用户组,并仅向其分配必要权限。 * 在 **系统** > **用户** > **用户**页面中,现在可通过新增的 **创建时间**和 **创建者**列查看 Back Office 用户的添加日期和时间,以及添加该用户的人员。 * 所有 Back Office 登录现在均强制要求使用双重身份验证。如果您的用户资料尚未启用 2FA,系统会要求您在继续前激活它。点击顶部栏中的电子邮件地址,点击下拉菜单中的 **启用 2FA**,然后选择 2FA 验证码的接收方式。 * 对于 **系统** > **本地化**页面上启用的所有语言,现在均将英语设为默认回退语言。这可确保在特定语言没有可用翻译或模板时使用英文版本,从而在不同语言之间提供无缝的用户体验。 * 在 **财务** > **入金**和 **财务** > **出金**页面上,现在可以按 **账户类型**列筛选交易。 * **财务** > **交易**页面列出的交易现在可按自定义时间段筛选。要应用筛选,请在 **日期**列下的筛选字段中指定开始和结束日期。 * **ChipPay** 支付提供商集成更新: * 新增了 **名称**字段。该字段会预填客户的名字和姓氏,以便在 B2CORE UI 中进行入金和出金。 * 区号格式已更新,以符合支付提供商要求。 * 现在可在 **ChipPay** 支付提供商的入金方式设置中配置汇率调整。 * 现在可在 **Help2Pay** 支付提供商的入金方式设置中选择银行代码。若已选择,该代码将默认用于入金。若未选择银行代码,客户可在 B2CORE UI 中入金时自行选择。 #### 已解决的问题 [#resolved-issues-9] * 发送给 Back Office 用户的电子邮件通知现在包含有关 **内部转账请求**事件的完整信息,不再缺少任何详细内容。 * 批量将余额清零的操作已修复,现在可将同一客户名下特定货币的所有钱包余额重置为零。 * **客户** > **账户**页面上的 **更新余额**选项已修复,可准确更新余额,无论 CSV 文件中所含客户电子邮件地址使用大写还是小写字母(详情请参阅[如何更新余额](../how-to-articles/manage-finances/how-to-update-balances))。 * **验证** > **文档**页面上的 **状态**列筛选功能现在可正常工作,仅显示所选状态的文档。 * 单击 **安全** > **已封锁客户**页面上的客户 ID 链接后,现在可准确重定向至与该 ID 关联的被封锁客户详情页。 *** ### 2024 年 3 月 [#march-2024] #### 新功能 [#new-features-16] ##### 新增 PS 集成 [#new-ps-integrations-9] 已集成新的支付系统 **Sqala**,支持以巴西雷亚尔 (BRL) 入金和出金。 ##### 储蓄计划 [#savings-programs] 现在可以创建储蓄计划。您的客户可以订阅此类计划,并投资闲置资金,以在每个计划设定的期限内持有资金来赚取利息。本次发布支持固定利率(详情请参阅[储蓄](../back-office-guide/savings/))。 #### 改进 [#improvements-16] * 对于 **BridgerPay** 支付提供商,通过 B2CORE UI 的入金流程已简化。现在,入金所需的字段会自动填入客户相关数据。 * **Praxis** 支付提供商的配置已增强,以确保安全处理交易。此外,为满足多样化的监管标准,您现在可以允许来自不同国家/地区的客户在 B2CORE UI 中通过该提供商入金时提交不同的必需文件集。 * 现在可配置 **构造器**支付方式,使客户能够在 B2CORE UI 中使用该方式进行入金或出金时附加必要文件(详情请参阅[如何添加构造器入金或出金方式](../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method))。 * 已恢复以下支付提供商,现在可供使用: * **WireCustom** — 用于入金和出金 * **1-2-Pay** — 用于入金和出金 * 如果 **邮件** > **营销** > **配置**页面上的电子邮件服务提供商连接正被 **邮件** > **营销** > **电子邮件模板**页面中创建的电子邮件模板使用,现在禁止删除这些连接。 * 为方便筛选,Back Office **财务**菜单内页面的 **状态**下拉列表中已添加所有可能的[交易状态](../back-office-guide/references/transaction-statuses)。 #### 新 B2CORE UI 更新 [#new-b2core-ui-updates-1] * 在新版 B2CORE UI 中,出金新增了 **摘要**部分。此部分提供出金的详细信息,包括所应用的佣金金额、汇率以及将从系统中扣除的最终金额。 * 若 Back Office 中的产品已配置 **最低入金**选项,则在新版 B2CORE UI 中根据该产品创建账户时,该选项不再被忽略。 * 在新版 B2CORE UI 的 **入金**、**出金**和 **转账**页面中,从下拉列表选择账户时,可用账户现在会按其类型分组,例如法币、加密货币、MT4、MT5 等。 * 新版 B2CORE UI 中的 **最后更新**字段现在使用完整日期格式:`YYYY.MM.DD HH:MM`。 #### 已解决的问题 [#resolved-issues-10] * **客户** > **账户**页面上的 **更新余额**选项已修复,可处理用于更新客户余额的 CSV 文件中列出的大量电子邮件地址。 * 已解决导致 Back Office 中创建入金和奖金的弹出表单加载缓慢的问题,这些表单现在加载更快。 * 在旧版和新版 B2CORE UI 的 **入金**页面中,当金额最初输入至 **支付金额**字段时,指示性入金金额现在可被正确计算。 * 已恢复向 HelpDesk 工单附加 TXT 文件的功能。 #### 已弃用功能 [#deprecated-functionality-8] * **Google Analytics** 集成已在 B2CORE 中弃用。 * **Back Office API** 已弃用。如有任何疑问或需要协助,请联系您的客户经理。 ### 2023 年 12 月 [#december-2023] #### 新功能 [#new-features-17] ##### 全新 B2CORE UI [#new-b2core-ui-1] 我们很高兴推出经过重新设计的全新 B2CORE UI 外观。该界面的创建旨在简化复杂的用户场景,同时使 UI 保持与现代设计趋势一致并及时更新。 新 UI 页面上会显示引导说明,帮助您熟悉主要变更和增强后的使用场景。 #### 切换至新 UI [#switch-to-the-new-ui] 您可以在**登录**页面,或登录 B2CORE UI 后点击**前往新界面**,切换至新 UI。 如需切换回之前的用户界面版本,请点击右上角的个人资料图标,然后在个人资料菜单中选择**切换至上一版本**。 #### 主要 UI 变更 [#main-ui-changes] **用户资料** 现在,您可以点击右上角的个人资料图标进入用户资料。在展开的个人资料菜单中,选择相应选项即可查看和更新个人信息、验证等级、资料安全状态以及已保存的出金预设。 **仪表盘** 现在,可添加至**仪表盘**的小组件会列在点击**添加小组件**按钮后打开的全新左侧栏中。点击小组件即可立即将其添加至**仪表盘**。您可以一次添加多个小组件。 **钱包** 现在,点击选中的钱包后,会在打开的全新右侧栏中显示钱包详情。您可以通过该侧栏执行余额操作、查看最近的钱包交易,或跳转至完整交易历史记录。 **入金和出金** 入金和出金流程已得到简化:您可以先选择钱包,再选择要以加密货币还是法定货币进行入金或出金,最后从所选货币支持的支付方式中选择一种。之后,您将获得入金或出金地址,或者填写所需字段以完成交易。 **内部出金** 在**资金** > **出金**页面,您现在可以选择**内部用户**选项,将资金从您的钱包提取至注册在同一 B2CORE 系统中的另一位用户的钱包。 **出金预设** 在**资金** > **出金**页面进行出金时,您可以将出金详情保存为预设。现在,点击个人资料图标并在个人资料菜单中选择**出金预设**,即可查看已保存预设的列表。使用已保存的预设可快速出金,无需每次都填写相同信息。 **交易历史记录** 通过在**入金**、**出金**、**兑换**、**转账**和**内部出金**标签之间切换,可在同一页面查看所有交易的历史记录。 现在,展开交易行即可查看特定交易的详情。 **平台** 展示您在各个平台开设账户基本信息的卡片采用了全新外观,并提供所有您熟悉的功能。 增强后的新增账户表单可让您方便地在模拟和真实选项之间切换、选择账户货币并应用其他设置。 **HelpDesk** **HelpDesk** 界面已更新。现在使用支持图表、处理工单及跟踪其状态更加方便。 现在会在弹出窗口中显示特定语言支持团队的工作时间。 **移动应用下载** 如果支持移动应用,现在您可以点击顶部栏中的**下载应用**按钮并扫描显示的二维码,将其下载到您的移动设备。 #### 改进 [#improvements-17] * Back Office 中的**奖金分配**页面新增了**临时奖金名称**列,您可以借此标明最受客户欢迎的临时奖金计划。 * 现已支持吉尔吉斯语本地化。如有需要,可在 Back Office 的**系统** > **本地化**页面启用该语言。 #### 已解决的问题 [#resolved-issues-11] * 现在可防止客户端详情中**高级**标签显示的信息被意外重置为所有注册客户的相同值。 * 已更新 **PaymentAsia** 支持的银行列表,确保通过该提供商进行的出金能够被正确处理。 *** ### 2023 年 11 月 [#november-2023] #### 新功能 [#new-features-18] ##### Centroid 集成 [#centroid-integration] 已集成可连接各种交易平台和流动性来源的 **Centroid** 平台。通过此版本,您可以在 B2CORE 中添加已在 Centroid 开设的账户来创建账户,在 Back Office 和 B2CORE UI 中查看已添加账户的信息,并执行入金、出金和转账等余额操作。 ##### Shufti Pro 的新文档类型 [#new-document-types-for-shufti-pro] 除 `passport` 和 `selfie` 外,**ShuftiPro** 支持的 `id_card` 和 `driving_license` 文档类型现在也可用于在 Back Office 中配置 KYC 流程。 #### 改进 [#improvements-18] * 在 B2CORE UI 中使用 **ChipPay** 进行入金和出金时,**电话号码**、**姓名**和**地区国家/地区**字段现在会自动填充客户资料中的信息。 * 已消除在 B2CORE UI 中连续发起多笔相同入金交易的可能性。 * 现在可在 Back Office 中归档余额非零的交易账户,无需在归档前从账户中转出资金。在此情况下,现有余额将保留在已归档账户中。如果取消归档该账户,其余额将再次可供账户所有者使用。 * 现在,仅当 Back Office 用户组中不包含任何用户时,才可删除**系统** > **用户** > **组**页面显示的用户组。 * 现在无法在 Back Office 的**系统** > **本地化**页面禁用默认本地化选项。 * 现在,在使用 **Praxis** 请求入金时会发送客户类型标识符,以确保此类交易能够由支付提供商正确处理。 #### 已弃用功能 [#deprecated-functionality-9] * 可在**产品** > **平台**页面配置的平台设置列表中,**允许用户共享相同账户**选项已弃用。 * B2CORE 已弃用对 KYC 提供商 **Sapuma** 的支持。 #### 已解决的问题 [#resolved-issues-12] * 为 Back Office 用户启用 2FA 时,**启用 2FA**弹出窗口不再会因意外点击窗口外部而关闭。 * 在 Back Office 的**设置**标签中更新新注册客户的权限列表后,**最大模拟交易账户数**和**最大真实交易账户数**选项不再被设为 0(零)。 * 客户现在可通过在支付提供商页面确认入金信息来完成 **PayPal** 入金,而不会收到错误消息并被重定向回 B2CORE UI。 * 在 B2CORE UI 中使用 **PaymentAsi** 以 MYR 出金时,不再显示空的**银行名称**下拉菜单,而是会显示可用于出金的银行名称列表。 * 已解决在批准客户使用 **ChillPay** 出金请求时出现“Receiver Repeat Bank Account”错误的问题。 * 使用 **manual** 提供商在 Back Office 中进行的出金不再停留在 **Pending** 状态。 *** ### 2023 年 10 月 [#october-2023] #### 新功能 [#new-features-19] ##### Back Office 用户的 2FA [#2fa-for-back-office-users] Back Office 用户现在可以使用 Google Authenticator 等 2FA 应用生成的基于时间的一次性密码 (TOTP),或使用发送至其电子邮件地址的验证码来启用 2FA。 ##### HTML 模板现在会在保存前渲染 [#html-templates-are-now-rendered-before-saving] 标记为已启用的 HTML 电子邮件模板现在仅可在成功渲染并显示在预览中后保存至 Back Office。 #### 改进 [#improvements-19] * MetaTrader 产品详情中的**平台组**字段,在基于这些产品创建客户账户后将无法再编辑。 * 如果唯一的电子邮件服务提供商被配置为发送营销电子邮件(**邮件** > **营销** > **配置**)或系统电子邮件(**邮件** > **系统** > **提供商**),则无法禁用或移除该提供商。 * 如果上一笔出金或转账请求仍在等待处理,现已缩短客户无法在 B2CORE UI 中创建新的出金或转账请求的时间。 * Back Office 新增了用于发送确认 B2BINPAY 出金所需验证码的电子邮件模板,使用户能够接收在**B2BINPAY** > **出金**页面创建的出金交易确认码。 * 现在,在 Back Office 的**事件日志**中添加评论时可以附加大型文件。 * 在已发送营销电子邮件列表中,设置并保存后立即发送的电子邮件现在会在**发送时间**列中显示 **Instant**。 #### 已弃用功能 [#deprecated-functionality-10] * **B2BInPay v1** 汇率提供商和 **Anfitraud** 模块已弃用。 #### 已解决的问题 [#resolved-issues-13] * 当客户在 B2CORE UI 中使用 **ChillPay** 入金时,现在会传递正确的银行代码。此外,现已处理 **ChillPay** 返回的所有交易状态,确保 Back Office 中显示相应的入金状态。 * 当客户在 B2CORE UI 中使用 **Mercuryo** 入金时,现在会被重定向至正确的支付提供商页面以完成入金。 * 现在,B2CORE UI 会向客户正确显示可选择用于通过 **Help2Pay QR Payment** 方法以 IDR 入金的银行列表。 * 使用 **NicePay** 和 **Perfect Money** 成功进行的入金现在会被正确处理,不再在 Back Office 中保持 **Pending** 状态。 * 已修复客户从 B2CORE UI 重定向至 **EeziePay** 支付页面后发生的无效签名错误,使客户能够完成入金。 * 现已支持此前无法通过 **ChipPay** 进行的 VND 和 CNY 入金。 * 以前在 Back Office 出金详情中缺失的、使用 B2BINPAY 出金时生成的交易 ID (TxID ) 现在已显示。 * 通过 **Shufti Pro** 进行的验证现在能够被正确处理,不会在 Back Office 中导致错误。 * 在 Back Office 中为 eWallet 和 B2TRADER 产品启用时,**从 TR 创建被拒绝**权限现在可正常工作。该权限禁止客户在 B2CORE UI 中添加货币和开设 B2TRADER 账户。 * 启用的 reCapture 不再阻止客户在 B2CORE UI 中继续注册流程。 * **MatchTrader** 模拟账户现在会以 Back Office 中相应产品指定的起始余额开设。 * 已解决无法加载客户详情中**MT 账户**标签数据的问题。 * 已加快 Back Office 中客户账户和余额数据的加载速度。 * 已修复 Back Office 中向客户账户批量入金的操作,使其能够接受必须进行入金的产品及特定产品货币。 * **TransferSuccessfulOperation** 事件发生时发送的电子邮件通知现在包含转账详情,而非显示空数据。 * 客户在 B2CORE UI 注册期间指定的国家/地区,不再会在管理员编辑 Back Office 中任何其他资料数据后从客户资料中移除。 * 如果客户当前验证等级允许其进行验证,则不再被禁止在 B2CORE UI 中通过验证流程。 * 以前在 Back Office PrimeXM 账户详情中缺失的可用保证金现在已显示。 * 在 Back Office 中,现禁止禁用与任何产品关联的产品组,以避免创建没有组的账户。 * 点击**编辑产品**页面的**操作**按钮后,在下拉菜单中显示的**国家/地区限制**选项不再重复。 * **导出**选项现在会导出在**产品** > **产品**页面创建的所有产品数据,而非仅导出当前页面所列产品的数据。 * 在 Back Office 中添加到为客户 MetaTrader 账户分配奖金操作的评论,现在也会添加至 MetaTrader。 * 如果向产品添加超过 50 种货币,查看产品详情时已添加货币列表不再被截断,而会显示所有已添加货币。 *** ### 2023 年 8 月 9 日 [#august-9-2023] #### 新功能 [#new-features-20] ##### PS 集成 [#ps-integrations-1] * 现已可使用 **FairPay** 支付提供商进行出金。通过 **FairPay** 的入金仅支持 USD。 * 现已可使用 **ChillPay** 支付提供商以 THB 出金。 * 使用 **ChillPay** 入金时,现在可选择一种支持的入金方式:**网上银行**、**信用卡**、**二维码支付**或**账单支付**。 ##### 支付提供商连接验证 [#validation-of-payment-provider-connections] 对于以下方式,现在可通过点击**检查连接**按钮检查支付提供商设置。该按钮已添加至**入金方式**和**出金方式**页面: * **BridgerPay** 入金方式 * **CHIP** 入金方式 * **B2BINPAY** 入金和出金方式 #### 改进 [#improvements-20] * 如果存在另一笔尚未完成的出金、转账、内部转账或兑换操作,现在禁止进行此类操作。 * 当用户更改用于登录 Back Office 的密码时,系统现在会验证新密码是否符合指定的复杂度要求。 * 在 B2CORE UI 中更改客户资料里的出生日期时,无法输入未满 18 岁客户的出生日期。 #### 已解决的问题 [#resolved-issues-14] * 对于 **Praxis** 支付提供商,入金时从 B2CORE UI 重定向至支付页面以及返回的流程现在可正常工作。 * 已解决无法批准客户使用 **Help2Pay** 支付提供商出金请求的错误。 * 在 Back Office 中启用 **Skrill** 出金方式后,不再会在 B2CORE UI 的**资金** > **出金**页面导致错误。 * 如果 Back Office 中已启用自动出金选项,客户在 B2CORE UI 中创建的出金请求现在会在请求金额被冻结且出金请求状态从 **New** 变为 **Pending** 后自动获得批准。 *** ### 2023 年 5 月 29 日 [#may-29-2023] #### 新功能 [#new-features-21] ##### 返现奖励 [#cashback-rewards] 现在可在 Back Office 中通过**返现** > **MetaTrader 交易量**,为在 MT4 和 MT5 上交易的客户设置返现奖励计划。客户每交易一个手数,即可获得根据各平台配置设置计算的返现奖励。 #### 改进 [#improvements-21] * 现已可使用 **BridgerPay** 以 GBP 入金。 #### 已解决的问题 [#resolved-issues-15] * 用于通过电子邮件通知 Back Office 用户入金成功的 HTML 模板,现在包含此前缺失的所有必要信息。 * 当平台连接丢失后正在恢复时,如果客户尝试从其账户重复转账,MT 账户余额不再可能变为负数。 * 现在支持为使用 **BridgerPay** 入金时必须指定的**邮政编码**字段填写字母数字值。 * 在 B2CORE UI 中,点击**25%**、**50%**、\*\*75%**或**100%\*\*按钮后自动计算的出金金额,现在会正确显示小数分隔符。此前,如果在 B2CORE UI 中选择俄语,小数分隔符会缺失。 *** ### 2023 年 4 月 18 日 [#april-18-2023] #### 已解决的问题 [#resolved-issues-16] * 修复了如果收件人列表中包含资料已删除的 Back Office 用户,事件通知无法通过 Slack 和电子邮件发送的问题。 * 修复了尝试查看**事件日志**详情时 Back Office 可能卡住的问题。 * 修复了阻止加载**财务** > **出金**页面数据的问题。 * 修复了使用 **PerfectMoney** 和 **FairPay** 支付提供商成功进行的入金可能在 Back Office 中被分配为 **Pending** 状态的问题。 * 修复了使用 **WireDocument** 方式入金时,分配给该方式的支付提供商凭据会在 B2CORE UI 中显示给客户的问题。 ### 2023 年 4 月 4 日 [#april-4-2023] #### 新功能 [#new-features-22] ##### 可获取详细 cTrader 数据 [#detailed-ctrader-data-available] 现在,Back Office 和 B2CORE UI 中会显示客户 cTrader 账户的余额和净值,以及交易、订单和持仓数据。 ##### 批量向客户账户入金 [#bulk-deposits-to-client-accounts] 现在可使用**客户** > **账户**页面中的**更新余额**按钮,一次更新多个客户的账户余额。点击该按钮后,上传包含客户电子邮件、账户 ID 以及您希望存入每个账户金额列表的 CSV 文件。 #### 改进 [#improvements-22] * 在 Back Office 中配置注册向导时,**自定义字段**标签现在会显示 **email**、**password** 和 **password\_confirm** 字段。您可以更改它们在 B2CORE UI 注册表单中的显示顺序。 * 为消除因**回调 URL**字段指定值不正确而导致的 B2TRADER 连接问题,该字段已从 B2TRADER 平台的配置设置中移除。用于发送回调消息的 URL 现在会在 B2CORE 设置期间指定。 * 将光标悬停在**财务** > **交易**页面上可用于手动处理 **Partial** 状态交易的**处理**、**取消**和**更改状态**按钮上时,现在会显示工具提示。 #### 已解决的问题 [#resolved-issues-17] * 修复了编辑 Back Office 用户详情页面中的数据后,会发送基于 **AdminUserCreated** 模板的电子邮件通知的问题。 * 修复了新注册客户在 B2CORE UI 的**验证**页面点击**下一步**按钮后无法通过验证流程的问题。 * 修复了在 B2CORE UI 中上传验证所需文件时发生错误的问题。 * 修复了已关闭帮助中心工单的状态仅在重新加载页面后才能在 B2CORE UI 中更新的问题。 *** ### 2023 年 3 月 21 日 [#march-21-2023] #### 改进 [#improvements-23] * **OTC 365** 支付提供商已更名为 **ChipPay**;B2CORE 将继续支持通过该提供商进行的入金和出金。 * 事件通知管理选项已更新如下: * 可通知 Back Office 用户的事件列表已扩展,新增了 [事件类型](../back-office-guide/references/event-types-for-triggering-event-notifications-for-back-office-users)。如需设置事件通知,请前往**系统** > **事件通知**。 * 现在可向多个 Back Office 用户发送事件通知。 * 用于发送事件通知的可用渠道现在包括 Slack、Telegram、电子邮件和 SMS。对于 Slack 和 Telegram,现在可选择将通知发送至公开频道和群组,或作为个人消息发送。 * 现在可为每位 Back Office 用户指定其用于接收事件通知的个人 Slack 和 Telegram 聊天标识符。可在**系统** > **用户**的用户详情页面指定这些标识符。 * 在**系统** > **日志**页面,您现在可以跟踪 Back Office 用户执行的操作。 * **财务** > **入金**和**财务** > **出金**页面新增了**内部评论**列。 #### 已解决的问题 [#resolved-issues-18] * 修复了国家/地区限制未应用于为验证流程定义的文档类型的问题。 * 修复了在 Trading UI 中切换工作区后,**TradingView** 小组件无法显示数据的问题。 * 修复了外部帮助中心系统中分配给工单的 **Resolved** 状态在 B2CORE UI 中显示为 **Duplicate** 的问题。 * 修复了使用 **Mercuryo** 支付提供商入金时发生“Signature is invalid”错误的问题。 *** ### 2023 年 2 月 28 日 [#february-28-2023] #### 新功能 [#new-features-23] ##### 新 PS 集成 [#new-ps-integrations-10] 已集成新的支付系统 **Nicepay**,支持入金操作。 #### 改进 [#improvements-24] * 现在可为不同类型的客户配置单独的验证流程。 * 现在可通过 Back Office 的**推广** > **仪表盘**配置 **Simple Exchange** 小组件的设置。 * 以下用于配置移动横幅的字段现在为可选项:**标题**、**副标题**、**按钮标题**和**预览文本**。 * 现在,在**系统** > **导入数据**页面导入客户相关数据时,会忽略 CSV 或 TSV 文件中包含的无效数据。此类导入操作将被分配 **Success with errors** 状态。 * Back Office 各个页面显示的表格现在使用固定表头和筛选字段。 * 内部 Back Office 库已更新,现在包含更新后的表单字段、分页组件及其他内容。 #### 已解决的问题 [#resolved-issues-19] * 修复了如果 API 响应不是线性的,则无法通过从指定 API 资源获取预定义选项来为 **Constructor** 方式添加的自定义字段自动上传这些选项的问题。 * 修复了临时奖金在达到指定有效期值后不会到期的问题。 * 修复了可能无法关闭 B2CORE UI 中**已验证文件**部分打开以供预览的文件的问题。 *** ### 2023 年 2 月 14 日 [#february-14-2023] #### 改进 [#improvements-25] * 使用 **Constructor** 支付提供商为入金和出金方式添加自定义字段时,现在可通过连接客户 API 并获取所需值来上传字段选项列表,而无需手动指定。 * 现在可从**partner**类型钱包向**personal**类型钱包及交易账户进行内部转账。 * 创建客户认证测试时,现在可在**详情**字段中指定测试描述。测试描述会显示在 B2CORE UI 中的测试标题下方。 * 现在可在 Back Office 的**客户** > **请求**页面按**交易已批准**和**合规已批准**列筛选客户请求。 * 现在可在**服务** > **客户**页面按动态列筛选数据。 * 对于管理员用户在 Back Office 中进行的兑换交易,兑换人列现在会显示进行该交易的管理员姓名或电子邮件地址。 #### 已解决的问题 [#resolved-issues-20] * 修复了无法从 Back Office 的**客户** > **账户**页面将**冻结金额**列导出至 XLSX 或 CSV 文件的问题。 *** ### 2023 年 1 月 31 日 [#january-31-2023] #### 新功能 [#new-features-24] ##### Back Office 用户组的导出和导入选项 [#export-and-import-options-for-back-office-user-groups] 现在可在**系统** > **用户** > **组**页面导出和导入 Back Office 用户组数据。 #### 改进 [#improvements-26] * 现在,客户详情的**账户**标签会显示每位客户以 USD 计的总入金、总净入金和总出金金额。此外,**财务** > **入金**和**财务** > **出金**页面会显示所有客户的总入金和总出金。 * **客户** > **常规**页面新增了**选择**、**全选**和**编辑所选客户**按钮。使用这些按钮可批量分配客户标签和更改客户资料状态。 * 为客户分配标签时,现在可通过启用**覆盖当前值**选项,以新标签替换现有标签。 * 用于通知事件日志中新评论的电子邮件模板,现在除管理员电子邮件地址外,还包含在评论中被标记的管理员用户姓名。 * 在 Back Office 中配置入金和出金方式时,可用货币列表现在按字母顺序排序。 #### 已解决的问题 [#resolved-issues-21] * 修复了通知客户新建交易账户的电子邮件可能应用错误本地化选项的问题。 *** ### 2023 年 1 月 19 日 [#january-19-2023] #### 新功能 [#new-features-25] ##### 新 PS 集成 [#new-ps-integrations-11] * 已集成 **FairPay** 支付提供商,支持入金操作。 * 现已可使用 **Mercuryo** 支付提供商以法定货币出金。 ##### Match-Trader 集成 [#match-trader-integration] 已集成全新的多合一外汇交易平台 **Match-Trader**,可通过 Back Office 和 B2CORE UI 管理客户交易账户及财务。 ##### 集成带有 IB 的 cTrader [#ctrader-integration-with-ib] cTrader 已与介绍经纪商 (IB) 集成,使您能够在该平台上配置并启用 IB 计划。 ##### HelpDesk 服务反馈 [#feedback-for-helpdesk-services] 已集成反馈收集系统,使您的客户能够评估 HelpDesk 服务质量,并就已解决的工单留下评论。 #### 改进 [#improvements-27] * 现在可使用名为 `import-ibs` 的新导入选项导入与 IB 计划相关的数据(例如 IB Email、Client Email 和 IB Type ID);该选项可在 Back Office 中前往**系统** > **导入数据**后使用。 * 在 Back Office 中配置验证等级时,现在可分别为 B2CORE UI(HTML 格式)和移动应用(JSON 格式)指定等级描述。 * 指定桌面版和移动应用版本的横幅标题现已变为可选。 * 手动处理**财务** > **交易**页面列出的 **Partial** 状态交易时,点击**推送**、**取消**或**更改状态**按钮后,现在会显示包含后续用户操作说明的模态窗口。 * 为允许不同部门添加用于配置付费服务的特定参数,现在可通过全新的**服务** > **类别**页面,为不同 Back Office 用户组设置服务参数访问权限。 * 对于临时奖金计划,B2CORE UI 现在会显示**已交易手数**字段,展示客户交易量及其是否符合奖金计划要求。 * 现在可设置在客户每次登录 B2CORE UI 时向其发送电子邮件通知。此类通知包含以下登录详情:日期和时间、IP 地址、设备类型、浏览器和位置。 #### 已解决的问题 [#resolved-issues-22] * 修复了如果上传的图像需要裁剪至所需的 200x200 像素尺寸,则无法通过 B2CORE UI 上传个人资料图片的问题。 * 修复了仅获准查看带有特定标签客户的管理员无法查看**奖金** > **奖金分配**页面数据和创建奖金的问题。 * 修复了如果客户认证测试包含未指定正确答案选项的封闭式问题,则通过测试后会发生错误的问题。 ### 2022 年 12 月 20 日 [#december-20-2022] #### 改进 [#improvements-28] * 现在可以通过在 **System** > **Settings** 页面新增的 **User-admin Session** 选项指定会话时长,从而限制 Back Office 用户的会话时间。达到指定时限后,用户会自动退出 Back Office。 * **Profile** > **Security** 页面上的 **Device Management** 部分已更新,可记录客户端登录 B2CORE UI 时所使用设备、IP 地址和地点的数据。 * B2CORE UI 中的 IB 计划新增了 **IB** > **Reports** > **Trades** 页面。 #### 已解决的问题 [#resolved-issues-23] * 修复了有时无法将客户出生日期数据导入 Back Office 的问题。 * 修复了通过 Back Office 上传客户个人资料图片时发生错误的问题。 *** ### 2022 年 12 月 6 日 [#december-6-2022] #### 改进 [#improvements-29] * 已切换至 Frontman v4 连接的 MT 平台现在可以指定可分配给新建客户账户的 MT 账户号码范围。 * 为帮助您识别 MT 组,在组之间移动 MT 账户时,现在会显示所选 MT 组所属产品的名称和标识符。 * 为防止十进制金额被错误解读,现在无法在 **System** > **Localizations** 页面更改指定为小数分隔符的字符。 *** ### 2022 年 11 月 24 日 [#november-24-2022] #### 新功能 [#new-features-26] ##### 将数据导入 Back Office [#data-import-to-the-back-office] 现在可以将此前从其他第三方系统导出至 CSV 或 TSV 文件的客户及其账户数据导入系统。为此,Back Office 新增了 **System** > **Import Data** 菜单项。 #### 改进 [#improvements-30] * 在 **Clients** > **General** 页面,现在可以一次为多个客户分配标签或更改其资料状态。 * **Back Office 用户的个人资料图片**:现在可以为 Back Office 用户资料上传头像。头像可帮助您快速识别在 Event log 中添加评论的用户。 * 现在可以通过输入 **Google Authenticator** 应用中的 2FA 代码,确认客户在 B2CORE UI 中发起的取款。 * **Finance** > **Exchange** 页面和客户详情中的 **Transactions** 选项卡新增 **Exchanged By** 列。该列指明兑换操作是由客户在 B2CORE UI 中执行,还是由管理员在 Back Office 中执行。 * 在 **Finance** > **Deposit wallets** 页面,现在可以为 **Method** 和 **Currencies** 列选择筛选值。 * 用于发送取款请求 Slack 通知的模板已更新,现包含以下字段以及对应 Back Office 页面的链接:**Project**、**Client name**、**Client email** 和 **Task**(包含指向必须批准或拒绝的取款请求的链接)。 * **Client’s services** 权限类别新增了一组用于管理参数预设的权限(可在 **Clients** > **Services** > **Saved presets** 页面配置): * 查看预设 * 创建预设 * 更新预设 * 删除预设 * 对于使用名为 **Constructor** 的支付提供商的入金和出金方式,在向方式添加自定义字段时,现在可以选择字段类型(**text** 或 **Select with autocomplete**)。根据所选字段类型,添加的字段会在 B2CORE UI 中显示为普通文本字段,或带有建议值的文本字段。 ### 2022 年 11 月 8 日 [#november-8-2022] #### 新功能 [#new-features-27] ##### Commission Cashback [#commission-cashback] Back Office 新增 **Commission Cashback** 菜单项,可在为指定代币推广作出贡献的用户之间分配奖励。奖励以在给定期间内于交易所交易该代币所赚取佣金的一部分进行分配。 #### 改进 [#improvements-31] * 在 **Promotion** > **Banners** 页面配置横幅时,现在可以选择适当的横幅类型:**Desktop** 或 **Mobile**。 * 在 **Event log** 页面中,用户将图片附加到消息时,现在可以直接展开该图片,而无需在新选项卡中打开。 * 对于 **Transfer** 类型的客户请求,新增 **From free funds** 字段,用于显示客户账户中的可用资金金额。 * 对于余额变更操作,**Operation type** 名称已进行如下更改: * **Credit** 更改为 **Deposit** * **Debit** 更改为 **Withdraw** * 对于 **Registration** 向导的 **Advanced** 步骤,现在可以应用 `unique_id_card_number` 规则,以确保客户在注册时提供唯一的身份证号码。 * 现在可以通过点击放大镜图标,检查 **Partial** 状态的交易是否已在 MetaTrader 平台执行: * 如果交易已在交易平台执行,其在 Back Office 中的状态将更改为 **Done**。 * 如果在交易平台中未找到交易,或平台不支持交易检查,您可以在 Back Office 中点击 **push**、**cancel** 或 **confirm** 按钮处理此交易。 * **cancel** 按钮现在可用于取消 Back Office 中的交易,并在交易平台中找到该交易时尝试取消它。 * 向客户在 B2CORE UI 中显示入金和取款方式的顺序,现在由这些方式在 Back Office 中分配的优先级决定。 * 在 **Promotion** > **Menu** 页面配置菜单选项时,现在可以选择特定菜单选项在 B2CORE UI 中适用于哪些类型的客户。 * **Security** > **Search by IP** 页面新增 **Export** 按钮,可将筛选后的数据导出为 CSV 或 XLSX 文件。 * 客户详情中 **Services** 选项卡显示的数据现在可按所有列进行筛选。 #### 已解决的问题 [#resolved-issues-24] * 修复了部分客户无法接收与 Event log 和取款操作相关 Slack 通知的问题。 * 修复了 **Factory** 值设为 100 的交易账户奖金计算不正确的问题。 *** ### 2022 年 10 月 25 日 [#october-25-2022] #### 改进 [#improvements-32] * 现在只能向包含在所选 MT 平台组中的交易账户分配临时奖金。 * 现在可以通过客户详情中 **Files** 选项卡的 **Upload multiple files** 选项,将 7-Zip 和 RAR 压缩包上传至客户文件夹。 * 更改客户电子邮件地址后,用于 HelpDesk 服务的电子邮件现在会自动更改。这使客户能够查看已提交工单的历史记录、状态和消息线程。 * 在 B2CORE UI 的 **Withdrawal amount** 字段中输入数值时,**Source amount** 字段现在会自动填充,并显示兑换为所需币种后的取款金额。 * 客户测试中使用的开放式问题答案现在会在点击 **Next** 按钮后保存,客户返回之前的问题时不会被丢弃。 * 为 B2CORE UI 的 **Referral Programs** 部分配置的横幅现在会显示在仪表板上,而非置于页面顶部。 *** ### 2022 年 10 月 11 日 [#october-11-2022] #### 新功能 [#new-features-28] ##### BitWallet 支持取款操作 [#bitwallet-supports-withdrawal-operations] 除入金操作外,**BitWallet** 支付提供商现在还支持取款操作。 ##### cTrader 的 White Label 解决方案 [#a-white-label-solution-for-ctrader] 现在可以通过在 **White label** 字段中指定所需公司名称,将与 cTrader 平台的连接配置为 White Label 解决方案。 #### 改进 [#improvements-33] * 现在可以指定在 B2CORE UI 中向客户显示公告的有效期。公告将在公告详情中指定的 **Due Date** 到期后,不再向客户显示。 * 从 Back Office 导出数据至文件时,现在可以选择文件格式:XLSX 或 CSV。 * 已修订 **Burn if balance \< 0** 选项,当 MT 账户的净值低于账户信用额时(Equity \< Credit)销毁奖金。 *** ### 2022 年 9 月 27 日 [#september-27-2022] #### 新功能 [#new-features-29] ##### 新 PS 集成 [#new-ps-integrations-12] 已集成新的支付提供商 **Advanced Payment Systems (APS)**,支持入金操作。 ##### 主账户和投资账户密码重置 [#password-reset-for-master-and-investment-accounts] 当客户在 B2CORE UI 中重置其 MetaTrader 4/5 账户密码时,现在需要选择是重置主账户还是投资账户的密码。 #### 改进 [#improvements-34] * 为控制客户在 B2CORE UI 中上传为个人资料图片的图像,新增名为 `Avatar` 的请求类型。 * 现在可以在验证等级详情的 **Daily internal transfer** 字段中设置每日内部转账操作允许的最大金额。如果客户在达到指定限额后想要进行内部转账,则该内部转账请求必须由管理员批准。 * **Total Balance** 小组件现在支持将所有客户钱包中的总余额兑换为您的 B2CORE 系统中可用的任意币种。 * **Finance** > **Transactions** 页面新增用于处理、确认或取消 **Partial** 状态交易的按钮。 * 对于演示类型产品,现在必须填写 **Starting Amount** 字段。该字段指明为此产品创建的演示账户所存入的初始金额。 #### 已解决的问题 [#resolved-issues-25] * 修复了点击顶部栏中显示的通知后,无法直接跳转至客户详情中 **Even log** 选项卡内添加的评论的问题。 * 修复了注册成功后发送的电子邮件中未显示客户名称的问题。 *** ### 2022 年 9 月 13 日 [#september-13-2022] #### 新功能 [#new-features-30] ##### 支持 cTrader 对冲和净额账户类型 [#support-for-hedged-and-netted-account-types-for-ctrader] 现在在为 cTrader 平台创建产品时,可以指定对冲或净额账户类型。客户可根据产品设置,在 B2CORE UI 中创建 cTrader 账户时选择账户类型。 ##### 用于触发事件通知的新事件类型 [#a-new-event-type-to-trigger-event-notifications] 现在可以通过 Slack 和电子邮件接收有关客户通过认证测试的事件通知。 ##### 可选择固定百分比进行转账或取款 [#the-capability-to-select-a-fixed-percentage-to-transfer-or-withdraw] 在 B2CORE UI 中,客户现在可以选择希望转账或取款的账户余额固定百分比(可用选项:25%、50%、75% 和 100%)。 #### 改进 [#improvements-35] * 已优化 Registration 向导工作流配置流程,使您可以快速添加 Basic Information 字段,并在 **Custom fields** 选项卡中指定其设置。 * 对于客户认证测试中的封闭式问题,现在可以选择添加单个或多个正确答案。 * **Internal transfer** 类型现已与其他转账操作分开。您可以通过 **Type** 列筛选转账操作列表。 * 在 **Finance** > **Deposit Wallets** 页面,**Method** 列现在显示指向用于生成钱包地址的入金方式详情的链接。 * B2TRADER 平台的 **Test connection** 选项现在除验证其他连接设置外,还会验证 **Front Office Client ID** 和 **Front Office Client Secret** 字段中指定的凭据。 * 客户详情页面显示的选项卡已重新组织,以便于导航。 * 现在可以选择要从客户详情页面显示的 **Files** 选项卡下载的特定文件夹和文件。 * B2CORE UI 中客户资料的 **Personal information** 部分现在会显示客户电话号码。 * 客户资料中 **Communication Language** 字段指定的语言,现在会在 B2CORE UI 的 **HelpDesk** 页面创建工单时自动应用于 **Language Department** 字段。 * 现在可以在 B2CORE UI 的 **HelpDesk** 页面通过 **Ticket ID** 搜索已提交工单。 #### 已解决的问题 [#resolved-issues-26] * 修复了 B2CORE UI 中为客户显示的其他可用入金方式错误显示首个所选入金方式描述的问题。 * 修复了如果此前关闭过工作区,点击 **Reset** 按钮后无法恢复默认 B2TRADER 工作区的问题。 *** ### 2022 年 8 月 30 日 [#august-30-2022] ##### 各平台之间的兑换和转账操作 [#exchange-and-transfer-operations-between-various-platforms] 现在可以在 B2TRADER、cTrader 和 MetaTrade 平台创建的钱包和账户之间兑换及转移资金。 ##### 支持 Google Pay [#support-for-google-pay] 您可以为特定支付系统启用 Google Pay,为客户增加一种入金选项。 ##### 新的奖金到期机制 [#a-new-bonus-expiration-mechanism] 现在可以配置客户取款时的部分奖金到期。Back Office 中 **System** > **Settings** 的 **Bonuses** 部分新增了相关选项。 #### 改进 [#improvements-36] * **System** > **Users** 部分新增 **Client Tags** 菜单项。使用该选项可查看现有客户标签列表及创建新标签。 * 已引入以下与 **Event log** 相关的改进: * **Events log** > **List** 页面现在会显示在 Back Office 中添加的评论列表,您可以根据已分配的客户标签查看这些评论。 * 现在可以为 Event log 类别添加描述,以说明每个类别的用途。 * 有关 **Event log** 选项卡中新增评论的 Slack 通知现在包含这些评论的文本。 * 顶部栏中的红色计数徽章现在仅在未读通知数量不为零时显示。 * B2CORE UI 的 **cTrader** 页面新增适用操作系统的 cTrader 下载链接。 * B2CORE UI 中 MT 账户卡片和账户详情显示的 **Equity** 图表现已同步,以显示相同数据。 * 如果 Back Office 中未为验证等级指定 KYC 向导,B2CORE UI 的 **Verification** 页面将不再显示 **Next step** 按钮。 * 在 B2CORE UI 的 **Exchange** 页面,**Amount To** 字段现在显示更准确的兑换结果。 #### 已解决的问题 [#resolved-issues-27] * 修复了在新注册客户分配给经理时忽略国家分配规则的问题。 * 修复了除非指定 PS 币种(从中扣除资金的币种)否则无法使用手动和构造器方式取款的问题,而这些方式并不要求指定该币种。 * 修复了无法在 B2CORE UI 的 **HelpDesk** 页面搜索客户提交工单列表的问题。 *** ### 2022 年 8 月 16 日 [#august-16-2022] #### 新功能 [#new-features-31] ##### 新 KYC 提供商集成 [#new-kyc-provider-integrations] 已集成新的 KYC 提供商 **Sapuma**,为运行自动 KYC 验证流程增加了一个选项。使用 **Sapuma** 时,除必填字段外,您还可以定义客户必须填写的自定义字段列表(例如 NIK、Place of Birth、Email、First Name、Date of Birth、Phone Number、Address、City、State、Country 和 ZIP Code),但客户资料中已指定这些字段的情况除外。 ##### 入金方式构造器 [#deposit-method-constructor] 现在可以使用名为 **Constructor** 的支付提供商配置新的入金方式,该提供商允许您通过添加所需数量的文本字段来创建自定义入金表单,客户在创建入金操作请求时必须填写这些字段。 #### 改进 [#improvements-37] * 对于使用 **Midtrans** 支付提供商进行的银行转账操作,客户现在只需指定转账金额并选择银行。其他必填字段会使用客户资料中指定的数据自动填写。 * System 部分新增 Backend images 菜单项,允许用户更改与 Back Office 相关的徽标和其他图像。 * 现在可以向客户认证测试添加三种类型的问题: * open — 表示客户可自由作答的开放式问题。 * close — 表示客户可从给定选项列表中仅选择一个正确答案作答的封闭式问题。 * questionnaire — 表示客户可从给定选项列表中选择一个或多个答案作答的多选问题。 * 新增状态 **Test results pending**,用于指明客户已通过认证测试,管理员应检查测试结果并批准或拒绝。 * 当 MT4 和 MT5 账户被添加至另一账户组时,账户详情(例如 **Product ID**、**Caption** 和 **Currency**)现在会根据组配置自动更新。如果之前的组与支持多币种的产品关联,**Product ID** 不会更改。 * **Events log** 已进行如下增强: * **Events log** 选项卡新增 **View comments** 和 **Reply** 按钮,使您能够展开评论线程并向其中添加新评论。 * 针对将您标记为收件人的新评论的 Slack 通知,现在包含指向 Back Office 中特定评论的链接。 * Back Office 中为 **B2TRADER** 产品启用的币种现在会自动作为资产添加到交易所。 * 将客户 B2TRADER 账户余额批量清零的操作已增强,支持以下选项: * 启用或禁用用于通知客户已执行批量操作的电子邮件分发。 * 对所有已启用币种执行批量操作。 * 在 System log 中指定取款操作的标识符。 * 支持用于识别批量操作是否已完成的附加状态。 * B2CORE UI **Transactions** 页面中 *transfer*、*deposit* 和 *withdrawal* 交易显示的日期和时间,现在表示交易处理的时间。 #### 已解决的问题 [#resolved-issues-28] * 修复了在 **System** > **Countries** 页面中,国家货币名称显示在 **Citizenship** 列而非 **Currency** 列的问题。 *** ### 2022 年 8 月 2 日 [#august-2-2022] #### 新功能 [#new-features-32] ##### 配置自动取款的新机制 [#a-new-mechanism-for-configuring-automatic-withdrawals] 启用自动取款的选项已从验证等级中分离,现与 **payout** 操作类型关联(可通过 **System** > **Operation types** 访问)。 **payout** 操作类型详情新增以下设置: * **Auto withdrawal** — 此设置启用或禁用自动取款功能。 * **Auto processing rules** — 此设置指定为哪些出金组启用自动取款功能。包含在指定出金组中的所有出金方式都将支持自动取款。 对于每个验证等级,可在验证等级详情中的 **Auto withdraw** 字段设置自动取款允许的最大金额。 ##### 与验证等级关联的客户认证测试 [#client-accreditation-tests-associated-with-verification-levels] 配置验证等级时,现在可以使用新的 **Passed Tests Needed** 选项,并选择客户在提交文件以获得该验证等级前必须通过的认证测试。 #### 改进 [#improvements-38] * 为保留已配置平台的设置,如果现有外部连接与配置为使用该连接的平台关联,现在无法将其删除。 * 以前可在币种详情中显示币种详细信息的列(例如 **Markup: Sell**、**Markup: Buy**、**Precision** 和 **Block explorer**)已移至 **Currencies** > **Currencies** 部分。在此处,您现在可以查看与币种相关的完整数据,并通过可用列筛选和排序这些数据。 * B2CORE UI 中用于表示币种金额的最大位数已增加至 18。 * B2CORE UI 中向客户显示的账户卡片现在会显示账户余额的最后更新时间,即使账户余额数据已过期,卡片仍保持可用,客户仍可操作其账户。 #### 已解决的问题 [#resolved-issues-29] * 修复了无法将 **email** 选项添加至现有事件通知渠道列表的问题。 * 修复了当 B2CORE UI 中提供 IB 部分时,**Quick Links** 小组件未显示 **IB** 部分链接的问题。 *** ### 2022 年 7 月 19 日 [#july-19-2022] #### 新功能 [#new-features-33] ##### Event Notifications [#event-notifications] 通过此版本,现在可以设置有关特定事件的通知,并通过 Slack 和电子邮件发送。要配置通知,请导航至 Back Office 新增的 **System** > **Event Notifications** 部分。以下事件可触发通知: * **Tagging users in the Event log** — 有关客户详情中 **Event log** 选项卡添加的备注和评论的通知,其中用户被标记为收件人。 * **Payout requests** — 有关客户创建的出金请求的通知。 ##### Slack 机器人集成 [#slack-bot-integration] 已集成 Slack 机器人,增加了一个发送事件通知的渠道。 #### 改进 [#improvements-39] * 客户详情新增 **Mailing Log** 选项卡,允许您查看发送至特定客户的电子邮件列表。在此选项卡中,您可以将电子邮件列表导出为 CSV 文件。 * B2CORE UI 的 **Wallets** 部分新增 **Hide balances** 选项,允许客户出于安全目的隐藏钱包余额。 * Back Office 的 **PAMM** > **Links** 部分新增 **Use redirect location only** 选项。使用该选项,您可以将客户重定向至您自己的 PAMM 平台(使用 **Redirect location** 字段中指定的 URL),而无需尝试验证其身份及创建支付账户。 #### 已解决的问题 [#resolved-issues-30] * 修复了无法在验证等级详情的 **Document groups** 字段中显示可用选项的问题。 * 修复了客户此前已退出 B2CORE UI 时,点击 **Not a member? Sign up now** 选项后被重定向至 **Sign In** 页面而非 **Sign Up** 页的问题。 * 修复了重新加载页面后无法保存应用于 **TradingView** 小组件的颜色设置的问题。 *** ### 2022 年 7 月 5 日 [#july-5-2022] #### 新功能 [#new-features-34] ##### 增强用户组安全权限 [#enhanced-security-permissions-for-user-groups] 通过此版本,您可以通过禁用 **System** > **Groups** 部分中的特定“view”选项,限制用户访问 B2CORE UI 的整个部分。 #### 改进 [#improvements-40] * 针对支付系统 RAMP 实施了新引擎,遵循集成支付提供商 B2BINPAY 最近的重大更新。 * 创建新的验证等级时,现在可以从 **Verification** > **Levels** 部分中显示的 Wizard 下拉菜单所列可用 KYC 提供商中进行选择。 * Wallets Overview 小组件现在显示以相同币种开立的所有用户钱包的汇总余额。 * 现在可以向 Advanced 工作流类型显示的 Registration Wizard 页面引入自定义步骤。 #### 已解决的问题 [#resolved-issues-31] * 修复了拒绝转账请求时显示重复交易详情的问题。 * 修复了 Market/Limit 小组件中显示不正确佣金币种的问题。 * 修复了 Wallets Overview 小组件中不同币种以相同颜色突出显示的问题。 *** ### 2022 年 6 月 21 日 [#june-21-2022] #### 新功能 [#new-features-35] ##### 新 PS 集成 [#new-ps-integrations-13] 已集成新的支付提供商 **PaymentAsia**,支持入金和取款操作。 ##### Event log 类别 [#event-log-categories] 现在可以定义类别,以组织客户详情 **Event log** 选项卡中添加的备注和评论。为此,Back Office 新增了 **Clients** > **Events log** 部分。 ##### 服务参数的增强多选字段 [#enhanced-multiselect-fields-for-service-parameters] 用于配置服务参数的多选字段(位于 **Clients** > **Services** > **Parameters section**)已修改,使您可以快速在两列之间移动预定义选项以启用或禁用它们。 #### 改进 [#improvements-41] * 已简化创建 eWallet 和 B2TRADER 产品的流程:现在可以在创建产品时选择并启用多个币种。 * 以下 B2TRADER 小组件可添加至默认 Dashboard 布局:**Assets**、**Watch List**、**Open Orders**、**Filled Orders** 和 **Order Book**。 * 现在可以通过将 Lifetime 参数(可在 Back Office 的 **System** > **Settings** 部分中找到)留空,隐藏 B2CORE UI **Sign In** 页面显示的登录二维码。 * B2CORE **Sign In** 页面显示的二维码尺寸已增加,从而可使用 iOS 13 和 15 的移动设备扫描。 * B2CORE **Sign In** 页面现可通过点击 **Eye** 图标切换密码可见性。 * MT 账户密码重置流程已简化:如果禁用 Change Account Password (MetaTrader) 向导,将不再显示用于选择密码重置选项的窗口(生成随机密码或指定自定义密码)。 * HelpDesk 上的请求表单已扩展为根据所选请求选项包含特定字段集。 #### 已解决的问题 [#resolved-issues-32] * 修复了启用 Google reCAPTCHA v2 时无法登录 B2CORE UI 的问题。 * 修复了启用浅色主题时 B2CORE Sing In 页面不显示二维码的问题。 * 修复了客户未登录 B2TRADER 时 B2CORE UI 的 Settings 部分不可用的问题。 *** ### 2022 年 6 月 7 日 [#june-7-2022] #### 新功能 [#new-features-36] ##### 支持新的交易平台 [#support-for-a-new-trading-platform-1] 通过此版本,已集成 **cTrader**,允许客户通过 B2CORE UI 创建 cTrader 交易账户。 ##### 使用二维码登录 B2CORE UI [#signing-in-to-the-b2core-ui-with-qr-codes] 现在可以通过扫描 **Sign In** 页面显示的二维码,从您已登录的 B2BROKER 应用登录 B2CORE UI。 ##### MT 账户自定义密码 [#custom-passwords-for-mt-accounts] B2CORE 现可为 MT 账户设置自定义密码。客户现在可选择为其 MT 账户设置自定义密码或生成随机密码。 #### 改进 [#improvements-42] * 对 B2CORE 注册流程进行了改进,以处理使用过期邀请链接完成注册的情况:现在会向用户显示相应消息,随后会将其重定向至 B2CORE UI 的 **Sign Up** 页面。 * 新增通过 B2CORE UI 选择希望在默认 **Dashboard** 上显示的小组件的选项。为此,请在 Back Office 的 **Promotion** > **Dashboard** 部分中为所需小组件启用 **Show by default** 开关。 * 现在可以通过 Back Office 和 B2CORE UI 上传客户资料照片并指定客户昵称。 #### 已解决的问题 [#resolved-issues-33] * 修复了无法通过 B2CORE UI 打开 MT 演示账户详情并显示其分析数据的问题。 * 对于设置了交易和支付币种的入金方式,修复了为支付币种指定的最小和最大入金值反而应用于交易币种的问题,该问题导致客户通过 B2CORE UI 在 **Deposit amount** 字段中指定金额时显示不正确的验证消息。 * 修复了在小组件尺寸较小时,**Quotes Widget MT** 中数据超出列边界显示的问题。 * 修复了将 **Quick Limit Order** 和 **Quick Market Order** 小组件添加至空间后,显示可用 B2TRADER 小组件列表而非上述小组件的问题。 * 修复了以下与 B2TRADER 小组件工具提示相关的问题: * 修复了显示最后一个小组件工具提示后 B2TRADER 空间变为不可用的问题。 * 修复了显示工具提示时,位于 B2TRADER 空间上部的小组件未完全显示的问题。 * 修复了为非活动 **TradingView** 小组件显示工具提示的问题。 *** ### 2022 年 5 月 24 日 [#may-24-2022] #### 新功能 [#new-features-37] ##### 支持新平台 [#support-for-new-platforms] 通过此版本,已支持 **OneZero** 和 **PrimeXM**。用于管理 OneZero 和 PrimeMX 账户的部分现可通过 B2CORE UI 的 **Platforms** 菜单项访问。要显示这些账户,请在 Back Office 中启用 **OZ/PXM** 选项(**Promotion** > **Menu**)。 ##### 新 KYC 提供商集成 [#new-kyc-provider-integration] 已集成新的 KYC 提供商 **ShuftiPro**,允许您验证客户身份和文件。 ##### 新的 Custom Commissions 小组件 [#a-new-custom-commissions-widget] 通过 B2CORE UI 导航至 **Profile** > **Settings** 后,现可使用一个新小组件,其中包含针对在特定市场交易的客户进行自定义的佣金数据。该小组件仅向已添加至 **Commissions** / **Custom** 组的客户显示。 #### 改进 [#improvements-43] * 客户现在可以通过 B2CORE UI 设置 **Dashboard** 的默认配置,方法是选择所需小组件并自定义其参数,例如仪表板上的尺寸和位置。客户设置的默认配置会在重置 **Dashboard** 或退出 B2CORE UI 后恢复。 * 用于获取客户对自定义协议和条款同意的 **I Agree to** 复选框,已添加至创建 MT4/MT5 账户的卡片中。通过 Back Office 配置产品时,应在 **Agreement Link** 字段中指定客户须同意文件的链接。 #### 已解决的问题 [#resolved-issues-34] * 修复了点击 B2CORE UI 中的 **B2TRADER** 菜单项时无法加载 **Trades History** 小组件的问题。 * 修复了 Firefox 用户可能遇到的 **TradingView** 小组件问题:若小组件此前已更改为显示特定数据,在 B2CORE UI 中切换菜单项后,小组件不显示数据。 * 修复了使用以 +7 开头的电话号码注册 B2CORE UI 时,**Sign up** 屏幕显示不正确国旗的问题。 *** ### 2022 年 4 月 26 日 [#april-26-2022] #### 改进 [#improvements-44] * Back Office 中的公告详情(**Promotion** > **Announcements**)新增 **Reaction Date** 字段。新字段显示客户通过 B2CORE UI 与公告互动的日期和时间。 * 从 Back Office 下载客户文件时,客户详情中 **Files** 选项卡 **Caption** 列显示的文件名现在会用作下载文件的文件名。 * 客户取款请求以及点击 **Finance** > **Payouts** 后显示的取款操作列表中新增 **Compliance approved** 字段。该字段用于识别取款操作是否已通过合规检查。只有被分配相应 **Compliance approved** 权限的管理员用户可更改该字段状态。 #### 已解决的问题 [#resolved-issues-35] * 修复了与 MT 账户相关的问题,该问题导致通过 B2CORE UI 在 MT5 菜单选项中显示 MT4 账户,并在 MT4 菜单选项中显示 MT5 账户。 * 修复了 B2CORE UI 启用 PAMM 选项时 **Quick Link** 小组件不显示数据的问题。 * 修复了在特定情况下验证过程中不接受正确电子邮件和电话确认代码的问题。 *** ### 2022 年 4 月 12 日 [#april-12-2022] #### 改进 [#improvements-45] * 已为 **Midtrans** 支付提供商添加取款操作支持。 * 现可通过 Back Office 自定义每个币种对的汇率提供商优先级。为此,新增了 **Rates Custom Priority** 字段,允许您按所需顺序设置现有汇率提供商(详情请参阅 [如何设置汇率提供商的优先级](../how-to-articles/manage-currencies/how-to-set-priorities-for-exchange-rate-providers))。 * 自动取款选项现适用于集成至 B2CORE 的所有支付提供商。客户取款金额未超过每个验证等级 **Auto withdraw** 字段中指定金额时,无需 B2CORE 管理员批准。 * 现在可以在 **Event log** 选项卡中添加备注时更改文本颜色。 * **Wallets Overview** 小组件已重命名为 **Total Balance**,现在以选定币种显示所有客户钱包的总余额(该小组件支持以下币种:USD、EUR、INR、CAD 和 GBP)。可在 Back Office 的 **Promotion** > **Dashboard** 中配置向客户显示总余额时可用的币种列表。该小组件最多可选择三种币种。 * 现在可通过 Back Office 的 **Promotion** > **Dashboard** 配置 B2CORE UI 中 **Walkthrough** 小组件的可见性。 #### 已解决的问题 [#resolved-issues-36] * 修复了设备旋转至横屏方向时 B2CORE UI 移动版本无法加载小组件数据的问题。 * 修复了 B2CORE UI 中 **Filled orders** 和 **Inactive orders** 小组件无法完全加载的问题。 *** ### 2022 年 3 月 29 日 [#march-29-2022] #### 改进 [#improvements-46] * 已增强从 B2BINPAY 获取币种汇率的机制,以便为每个币种对提供更多汇率数据并更快传送。 * 已更改在 Back Office 的 **Event log** 选项卡中创建新记录时向管理员用户发送的电子邮件通知:**Client ID** 字段现在可点击,且包含指向通过 Back Office 记录的相应记录的 URL;新增显示公司简称和全称的字段。 * 客户详情中 Back Office 提供的 **Deposit**、**Payout**、**Transfer**、**Exchange** 和 **Withdrawal Wallet List** 页面新增 **Export** 按钮,可将这些页面中包含的数据导出为 CSV 文件。 #### 已解决的问题 [#resolved-issues-37] * 修复了未通过 B2CORE UI 完成 KYC 验证的客户仍可选择入金或取款方式的问题。 * 修复了 B2CORE UI 的 **Analytics** 页面显示所有客户账户数据,而非仅显示所选账户数据的问题。 * 修复了总余额等于零时 **Wallets Overview** 小组件无法显示 **Total Balance** 图表的问题。 * 修复了以下与 **Trading View** 小组件相关的问题: * 修复了添加相应指标后 **Trading View** 小组件不显示 **Volume** 图表的问题。 * 修复了切换选项卡后再返回包含小组件的选项卡时,**Trading View** 小组件不显示数据的问题。 * 修复了使用 B2CORE UI 移动版本时无法在 **Trading View** 小组件中显示数据的问题。 * 修复了存在多个工作区时,**Reset** 按钮仅将默认 B2TRADER 工作区重置为默认配置,而非重置所有工作区的问题。 * 修复了此前关闭默认 B2TRADER 工作区时,无法通过点击 **Reset** 按钮恢复这些工作区的问题。 * 修复了 B2CORE UI 可用小组件列表中缺少 **SimpleExchange** 小组件的问题。 *** ### 2022 年 3 月 15 日 [#march-15-2022] #### 新功能 [#new-features-38] ##### 新 PS 集成 [#new-ps-integrations-14] 已集成新的支付提供商 **POLi**,支持入金。 #### 改进 [#improvements-47] * 已实现币种字母代码不区分大小写的比较,以便无论客户账户中指定的币种字母代码使用何种大小写,均可在 **Wallets Overview** 小组件中按币种代码正确显示已排序的可用钱包。 * B2CORE UI 新增荷兰语。 #### 已解决的问题 [#resolved-issues-38] * 修复了无法通过 B2CORE UI 下载 **Withdraw** 页的问题。 * 修复了在 B2CORE UI 中点击 **Profile** > **API Key Management** 时发生错误的问题。 * 修复了 B2CORE UI 中特定小组件仅在重新加载页面后才显示数据的问题。 * 修复了在切换至所选本地化之前于 B2CORE UI **Sign In** 页面更改语言后显示错误消息的问题。 * 修复了 B2CORE Back Office **System** > **Groups** 中 Right 部分下没有 **Files** 子组及相应 **Upload Files** 权限的问题。 *** ### 2022 年 3 月 1 日 [#march-1-2022] #### 新功能 [#new-features-39] ##### 交易检查 [#transaction-check] 加密货币 **Deposits** 和 **Payouts** 详情中新增 **Check transaction** 按钮。成功验证后,会在 **Security** > **Transaction Monitoring** 中创建相应交易记录。此选项仅适用于已配置 SumSub KYT 的客户。 #### 改进 [#improvements-48] * 当 **Mailing** 部分的 SMTP 连接测试失败时,现在会显示详细错误消息,包括每个字段的验证和数据输入错误信息。 * 已改进 **B2BINPAY** 连接: * 已添加异步钱包请求,以加快入金和出金方式编辑页面的加载速度。 * **Provider settings** 中新增 **Destination tag** 和 **Destination tag type** 字段。 #### 已解决的问题 [#resolved-issues-39] * 修复了不提供交易所功能的客户出现 B2TRADER 授权错误的问题。 *** ### 2022 年 2 月 15 日 [#february-15-2022] #### 改进 [#improvements-49] * 与 **BerryPay** 的集成已改进。异步响应的格式以及生成传输数据数字签名的算法均已更改。 * 与 **B2BINPAY** 的集成已改进。添加新的入金方式时,提供商设置中的本地 URL 字段会自动填写。 * **PAX** 货币已重命名为 **USDP**。字母代码和名称均已更新。 * 已为 **注册** 向导添加新规则 `english_chars`。启用后,B2CORE UI 中的注册表单仅接受 **名字** 和 **姓氏** 字段中的拉丁字符。 * **验证** > **级别** 中的 **索引** 和 **下一层级** 字段现已可编辑,显著简化了在 B2CORE UI 中创建和自定义验证级别显示的过程。此前,必须按相反顺序创建级别——从最后一个到第一个。如有错误,无法在 B2CORE UI 中编辑字段顺序。 * 货币对详情中新增 **为管理员启用** 选项。**启用** 选项已重命名为 **为客户端启用**。这使您可以区分通过 B2CORE UI 和 B2CORE Back Office 执行兑换操作的访问权限。 * **货币** > **货币对** 表格中新增以下字段: * **最大金额** * **步长** * **已启用对冲** * **为管理员启用** * **为客户端启用** * 在进一步改进之前,已禁用更改 B2CORE UI 和 B2CORE Back Office 中 MT 账户编号的功能。 #### 已解决的问题 [#resolved-issues-40] * 修复了导致 B2CORE UI 中未显示“个人资料”>“设置”>“等级”和“个人资料”>“安全性”>“白名单”部分的问题。 * 修复了导致 B2CORE UI 中“提现金额”字段保留上一次输入值的问题。 * 修复了导致 Trading UI 即时加载的问题。 *** ### 2022 年 2 月 1 日 [#february-1-2022] #### 新功能 [#new-features-40] ##### B2CORE UI 菜单管理 [#b2core-ui-menu-management] **推广**中新增了 **菜单** 部分。您可以在此管理 B2CORE UI 菜单项,例如根据客户的验证级别更改其可见性。 ##### 客户文件夹树 [#client-folders-tree] **系统**中新增了 **客户文件夹** 部分。现在,您可以创建具有任意嵌套深度的文件夹树。 功能: * 您可以在 **系统** > **客户文件夹** 部分中创建预定义的系统文件夹。这些文件夹将自动添加至所有客户。 * 您还可以在客户详情的 **文件** 选项卡中,为特定客户创建自定义文件夹。请注意,您无法在此处删除系统文件夹。 * 如果创建的系统文件夹与某个客户的自定义文件夹同名,也不会有问题:自定义文件夹名称将添加 `_Custom` 后缀,并会在其旁边创建同名的系统文件夹。 * 在 **系统** > **客户文件夹** 中重命名文件夹时,该文件夹也会在客户详情的 **文件** 选项卡中自动重命名。 * 您可以为文件夹分配访问权限,以指定哪些用户组可以在 **文件** 选项卡中查看和编辑该文件夹。 * 默认情况下,嵌套文件夹会继承父文件夹的访问权限。其访问权限不得宽于父文件夹的权限。 * 当从某个用户组撤销分配给父文件夹的访问权限时,这些用户对所有嵌套文件夹的访问将自动受到限制。 * 向用户组授予父文件夹的访问权限时,系统**不会**自动授予其对嵌套文件夹的访问权限。 ##### 注册成功事件 [#successful-registration-event] **系统** > **事件** 中新增了事件类型 **SuccessfulRegistration**。当客户通过 B2CORE UI 注册,或管理员通过 B2CORE Back Office 创建新的客户资料时,系统会向事件中指定的管理员邮箱发送通知。**系统** > **模板** 中还新增了模板 `SuccessfulRegistration (to admin)`。 ##### 新汇率提供商 [#new-rate-provider] 已集成新的汇率提供商 **WazirX**。 #### 改进 [#improvements-50] * 上传多个文件时,现已支持拖放功能。 * 配置入金/出金方式的佣金时,您可以一次选择多种货币。 * 创建新产品时,货币列表现按字母顺序排序。还实现了快速搜索字段。 * 创建零余额批量操作时,货币列表现显示字母代码而非名称。 * 新提供商 **TransakV2** 已集成至 B2BINPAY。 * 在交易详情中,**客户** 字段现已成为指向客户资料的链接。 * Transfer 类型请求的详情中新增了 **转出账户金额** 和 **转出账户净值** 字段。如果账户不具有这些参数,则显示 `0`。当前余额从平台获取。 * 已优化兑换页面接收汇率的流程,因此仅加载与客户钱包对应的货币对汇率。 #### 已解决的问题 [#resolved-issues-41] * 修复了未预先刷新页面时无法登录 B2CORE UI 的问题。 *** ### 2022 年 1 月 18 日 [#january-18-2022] 此版本旨在解决技术债务并提高稳定性。 #### 改进 [#improvements-51] * 现可为返佣选择账户类型——交易账户或个人账户。对于个人账户类型,在比较钱包货币与交易账户货币后,返佣将存入钱包。如果返佣是针对多个交易账户计算的,则会以单独入金的形式记入钱包。 #### 已解决的问题 [#resolved-issues-42] * 修复了在产品设置中指定 `Max accounts = -1` 时无法取消归档 MT 账户的问题。 ### 2021 年 12 月 21 日 [#december-21-2021] #### 新功能 [#new-features-41] ##### 客户认证 [#clients-accreditation] 已实现一项新功能,可让您管理和配置客户认证。**验证**页面新增了 **客户测试** 部分。在此部分中,您可以指定客户需要回答的问题,以便在 B2CORE UI 中获得更高的验证等级。此外,客户详情中新增了“测试结果”选项卡。 ##### 保存出金详情 [#saving-withdrawal-details] 通过 B2CORE UI 提交出金请求时,客户现在可以选择保存出金详情,避免在后续每次出金时再次填写相同的信息。客户资料中新增了 **财务** 部分,您可在其中查看所有已保存的出金数据。管理员也可通过 B2CORE Back Office 访问此数据,只需切换至客户详情中新增的 **已保存出金** 选项卡。 ##### 钱包详情 [#wallet-details] 在 B2CORE UI 中,现在可以查看指定钱包的交易历史记录。 ##### 服务预设 [#service-presets] 您现在可以创建预配置预设,并在添加新客户服务或自定义现有服务时快速应用。与特定服务关联的预设可在 **客户** > **服务** > **已保存预设** 部分中访问。 #### 改进 [#improvements-52] * **安全** > **交易监控** 部分中的数据现在默认按 **交易 ID** 字段降序筛选。 * 客户详情的 **文件** 选项卡新增了 **上传多个文件** 按钮。 * **客户** > **服务** 部分中新增了有关服务参数的信息。服务参数列在单独的表格列中;为不同客户指定的参数值显示在相应的行中。 * 在 B2CORE UI 中,**删除账户** 选项已被移除,直至进一步改进完成。 #### 已解决的问题 [#resolved-issues-43] * 修复了在 B2CORE UI 中显示交易历史金额值时忽略精度设置的问题。 * 修复了入金金额字段的验证规则。该规则现基于“入金金额”字段中所选资产的精度设置。 * 修复了添加出金白名单时出现问题的问题。 * 修复了重新发送 2FA 代码后计时器错误重置的问题。 *** ### 2021 年 12 月 7 日 [#december-7-2021] #### 新功能 [#new-features-42] ##### 多币种账户 [#multi-currency-accounts] 从此版本开始,B2CORE 可以处理多币种账户。产品详情中新增了 **币种** 选项卡。创建产品后(此步骤仍需选择基础币种),您可以向其中添加不限数量的币种。已添加币种的设置可以覆盖产品设置。此外,为 B2TRADER 平台(支持多币种账户)创建产品也变得更加容易。此前,您必须创建一个平台产品,然后使用 Wallet Wrapper 为每种币种创建钱包。现在,您可以一次性完成所有操作:创建平台产品并向其添加所有所需币种。 ##### B2BINPAY:商户客户和多种地址类型 [#b2binpay-merchant-clients-and-multiple-address-types] 对于 B2BINPAY v2,已实现商户客户交易的处理。同时,还新增了对多种地址类型的支持。在 B2BINPAY 方法的设置中,具有多种地址类型的币种会显示地址类型字段。 #### 改进 [#improvements-53] * **交易已批准**(用于出金)和 **财务已验证**(用于入金)字段值的编辑现在仅对具有相应访问权限的管理员用户开放。对应设置已添加至 **系统** > **群组**。 * 已为文本类型的服务参数启用文本换行。 * 对 **安全** > **交易监控** 实施了多项改进: * **交易 ID** 现在显示操作本身的标识符。 * 新增四个支持筛选的列:**创建日期**、**电子邮箱**、**源金额**、**源币种**。 * 新增了 **导出** 按钮。 * **系统** > **用户** 中新增以下列:**2FA 状态**、**IP 白名单**、**群组**。 * 已为 Trading UI 实现骨架屏,用于显示小组件的加载状态。 * 改进了 CoinMarketCap 集成,以获取“罕见”货币对的汇率:若未提供汇率,将访问额外的汇率资源。 * 改进了 SendGrid 集成,以绕过最多 1000 个电子邮件收件人的限制。 * 在注册 B2CORE UI 时,系统会根据所选国家预先选择电话区号。 #### 已解决的问题 [#resolved-issues-44] * 修复了导致 B2CORE UI 中验证页面无限加载的问题。 * 对于 MT4 和 MT5 账户,修复了导致交易历史中 Pending 订单无限加载的问题。 * 修复了排序上下箭头的问题,该问题会导致按余额或名称错误地排序 MT 账户和钱包。向上箭头现在可正确按升序排序,向下箭头则按降序排序。 * 修复了 TradingView 小组件中 Reset 按钮无效的问题。 * 对于 MT5 账户,修复了交易历史中 Profit 参数值以指数表示法而非十进制显示的问题。 *** ### 2021 年 11 月 24 日 [#november-24-2021] #### 新功能 [#new-features-43] ##### 隐藏收件人电子邮箱 [#hiding-recipients-emails] 接收通过 SendGrid 发送的电子邮件时,您的收件人现在仅能在邮件列表中看到自己的地址,而不会看到其他收件人的电子邮箱。 ##### 每日 SMS 限制 [#sms-daily-limit] **系统** > **设置** > **其他** 中新增了 **每位收件人的 SMS 限制** 设置。您可使用该设置限制每天可向每个客户发送的 SMS 数量,避免余额的不受控消耗。该设置将应用于注册和 2FA 确认期间发送的 SMS。如果超出限制(例如,客户已收到允许数量的 SMS,但仍无法输入正确的 2FA 代码),将阻止向该客户发送 SMS 一年。 ##### 通过 Back Office 提交验证请求 [#verification-requests-via-back-office] 客户详情中,**文件**选项卡新增了 **验证请求** 按钮。使用此按钮可直接通过 B2CORE Back Office 上传文件并创建下一验证等级的请求。重要提示:如果已为该客户创建一个处于开放状态的 Verification 类型请求,则无法创建新的请求。 ##### 新支付系统集成 [#new-ps-integrations-15] 已集成新的支付系统 **Help2Pay**,支持入金和出金操作。可用币种如下: * `MYR` — 马来西亚林吉特 * `THB` — 泰铢 * `VND` — 越南盾 * `IDR` — 印尼卢比 * `PHP` — 菲律宾比索 #### 改进 [#improvements-54] * 在客户详情中,**文件**选项卡的位置已调整,现位于 **服务** 和 **高级** 选项卡之间,以便更快访问。 * 现在可以拒绝与已删除客户相关的 **验证** 请求。 * 已改进返佣计算机制: * **返佣百分比** 已重命名为 **返佣值**,这意味着它不再是百分比值。计算公式保持不变:`cashback = lots amount × cashback value`。 * 如果两个交易平台处于活跃状态且连接至同一数据库,则返佣仅记入一次。 * 使用模拟账户交易不再获得返佣。 * 不再可以在 **系统** > **本地化** 中禁用所有语言。必须至少启用一种语言,否则无法保存更改。 * 对于 B2BINPAY 转账,**创建时间**值现在被视为收到最终确认的日期和时间,而不再像以前那样表示创建转账的日期和时间。此变更旨在避免不一致。对于其他支付系统,该值仍表示创建发票的日期和时间。 * B2CORE UI 中的钱包现已提供列表视图。 * 已完成向新版 WebSDK SumSub 的迁移。有关更多信息,请参阅 [SumSub 文档](https://developers.sumsub.com/migrations/sdk.html#advantages-of-the-new-sdk)。 #### 已解决的问题 [#resolved-issues-45] * 对于 Google Chrome 和 Safari,修复了访问令牌过期后系统注销用户而非刷新令牌的问题。 * 修复了电子邮件消息仅发送至已上传 CSV 文件中第一个电子邮箱,且未处理其他地址的问题。 *** ### 2021 年 11 月 9 日 [#november-9-2021] #### 新功能 [#new-features-44] ##### 立即重置密码 [#immediate-password-reset] Back Office 中新增了为特定客户或所有客户一次性请求重置密码的选项。客户尝试登录时,将收到密码已失效且必须更改的通知。重置密码前需要进行电子邮件验证(使用验证码)。 #### 改进 [#improvements-55] * 改进了系统设置的内部存储:新增了具有唯一名称的群组。 * MT4/MT5 模拟账户可以在不转移剩余资金的情况下归档。客户 UI 和 Back Office 均支持归档。 * 对于 B2BINPAY v2 回调,新增了按币种别名的额外检查,以避免名称不匹配时发生错误。 * 删除个人数据后(点击 Delete Account 按钮),该客户的所有活跃请求将自动被拒绝。 #### 已解决的问题 [#resolved-issues-46] * 修复了尝试打开交易 UI 时重定向至仪表板的问题。 * 修复了多分钟无操作后 TradingView 图表不显示的问题。 *** ### 2021 年 10 月 26 日 [#october-26-2021] #### 新功能 [#new-features-45] ##### 已交易手数返佣 [#cashback-for-traded-lots] 经纪商现在可以设置返佣比例来奖励交易者。返佣设置为每交易一手的固定金额,并以钱包币种支付。 ##### 测试邮件连接 [#testing-mailing-connection] Mailing > System > Providers 部分新增了 Test Connection 按钮,可用于测试现有连接的状态。每封电子邮件发送失败后,自动超时时间将从 0 依次增加至 5、25、125 秒等,但不会超过 52 分钟,之后超时循环将从 0 重新开始。 ##### 新支付系统集成 [#new-ps-integrations-16] 已集成新的支付系统 **Gibilling**,支持出金操作。 #### 改进 [#improvements-56] * Watchlist 小组件已完全重新设计,拥有全新的简洁界面,并提供更好的用户体验。 * 为方便用户使用,B2CORE UI 安全部分中的 Whitelist 和 Device management 小组件已交换位置。 * 改进了 Sumsub 连接设置,使系统在 SyncData 期间从 Sumsub 的 Personal info 部分获取客户信息,而非此前的 Provided Personal Info 部分。 #### 已解决的问题 [#resolved-issues-47] * 修复了货币兑换问题:当报价币种钱包余额为零时,Exchange 按钮处于非活动状态。 * 修复了涉及 Cryptocompare 和 BTC-Alpha 汇率提供商的兑换操作显示错误汇率的问题。 *** ### 2021 年 10 月 12 日 [#october-12-2021] #### 新功能 [#new-features-46] ##### 自动奖励金最低金额 [#auto-bonus-minimum] 管理员用户现在可以设置触发自动创建奖励金的最低入金金额。最低入金金额适用于向 MT 账户进行的每次资金转账。要了解此新功能,请导航至 System > Settings > Bonuses。 ##### 自动奖励金限额 [#auto-bonus-limit] 管理员用户可以限制向客户支付的自动创建奖励金总额。当向客户自动创建的奖励金总额达到指定限额时,将不再生成新的自动创建奖励金。仅适用于向 MT 账户转入资金。要了解此新功能,请导航至 System > Settings > Bonuses。 ##### 出金时销毁奖励金 [#bonus-burn-on-withdrawal] System > Settings > Bonuses 部分新增了 Burn on withdrawal 切换选项。如果已启用,且客户进行出金,则为特定账户计算的所有奖励金都将被销毁并标记为 Expired;如果已禁用,且客户进行出金,则所有奖励金将保持活跃。 ##### 服务参数的表格类型 [#table-type-for-service-parameters] 服务参数现在新增了 Table type 选项,可用于指定该特定服务的列数和行数。要了解此新功能,请导航至 Clients > Services > Parameters 并编辑所选参数。 ##### 注册身份工作流程功能 [#register-as-workflow-feature] 用户注册向导新增了 Register As 工作流程选项,允许管理员用户选择将自动分配给通过此向导注册的所有新用户的客户类型。 ##### 用户设置的新筛选器 [#new-filters-for-user-settings] 管理员用户现在可以借助 System > Users > Edit 选项卡中“国家”字段新增的 Include 和 Exclude 选项,按地理位置限制特定用户可查看的客户列表。如果 Exclude 选项处于活跃状态且指定了某个国家,则具有这些设置的用户将看到除所选国家外所有国家的客户列表。如果 Include 选项处于活跃状态且选择了某个国家,则具有这些设置的用户将仅看到所选国家的客户列表。 ##### 按合作伙伴 ID 限制产品查看 [#product-view-restriction-by-partner-id] 经纪商现在可以限制特定 IB 以及该 IB 客户对产品的访问权限。这些设置在 Back Office 中进行,并会反映在 B2CORE UI 中。 #### 改进 [#improvements-57] * API 新增乌尔都语、希腊语、乌克兰语、芬兰语、瑞典语和挪威语。 * MT4/MT5 Wrapper v3 的错误消息现在以描述清晰、易于理解的格式显示。 #### 已解决的问题 [#resolved-issues-48] * 修复了 TradingView 小组件不会自动切换数据以匹配交易者所选市场的错误。 * 修复了 Wallet 小组件不必要地向上取整 Total balance 总和的问题。 * 修复了当存在两个 ID 相同的账户时内部转账期间发生的错误。 * 修复了 Partial 状态交易被列在状态为 Successful 的入金列表中的问题。 * 修复了未考虑之前 Start amount 设置,导致新 MT Demo 账户以零余额创建的错误。 * 修复了隐藏管理面板中用户创建表单多个字段标签的错误。 * 修复了发送给客户的新入金消息中 Amount 字段为空的问题。 * 修复了管理面板用户设置中 Countries 字段筛选器操作不正确的问题。 * 修复了所有转账列表与各转账详情之间状态显示未同步的问题。 * 修复了取消勾选 View mailing 选项时 Mailing 部分未隐藏的问题。 *** ### 2021 年 9 月 28 日 [#september-28-2021] #### 新功能 [#new-features-47] ##### 数据脱敏 [#data-masking] 具有完全访问权限的管理员现在可以通过分别启用 *Mask Data* 和 *Update Masking Data* 复选框,对其他管理员或管理员群组应用数据脱敏选项。启用后,数据脱敏将阻止选定用户查看以下客户数据:客户名称、电子邮箱和电话号码。这适用于系统中显示的数据以及导出的文档。要了解此新功能,请导航至 System > Users/Groups > Edit。 ##### 符合 GDPR 的客户数据保护工具 [#client-data-protection-tool-in-compliance-with-gdpr] 新增了一项功能,允许经纪商删除已删除客户资料中的全部个人客户数据。系统将删除以下个人数据:名字、中间名、姓氏、电子邮箱、国家、地址、电话、文档、历史数据、设备。 ##### B2BINPAY 交易检查 [#b2binpay-transactions-check] B2BINPAY > Wallets 部分新增了 Check 选项,允许用户审核选定时间段内的所有 B2BINPAY 入金或出金。 ##### 新工作流程类型 [#new-workflow-type] System > Events > SuccessfulOperationHandler > Event handler workflow 中新增了 SendNotificationFlow 工作流程。新工作流程会将所有成功交易的详情发送至电子邮箱。 ##### 钱包显示币种 [#wallet-display-currency] 用户现在可以选择显示钱包数据所使用的币种。目前可用币种为 USD 和 EUR,近期版本将新增更多币种。 #### 改进 [#improvements-58] * 可通过主页顶部栏消息图标访问的管理员消息现在将始终保存,无论其是否已读。被标记管理员的列表显示在消息顶部。为便于导航,发送给当前管理员的消息使用与其他消息不同的颜色标识。 * 现在不能从 System > Wizards > Edit element > Workflow 中移除 Password 字段,除非先启用 Password Auto Generation 选项。 * 用户现在可以动态编辑以下交易详情:*Transaction hash*、*Status*、*Rate (USD)*。交易的 Final amount 将自动重新计算。 * 已从 B2CORE 数据库中移除所有与 B2Margin 相关的账户/钱包、交易、产品和平台。 * 改进了 B2TRADER Adv UI Workspace 小组件结构,因此当用户移动或添加新小组件时,现有小组件将保持原位而非移动,并遵循层叠原则,直至设置所有小组件。 #### 已解决的问题 [#resolved-issues-49] * 修复了阻止自动生成月度财务报告的错误。 * 修复了交易监控中的 Withdrawal 筛选器问题,该问题导致应用筛选器时显示零条目。 * 修复了 Finance > Payouts 中阻止出金处理的 *In Progress* 状态错误。 * 修复了 Finance 部分导出数据中缺少 *Payment Name* 和 *Name fields* 的错误。 * 修复了阻止在 Security > Transaction Monitoring 中生成报告的错误。 * 修复了转账状态回调为 *unconfirmed* 的入金被视为 *confirmed* 的错误。 *** ### 2021 年 9 月 14 日 [#september-14-2021] #### 新功能 [#new-features-48] ##### 文件迁移工具 [#files-migration-tool] 新增了文件迁移工具,可让您仅通过在 Edit File 选项卡的 Directory 字段中选择所需目录,即可在目录之间移动客户文件。文件只能移动至同一客户的其他目录。 ##### B2BINPAY v2 汇率提供商集成 [#b2binpay-v2-rate-provider-integration] 已集成新的汇率提供商 — B2BINPAY v2。 ##### 根文件夹限制 [#root-folders-restrictions] System > Settings 中新增了一个部分,允许管理员限制或授予选定用户访问根文件夹的权限。 #### 改进 [#improvements-59] * Clients > Details > Event Log 中新增了事件日志消息功能,可向消息中标记的管理员发送事件日志消息。 #### 已解决的问题 [#resolved-issues-50] * 修复了 B2CORE 无法识别支付系统发送的 GBPay 回调的问题。 * 修复了 GBPay 集成问题:生成的 Reference 编号包含数字、大写和小写字母,但该支付系统仅接受数字和大写字母。 * 修复了 Payments > Deposits 中 Total Amount 的空值显示不正确的问题。 * 修复了 Accounts 表格设置中的问题:取消勾选 Hide zero balance 选项后,表格不会刷新回完整列表。 * 修复了已启用 2FA 选项的用户,其 2FA 设置显示为 Disabled 的问题。 *** ### 2021 年 8 月 31 日 [#august-31-2021] #### 新功能 [#new-features-49] ##### 交易接收事件 [#transaction-receival-event] 新增事件类型 — SuccessfulOperation,在接收到新的成功交易(入金、出金、转账或兑换)时,会向提供的外部 URL 发送 POST 请求。 ##### 余额接收事件 [#balance-receival-event] 新增另一种事件类型 — AccountBalanceReceived,该事件每 12 小时检查 SMS 提供商的余额,并在余额较低时发送电子邮件通知。同时还新增了相应的电子邮件模板 — BalanceSmall。 ##### 客户数据同步 [#client-data-synchronization] SumSub 设置中新增了一项操作 — Sync Data,该操作会开始同步验证等级高于 0 的客户的文档及个人数据(名字、姓氏等)。可在日志中检查执行情况。每小时允许触发一次该操作。 #### 改进 [#improvements-60] * 为客户详情的 Event Log 选项卡新增了单独的访问权限组。 * 对于 B2Margin 和 B2Margin Cash 平台,在 B2CORE UI 中更改电子邮箱时,平台上的电子邮箱也会随之更改。 * B2TRADER 平台设置已迁移至 External connections。 * 新增了新入金和被拒绝入金的电子邮件通知模板。默认情况下,新入金电子邮件通知模板处于禁用状态。 * 从客户详情的 Services 选项卡中移除了以下字段:Service Setup Fee、Service Monthly Fee、Service Sign Date。 * Services 中的参数构造器新增以下类型:text、numeric、date、select、multiselect、checkbox。 * 归档模拟账户时,现将跳过资金检查,并可立即归档账户。 * Nexmo 提供商已适配新品牌 — Vonage。 * 调整了 Toshimart 集成,现在可自动从客户获取 First Name、Last Name 和 Email。 * 调整了与 SumSub 的 KYT 集成,现在会将交易中实际使用的钱包发送进行检查。 * 调整了用于外部入金的 BPay 集成,新增提供商 — BPayExternal。 #### 已解决的问题 [#resolved-issues-51] * 修复了带转换入金中最终入金金额计算时忽略加价的问题。 * 修复了注册时仍可选择已禁用国家的问题。 * 修复了因连接缓慢而导致登录页面会话过期的问题。 * 对于 Windows 10,修复了在 Google Chrome 中切换至其他选项卡后小组件刷新的问题。 * 修复了登录后切换至 Exchange 页面时无限重定向的问题。 * 修复了奖励金小组件进度条百分比显示不正确的问题。 * 修复了在 TradingView 中添加的任何指标切换至其他页面后消失的问题。 * 修复了每次点击后都会发送 auth 请求的问题。 * 修复了反钓鱼代码不接受以西里尔字母输入的值的问题。 * 修复了 OneZero 账户保证金水平计算不正确的问题。新的正确公式为:`Margin Level = Margin Used [Equity — Free Margin] / Equity * 100% = (1 — Free Margin/Equity) * 100%`。 * 修复了出金请求电子邮件通知中显示自定义字段代码而非其名称的问题。 *** ### 2021 年 8 月 3 日 [#august-3-2021] #### 新功能 [#new-features-50] ##### 标记并通知管理员 [#tagging-and-notifying-an-admin] 在创建新评论时,客户详情的 Event Log 选项卡中新增了下拉列表。使用下拉列表可标记管理员。管理员将通过新增至顶部工具栏的图标收到通知。点击该图标后再点击消息,管理员将被重定向至客户详情的 Event Log 选项卡。 ##### 目录 [#directories] 已为客户详情的 Files 选项卡实现使用目录(文件夹)的功能。 ##### AdvCash 出金渠道 [#advcash-withdrawal-channels] 在提供商中新增了 AdvCash 出金渠道,现在您可以在管理面板的 System > Payout system > Payout methods 页面配置渠道。 #### 改进 [#improvements-61] * Services > List 和服务创建表单中新增了 External system id 字段。 * 对 Services > Clients 进行了改进: * 新字段:Client internal type、Client type、Company short、Company long、Tags 和 Manager。 * ID 可点击,并跳转至客户详情。 * Service name 可点击,并跳转至服务详情。 * Email 可点击,并会复制到剪贴板。 * Adv UI 中的 Simple Exchange 现在支持在买入和卖出操作之间切换。例如,您可以将 BTC/USDT 市场切换为 USDT/BTC。 * 我们将 B2Margin 和 B2Margin Cash 合并为单一平台。为便于使用,配置已部分迁移至 External Accounts。 * 我们增强了 BPay 集成,使其能够接收来自外部系统的回调,并通过检查详情中的用户 ID 为终端用户入账。 * 即使您没有编辑服务的权限,现在也可以在客户详情的 Services 选项卡中查看服务详情。 * B2TRADER 授权现在使用令牌而非 Cookie。 * 通过优化数据库请求,改进了 Finance > Exchange 和 Finance > Transfers 页面的导出功能。 #### 已解决的问题 [#resolved-issues-52] * 修复了导出 **财务** > **入金** 时 **金额** 和 **最终金额** 字段的值舍入问题。 * 修复了允许使用 `account_id` 提取未经允许资产的问题。 * 对于 B2TRADER Adv UI,修复了导致页面自发刷新的问题。 * 修复了在 Dashboard 页面将小组件拖出边界后,页面水平滚动无法恢复默认值的问题。 * 修复了导致 TwilioPhone 不显示在外部连接列表中的问题。 * 修复了导致 CoinGecko 汇率提供商不显示汇率的问题。 * 修复了将用户状态更改为 Inactive 时已授权用户发生注销错误的问题。 * 修复了无法在电子邮件中查看 Anti-Phishing Code 的问题。 * 修复了打开 Exchange 页面时可能导致无限重定向的问题。 * 修复了启用 SMS 2FA 时新增的 Anti-Phishing Code 不显示的问题。 *** ### 2021 年 7 月 20 日 [#july-20-2021] #### 新功能 [#new-features-51] ##### Twilio Voice 集成 [#twilio-voice-integration] 新的 Twilio Phone 提供商已添加至 External Connections。进行设置后,您可以从个人信息页面呼叫客户。 ##### CoinGecko 集成 [#coingecko-integration] CoinGecko API 集成。开源汇率提供商。 ##### Profile > Security [#profile--security] 多个区块已移至 **Profile** > **Security** 页面,并新增了一些区块: * **Address Management** 从 **Settings** 移入。 * **Two-factor authentication** 从 **Settings** 移入。 * 新增 **Anti-Phishing Code** 区块(4—20 个非特殊字符)。启用 **Google Authenticator** 后可用。 * 新增 **Device Management** 区块,显示受信任设备列表。 #### 改进 [#improvements-62] * 管理面板 Mailing 部分新增了 SMTP 服务器设置。可以配置电子邮件存储期限、重新发送和删除未发送电子邮件。 * 新增监控功能以防止滥用 Adv UI。如果在一分钟内添加超过 20 个小组件,或执行超过 20 次调整大小/移动操作,系统将提示用户重置 Workspace 并停止滥用活动。 * 优化了出金列表的导出。下载速度提高最多 4 倍,电子邮件发送速度提高最多 3.5 倍。 #### 已解决的问题 [#resolved-issues-53] * 对于 BetaTransfer PSP,修复了在管理面板创建资金出金方法期间返回不正确币种列表的问题。 * 修复了 TradingView 小组件在套接字重新连接后可能显示错误数据的问题。 * 修复了 TradingView 小组件拒绝调整图表大小的问题。 * 修复了更改入金/出金方法期间显示先前方法汇率的问题。 * 修复了使用多个 PS Currencies 时始终入金第一个币种的问题。 * 修复了滚动页面时下拉列表固定在屏幕上的问题。 *** ### 2021 年 7 月 6 日 [#july-6-2021] #### 新功能 [#new-features-52] ##### 出金方法构造器 [#payout-method-constructor] 已添加 Constructor 出金提供商。通用设置与其他提供商相同,但额外提供了 Custom Fields 区块,其中包含 Add Field 选项。字段名称可以编辑。字段值可以在创建出金时设置,也可以在相应的客户请求中查看。 #### 改进 [#improvements-63] * 优化了客户、账户和支付列表的导出。下载速度提高最多 4 倍,电子邮件发送速度提高最多 3.5 倍。 * Payeer 设置已迁移至 External Connections。现在,B2CORE 所有者可以在方法设置中配置确切的 Payeer 出金渠道,以便为不同渠道配置不同的佣金/命名等。 * 对于 B2Margin Cash,新增了使用令牌授权登录交易 UI 的功能。 * 对于 PrimeXM,新增了转账请求设置。 * Deposits 和 Payouts 表格中新增了 Final Currency 字段 — 资金入账/扣账所用的币种。为方便使用,该字段也会显示在客户详情 Finance 选项卡的表格中,并与 Rate currency 和 Rate (USD) 字段一同显示。 * 在 Security 中按 IP 搜索时,现在可使用 Hide IP duplicates 选项。启用此选项可按唯一的电子邮箱 + IP 组合对条目进行分组。 * TradingView 小组件新增 4 小时 K 线时间周期。 #### 已解决的问题 [#resolved-issues-54] * 修复了 Trade history 小组件中所有工具的手数值均设为 0 的问题。 * 修复了内部客户类型“agent”的显示名称。 * 修复了带转换出金且仅有一种 PS 币种可用时,Back Office 显示错误目标币种的问题。 * 修复了 Public exchange 中特定货币对链接无效且所有小组件显示默认货币对的问题。 * 修复了 New Deposit Amount 选项影响目标币种(TR Currency)而非源币种(PS Currency)入金金额的问题。 * 修复了客户详情 Trades 选项卡中 Fee Product 值不显示的问题。 *** ### 2021 年 6 月 22 日 [#june-22-2021] #### 新功能 [#new-features-53] ##### PrimeXM 集成 [#primexm-integration] 现在可以配置与 PrimeXM 平台的连接并获取客户账户。Back Office 中将显示有关余额、净值、保证金、PnL、转入/转出账户资金的详细信息。在 B2CORE UI 中,PrimeXM 账户将显示在 Wallets 页面。 ##### B2TRADER 的简单兑换 [#simple-exchange-for-b2trader] 高级 UI 中新增了一个小组件。如果两个钱包都位于 B2TRADER 平台,Simple Exchange 可通过 FOK 订单兑换币种。 #### 改进 [#improvements-64] * 现在将检查汇率提供商的所有自定义字段有效性。此外,如果刚创建的提供商具有密码字段,该提供商将被创建为禁用状态;尝试启用密码字段为空的提供商时,将显示错误消息。 * 客户奖励金详情现在会显示创建奖励金时设置的字段。 * B2Margin Cash 登录信息现在存储在 B2CORE UI 中。 * 达到最长不活跃时间后,账户不再被归档,仅禁用交易选项。 * 对于 Banners 和 Announcements,新增了 Button URL 字段。如果指定了值,点击按钮后客户将被重定向至指定 URL。 * 创建 MetaTrader 账户时,现在可以选择仅包含 Investor Password 而不含 Password 的 Investor Only 模板。 * 新增一种客户请求类型,用于快速筛选与 Introducing brokers 相关的请求。 #### 已解决的问题 [#resolved-issues-55] * 修复了尝试查看兑换详情时导致错误的问题。 * 修复了尽管具有访问权限,部分客户菜单中未显示 Internal Transfer 项目的问题。 * 修复了加载 Wallet 页面时显示空钱包列表的问题。 * 修复了需要审批的账户在未创建请求的情况下被创建的问题。 * 对于 Introducing brokers,修复了按国家、纬度、经度和持仓生命周期进行排序和筛选的问题。 * 修复了兑换界面中语言选择窗口显示不正确的问题。 * 修复了 TradingView 小组件在缩小和滚动图表时出现间隙的问题。 * 修复了出金请求中的错误翻译。 *** ### 2021 年 6 月 8 日 [#june-8-2021] #### 新功能 [#new-features-54] ##### 对冲失败处理程序 [#hedging-fail-handler] Events 中新增了一种类型。兑换操作对冲失败时,您现在可以收到包含交易 ID 的电子邮件或 Slack 通知。 ##### 请求接收处理程序 [#request-receival-handler] Events 中新增了另一种类型,当创建特定类型的请求时,该类型会发送电子邮件通知。 ##### IB 中支持 B2TRADER 平台 [#b2trader-platform-support-in-ib] 新增了另一个交易平台 — B2TRADER。可在 B2CORE Back Office 中配置与平台的连接及佣金支付计划。 #### 改进 [#improvements-65] * 如果将不存在的类指定为向导,现在无法保存验证等级。 * 在 Registration 向导字段构造器中,Label 字段值现在为必填项。 * 对 B2Margin Cash 平台进行了多项改进: * 在账户详情中,现在显示交易平台群组并可进行编辑。 * 在产品详情中,现在可以设置多个平台群组。 * 编辑产品或 B2Margin Cash 平台账户的平台群组时,一个域中仅允许一个群组。 * 向 B2TRADER 平台的私有 API 请求中新增了 `nonce` 值。Nonce 是一个 64 位整数,在所用公钥范围内的 22 秒时间间隔中唯一。它用于提升交易方法的安全性。适用于配置 B2TRADERShadow 平台以进行兑换对冲的 B2CORE。 * B2TRADER 平台授权现在使用令牌而非 Cookie。 * 验证请求中现在会在 `snsHost` 字段发送当前活跃外部连接的值。 * Introducing brokers 中的交易品种详情、交易详情和奖励详情新增了基础币种和报价币种。 * Introducing brokers 中已重新设计并改进奖励状态和详情、交易详情及交易品种详情的命名。重新组织了数据展示以提高便利性。 #### 已解决的问题 [#resolved-issues-56] * 修复了 Open Orders 小组件在限价单 Price 中显示零的问题。 * 修复了取消订单时发生意外错误的问题。 * 修复了 Safari 中重新登录 B2CORE UI 时会话过期的问题。 * 修复了在 B2CORE UI 中重新切换到兑换选项卡时数据加载缓慢的问题。 * 对于 Trading View 小组件,修复了默认图表类型。现在始终为 Candles。 * 修复了 WatchList 小组件中删除条目后 Remove 工具提示未消失的问题。 * 对于 MT4 和 MT5 Accounts,修复了没有交易时不显示账户数据的问题。 * 修复了配置入金方法时已连接 B2BINPAY v2 钱包显示不正确的问题。 * 修复了带转换入金方法的计算。 *** ### 2021 年 5 月 26 日 [#may-26-2021] #### 新功能 [#new-features-55] ##### SumSub KYB [#sumsub-kyb] 更改客户类型(个人/企业)时,B2CORE UI 和验证系统中的客户验证等级将设为 0。将需要重新验证。若在 SNS 的 External Connections 中启用 Client Resetting Mode,则此选项可用。默认情况下处于禁用状态。 ##### 事件日志 [#event-log] 客户详情中新增了一个选项卡。您可在该选项卡上添加关于客户的备注和评论。支持文本格式设置、超链接、附件、回复和消息编辑。 ##### 服务参数构造器 [#parameter-constructor-for-services] 现在可以为每项服务配置附加参数。向客户添加服务时,这些字段将为必填项。 ##### IB 交易品种导出 [#ib-symbols-export] 现在可以将设置导出至 CSV、更改公式,然后在相同或不同的 IB Type 中导入这些交易品种设置。IB Type 详情的 Symbols 选项卡中提供 Export 按钮。 ##### 最短持仓时间 [#min-position-lifetime] Introducing brokers 中的 MT4 和 MT5 平台新增参数。如果持仓在最短持仓时间之前平仓,则不会计入奖励计算。 #### 改进 [#improvements-66] * 我们显著增强了授权技术。 * 优化了从 CryptoCompare 接收汇率的过程。现在不会为每个货币对发送请求,而是汇总货币对并为所有货币对发送一个请求。 * 客户详情 Files 选项卡新增支持的格式:DOC、DOCX、XLSX、CSV、PAGES、NUMBERS、ZIP。 * B2TRADERShadow 平台配置中的 API Key 现在可见。 * 现在每个导出请求都可在数分钟内完成。 * 异步余额现在会直接在打开的页面上更新,无需刷新。 * Introducing brokers 中新增了 MT5 的 PostgreSQL 报表支持。 * Introducing brokers 中的层级 ID 已替换为层级名称。 * Introducing brokers 中的 MT4 和 MT5 平台新增了最短持仓时间参数。如果持仓在最短持仓时间之前平仓,则不会计入奖励计算。 * 为 Introducing brokers 服务新增 MaxMind 诊断。 * 除此前仅支持 MySQL 外,IB 现在还支持 MT5 的 PostgreSQL 报表。 #### 已解决的问题 [#resolved-issues-57] * 修复了因 Client Rights 发布而导致用户被禁用的问题。 * 修复了 Transaction Monitoring 针对“绿色”交易发送电子邮件通知的问题。 * 修复了移动设备上删除 Wallets Overview 小组件时也会删除 Quick Links 小组件的问题。 * 修复了创建新工作区时 Add Widget 链接显示在横幅上的问题。 * 修复了重新登录后 Verification 小组件的错误行为。 * 修复了断开兑换连接后交易历史未更新的问题。 *** ### 2021 年 4 月 27 日 [#april-27-2021] #### 新功能 [#new-features-56] ##### 客户访问权限 [#clients-access-rights] 您不再需要从 Back Office 的不同部分管理客户权限。客户访问权限管理已移至 System 中的 Clients Rights 子部分。您可以创建和编辑访问级别,从客户资料详情为客户分配级别,等等。 ##### 交易验证处理程序 [#transaction-verifying-handler] Events 中新增了一种类型。在 Transaction Monitoring (KYT SumSub) 中检测到 RED 交易时,您现在可以收到电子邮件通知。通知包含交易详情和风险评分。 ##### 账户创建处理程序 [#account-created-handler] 新增了另一种事件类型,当为客户开立账户时,会向提供的外部 URL 发送 POST 请求。请求正文包含客户标识符、账号和产品详情。 ##### IB 报告 [#ib-reports] 新增了 Reports 部分。目前可使用 Acquisition report 和 Payment report。 ##### IB API 客户端 [#ib-api-clients] 现在可以通过 Back Office 连接您的应用程序并获取其 API 访问权限。在 Services > Security > API Clients 中,您可以添加 API 客户端并获取 Client ID 和 Client Secret。如有必要,您也可以删除客户端。 #### 改进 [#improvements-67] * 已针对支付状态调整 ChillPay 集成,并在方法配置中新增成功和错误 URL。 * 在 Bonus Presets 中为 Lots per unit 字段新增验证。现在无法保存零值。 * 所有其余页面(Transfer、Deposit、Withdraw、MT5、MT4、Internal Transfer)上的余额现在均异步更新,以快速且正确地显示信息。 * 改进了 Wizards 功能:将阻止已完成向导步骤的重复信号。 * 对于 IB 部分,我们重新设计并优化了与 Symbols 相关实体的命名。 #### 已解决的问题 [#resolved-issues-58] * 修复了导出报告时“下载文件”按钮无法使用的问题。 * 修复了报告导出的 CSV 模板。 * 修复了客户资料中未显示来自 SumSub 的客户数据的问题。 * 修复了密码恢复窗口显示不正确的问题。 * 修复了在 Safari 中尝试加载交易账户详情历史记录时无限加载的问题。 * 修复了 IB 中无法按客户注册日期筛选的问题。 * 修复了在 Firefox 浏览器中,饼图小部件上的工具提示被货币余额遮挡的问题。 * 修复了使用 Wire 方式入金时显示错误标题的问题。 * 修复了当客户未指定国家/地区值时,与 Mercurio 交互会导致错误的问题。 * 修复了页脚中的“需要帮助”链接无法正确处理 HTML 格式的问题。 *** ### 2021 年 4 月 13 日 [#april-13-2021] #### 新功能 [#new-features-57] ##### B2Margin 平台组编辑 [#b2margin-platform-groups-editing] 新增了为账户移除/添加交易平台组的功能。现在可以选择多个平台组,但域中只能选择一个组。新功能可在账户详情中使用。 ##### 新 PS 集成 [#new-ps-integrations-17] 又集成了两个支付系统——**EeziePay** 和 **9PAY**。 #### 改进 [#improvements-68] * 在 Antifraud 中,为“多个账户使用相同 IP”事件新增了“验证级别监控”设置,可用于指定要检查的客户验证级别。 * 对于 B2Margin,现在可以通过令牌在 Trading UI 中授权。 * 对于 B2TRADER,当冻结资金被退回时,将为该操作显示特殊备注。 * Introducing Brokers 流程的监控和运行现在更加便捷:我们分析并改进了流程标题,使其更具声明性。 * 我们为 Registration Wizard 中选择字段的 Options Type 添加了验证。 #### 已解决问题 [#resolved-issues-59] * 修复了在 Back Office 中可以创建提现钱包值为空的提现请求的问题。 * 修复了将 MT4/MT5 Payment Accounts 和 Trading Accounts 小部件添加至 B2CORE UI 仪表板后,其行为异常(无限加载、拖放被阻止)的问题。 * 修复了 TradingView 小部件中的图表在日/周/月时间区间内不显示的问题。 * 修复了交易的 First Transfer Activation 选项无法使用的问题。 * 修复了如果在更改 B2CORE UI 主题时图表尚未加载,图表主题不会更改的问题。 * 修复了仅有一种本地化语言可用时,界面语言不显示的问题。 *** ### 2021 年 3 月 30 日 [#march-30-2021] #### 改进 [#improvements-69] * Antifraud 更新: * 我们新增了对未经授权更改用户验证级别的检查。 * 现在,“多个账户使用相同 IP”通知的详情中会显示所有客户的信息。 * MetaTrader5 平台和产品更新: * 在产品设置中新增了 First Transfer Activation 开关。如果为 Enabled,所有账户创建时均会关闭 Trade Enabled 权限;首次成功转账至该账户后,将添加此权限。 * 在平台设置中新增了 Max Inactivity 字段。余额小于或等于 0,且超过此字段指定天数没有余额交易的所有账户将被归档。检查每周运行一次。 * 我们已将 HelpDesk 设置迁移至 External Connections。现在 B2CORE 所有者可自行配置 HelpDesk,无需等待 B2CORE 团队处理。 * 调整了 CryptoCompare Rates 提供商集成,以便在提供商详情中插入密钥。 * 我们新增了报告生成时间过长的通知。 * Vpay 集成更新。账户参数已移至提供商设置。 * 现在只有具备 Update client’s request 权限的管理员可以审核请求。 * 我们从 Total Balance 饼图中移除了不相关的 Account number 字段。 * 现在所有页面均支持横幅背景图片。此前仅仪表板页面支持此功能。 * Dashboard 和 Wallets 页面上的余额现在会异步更新,以快速且正确地显示信息。 #### 已解决问题 [#resolved-issues-60] * 修复了未配置选项的 select、multiselect 类型在高级注册期间显示错误字段集的问题。 * 修复了 Accounts 中缺少 Hide zero balance 标志的问题。 * 修复了无法应用请求颜色设置的问题。 * 修复了高级 Registration 步骤字段中 Name 属性为数值时的验证流程。 * 修复了 Trades History 中缺少 Amount 的问题。 * 修复了使用桌面版 Safari 登录的问题。 * 修复了 Asset 小部件未显示所有资产的问题。 * 修复了在 Dashboard 上拖放及调整相邻小部件大小时,Trading View 小部件会固定不动的问题。 * 修复了新创建的钱包仅在刷新页面后才显示的问题。 * 修复了 Buy Limit 订单费用计算显示不正确的问题。 * 修复了 HelpDesk 中工单状态变更通知未显示的问题,以及其他一些小问题。 * 修复了部分客户无法通过短信进行 2FA 确认的问题。 * 修复了部分客户的阶梯费用显示不正确的问题。 *** ### 2021 年 3 月 16 日 [#march-16-2021] #### 新功能 [#new-features-58] ##### 设备管理 [#device-management] 设备管理功能可为每次客户登录获取唯一的“指纹”。每个指纹包含有关登录和设备的一组数据。设备列表可在客户详情的 Devices 标签页中查看。 #### 改进 [#improvements-70] * 我们新增了余额异步更新功能,显著加快了用户账户的加载速度。 * 我们为 Client Profile 新增了个人资料图片和昵称。 * 为提高清晰度,Connections 子部分已重命名为 External Connections。每个连接均新增了 Type 字段,目前支持两个值:Payment system 和 Other。现在创建新的 Deposit/Payout 方法时,只有 Payment system 类型的连接可供选择。此外,连接详情中还新增了 Enable/Disable 选项。 * 我们已将 SumSub 配置迁移至 External Connections。现在 B2CORE 所有者可自行配置集成,无需等待 B2CORE 团队处理。 * 未连接至 SumSub 的客户现在可以禁用交易监控。现在也可以指定要监控的货币列表。新设置可在 External Connections 中使用。 * Services List 和 Services Groups 中新增了 Comment 字段。 * Antifraud 通知现在可按 Responsible admin users 筛选。 * 现在可以为反欺诈通知设置电子邮件地址模式例外。例如,如果为 `user*@email.com` 创建例外规则,则反欺诈系统不会针对任何以 `user` 开头、以 `@email.com` 结尾的地址触发,例如 `user+1@email.com` 等。 * 现在我们可以处理来自 B2BINPAY v2 的无交易 ID 回调。 * 对于通过 WireDocuments 提供商进行的入金/提现,管理员现在可以直接在请求中编辑交易金额。 #### 已解决问题 [#resolved-issues-61] * 修复了部分客户查看客户账户时会看到无限加载的问题。 * 修复了注册页面上客户协议 HTML 显示不正确的问题。 * 修复了部分客户无法按货币导出账户的问题。 * 修复了导致注册时名字和姓氏字段出现问题的规则。 * 修复了通过 SumSub 使用验证级别时出现的问题。 * 修复了 Clients Requests 权限无法正确运行的问题。 * 修复了服务器级别请求代理的问题。 * 修复了 B2CORE UI 界面中的 Offline 通知。 * 修复了 B2CORE UI 中某些标签可能显示不正确的问题。 * 修复了 B2TRADER 和 B2Margin 的 Trading UI 中订单簿在长时间无活动后可能显示不正确的问题。 * 修复了 Total Balance 小部件中缺失汇率显示不正确的问题。 *** ### 2021 年 3 月 2 日 [#march-2-2021] #### 新功能 [#new-features-59] ##### 钱包概览小部件 [#wallets-overview-widget] 我们完成了又一个 Dashboard 小部件,这是最具代表性和信息量的小部件。现在终端用户可以通过卡片和饼图视图查看其资产余额及对应的 USD 等值金额。 ##### Wizards v2 [#wizards-v2] 我们完全重构并优化了向导功能,它让您能够在 Back Office 端配置部分业务逻辑,例如注册、密码恢复、资料更改、验证等。每个向导都有可安装步骤列表和默认步骤列表。菜单中现已提供 System > Wizards 部分。我们将继续进行改进。 #### 改进 [#improvements-71] * 我们为所有 B2TRADER Exchange 客户开发了 Public Adv UI。可通过联系客户经理获取此功能。 * 现在,通过 Back Office 更改使用 B2TRADER 平台的用户电子邮件时,平台上的电子邮件也会自动更改。 * 在客户账户中新增了 Balance (USD) 和 Balance (EUR) 字段。 * 我们改进了对未成功对冲的处理。现在可在交易详情中查看对冲状态和日志。 * 我们新增了转账详情,如果转账通过请求完成,您还可以在此查看 Request Info。 * 我们在 Security 部分新增了 Address Management,您可以在其中查看客户已添加到白名单的地址。 * 我们在 Deposits 和 Payouts 表中新增了 Final Amount 和 Final Currency。 * 现在您可以在 Compliances 标签页中查看是哪位管理员添加了评论。 * Mercuryo 支付系统不再需要双重验证:现在我们可以使用 SumSub 令牌。 * 我们更改了产品详情中 Min Deposit Amount 的计算逻辑,在值为 0 或为空时将忽略该限制。 * 我们进行了多项调整,以提高 Back Office 表格的效率并加快加载速度。 #### 已解决问题 [#resolved-issues-62] * 修复了加密货币账户余额显示精度错误的问题。 * 修复了未显示电子邮件变更历史信息的问题。 * 修复了创建转账后 Back Office 卡死的问题。 * 修复了针对多个账户使用相同电话号码的 Antifraud 误报问题。 * 修复了未显示通过 B2BINPAY v2 提现的 Blockchain 费用的问题。 * 修复了 Bank Wire Local 未正确显示信息的问题。 * 修复了因权限导致 Client Services 部分可能无法编辑的问题。 * 修复了刷新后工作区被重置的问题。 * 修复了刷新页面后所有小部件均切换至默认货币对的问题。 * 修复了点击徽标时导航不正确的问题。 * 修复了 Watchlist 小部件中 24h Volume/Change 参数值不正确的问题。 *** ### 2021 年 2 月 16 日 [#february-16-2021] #### 新功能 [#new-features-60] ##### 财务操作审计 [#audit-of-financial-operations] 我们开发并实施了一种审计算法,用于检查财务交易并计算异常差异。Clients > Requests 中现已提供新的 Audit 按钮。 #### 改进 [#improvements-72] * 我们很荣幸推出 Mailing 1.1——新增了: * 一次向所有客户发送电子邮件, * 从 CSV 文件导入收件人, * 电子邮件附件, * HTML 标签的可视化编辑器, * 电子邮件预览, * 更轻松地创建模板并将电子邮件保存为模板, * Sendgrid 的 webhooks。 * 我们改进了对冲功能:现在可为货币对启用/禁用对冲,兑换时也可为特定类型客户禁用对冲。 * 我们统一了客户请求的交易详情。现在,通过所有提供商的提现请求都将显示终端用户输入的交易详情。 * 现在我们可以处理更多 PAMM IB 的 State 代码。 * 将 twilio/sdk 升级至版本 6。 #### 已解决问题 [#resolved-issues-63] * 修复了入金失败时电子邮件通知中未显示拒绝原因的问题。 * 修复了导出转账时未显示 Created 字段的问题。 * 修复了兑换入金显示错误货币的问题。 * 修复了用户限制(例如 Client Tag)不适用于导出的问题。 * 修复了尝试在 SumSub 中创建已存在申请人时导致错误的问题。 * 修复了客户详情中显示错误 MT5 Accounts 的问题。 * 修复了在启用相应权限后编辑 Client Services 和 Services Groups 时出现 Access denied 错误的问题。 * 修复了入金失败问题,并更新了与 Sticpay 的集成。 * 修复了 B2TRADER Advanced UI 中的多个问题,例如浅色主题无法使用、点击徽标时无限重定向,以及其他小问题。 * 修复了产品在启用 Auto Creation on Login 时忽略 Restrictions 的问题。 * 修复了 Multiple IP Addresses 在授权失败时触发的问题。 *** ### 2021 年 2 月 2 日 [#february-2-2021] #### 新功能 [#new-features-61] ##### SumSub 交易监控 [#sumsub-transaction-monitoring] 我们通过 SumSub 集成开发了全新的 KYT 功能。现在,已连接到 SumSub 的客户将能够检查其交易,并查看风险评分、资金来源及其所有关键信号。新功能已添加至 Security > Transaction Monitoring 部分。 #### 改进 [#improvements-73] * 我们重构了与 B2Margin 和 B2TRADER 的集成,以提升这些服务的稳定性和效率。 * 我们重构了转换器对冲用途平台所需的 B2TRADERShadow,使其可通过在 B2BX cabinet 中生成的 API 密钥进行连接。 * CoinmarketCap 汇率提供商集成已更新,现已完全可用。 * Back Office 中的 MT Accounts 现已划分为与活跃平台对应的标签页,以优化表格加载和可视化。 * 在 Back Office 中新增了 Deposit Wallets 导出功能。 * 所有 B2TRADER 客户现已切换至新版、经过优化的高级 UI。 * 对于带兑换的充值,如果只有一种货币可用,我们移除了不必要的货币选择。 * 其他小型 UI 改进。 #### 已解决问题 [#resolved-issues-64] * 修复了从 Back Office 禁用 2FA 后,终端用户的 2FA 仍保持启用状态的问题。 * 修复了可以创建多个 Liquidity 类型产品的问题。 * 修复了具有指定客户标签的管理员无法创建新客户的问题。现在,新客户将继承管理员的相同标签。 * 修复了登录页面显示蓝色 Error snack bar 的问题。 * 修复了可能导致月度报告生成失败的问题。 * 修复了转账表无限加载的问题。 * 修复了在创建奖金或奖金预设时 Ignored symbol groups 选择器为空的问题。 * 修复了 twilio 未连接时,手机号码会显示为已确认的问题。 * 修复了无法处理 Simplex 入金付款的问题。 * 修复了 Decta 支付网关付款即使在支付网关侧成功,仍处于 New 状态的问题。 * 修复了尝试登录时登录页面有时会卡死的问题。 * 修复了 B2CORE UI 中验证级别布局显示不正确的问题。 * 修复了 trading view 中不显示图表的问题。 * 修复了 wire-custom 中设置的付款详情不显示的问题。 **Introducing brokers (IB)** is a partnership program that enables brokers to expand their client network and boost their business growth and profits through revenue sharing. ## How it works [#how-it-works] The partnership program is based on a **revenue sharing** approach. Brokers attract new traders through their partners and, in return, reward these partners with a portion of the earnings generated from referred active traders. Rewards can be paid in any crypto- or fiat currency. The reward amount is calculated per trade and is paid to a partner based on pre-set payment schedules, which can be hourly, daily, weekly, or monthly. The programs are fully customizable to best suit your specific needs: * You can select from various joining options: from automatic registration of all clients to exclusive joining by personal invitation. * You can customize reward ratios for different symbols or symbol groups. * You can set up tiers by a number of active traders referred and/or trading volume to further motivate your partners. * You can configure levels to reward partners not only for trades of their direct clients, but also for trades of clients referred by their clients. * You can set personal reward plans for key partners. ## Key features [#key-features] ### Various trading platforms [#various-trading-platforms] B2CORE IB offers a real-time access to market data through integration with popular trading platforms: * [B2TRADER](https://b2broker.com/b2trader/) * [MetaTrader 4](https://www.metatrader4.com/en) * [MetaTrader 5](https://www.metatrader5.com/en) * [cTrader](https://ctrader.com/) * [DXtrade](https://dx.trade/) * Converter ### Diverse and flexible payment plans [#diverse-and-flexible-payment-plans] Explore our range of flexible payment plans and select the option that aligns perfectly with your business needs. Available payment plans depend on the platform. | Payment plan | B2TRADER | MT4 | MT5 | cTrader | DXtrade | Converter | | --------------------- | -------- | --- | --- | ------- | ------- | --------- | | **Commission** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | **Lot** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Max amount** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Markup** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Markup %** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | | **Spread** | ✔️ | | ✔️ | ✔️ | | | | **Platform Spread %** | ✔️ | ✔️ | ✔️ | ✔️ | | | | **Platform Markup %** | ✔️ | ✔️ | ✔️ | ✔️ | | | To learn more, refer to [Payment plans](payment-plans). ### Advanced CRM tool [#advanced-crm-tool] With the B2CORE Back Office, you have access to a wide range of features and benefits: * Launch and manage multiple partnership programs. * Encourage your clients to attract new traders by offering them a variety of reward options and plans. * Monitor and control your partners’ performance and marketing campaigns. * Get valuable insights through robust data analysis and comprehensive reporting. ### Extended analytics for partners [#extended-analytics-for-partners] With the help of B2CORE UI, your partners can monitor their key performance indicators through comprehensive reports and beautiful charts, as well as customize their referral links. ### All-round equipped solution [#all-round-equipped-solution] B2CORE IB offers an extensive range of services and ready-to-go apps backed up by 24/7 multi-lingual support, ensuring that you have the necessary assistance whenever you need it. ## Broker [#broker] The owner of a partnership program. *** ## Direct client [#direct-client] The client who signed up to the B2CORE UI by a referral link of a partner. Let's say, it is *Jill*. *Jill* joined the partnership program by *Jack's* referral link. *** ## IB type [#ib-type] The set of criteria based on which a broker pays rewards and the set of parameters for calculating these rewards. The broker can configure more than one IB type with separate settings and, for example, different types of registration. *** ## Level [#level] The setting of an IB type. It determines how many participants in the chain from the partner to the trader receive a reward. By default, only Level 1 is configured, which means that the broker pays rewards only for trades of direct clients. Let's say, the broker pays *Jill* the Level 1 ratio for the trades of the direct clients. For example, the Level 1 multiplier is 1. But the broker may want to pay *Jack* the Level 2 ratio for the same trades (because if not for *Jack*, *Jill* might not have joined the program and would not have brought so many clients). For example, the Level 2 multiplier is 0.5. And so on. The depth of the clients tree is not limited, and the broker chooses the number of paid levels. With the [Max amount](payment-plans#max-amount) payment plan, the broker can also limit the total reward amount and specify reward amounts for each level as a fixed value, not a ratio. *** ## Master IB [#master-ib] The special status of a partner. For such partners, a broker can configure an individual number of paid levels with a fix ratio. The Master IB status overwrites settings of a partnership program for this partner. *** ## Partner [#partner] The client who signed up to the B2CORE UI and joined a partnership program. Let's say, it is *Jack*. After joining the partnership program, *Jack* receives a referral link. *** ## Personal ratio [#personal-ratio] The individual configuration of reward amount. For example, the broker can pay increased rewards to partners who bring many clients and trades. Unlike tiers, this setting is not automatic and is set manually by the broker for selected partners. *** ## Referral link [#referral-link] The personal link of a partner which usually leads to the Sign up page of the B2CORE UI. All clients who signed up by this link are [direct clients](key-terms#direct-client) of this partner. *** ## SubIB [#subib] The client who signed up to the B2CORE UI by a referral link of a partner and then joined a partnership program. In other words, this client decided to become a partner too. Let's say, it is *Jill*. Clients brought by *Jill* are not direct clients of *Jack*, but the broker can still trace them back: *Jack* → *Jill* → *Clients brought by Jill*. *Jill* has many friends, so 100 of them signed up to the B2CORE UI and started trading. *** ## Tier [#tier] The setting of an IB type. With the help of tiers a broker can encourage partners with extra motivation. For example, the broker can configure increased reward ratio for each partner who brings 100 active clients in 30 days. Or increased reward ratio for each partner whose clients have traded 1,000 lots in 14 days. Or both at once. If a partner qualifies for several tiers at once, the tier with the highest ratio is applied. See [how to configure tiers](how-to-articles/how-to-configure-tiers) for the full calculation logic. A payment plan is part of IB type configuration that the Broker sets when launching a partnership program. **Key points** * Payment plans can be configured for a single symbol or symbol group. For a step-by-step tutorial, refer to [How to set up a payment plan for symbols](how-to-articles/how-to-set-up-a-payment-plan-for-symbols). * The calculated reward amounts can be additionally multiplied by level, tier, personal or Master ratio, if applicable. * If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * Trading volume used for reward calculations can be changed by a platform group modifier. For example, the lot size for a group is set to 0.4 (**Introducing brokers** > **Platforms** > **Groups**). If the trade volume is 100 lots, this value will be multiplied by the group lot size: **100 lots × 0.4 = 40 lots**. The available payment plans are described below. Pay attention to a list of trading platforms to which each plan is applicable. **Disclaimer** All values given in this section are for demonstration purposes only and do not constitute a recommendation. ## Commission [#commission] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, DXtrade, and Converter platforms. The Broker pays partners a fixed percentage of commissions received for trades executed by their clients: **Reward amount = Commission × Percentage** Where: * **Commission** is a fee amount that a trader paid to the Broker for executing a trade. * **Percentage** is a commission percentage value specified by the Broker in the IB type settings. This is a percentage of the total commission received by the Broker. Consider an example of *Jack*, whose client brought 70 USD in commissions to the Broker, while the set commission percentage is 10%. In this case, the amount rewarded to *Jack* is calculated as follows: **70 USD × 10% = 7 USD**. **Implementation details of the Commission payment plan on the Converter platform** When the *Commission* plan is used on the Converter platform, brokers pay partners a fixed percentage of markups received from exchange transactions made by their clients. These markups are configured in B2CORE, applied to each exchange transaction, and then recorded as commissions. The partner's reward is then calculated based on the recorded commissions, using the percentage specified in the *Commission* plan. ## Lot [#lot] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners a fixed amount for each lot traded by their clients: **Reward amount = Trading volume, in lots × Amount per lot** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Amount per lot** is a fixed reward amount to be paid per lot, specified by the Broker along with the reward currency. The reward currency doesn't depend on the traded symbol. That is, the Broker can specify USD as the reward currency for the ETH/EUR symbol. Consider an example of *Jill*, whose client has traded 10 lots while the reward amount per lot is 2 USD. In this case, the amount rewarded to *Jill* is calculated as follows: **10 lots × 2 USD = 20 USD**. Keep in mind that you must monitor profitability using this scheme as the reward amounts may exceed the commissions charged. ## Max amount [#max-amount] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners a fixed amount for each lot traded by their clients, while also having the opportunity to specify both the maximum reward amount and the reward amount for each configured level. With the **Lot** payment plan, the Broker specifies the reward amount per lot for Level 1. The rewards for subsequent levels (if configured) are calculated as a percentage of Level 1 reward. With the **Max amount** payment plan, the Broker limits the total reward amount paid to partners, regardless of the number of levels, and then specifies the exact amount a partner receives at each level. The following example illustrates how the reward amount can be distributed across different levels. | | **1 level** | **2 levels** | **3 levels** | **4 levels** | **5 levels** | **6 levels** | | ----------- | ----------- | ------------ | ------------ | ------------ | ------------ | ------------ | | **Level 1** | 10 USD | 8 USD | 5 USD | 5 USD | 4 USD | 3 USD | | **Level 2** | | 2 USD | 3 USD | 3 USD | 2 USD | 2 USD | | **Level 3** | | | 2 USD | 1 USD | 2 USD | 2 USD | | **Level 4** | | | | 1 USD | 1 USD | 1 USD | | **Level 5** | | | | | 1 USD | 1 USD | | **Level 6** | | | | | | 1 USD | Based on the table above, consider an example of *Jack*, whose direct client has traded 10 lots. In this case, the reward is paid only to Level 1, and the amount rewarded to *Jack* is calculated as follows: **10 lots × 10 USD = 100 USD**. Next, consider an example of *Jill* who participates in *Jack's* sub-IB program. If *Jill's* direct client has traded 10 lots, then the reward amount is distributed between two levels: * at Level 1, the amount rewarded to *Jill* is calculated as follows: **10 lots × 8 USD = 80 USD** * at Level 2, the amount rewarded to *Jack* is calculated as follows: **10 lots × 2 USD = 20 USD** In this case, the total reward amount is 100 USD, that's 10 USD per each traded lot. ## Markup [#markup] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The Broker pays partners rewards based on the volume traded by their clients and a markup specified in points: **Reward amount = Trading volume, in lots × Markup, in points** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Markup** is a markup value to be paid per lot, specified by the broker in the IB type settings. For example, the markup set on a platform is 14 points, and *Jack* decides to pay partners 1/7 of this markup value, that is 2 points. After *Jack's* clients have traded 10 lots of AUD/CAD, the amount rewarded to *Jack* is calculated as follows: **10 lots × 2 points = 20 CAD**. ## Markup % [#markup-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, cTrader, and DXtrade platforms. The broker pays the partners a percentage of the markup. The calculation formula depends on the trade side: * For **sell** trades: **Reward amount = Trading volume × Trade price × 2 × Markup % / (1 + Markup %)** * For **buy** trades: **Reward amount = Trading volume × Trade price × 2 × Markup % / (1 – Markup %)** Where: * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Trade price** is an execution price at which the asset was sold or bought by a trader as a result of a trade. * **Markup %** is a markup value, in percents, specified by the broker in the IB type settings. For example, the markup value is 20% and a client of *Jill* buys 15 lots at 4,000. In this case, the amount rewarded to *Jill* is calculated as follows: **15 × 4,000 × 2 × 0.2 / (1 - 0.2) = 30,000**. **When to use** Choose this plan when the Broker wants to pay partners a reward based on a rate set independently for each IB, regardless of the Broker's own spread/markup revenue. The reward is calculated instantly per trade and can apply to open, closed, or any position — useful when partners should be rewarded as soon as a position opens, not only once it's closed. ## Spread [#spread] > Supported for the B2TRADER, cTrader, and MetaTrader 5 platforms. The broker pays the partner a percentage of the market spread value at the moment of the trade. **Reward amount = (Market ask – Market bid) × Contract size × Trading volume × Percentage / 100** Where: * **Market ask**, **Market bid** are top-of-the-book bid and ask market prices valid at the moment of the trade, in the quote currency. * **Contract size** is a standardized quantity of asset per lot, set on a trading platform. * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Percentage** is a spread percentage value specified by the Broker in the IB type settings. Consider an example of *Jill*, whose client traded on the EUR/USD market: * **Market ask** = 1.08253 * **Market bid** = 1.07252 * **Contract size** = 100,000 * **Trading volume** = 2 lots * **Percentage** = 50% In this case, the amount rewarded to *Jill* is calculated as follows: **(1.08253 – 1.07252) × 100,000 × 2 × 50 / 100 = 1,001 USD**. ## Platform Spread % [#platform-spread-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, and cTrader platforms. This payment plan only applies to **closed** trade positions. The broker pays the partner a percentage of the spread value recorded by the trading platform for the closed trade. Unlike the **Spread** plan, which uses live market bid and ask prices, this plan uses the spread value stored in the trade data by the platform itself. **Reward amount = Platform spread × Contract size × Trading volume × Percentage / 100** Where: * **Platform spread** is the spread value recorded by the trading platform at the time of trade execution, in the quote currency. * **Contract size** is a standardized quantity of asset per lot, set on a trading platform. * **Trading volume** is an amount of lots that was sold or bought by a trader as a result of a trade. * **Percentage** is a spread percentage value specified by the Broker in the IB type settings. Consider an example of *Jack*, whose client traded EUR/USD: * **Platform spread** = 0.00200 * **Contract size** = 100,000 * **Trading volume** = 2 lots * **Percentage** = 50% In this case, the amount rewarded to *Jack* is calculated as follows: **0.00200 × 100,000 × 2 × 50 / 100 = 200 USD**. ## Platform Markup % [#platform-markup-] > Supported for the B2TRADER, MetaTrader 4, MetaTrader 5, and cTrader platforms. This payment plan only applies to **closed** trade positions. The broker pays the partner a percentage of the markup revenue generated from the closed trade. Unlike the **Markup %** plan, which is calculated instantly from a manually configured rate, this plan first computes the actual markup revenue the platform earned on the trade (based on the broker's symbol markup configuration), then pays the partner a percentage of that revenue. **Step 1 — Markup revenue** (depends on the markup type configured for the symbol): * Percent-type markup: **Markup revenue = Trade price × Trading volume × Contract size × (Markup bid % + Markup ask %) / 100** * Point-type markup: **Markup revenue = (Markup bid, in points + Markup ask, in points) × Point size × Contract size × Trading volume** * Spread-diff markup (MetaTrader 4/5): **Markup revenue = Spread diff × Point size × Contract size × Trading volume** **Step 2 — Reward amount** **Reward amount = Markup revenue × Percentage / 100** Where: * **Trade price**, **Trading volume**, **Contract size** are as defined in the sections above. * **Markup bid/ask** (in percent or points) or **Spread diff** is the markup configuration recorded by the trading platform for that symbol (set by the Broker at platform, group, account, or symbol level; account-level settings take priority). * **Percentage** is the reward percentage specified by the Broker in the IB type settings — this is the partner's cut of the platform's own markup revenue, not the markup rate itself. Consider an example of *Jack*, whose client buys 15 lots of EUR/USD at 1.1000. The contract size is 100,000, the symbol's markup configuration is 0.05% bid + 0.05% ask, and the reward percentage set for *Jack* is 20%. * **Markup revenue** = 1.1000 × 15 × 100,000 × (0.05 + 0.05) / 100 = **1,650 USD** * **Reward amount** = 1,650 × 20 / 100 = **330 USD** **When to use** Choose this plan when the partner's reward should track the Broker's own markup/spread profit on the client's trades, rather than a rate set independently for the IB. Because the actual revenue is only known once a position closes, this plan works only with **closed** trade positions. To join your first partnership program and become a partner: Sign in to the B2CORE UI with your credentials. Expand the partnership section in the main menu (labeled **IB Room** or **Partners**, depending on the broker configuration) and click any option in the expanded menu, such as **Partner Dashboard**, **Promo**, or **Reports**. In the **Partner Program** dropdown, select a partnership program that best meets your requirements. After selecting a partnership program, you can see its description that provides important information about the program. Click **Become a Partner** to join the selected partnership program. If several partnership programs are available to you and you've already joined one of them and want to join one more: Expand the partnership section in the main menu (labeled **IB Room** or **Partners**, depending on the broker configuration) and click any option in the expanded menu, such as **Partner Dashboard**, **Promo**, or **Reports**. In the dropdown located at the top of the page, select **Become a Partner**. In the displayed **Partner Program** dropdown, select a partnership program to which you want to join. Click **Become a Partner** to join the selected partnership program. Depending on the platform configuration, you may be allowed to join the selected partnership program immediately or after a B2CORE admin confirms your request for joining the program. After joining your first partnership program, you can access the menu options located under the partnership section (**IB Room** or **Partners**) in the main menu. The Market Data session provides real-time order book streaming via the FIX 4.4 protocol. Use this session to subscribe to price updates for specific trading instruments and receive continuous market data. For FIX connection settings (host, port, SenderCompID, TargetCompID, credentials), contact your broker. This page covers the **Market Data** session only. For trading operations (order placement, execution reports), use the [Trading](trading) session. ## Supported message types [#supported-message-types] The following values can be assigned to the `<35>` MsgType field: * `A` — Logon (Client → B2TRADER) * `0` — Heartbeat (Client ↔ B2TRADER) * `1` — Test Request (Client ↔ B2TRADER) * `3` — Reject (Client ← B2TRADER) * `4` — Sequence Reset (Client ↔ B2TRADER) * `5` — Logout (Client ↔ B2TRADER) * `V` — Market Data Request (Client → B2TRADER) * `W` — Market Data — Snapshot/Full Refresh (Client ← B2TRADER) * `X` — Market Data — Incremental Refresh (Client ← B2TRADER) * `Y` — Market Data Request Reject (Client ← B2TRADER) * `j` — Business Reject (Client ← B2TRADER) ## Getting started [#getting-started] ### Connection [#connection] To connect to the Market Data session, use the following parameters provided by B2TRADER: * **Host and port**: The Market Data endpoint (provided separately from the Trading endpoint) * **SenderCompID**: Your client identifier for the Market Data session * **TargetCompID**: The server identifier for the Market Data session * **Protocol**: FIX 4.4 The Market Data connection does not require SSL. ### Message structure [#message-structure] **Standard Header** All FIX messages must begin with a Standard Header containing the following fields: **`8 BeginString`** `String` Identifies the FIX version (`FIX.4.4`). Always the first field in a message. **`9 BodyLength`** `int` The automatically computed message length, in bytes. Always the second field. **`35 MsgType`** `String` The message type. See [Supported message types](#supported-message-types) for possible values. Always the third field. **`34 MsgSeqNum`** `int` The message sequence number, incremented by 1 for each consecutive message. **`49 SenderCompID`** `String` The identifier of the message sender. Provided by B2TRADER. **`52 SendingTime`** `Timestamp` The date and time when the message was sent, in UTC: `YYYYMMDD-HH:MM:SS.sss`. **`56 TargetCompID`** `String` The identifier of the message recipient. Provided by B2TRADER. *** **Standard Trailer** All FIX messages must end with a Standard Trailer: **`10 CheckSum`** `int` A three-digit checksum. Always the last field in a message. ### Logon (A) [#logon-a] This message is sent by the client to initiate a FIX session. It must be the first message in each connection. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`98 EncryptMethod`** `int` The encryption method. Required. Must be `0` (no encryption). **`108 HeartBtInt`** `int` The heartbeat interval, in seconds. Required. Indicates how often the server sends Heartbeat messages as part of a connection health check. **`141 ResetSeqNumFlag`** `Boolean` Indicates whether both parties should reset the currently used sequence numbers. Optional. **`553 Username`** `String` The client username. Required. Provided by B2TRADER. **`554 Password`** `String` The client password. Required. Provided by B2TRADER. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=138^35=A^1=68a4446ac84827ff5cd35c74^34=1^52=20231218-07:59:06.000^49=sender_b2trader^56=target_b2trader^554=password^553=username^98=0^108=30^10=139^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=112^35=A^1=68a4446ac84827ff5cd35c74^34=1^49=target_b2trader^52=20231218-07:59:06.655^56=sender_b2trader^98=0^108=30^10=009^ ``` ### Session maintenance [#session-maintenance] #### Heartbeat (0) [#heartbeat-0] This message is sent back and forth between the server and the client to check the connection status and in response to Test Request messages. **`112 TestReqID`** `String` The identifier of a Test Request in response to which this Heartbeat is sent. Required when the Heartbeat is a response to a Test Request. ```text title="Example" 8=FIX.4.4^9=73^35=0^34=2^52=20231218-07:59:36.000^49=sender_b2trader^56=target_b2trader^10=202^ ``` #### Test Request (1) [#test-request-1] This message is sent back and forth between the server and the client as a means of connectivity check. If a Heartbeat is not received within the expected interval, a Test Request is sent; the recipient must respond with a Heartbeat containing the same `<112>` TestReqID. **`112 TestReqID`** `String` The identifier of a Test Request. Optional. ```text title="Example" 8=FIX.4.4^9=81^35=1^34=137^52=20231218-10:12:38.000^49=sender_b2trader^56=target_b2trader^112=2^10=040^ ``` #### Sequence Reset (4) [#sequence-reset-4] This message indicates the sequence number of the next message from the sender, immediately following the Sequence Reset. This may be necessary to recover from a disconnect when some messages were lost or their resending is not desirable. **`123 GapFillFlag`** `Boolean` Indicates that this message replaces missing messages that won't be resent. Optional. Possible values: * `Y` — Gap fill: `<34>` MsgSeqNum is valid and indicates the beginning of the gap fill range * `N` — Sequence reset: `<34>` MsgSeqNum is ignored. Should only be used in disaster recovery situations **`36 NewSeqNo`** `int` The new sequence number. Required. ```text title="Example" 8=FIX.4.4^9=84^35=4^34=6^49=target_b2trader^52=20231219-21:11:38.578^56=sender_b2trader^123=Y^36=8^10=231^ ``` #### Logout (5) [#logout-5] This message is sent by the client or server to terminate a session. When terminated, the possible reason is specified in the `<58>` Text field. **`58 Text`** `String` The detailed information about the reason for logging out. Optional. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=83^35=5^34=5^52=20231218-13:40:48.000^49=sender_b2trader^56=target_b2trader^58=ST1234^10=229^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=75^35=5^34=748^49=target_b2trader^52=20231218-13:40:49.016^56=sender_b2trader^10=064^ ``` ### Reject (3) [#reject-3] This message is sent by the server upon receiving a malformed message from the client. The rejection reason is specified in the `<373>` SessionRejectReason field. This message is unrelated to application-level rejections (Market Data Request Reject and Business Reject). **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`371 RefTagID`** `int` The tag number of the field that caused message rejection. Optional. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`373 SessionRejectReason`** `int` The reason why the message is rejected. Optional. Possible values: * `0` — Invalid tag number * `1` — Required tag missing * `2` — Tag not defined for this message type * `3` — Undefined tag * `4` — Tag has no value assigned * `5` — Value is incorrect (out of range) for this tag * `6` — Incorrect value data format * `7` — Decryption issue * `8` — Signature problem * `9` — CompID issue * `10` — SendingTime accuracy issue * `11` — Invalid MsgType * `12` — XML validation error * `13` — Same tag appears more than once * `14` — Tag specified not in required order * `15` — Wrong order of repeating group fields * `16` — Incorrect NumInGroup count for repeating group * `17` — Non-"Data" value includes field delimiter (SOH character) * `99` — Other **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=125^35=3^34=193^52=20231219-22:41:16.000^49=target_b2trader^56=sender_b2trader^45=18^371=262^372=V^373=1^58=Required tag missing^10=122^ ``` *** ## Market Data Request (V) [#market-data-request-v] This message is sent by the client to subscribe to real-time quoting data for a specified ticker symbol. After subscribing, the server sends an initial Market Data — Snapshot/Full Refresh, followed by continuous Market Data — Incremental Refresh messages with each market data update. To subscribe to multiple symbols, send a separate Market Data Request for each symbol. To unsubscribe, send a Market Data Request with `<263>` SubscriptionRequestType set to `2`. All subscriptions are also terminated when the session is closed via Logout. **`262 MDReqID`** `String` The identifier of the Market Data Request. Required. Must be unique for the duration of each session. When unsubscribing, specify the ID of a previous request to discard. **`263 SubscriptionRequestType`** `int` The type of response expected from the server. Required. Possible values: * `1` — Subscribe: receive updates as the market status changes * `2` — Unsubscribe: stop streaming market data for the specified symbol **`264 MarketDepth`** `int` The market depth for an order book snapshot. Required. Possible values: * `0` — Full order book * `1` — Top-of-the-book prices **`265 MDUpdateType`** `int` The update type. Required. Must be `1` (incremental updates for changed price levels only). **`267 NoMDEntryTypes`** `int` The number of `<269>` MDEntryType entries requested. Required. > Repeating group: **`269 MDEntryType`** `int` The side of the quote. Required. Possible values: * `0` — Bid * `1` — Ask **`146 NoRelatedSym`** `int` The number of ticker symbols. Required. Must be `1`. To subscribe to multiple symbols, send a separate request for each. > Repeating group: **`55 Symbol`** `String` The market identifier. Required. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. ```text title="Example (Client → B2TRADER)" 8=FIX.4.4^9=141^35=V^34=7^52=20231220-08:11:50.000^49=sender_b2trader^56=target_b2trader^262=1235^263=1^264=0^265=1^267=2^269=0^269=1^146=1^55=spot.btc_usdt^10=250^ ``` ## Market Data — Snapshot/Full Refresh (W) [#market-data--snapshotfull-refresh-w] This message is sent by the server after the client subscribes to a ticker symbol. It contains the full current state of the order book. Subsequent updates are delivered as Market Data — Incremental Refresh messages. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`262 MDReqID`** `String` The identifier of the originating Market Data Request. **`268 NoMDEntries`** `int` The number of market data entries following. The value is `0` if the order book is empty. > Repeating group (present when `<268>` NoMDEntries > 0): **`269 MDEntryType`** `int` The side of the quote. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — Bid * `1` — Ask **`270 MDEntryPx`** `Price` The price of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`271 MDEntrySize`** `Qty` The tradable volume of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`278 MDEntryID`** `String` A unique market data entry identifier. Conditional — required if `<268>` NoMDEntries is not `0`. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=507^35=W^34=48^49=target_b2trader^52=20231222-14:40:39.983^56=sender_b2trader^55=spot.btc_usdt^262=1235^268=9^269=1^270=1.10338^271=3000000^278=4441516524^269=1^270=1.10337^271=1000000^278=4441516521^269=1^270=1.10339^271=5000000^278=4441516523^269=1^270=1.10335^271=600000^278=4441516522^269=0^270=1.10333^271=500000^278=4441516520^269=0^270=1.10332^271=1000000^278=4441516517^269=0^270=1.10331^271=3000000^278=4441516516^269=0^270=1.10334^271=100000^278=4441516519^269=0^270=1.1033^271=5000000^278=4441516518^10=025^ ``` ## Market Data — Incremental Refresh (X) [#market-data--incremental-refresh-x] This message is continuously sent by the server after the initial Snapshot/Full Refresh. Each message includes only the changes since the previous update. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`262 MDReqID`** `String` The identifier of the originating Market Data Request. **`268 NoMDEntries`** `int` The number of market data entries following. The value is `0` if the order book is empty. > Repeating group (present when `<268>` NoMDEntries > 0): **`269 MDEntryType`** `int` The side of the quote. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — Bid * `1` — Ask **`270 MDEntryPx`** `Price` The price of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`271 MDEntrySize`** `Qty` The tradable volume of the market data entry. Conditional — required if `<268>` NoMDEntries is not `0`. **`278 MDEntryID`** `String` A unique market data entry identifier. Conditional — required if `<268>` NoMDEntries is not `0`. * Must be unique among active entries when `<279>` MDUpdateAction is `0` (New) * Must match the previous `<278>` MDEntryID when `<279>` MDUpdateAction is `1` (Change) or `2` (Delete) **`279 MDUpdateAction`** `int` The update type. Conditional — required if `<268>` NoMDEntries is not `0`. Possible values: * `0` — New * `1` — Change * `2` — Delete **`58 Text`** `String` Additional context. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=201^35=X^34=52^49=target_b2trader^52=20231222-14:40:41.150^56=sender_b2trader^55=spot.btc_usdt^262=1235^268=2^279=1^269=0^270=1.10334^271=200000^278=4441516519^279=2^269=1^270=1.10339^271=0^278=4441516523^10=092^ ``` ## Market Data Request Reject (Y) [#market-data-request-reject-y] This message is sent by the server to reject a Market Data Request due to business or technical reasons. **`262 MDReqID`** `String` The identifier of the rejected Market Data Request. Required. **`281 MDReqRejReason`** `int` The reason why the request is rejected. Optional. Possible values: * `0` — Unknown symbol * `1` — Duplicate MDReqID * `2` — Insufficient bandwidth * `3` — Insufficient permissions * `4` — Unsupported SubscriptionRequestType * `5` — Unsupported MarketDepth * `6` — Unsupported MDUpdateType * `8` — Unsupported MDEntryType **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=118^35=Y^34=3^49=target_b2trader^52=20231221-10:25:11.849^56=sender_b2trader^262=1234^58=symbol 'btcusd' is not supported^10=104^ ``` ## Business Reject (j) [#business-reject-j] This message is sent by the server to reject a message due to a business-level issue not addressed by the standard Market Data Request Reject or session-level Reject. **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`380 BusinessRejectReason`** `int` The reason why the request is rejected. Required. Possible values: * `0` — Other * `1` — Unknown ID * `2` — Unknown Security * `3` — Unsupported MsgType * `4` — Application not available * `5` — Conditionally required field missing * `6` — Not authorized * `7` — DeliverTo firm not available at this time **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=120^35=j^34=2^49=target_b2trader^52=20231219-22:30:39.617^56=sender_b2trader^45=133^58=Unsupported Message Type^372=V^380=3^10=166^ ``` The Trading session enables order placement and execution management via the FIX 4.4 protocol. Use this session to submit orders and receive real-time execution reports for your trading activity. For FIX connection settings (host, port, SenderCompID, TargetCompID, credentials), contact your broker. This page covers the **Trading** session only. For real-time order book streaming, use the [Market Data](market-data) session. ## Supported message types [#supported-message-types] The following values can be assigned to the `<35>` MsgType field: * `A` — Logon (Client → B2TRADER) * `0` — Heartbeat (Client ↔ B2TRADER) * `1` — Test Request (Client ↔ B2TRADER) * `3` — Reject (Client ← B2TRADER) * `4` — Sequence Reset (Client ↔ B2TRADER) * `5` — Logout (Client ↔ B2TRADER) * `D` — New Order Single (Client → B2TRADER) * `8` — Execution Report (Client ← B2TRADER) * `j` — Business Reject (Client ← B2TRADER) ## Getting started [#getting-started] ### Connection [#connection] To connect to the Trading session, use the following parameters provided by B2TRADER: * **Host and port**: The Trading endpoint (provided separately from the Market Data endpoint) * **SenderCompID**: Your client identifier for the Trading session * **TargetCompID**: The server identifier for the Trading session * **Protocol**: FIX 4.4 The Trading connection requires SSL with a self-signed certificate. ### Message structure [#message-structure] **Standard Header** All FIX messages must begin with a Standard Header containing the following fields: **`8 BeginString`** `String` Identifies the FIX version (`FIX.4.4`). Always the first field in a message. **`9 BodyLength`** `int` The automatically computed message length, in bytes. Always the second field. **`35 MsgType`** `String` The message type. See [Supported message types](#supported-message-types) for possible values. Always the third field. **`34 MsgSeqNum`** `int` The message sequence number, incremented by 1 for each consecutive message. **`49 SenderCompID`** `String` The identifier of the message sender. Provided by B2TRADER. **`52 SendingTime`** `Timestamp` The date and time when the message was sent, in UTC: `YYYYMMDD-HH:MM:SS.sss`. **`56 TargetCompID`** `String` The identifier of the message recipient. Provided by B2TRADER. *** **Standard Trailer** All FIX messages must end with a Standard Trailer: **`10 CheckSum`** `int` A three-digit checksum. Always the last field in a message. ### Logon (A) [#logon-a] This message is sent by the client to initiate a FIX session. It must be the first message in each connection. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`98 EncryptMethod`** `int` The encryption method. Required. Must be `0` (no encryption). **`108 HeartBtInt`** `int` The heartbeat interval, in seconds. Required. Indicates how often the server sends Heartbeat messages as part of a connection health check. **`141 ResetSeqNumFlag`** `Boolean` Indicates whether both parties should reset the currently used sequence numbers. Optional. **`553 Username`** `String` The client username. Required. Provided by B2TRADER. **`554 Password`** `String` The client password. Required. Provided by B2TRADER. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=117^35=A^1=68a4446ac84827ff5cd35c74^34=1^52=20231218-07:59:06.000^49=sender_b2trader^56=target_b2trader^554=password^553=username^98=0^108=30^10=117^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=93^35=A^1=68a4446ac84827ff5cd35c74^34=225^49=target_b2trader^52=20231218-07:59:06.655^56=sender_b2trader^98=0^108=30^10=054^ ``` ### Session maintenance [#session-maintenance] #### Heartbeat (0) [#heartbeat-0] This message is sent back and forth between the server and the client to check the connection status and in response to Test Request messages. **`112 TestReqID`** `String` The identifier of a Test Request in response to which this Heartbeat is sent. Conditional — required when sent in response to a Test Request. ```text title="Example" 8=FIX.4.4^9=79^35=0^34=2^52=20231218-07:59:36.000^49=sender_b2trader^56=target_b2trader^10=156^ ``` #### Test Request (1) [#test-request-1] This message is sent back and forth between the server and the client as a means of connectivity check. If a Heartbeat is not received within the expected interval, a Test Request is sent; the recipient must respond with a Heartbeat containing the same `<112>` TestReqID. **`112 TestReqID`** `String` The identifier of a Test Request. Required. ```text title="Example" 8=FIX.4.4^9=87^35=1^34=137^52=20231218-10:12:38.000^49=sender_b2trader^56=target_b2trader^112=2^10=250^ ``` #### Sequence Reset (4) [#sequence-reset-4] This message indicates the sequence number of the next message from the sender, immediately following the Sequence Reset. This may be necessary to recover from a disconnect when some messages were lost or their resending is not desirable. **`123 GapFillFlag`** `Boolean` Indicates that this message replaces missing messages that won't be resent. Optional. Possible values: * `Y` — Gap fill: `<34>` MsgSeqNum is valid and indicates the beginning of the gap fill range * `N` — Sequence reset: `<34>` MsgSeqNum is ignored. Should only be used in disaster recovery situations **`36 NewSeqNo`** `int` The new sequence number. Required. ```text title="Example" 8=FIX.4.4^9=90^35=4^34=6^49=target_b2trader^52=20231219-21:11:38.578^56=sender_b2trader^123=Y^36=8^10=176^ ``` #### Logout (5) [#logout-5] This message is sent by the client or server to terminate a session. When terminated, the possible reason is specified in the `<58>` Text field. **`58 Text`** `String` The detailed information about the reason for logging out. Optional. ```text title="Request (Client → B2TRADER)" 8=FIX.4.4^9=105^35=5^34=5^52=20231218-13:40:48.000^49=sender_b2trader^56=target_b2trader^58=Session terminated by client^10=183^ ``` ```text title="Response (B2TRADER → Client)" 8=FIX.4.4^9=81^35=5^34=748^49=target_b2trader^52=20231218-13:40:49.016^56=sender_b2trader^10=009^ ``` ### Reject (3) [#reject-3] This message is sent by the server upon receiving a malformed message from the client. The rejection reason is specified in the `<373>` SessionRejectReason field. This message is unrelated to application-level rejections (Execution Report with rejected status and Business Reject). **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`371 RefTagID`** `int` The tag number of the field that caused message rejection. Optional. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`373 SessionRejectReason`** `int` The reason why the message is rejected. Optional. Possible values: * `0` — Invalid tag number * `1` — Required tag missing * `2` — Tag not defined for this message type * `3` — Undefined tag * `4` — Tag has no value assigned * `5` — Value is incorrect (out of range) for this tag * `6` — Incorrect value data format * `7` — Decryption issue * `8` — Signature problem * `9` — CompID issue * `10` — SendingTime accuracy issue * `11` — Invalid MsgType * `12` — XML validation error * `13` — Same tag appears more than once * `14` — Tag specified not in required order * `15` — Wrong order of repeating group fields * `16` — Incorrect NumInGroup count for repeating group * `17` — Non-"Data" value includes field delimiter (SOH character) * `99` — Other **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=128^35=3^34=193^52=20231219-22:41:16.000^49=target_b2trader^56=sender_b2trader^45=18^371=11^372=D^373=1^58=Required tag missing: ClOrdID^10=126^ ``` *** ## New Order Single (D) [#new-order-single-d] This message is sent by the client to place a new order. The server responds with an Execution Report confirming the order status. For details on supported order types, see [Order types](../get-started/order-types). For details on time-in-force options, see [Time in force](../get-started/time-in-force). **`11 ClOrdID`** `String` The unique client-assigned order identifier. Required. **`1 Account`** `String` The account identifier. Required. Provided by B2TRADER. **`55 Symbol`** `String` The market identifier. Required. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. **`54 Side`** `char` The order side. Required. Possible values: * `1` — Buy * `2` — Sell **`38 OrderQty`** `Qty` The order quantity. Required. Must be greater than zero. The decimal precision must not exceed the market's amount scale, and the value must be at least the market's minimum amount. **`40 OrdType`** `char` The order type. Required. Possible values: * `1` — Market * `2` — Limit **`59 TimeInForce`** `char` The order's time-in-force policy. Required. Possible values: * `0` — Day * `1` — Good Till Cancel (GTC) * `3` — Immediate or Cancel (IOC) * `4` — Fill or Kill (FOK) * `6` — Good Till Date (GTD) **`44 Price`** `Price` The order price. Conditional — required when `<40>` OrdType is `2` (Limit), must not be present when `<40>` OrdType is `1` (Market). Must be greater than zero. The decimal precision must not exceed the market's price scale. **`126 ExpireTime`** `UTCTimestamp` The order expiration time. Conditional — required when `<59>` TimeInForce is `6` (GTD), must not be present otherwise. **`60 TransactTime`** `UTCTimestamp` The time of order creation. Required. ```text title="Limit order example (Client → B2TRADER)" 8=FIX.4.4^9=168^35=D^34=3^52=20231220-09:15:30.000^49=sender_b2trader^56=target_b2trader^1=68a4446ac84827ff5cd35c74^11=order001^55=spot.btc_usdt^54=1^38=0.5^40=2^44=42500.00^59=1^60=20231220-09:15:30.000^10=123^ ``` ```text title="Market order example (Client → B2TRADER)" 8=FIX.4.4^9=155^35=D^34=4^52=20231220-09:16:00.000^49=sender_b2trader^56=target_b2trader^1=68a4446ac84827ff5cd35c74^11=order002^55=spot.btc_usdt^54=2^38=0.1^40=1^59=3^60=20231220-09:16:00.000^10=045^ ``` ## Execution Report (8) [#execution-report-8] This message is sent by the server to confirm order status changes, including acknowledgment of new orders, fills, partial fills, cancellations, and rejections. For details on order statuses, see [Order statuses](../get-started/order-statuses). **`37 OrderID`** `String` The server-assigned unique order identifier. Required. **`11 ClOrdID`** `String` The client-assigned order identifier from the original New Order Single. Required. **`17 ExecID`** `String` The unique execution identifier. Present for trade executions. **`150 ExecType`** `char` The type of execution being reported. Required. Possible values: * `0` — New: order has been accepted * `4` — Canceled: order has been canceled by the server (e.g., IOC order partially filled, GTD order expired, or market settings changed) * `8` — Rejected: order has been rejected * `F` — Trade: order has been partially or fully filled **`39 OrdStatus`** `char` The current order status. Required. Possible values: * `0` — New * `1` — Partially filled * `2` — Filled * `4` — Canceled * `8` — Rejected **`1 Account`** `String` The account identifier. Required. **`55 Symbol`** `String` The market identifier. Format: `{marketType}.{baseAssetId}_{quoteAssetId}`. **`54 Side`** `char` The order side. Required. Possible values: * `1` — Buy * `2` — Sell **`40 OrdType`** `char` The order type. Required. Possible values: * `1` — Market * `2` — Limit **`44 Price`** `Price` The order price. Present for Limit orders. **`6 AvgPx`** `Price` The average price of all fills on this order. Required. **`14 CumQty`** `Qty` The total filled quantity. Required. **`151 LeavesQty`** `Qty` The remaining quantity to be filled. Required. Set to `0` for Canceled or Rejected orders. **`31 LastPx`** `Price` The price of the last fill. Present when `<150>` ExecType is `F` (Trade). **`32 LastQty`** `Qty` The quantity of the last fill. Present when `<150>` ExecType is `F` (Trade). **`15 Currency`** `String` The quote asset identifier. Optional. **`60 TransactTime`** `UTCTimestamp` The transaction time. Required. **`64 SettlDate`** `String` The settlement date in `YYYYMMDD` format. Required. **`58 Text`** `String` Additional information, such as the rejection reason. Optional. ```text title="New order accepted (B2TRADER → Client)" 8=FIX.4.4^9=220^35=8^34=5^52=20231220-09:15:30.100^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YP^11=order001^150=0^39=0^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=1^40=2^44=42500.00^6=0^14=0^151=0.5^60=20231220-09:15:30.100^64=20231220^10=087^ ``` ```text title="Trade execution (B2TRADER → Client)" 8=FIX.4.4^9=245^35=8^34=6^52=20231220-09:15:30.200^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YP^11=order001^17=01HBXK5V3R8NQ7YR^150=F^39=2^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=1^40=2^44=42500.00^6=42500.00^14=0.5^151=0^31=42500.00^32=0.5^15=usdt^60=20231220-09:15:30.200^64=20231220^10=154^ ``` ```text title="Order rejected (B2TRADER → Client)" 8=FIX.4.4^9=214^35=8^34=7^52=20231220-09:16:00.100^49=target_b2trader^56=sender_b2trader^37=01HBXK5V3R8NQ7YS^11=order002^150=8^39=8^1=68a4446ac84827ff5cd35c74^55=spot.btc_usdt^54=2^40=1^6=0^14=0^151=0^58=Insufficient balance^60=20231220-09:16:00.100^64=20231220^10=201^ ``` ## Business Reject (j) [#business-reject-j] This message is sent by the server to reject a message due to a business-level issue not addressed by the standard session-level Reject or Execution Report rejection. **`45 RefSeqNum`** `int` The sequence number of the rejected message (`<34>` MsgSeqNum). Required. **`372 RefMsgType`** `String` The type of the rejected message (`<35>` MsgType). Optional. **`380 BusinessRejectReason`** `int` The reason why the request is rejected. Required. Possible values: * `0` — Other * `1` — Unknown ID * `2` — Unknown Security * `3` — Unsupported MsgType * `4` — Application not available * `5` — Conditionally required field missing * `6` — Not authorized * `7` — DeliverTo firm not available at this time **`58 Text`** `String` The detailed information about the rejection reason. Optional. ```text title="Example (B2TRADER → Client)" 8=FIX.4.4^9=100^35=j^34=2^49=target_b2trader^52=20231219-22:30:39.617^56=sender_b2trader^45=133^58=Unsupported Message Type^372=V^380=3^10=006^ ``` Each trading account has an `accountStatus` field that determines which operations are permitted on the account. The field is returned on account objects by the API, such as in [Get accounts](../rest-api/settings). An account can be assigned one of the following statuses: * **Active**: All operations are permitted, including placing, modifying, and canceling orders, opening and closing positions, deposits, and withdrawals. * **Halted**: Trader-initiated trading is blocked. Requests to place, modify, or cancel orders and to open or close positions are rejected. Deposits and withdrawals remain allowed. Managed trading through the Management API (MAM, B2COPY) continues to work. * **Frozen**: All operations are blocked. Trading, deposits, and withdrawals are unavailable, and the account is view-only. Stop-out liquidation still executes as a safety mechanism. * **Archived**: The account is decommissioned and hidden from all user-facing surfaces. Real-time profit and loss, equity, margin level, and funding settlement continue for all statuses. Archived accounts are never returned in the trading API account list. They are excluded server-side, so an account that changes to *Archived* stops appearing in [Get accounts](../rest-api/settings) responses. A market can be assigned one of the following statuses: * **Open**: The market is operating properly and accepts orders via Trading terminal and API. Market data for charts is persisted. * **Paused**: The market stops accepting incoming orders via Trading terminal and API (previously placed Limit orders still await execution). Market data for charts is persisted. * **Halted**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is persisted. * **Disabled**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is not persisted. * **Archived**: The market is retired from regular operations. It doesn't accept trading activity, isn't included in market synchronization responses, and its historical chart data is deleted. ## Market and Limit orders [#market-and-limit-orders] Orders can be assigned one of the following statuses: * **Started**: The order has passed preliminary checks. * **Pending**: For Limit orders: the order is waiting for a price trigger. * **Working**: The order is being executed. * **Completed**: The order has been executed in its full amount. * **Cancelled**: The order has been cancelled by a trader. * **Rejected**: The order has been rejected by the system and has never been assigned the *Working* status. * **Expired**: The order has been cancelled due to [Time in force](time-in-force) settings. Some part of it may have already been executed. The status is applicable for GTD and Day orders only. ## Stop orders [#stop-orders] Orders can be assigned one of the following statuses: * **Waiting for activation**: The order awaits the Activation price trigger. * **Activated**: The Activation price has been reached, a new Market or Limit order has been placed. * **Rejected**: The Activation price has been reached, but an issue occurred with placing of a new Market or Limit order. The following order types are supported: * **Market**: An instruction to instantly buy or sell a certain asset amount at a currently best price on the market. Such orders are not listed in the order book. * **Limit**: An instruction to buy or sell a certain asset amount at a specified price. Limit orders are placed in the order book and executed only after the market price reaches the specified limit price (or at a better price). * **Stop Market**: Such an order is not placed unless the current market price meets a specified stop (or trigger) price, after which the order is placed as a regular Market order due to be executed or cancelled, depending on its Time in force. * **Stop Limit**: The order is similar to the Stop Market order in the sense that you need to indicate the stop price at which the order must be placed, after which it becomes a regular Limit order awaiting execution at a specified limit price. For Stop buy orders, the stop price should be above the best ask price; for Stop sell orders, the stop price should be below the best bid price (otherwise, the orders will be activated instantly). Stop Market and Stop Limit orders are accepted while a market is closed according to its trading calendar. The order is stored with the standard `WaitingForActivation` status and is evaluated against the first available price when the session opens. Market and Limit orders are still rejected while the market is closed. The market's own status must still be `Open` — a `Paused` or `Halted` market rejects every order type. Refer to [Time in force](time-in-force) to learn about execution parameters that can be specified for different order types. ## Introduction [#introduction] B2TRADER provides developers with three distinct methods for data delivery, each optimized for specific use cases and performance requirements: REST, WebSocket, and FIX APIs. The **REST API** provides read access to market data as well as both read and write access to trading operations. It serves as the foundation for synchronous data operations where immediate confirmation and guaranteed delivery are essential. The **WebSocket API** provides access to public market data streaming as well as private account updates. It delivers real-time updates with low latency, making it ideal for live trading environments. The **FIX API** provides direct access to market data and trading via the FIX 4.4 protocol. It is designed for institutional clients and algorithmic trading systems that require standardized, low-latency connectivity using the industry-standard Financial Information eXchange protocol. This approach provides developers with flexible options for building robust, scalable trading applications that can handle both operational requirements and real-time market dynamics. ### When to use REST API [#when-to-use-rest-api] * **Account configuration and settings**: Managing user preferences and system configurations. * **Order placement and modification**: Creating, updating, and canceling trading orders. * **Historical data retrieval**: Accessing past trading records and market data. * **One-time data requests**: Retrieving specific information that doesn't require continuous updates. * **Administrative operations**: Account management and system administration tasks. ### When to use WebSocket API [#when-to-use-websocket-api] * **Real-time price monitoring**: Live market price feeds and ticker updates. * **Live position tracking**: Continuous monitoring of open and closed positions. * **Order book visualization**: Real-time depth of market data. * **Market data feeds**: Streaming market statistics and trading activity. * **Account balance monitoring**: Live updates of account equity and margin status. ### When to use FIX API [#when-to-use-fix-api] * **Institutional connectivity**: Standardized FIX 4.4 protocol for professional trading infrastructure. * **Algorithmic trading**: Low-latency order execution and market data for automated strategies. * **Market data streaming**: Real-time order book snapshots and incremental updates via FIX protocol. * **Multi-venue integration**: Unified FIX connectivity for systems already integrated with other FIX-based venues. ## General considerations [#general-considerations] The following applies to all interface descriptions provided in this documentation: * **Endpoints**: All endpoints are relative and resolved based on a specified hostname (indicated as `{host}`). * **Authentication**: REST and WebSocket APIs require an access token (see [Authentication](#authentication)). The FIX API uses in-band authentication via the Logon message with Username, Password, and Account fields provided by B2TRADER. * **Data format**: REST and WebSocket APIs return results in JSON format. The FIX API uses the standard FIX 4.4 message format. * **Security**: All communications use secure protocols (HTTPS for REST, WSS for WebSocket, encrypted TCP for FIX). ### Authentication [#authentication] API access requires an access token for both REST and WebSocket connections. Authentication follows a two-step process: 1. Generate an offline token in the Trading terminal. 2. Exchange the offline token for an access token via API call. #### Token types [#token-types] **Offline token** * **Limit**: 10 tokens per account * **Validity**: 1 year * **Management**: Can be revoked or deleted at any time * **Purpose**: Generate access tokens **Access token** * **Type**: Bearer token * **Validity**: 60 minutes * **Purpose**: Authorize API requests ### Generate offline token [#generate-offline-token] To generate an offline token: 1. In the Trading terminal, open **Settings** and select **API token management**. 2. Click **+ Create new**. 3. In the **New API token** popup, fill in a **Name** for the token, to help you identify it later. 4. Click **Create**. The newly generated token will be displayed and available for copying, along with its name and expiration date. The token only reveals once in the creation popup. Copy and store it securely before closing the popup. The token can't be retrieved again after closing. ### Obtain access token [#obtain-access-token] Request an access token using your offline token. **Endpoint**: `POST` `/frontoffice/api/v4/access-token` **Request body**: ```json { "token": "{YOUR_OFFLINE_TOKEN}" } ``` **Response** (Success): ```json { "accessToken": "{YOUR_ACCESS_TOKEN}", "expiresIn": 3600, "tokenType": "Bearer" } ``` **`accessToken`** `string` The access token for API authorization. **`expiresIn`** `integer` The token lifetime, in seconds. **`tokenType`** `string` The authentication type, always `"Bearer"`. ### Using access tokens [#using-access-tokens] Include the access token in API requests: ```http title="REST" Authorization: Bearer {YOUR_ACCESS_TOKEN} ``` ```http title="WebSocket" {URL}?access_token={YOUR_ACCESS_TOKEN} ``` Access tokens must be refreshed before expiration by repeating the Step 2 with your offline token. ## REST API: Synchronous data operations [#rest-api-synchronous-data-operations] The REST API serves as the foundation for synchronous data operations within the B2TRADER platform. This approach follows standard HTTP protocols and is ideal for operations requiring immediate confirmation and guaranteed delivery. ### Key characteristics [#key-characteristics] * **Request-response operations** where immediate confirmation is required. * **Account management** including settings and configuration. * **Order placement and modification** with guaranteed delivery. * **Historical data retrieval** for analysis and reporting. * **Stateless operations** that don't require persistent connections. ### HTTP response codes [#http-response-codes] B2TRADER API uses conventional HTTP response codes to indicate the success or failure of requests. **Success codes:** * `200 OK` — Request successful **Error codes:** * `400 Bad Request` — Invalid request parameters * `401 Unauthorized` — Authentication required * `403 Forbidden` — Insufficient permissions * `404 Not Found` — Resource not found * `429 Too Many Requests` — [Rate limit](#rate-limits) exceeded * `500 Internal Server Error` — Server error In case of an error, an object will be returned with the following structure: ```json { "code": "text", "message": "text", "details": { "source": "text", "message": "text", "stackTrace": "text" } } ``` ### Available endpoints [#available-endpoints] * **[Trading operations](../rest-api/trading)**: Create, modify, and cancel orders; open, close, and modify positions; control price trigger settings. * **[Trading history](../rest-api/history)**: Retrieve detailed execution records for positions and orders. * **[Settings and configurations](../rest-api/settings)**: Access account information, market specifications, trading sessions, and asset details. ### Rate limits [#rate-limits] Rate limits are applied per minute for each unique **AccountId** to ensure fair resource usage and maintain optimal API performance. All limits use the **Fixed Window** strategy. When rate limits are exceeded, the API returns a `429 Too Many Requests` HTTP status code. #### Trading methods [#trading-methods] * **Default limit**: 600 requests per minute for all methods. * **Reduced limit (200 rpm)** applies to: * Get order data methods * Bulk close positions method * Price triggers methods #### History methods [#history-methods] * **All request types**: 60 requests per minute. #### Settings methods [#settings-methods] * **GET requests**: 100 requests per minute. * **POST and DELETE requests**: 60 requests per minute. Rate limits are calculated independently for each method category. For example, you can make 100 GET requests to Settings methods and 60 requests to History methods within the same minute without hitting rate limits. ## WebSocket API: Real-time data streaming [#websocket-api-real-time-data-streaming] The WebSocket API delivers real-time updates with minimal latency, essential for modern trading applications. The implementation uses unidirectional communication from server to client, ensuring efficient data delivery. ### Key characteristics [#key-characteristics-1] * **Unidirectional communication** from server to client for optimal performance. * **Real-time market data** for live trading environments. * **Position and order updates** as they occur in real-time. * **Low-latency data delivery** for time-sensitive trading operations. * **Persistent connections** maintaining continuous data flow. ### SignalR implementation [#signalr-implementation] B2TRADER utilizes **AspNetCore SignalR** for WebSocket message organization and transmission, providing a robust and scalable real-time communication framework. **Resources:** * [Official GitHub Repository](https://github.com/dotnet/aspnetcore/tree/main/src/SignalR) * [Official Documentation](https://dotnet.microsoft.com/en-us/apps/aspnet/signalr) SignalR provides a structured approach to real-time communication through standardized message formatting and connection management. ### Connection lifecycle [#connection-lifecycle] The data transfer process consists of two essential phases: 1. **Connection establishment** — Initial handshake, authentication, and subscription setup. 2. **Data streaming** — Continuous real-time data flow with automatic reconnection handling. ### Message types [#message-types] SignalR utilizes numerical `type` indicators for different operations: ### Available stream types [#available-stream-types] * **[Trading streams](../ws-api/trading)**: Track active orders, open and closed positions. * **[Market data streams](../ws-api/market-data)**: Get real-time order book updates, market statistics and price changes. * **[Account information streams](../ws-api/account-info)**: Get live account balance and margin updates. ## FIX API: Standardized protocol connectivity [#fix-api-standardized-protocol-connectivity] The FIX API provides direct access to B2TRADER via the FIX 4.4 protocol, the industry standard for electronic trading communication. It is designed for institutional clients and algorithmic trading systems. ### Key characteristics [#key-characteristics-2] * **FIX 4.4 protocol** for standardized, vendor-neutral connectivity. * **Dedicated sessions** for Market Data and Trading with separate endpoints. * **In-band authentication** via Logon message (Username, Password, Account). * **Real-time market data** with order book snapshots and incremental updates. * **Session management** with Heartbeat, Test Request, and Sequence Reset support. ### Authentication [#authentication-1] Unlike REST and WebSocket APIs, the FIX API does not use access tokens. Authentication is performed in-band as part of the FIX Logon message using credentials provided by B2TRADER: * **Username** (`<553>`): The client username * **Password** (`<554>`): The client password * **Account** (`<1>`): The account identifier ### Available session types [#available-session-types] * **[Market Data](../fix-api/market-data)**: Subscribe to real-time order book updates, snapshots, and incremental refreshes. * **[Trading](../fix-api/trading)**: Place orders and receive execution reports in real time. ## Integration best practices [#integration-best-practices] ### API selection strategy [#api-selection-strategy] * Use **REST API** for operational tasks requiring confirmation (order placement, account management). * Use **WebSocket API** for real-time monitoring and market data visualization. * Use **FIX API** for institutional connectivity, algorithmic trading, and integration with existing FIX-based infrastructure. * Implement multiple APIs in comprehensive trading applications for optimal functionality. ### Performance optimization [#performance-optimization] * Implement proper connection pooling for REST API requests. * Use WebSocket subscriptions efficiently by subscribing only to required data streams. * Handle reconnection logic for WebSocket connections to ensure data continuity. * Implement appropriate error handling and retry mechanisms. ### Security considerations [#security-considerations] * Store authentication tokens securely and implement token refresh mechanisms. * Use secure connections (HTTPS/WSS) for all API communications. * Implement proper input validation and sanitization. * Monitor API usage and implement rate limiting on the client side. This comprehensive API architecture enables developers to build sophisticated trading applications that can handle both real-time market dynamics and operational trading requirements efficiently. When trading on CFD or Perpetual markets, the following triggers can be enabled to manage investments and mitigate risks: * **Take profit**: A take-profit order is used to sell or buy an asset automatically once it hits a predefined price, ensuring the trader locks in profits. For example, if a trader buys ETH at $2,000 and sets the Take profit at $2,100, the platform will sell the ETH automatically when the market price reaches $2100, securing the trader's profit. * **Stop loss**: A stop-loss order is a tool to limit potential losses. It automatically sells an asset when its price falls to a predetermined level. For example, if a trader buys ETH at $2,000 and sets the Stop loss at $1,900, the asset will be sold if the price drops to $1,900, capping the loss to $100 per ETH. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified percentage. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. For example, a trader buys ETH at $2,000 and sets the Trailing stop at $1900 with a 10% adjustment. If ETH rises to $2,200, the Trailing stop increases to $2,090. A drop to $2,090 triggers the sale, locking in gains. The triggers are applicable to all order types: Market, Limit, Stop Market, and Stop Limit. Multiple triggers can be applied simultaneously. The triggers can be adjusted anytime until a position is fully closed. The Take profit, Stop loss, and Trailing stop always operate with the current position volume. For **buy** orders, the triggers are activated by the top-of-the-book **bid** price. For **sell** orders, the triggers are activated by the top-of-the-book **ask** price. Triggers do not activate if a position is in the *Stop out* state. However, if the position persists after the *Stop out*, triggers can then be activated. The following time-in-force settings can be specified for orders: * **FOK** (fill-or-kill): Such orders are either filled instantly or killed (cancelled). In other words, a fill-or-kill order must be fulfilled instantly or not executed at all. FOK orders are used when partial delivery of assets isn't acceptable for any reason. * **IOC** (immediate-or-cancel): This setting implies that any part of an order that can't be filled instantly must be cancelled. Upon placing an IOC order, an attempt will be made to instantly execute it (in full or in part) at the best possible price, after which any remaining, unfilled part will be cancelled. If no amount is available at a specified price upon placing such order, it's cancelled instantly. * **GTC** (good-‘til-cancelled): The default setting applied to all Limit orders. Open GTC orders are awaiting execution until they are cancelled explicitly by a trader or filled. * **GTD** (good-‘til-date): Can be applied to Limit and Stop Limit orders. Such orders remain listed in the order book until a specified date or until they are cancelled by a trader. By that time the order can be partially executed. * **DAY**: Can be applied to Limit and Stop Limit orders. Such orders remain listed in the order book until 23:59 of the current day or until they are cancelled by a trader. By that time the order can be partially executed. * **Retry**: Can be applied to Market orders only. A Retry order aims to fill your full volume by repeatedly filling the unfilled remainder at current market prices. The average price may be worse than shown, and in thin markets a remainder may stay unfilled. The order expiration time is defined by the time settings specified for the platform, without taking into account the time settings of the devices from which the platform is accessed. Guest endpoints serve public market data to callers with no access token. Each one is the anonymous counterpart of an authenticated endpoint: same request shape, same response schema, no authorization. They exist so an unauthenticated Trading terminal session can render markets, charts, and order books, and you can use them the same way for read-only integrations. Every guest endpoint sits under a `/guest` path segment inserted after the API version, and shares these rules: * **No authentication.** Do not send an `Authorization` header. There are no required operations. * **No `accountId`.** The `accountId` header used by the authenticated endpoints does not apply and is not read. * **Public data only.** Balances, positions, orders, trade history, margin, and user profile are not reachable through any guest endpoint. * **Guest-visible markets only.** A market that is not active and well-configured is rejected with `400`, even if it exists. * **No account context.** A guest has no trading account, so nothing account-specific enters the calculation. Commissions come from the tenant's **default** commission profile rule, with volume-based tiers evaluated at a traded volume of `0`, so a guest always sees the entry tier. Prices and calculated figures can therefore differ from the same call made with an access token. * **Rate limited per caller.** Guest traffic is subject to its own request-rate limit, separate from the authenticated limits. * **Read-only.** There is no guest counterpart of order placement, position closing, trigger submission, or favorites. ## Assets [#assets] `GET` `/frontoffice/api/v3/guest/assets` Anonymous counterpart of [Get assets](settings#get-assets). Returns the same schema, restricted to CRM-source assets — assets that exist only on a liquidity provider stay hidden. ## Info [#info] `GET` `/frontoffice/api/v3/guest/info` Anonymous counterpart of [Get server info](settings#get-server-info). Same platform time, same schema. *** `GET` `/frontoffice/api/v3/guest/info/time-zones` Anonymous counterpart of [Get server time zones](settings#get-server-time-zones). Same schema. ## Markets [#markets] `GET` `/frontoffice/api/v5/guest/markets` Anonymous counterpart of [Get markets](settings#get-markets). Lists active, well-configured markets ordered by display name. Accepts the optional `categoryId` query parameter. Each item carries `marketId`, `displayName`, `fullName`, `type`, and `subtype` — the authenticated `isFavorite` field is absent, because guests have no per-account favorites. *** `GET` `/frontoffice/api/v5/guest/markets/{marketId}` Anonymous counterpart of [Get market](settings#get-market). Returns the instrument's trading parameters — price and amount scales, tick size, lot size and step, amount limits, trading calendar, slippage rate, price deviation, and the funding schedule for perpetual markets. The per-account, commission, and leverage fields of the authenticated response are absent. An unknown, disabled, or misconfigured `marketId` returns `400`. *** `GET` `/frontoffice/api/v4/guest/markets-categories` Returns the broker's market category tree, pruned to branches that contain at least one guest-visible market. Each category carries `id`, `name`, and a nested `categories` array. ## Order data [#order-data] These endpoints price a hypothetical order without placing it. They are the calculation behind the order form's preview figures. `POST` `/frontoffice/api/v3/guest/order-data` Anonymous counterpart of [Get SPOT order data](trading#get-spot-order-data). Same request body. The response carries the same `order` object with `baseAmount`, `quoteAmount`, `commissionAmount`, and `total`, calculated without any account-specific settings and with the tenant-default commission rule. *** `POST` `/frontoffice/api/cfd/v4/guest/order-data` Anonymous counterpart of [Get CFD order data](trading#get-cfd-order-data). Same request body. The response carries the same `order` object — `lotAmount`, `requiredMarginInRAT`, `quoteAmount`, `commissionAmountInRAT`, `takeProfit`, and `stopLoss` — calculated without any account-specific settings, and with `marginLevel` always `null`, since it needs a balance and open positions. *** `POST` `/frontoffice/api/perpetual/v4/guest/order-data` Anonymous counterpart of [Get PF order data](trading#get-pf-order-data). Behaves exactly as the CFD guest variant above, including `marginLevel` always being `null`. ## Charting [#charting] `GET` `/marketdata/api/v4/guest/instruments/{marketSymbol}/history` Returns historical candles for a market. Candle prices are not account-specific and can differ from the authenticated endpoint's response for the same market and window. Response schema matches the authenticated charting history endpoint at `/marketdata/api/v4/instruments/{marketSymbol}/history`. `type`, `startDate`, and `endDate` are **required** here, and the requested window is capped per timeframe: | Timeframe | Maximum window | | ---------------------- | -------------- | | 1, 5, 15, 30 minutes | 30 days | | 1, 4, 12 hours | 365 days | | 1 day, 1 week, 1 month | 5 years | A missing, malformed, or oversized window returns `400`. `endDate` may not be in the future beyond a one-minute allowance for client clock drift. A market that is hidden from traders returns an empty candle set rather than an error. *** `GET` `/marketdata/api/v4/guest/instruments/{marketSymbol}/funding` Returns the funding event history of a perpetual market. Funding events do not depend on an account, so the response matches the authenticated endpoint at `/marketdata/api/v4/instruments/{marketSymbol}/funding` exactly. Accepts the same `limit`, `offset`, `appliedAtFrom`, and `appliedAtTo` query parameters. An unknown market symbol, or a market that is not a perpetual, returns `400`. ## AI recommendation [#ai-recommendation] `GET` `/marketdata/api/v1/guest/ai-recommendation/{marketId}` Returns the AI-generated recommendation for a market — price forecast, sentiment ratios, suggested actions, market metrics, and triggers. Response schema matches the authenticated endpoint at `/marketdata/api/v1/ai-recommendation/{marketId}`. Accepts the same optional `language` query parameter, defaulting to `en`. An unknown `marketId` returns `400`. ## Streaming market data as a guest [#streaming-market-data-as-a-guest] The endpoints above cover snapshots and history. For live prices, order books, and candles without a token, use the guest market data stream — see [Guest market data](../ws-api/market-data#guest-market-data). ## Open positions [#open-positions] ### Get executions for an open position [#get-executions-for-an-open-position] `POST` `/frontoffice/api/v4/positions/``{positionId}``/executions/list` #### Summary [#summary] Use this method to retrieve execution details for a specific open position using its position identifier. #### Request [#request] ##### Header parameters [#header-parameters] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters] **`positionId`** `required` The position identifier. ##### Body [#body] **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`offset`** `integer · int32 | nullable` The number of items to skip before starting to collect the result set. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2PMT0VMJG5B8XBDNZ7FNM1F/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 2, "offset": 0 } ``` #### Response [#response] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.293Z", "executionId": "01K2PMT0VNWB23GSRN2XQAJD6Q", "baseAmount": "0.314", "executionPrice": "4603.5", "commissionAmountInRAT": "0", "commissions": [], "comment": null }, { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.293Z", "executionId": "01K2PMT0VN1F2JPM14AEV6V8YJ", "baseAmount": "0.045", "executionPrice": "4603.49", "commissionAmountInRAT": "0", "commissions": [], "comment": null } ] } ``` ### Get executions for open positions [#get-executions-for-open-positions] `POST` `/frontoffice/api/v4/positions/executions/list` #### Summary [#summary-1] Use this method to retrieve execution details for multiple open positions by providing an array of position identifiers. #### Request [#request-1] ##### Header parameters [#header-parameters-1] **`accountId`** `required` The trading account identifier. ##### Body [#body-1] **`positionIds`** `array · string[]` The array of position identifiers. **`limit`** `integer · int32 | nullable` The maximum number of items to return. ```http title="Request example" POST /frontoffice/api/v4/positions/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "positionIds": [ "01K2PMT0VMJG5B8XBDNZ7FNM1F", "01K2PMXY63HESK110WT1CHMAFA" ], "limit": 5 } ``` #### Response [#response-1] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "01K2PMXY63HESK110WT1CHMAFA", "orderId": "01K2PMXY1894RC6E2BYFR00T87", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:38:10.627Z", "executionId": "01K2PMXY63NXM30VNWPDECSFJR", "baseAmount": "15", "executionPrice": "4333.69288", "commissionAmountInRAT": "32.27", "commissions": [ { "assetId": "eur", "amount": "32.27" } ], "comment": null }, { "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "orderId": "01K2PMT0KRRMTTXGPDJCXZ99NZ", "side": "Buy", "reason": "Trader", "createdAt": "2025-08-15T10:36:02.292Z", "executionId": "01K2PMT0VMPCZW0JB2C9J6B405", "baseAmount": "0.141", "executionPrice": "4602.3", "commissionAmountInRAT": "5", "commissions": [ { "assetId": "eur", "amount": "5" } ], "comment": null } ] } ``` ## Closed positions [#closed-positions] ### Get orders for closed positions [#get-orders-for-closed-positions] `POST` `/frontoffice/api/v4/orders/closed-positions` #### Summary [#summary-2] Use this method to retrieve orders associated with closed positions within specified date ranges and market filters. #### Request [#request-2] ##### Header parameters [#header-parameters-2] **`accountId`** `required` The trading account identifier. ##### Body [#body-2] **`createdAtFrom`** `string · date-time | nullable` The start date of the period when the positions were opened. **`createdAtTo`** `string · date-time | nullable` The end date of the period when the positions were opened. **`closedAtFrom`** `string · date-time | nullable` The start date of the period when the positions were closed. **`closedAtTo`** `string · date-time | nullable` The end date of the period when the positions were closed. **`marketId`** `string | nullable` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`marketType`** `string | nullable` The market type. Possible values: * `Cfd` * `Perp` **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`lastOrderId`** `string | nullable` The identifier of the final order to be returned. ```http title="Request example" POST /frontoffice/api/v4/orders/closed-positions HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 2, "createdAtFrom": "2025-08-01T12:00:32.886Z", "createdAtTo": "2025-08-15T12:00:32.886Z" } ``` #### Response [#response-2] In case of success, an object will be returned. Each object contains the following information: **`marketId`** `string` The market identifier. **`marketFullName`** `string | nullable` The market full name or description (optional). **`marketDisplayName`** `string | nullable` The market ticker. **`marketType`** `string` The market type. Possible values: * `Cfd` * `Perp` **`orderId`** `string` The order identifier. **`orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`timeInForce`** `string` The [time-in-force setting](../get-started/time-in-force) of the order. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`side`** `string` The order side. Possible values: * `Buy` * `Sell` **`positionCloseLotAmount`** `decimal string` The position amount closed by the order, in lots. **`reason`** `string` The reason for placing the order. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`closedAt`** `string · date-time | nullable` The date and time when the position was closed. **`positionId`** `string` The position identifier. **`openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`closePrice`** `decimal string` The volume-weighted average price (VWAP) of trades related to a position-closing order. **`positionPriceInRAT`** `decimal string` The position price, in conversion to RAT. **`rateToRAT`** `decimal string` The conversion rate to RAT. **`openedAt`** `string · date-time` The date and time when the position was opened. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "data": [ { "marketId": "cfd.eth_eur", "marketFullName": null, "marketDisplayName": "CFD ETH/EUR", "marketType": "Cfd", "orderId": "01K2PNGX50SR1FRE6P14PJC17E", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "15", "reason": "Trader", "realizedPnlInRAT": "-144.64", "closedAt": "2025-08-15T10:48:32.393Z", "positionId": "01K2PMXY63HESK110WT1CHMAFA", "openPrice": "4333.69288", "closePrice": "3370.58389", "positionPriceInRAT": "50558.75", "rateToRAT": "1", "openedAt": "2025-08-15T10:38:10.628Z", "comment": null }, { "marketId": "perp.eth_usdt", "marketFullName": "ETH/USDT_4s8hKqiPXmXOEhsO1J6W", "marketDisplayName": "ETH/USDT_jC6Im5PxwgZLrwyccRcI", "marketType": "Perpetual", "orderId": "01K2PNG3N6NKAJVV4RV5E2V0HK", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "0.5", "reason": "Trader", "realizedPnlInRAT": "13.42", "closedAt": "2025-08-15T10:48:06.234Z", "positionId": "01K2PMT0VMJG5B8XBDNZ7FNM1F", "openPrice": "4603.1607", "closePrice": "4634.3915", "positionPriceInRAT": "1992.78", "rateToRAT": "0.86", "openedAt": "2025-08-15T10:36:02.293Z", "comment": null } ], "isExceeded": true } ``` ### Get executions for a closing order [#get-executions-for-a-closing-order] `POST` `/frontoffice/api/v5/orders/``{orderId}``/executions/list` #### Summary [#summary-3] Use this method to retrieve execution details for a specific position-closing order using its identifier. #### Request [#request-3] ##### Header parameters [#header-parameters-3] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-1] **`orderId`** `required` The order identifier. ##### Body [#body-3] **`positionId`** `string | nullable` The position identifier. **`limit`** `integer · int32 | nullable` The maximum number of items to return. **`lastExecutionId`** `string | nullable` The identifier of the final execution to be returned. ```http title="Request example" POST /frontoffice/api/v4/orders/01K2PNG3N6NKAJVV4RV5E2V0HK/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "limit": 5 } ``` #### Response [#response-3] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed amount of the base asset. **`executionPrice`** `decimal string` The price at which the execution was settled. **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. Structure: * **`assetId`** `string` * **`amount`** `decimal string` **`positionSizeIncreased`** `boolean` Indicates if a position size was increased (`true`) or decreased (`false`) as a result of the execution. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "string", "orderId": "string", "side": "Buy", "reason": "Trader", "createdAt": "2025-12-18T19:02:22.196Z", "executionId": "string", "baseAmount": "string", "executionPrice": "string", "realizedPnlInRAT": "string", "commissionAmountInRAT": "string", "commissions": [ { "assetId": "string", "amount": "string" } ], "positionSizeIncreased": true } ], "isExceeded": true } ``` ### Get executions for closing orders [#get-executions-for-closing-orders] `POST` `/frontoffice/api/v5/orders/executions/list` #### Summary [#summary-4] Use this method to retrieve execution details for multiple position-closing orders by providing an array of order identifiers. #### Request [#request-4] ##### Header parameters [#header-parameters-4] **`accountId`** `required` The trading account identifier. ##### Body [#body-4] **`orderId`** `string` The order identifier. **`positionId`** `string` The order identifier. ```http title="Request example" POST /frontoffice/api/v4/orders/executions/list HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "orderPositionPairs": [ { "orderId": "01K31APDKZCVGWZA3XTF5JPAMD", "positionId": "01K31APDWF2EBHRKHH15VGB1ST" } ], "limit": 0 } ``` #### Response [#response-4] In case of success, an object containing an array of executions will be returned. Each execution object contains the following information: **`positionId`** `string` The position identifier. **`orderId`** `string` The order identifier. **`side`** `string` The execution side. Possible values: * `Buy` * `Sell` **`reason`** `string` The reason for the execution. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`createdAt`** `string` The date and time when the execution occurred, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`executionId`** `string` The execution identifier. **`baseAmount`** `decimal string` The executed base asset amount. **`executionPrice`** `decimal string` The price at which the execution was settled. **`realizedPnlInRAT`** `decimal string` The realized PnL, in conversion to RAT. **`commissionAmountInRAT`** `decimal string` The total commissions charged for the execution, in conversion to RAT. **`commissions`** `array` The breakdown of commissions charged per asset. Structure: * **`assetId`** `string` * **`amount`** `decimal string` **`positionSizeIncreased`** `boolean` Indicates if a position size was increased (`true`) or decreased (`false`) as a result of the execution. **`comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`isExceeded`** `boolean` Indicates whether the number of returned items reached the response `limit` and more data is available. ```json title="Response example — 200: OK" { "executions": [ { "positionId": "string", "orderId": "string", "side": "Buy", "reason": "Trader", "createdAt": "2025-12-18T18:53:15.657Z", "executionId": "string", "baseAmount": "string", "executionPrice": "string", "realizedPnlInRAT": "string", "commissionAmountInRAT": "string", "commissions": [ { "assetId": "string", "amount": "string" } ], "positionSizeIncreased": true, "comment": null } ], "isExceeded": true } ``` ## Equity Curve [#equity-curve] ### Get equity curve data [#get-equity-curve-data] `POST` `/api/history/v1/equity-curve` #### Summary [#summary-5] Use this method to retrieve equity data points for a trading account over an inclusive date range. The response can contain daily, weekly, or monthly data points. #### Request [#request-5] ##### Header parameters [#header-parameters-5] **`accountId`** `string` `required` The trading account identifier. ##### Body [#body-5] **`dateFrom`** `string · date-time` `required` The start of the inclusive date range, in ISO 8601 format. **`dateTo`** `string · date-time` `required` The end of the inclusive date range, in ISO 8601 format. It must be later than `dateFrom`. **`granularity`** `string` `required` The aggregation granularity. Possible values are `Days`, `Weeks`, and `Months`. ```http title="Request example" POST /api/history/v1/equity-curve HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "dateFrom": "2026-03-01T00:00:00Z", "dateTo": "2026-04-01T00:00:00Z", "granularity": "Days" } ``` #### Response [#response-5] In case of success (`200`), an object containing the equity curve data points is returned. **`dataPoints`** `array of object` The data points for the requested range and granularity. Each data point contains: * **`date`** `string · date-time` — the date represented by the data point, in ISO 8601 format. * **`marginBalance`** `decimal string` — the margin balance at the data point. * **`equity`** `decimal string` — the equity at the data point. * **`totalEquity`** `decimal string` — the total equity at the data point. * **`unrealizedPnl`** `decimal string` — the unrealized profit or loss at the data point. * **`deposits`** `decimal string` — the deposits recorded for the data point or aggregation period. * **`withdrawals`** `decimal string` — the withdrawals recorded for the data point or aggregation period. **`lastUpdated`** `string · date-time` The timestamp of the most recent data update, in ISO 8601 format. An invalid granularity or a date range where `dateFrom` is not before `dateTo` returns `400 Bad Request`. ```json title="Response example — 200: OK" { "dataPoints": [ { "date": "2026-04-01T00:00:00Z", "marginBalance": "10000.50", "equity": "10500.75", "totalEquity": "10500.75", "unrealizedPnl": "500.25", "deposits": "0", "withdrawals": "0" } ], "lastUpdated": "2026-04-01T12:00:00Z" } ``` ## Accounts [#accounts] ### Get accounts [#get-accounts] `GET` `/frontoffice/api/v3/accounts` #### Summary [#summary] Use this method to retrieve a list of all trading accounts with their basic information including account type and total balance. #### Request [#request] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/accounts HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response] In case of success, an array of objects will be returned. Each object contains the following information: **`accountId`** `string` The trading account identifier. **`publicAccountId`** `integer` The public account identifier for display purposes. **`accountName`** `string` The account name. **`accountType`** `string` The account type. Possible values: * `Hedging` * `Netting` **`accountStatus`** `string` The account status, which determines the permitted operations. For a description of each value, see [Account statuses](../get-started/account-statuses). Possible values: * `Active` * `Halted` * `Frozen` **`totalBalanceInRAT`** `decimal string` The total balance, in RAT. **`isCopyTradingAccount`** `boolean` Indicates if the account is `Copy`. ```json title="Response example — 200: OK" [ { "accountId": "685a7eaa360f9e7416221a61", "publicAccountId": 1234567, "accountName": "B2TRADER Hedging account", "accountType": "Hedging", "accountStatus": "Active", "totalBalanceInRAT": "6020.12", "isCopyTradingAccount": false }, { "accountId": "6891e70db552ff9c6fbbccf5", "publicAccountId": 1234568, "accountName": "B2TRADER Netting account", "accountType": "Netting", "accountStatus": "Halted", "totalBalanceInRAT": "10987.39", "isCopyTradingAccount": false } ] ``` ## Assets [#assets] ### Get assets [#get-assets] `GET` `/frontoffice/api/v3/assets` #### Summary [#summary-1] Use this method to retrieve a list of available assets on the platform. #### Request [#request-1] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/assets HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-1] In case of success, an array of objects will be returned. Each object contains the following information: **`assetId`** `string` The asset identifier. **`assetName`** `string` The asset display name. **`isRootAsset`** `boolean` Indicates whether this is a root asset. ```json title="Response example — 200: OK" [ { "assetId": "usdt", "assetName": "Tether", "isRootAsset": true }, { "assetId": "xrp", "assetName": "Ripple", "isRootAsset": false } ] ``` ## Markets [#markets] ### Get markets [#get-markets] `GET` `/frontoffice/api/v6/markets` #### Summary [#summary-2] Use this method to retrieve a list of available markets with their type, subtype, and favorite status. #### Request [#request-2] ##### Query parameters [#query-parameters] **`categoryId`** The market category identifier. **`dynamicCommissionGroupId`** The dynamic commission group identifier. **`isFavorite`** `boolean` Filter by favorite status. If set to `true`, only markets marked as favorites are returned. ```http title="Request example" GET /frontoffice/api/v6/markets?isFavorite=true HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} ``` #### Response [#response-2] In case of success, an array of market objects is returned. Each market object contains the following information: **`marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`displayName`** `string` The market ticker. **`fullName`** `string | nullable` The market full name or description. **`type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`subtype`** `string | nullable` *Applicable to CFD markets only.* The market subtype. Possible values: * `Crypto` * `Fx` * `Metals` * `Indices` * `Energies` * `Ndf` * `Shares` * `Etf` **`isFavorite`** `boolean` Indicates whether the market is marked as a favorite by the current user. ```json title="Response example — 200: OK" [ { "marketId": "spot.btc_usdt", "displayName": "BTC/USDT", "fullName": null, "type": "Spot", "subtype": null, "isFavorite": true }, { "marketId": "cfd.eth_btc", "displayName": "ETH/BTC", "fullName": "Ethereum to Bitcoin", "type": "Cfd", "subtype": "Crypto", "isFavorite": false }, { "marketId": "perp.trx_usdt", "displayName": "TRX/USDT", "fullName": "TRX to Tether Perpetual", "type": "Perpetual", "subtype": null, "isFavorite": false } ] ``` ### Get market [#get-market] `GET` `/frontoffice/api/v6/markets/``{marketId}` #### Summary [#summary-3] Use this method to retrieve detailed information about a specific market using its market identifier. #### Request [#request-3] ##### Path parameters [#path-parameters] **`marketId`** `required` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. ```http title="Request example" GET /frontoffice/api/v6/markets/{marketId} HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-3] In case of success, an object will be returned. Each object contains the following information: **`marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`displayName`** `string` The market ticker. **`fullName`** `string | nullable` The market full name or description (optional). **`baseAssetId`** `string` The base asset identifier. **`quoteAssetId`** `string` The quote asset identifier. **`minAmount`** `decimal string | nullable` *Applicable to Spot markets only.* The minimum tradable amount of the base asset. **`maxBaseAmount`** `decimal string | nullable` The maximum tradable amount of the base asset. **`priceDeviation`** `decimal string` The allowed price deviation for Limit orders placed on the market. Supports decimal values in the range `[0, 1]`, with up to 4 decimal places, for example: * `0.1` = 10% * `0.01` = 1% * `0.001` = 0.1% * `0.0001` = 0.01% If set to `0`, no restriction is applied, the price deviation is ignored. **`priceScale`** `integer` The price precision, which is the number of digits after a decimal separator. Also determines the minimum allowed trade price. Supports only integer values in the range `[2, 8]`. For example, `2` means the following price format: `0.01`, and `8`: `0.00000001`. **`amountScale`** `integer | nullable` *Applicable to Spot markets only.* The amount precision, which is the number of digits after a decimal separator. Also determines the minimum trade amount. Supports only integer values in the range `[0, 8]`. For example: * `0` means `1` (no digits after the decimal separator) * `5` means `0.00001` (five digits after the decimal separator) * `8` means `0.00000001` (eight digits after the decimal separator) **`type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`subtype`** `string | nullable` *Applicable to CFD markets only.* The market subtype. Possible values: * `Crypto` * `Fx` * `Metals` * `Indices` * `Energies` * `Ndf` * `Shares` * `Etf` **`swapSettings`** `object | nullable` *Applicable to CFD markets only.* The fee type charged for holding open positions overnight. The amount can be negative for rebates. Possible values: * `FixPerLot`: The fixed amount per lot. * `Percent`: The fixed amount in points which is applied to the position size, in the range `[-1, 1]`, with up to 5 decimal places. * `Points`: The fixed amount of percents which is applied to the position size, with up to 3 decimal places. Structure: * **`type`** `string` — Swap calculation type. Possible values: `FixPerLot`, `Percent`, `Points`. * **`shortPositionSettings`** `object` — Settings for Short positions: * **`size`** `decimal string` * **`assetId`** `string | nullable` * **`longPositionSettings`** `object` — Settings for Long positions: * **`size`** `decimal string` * **`assetId`** `string | nullable` **`lotSize`** `integer | nullable` *Not applicable to Spot markets.* The standardized quantity of the base asset per lot. Supports only integer values in the range `[1, 1000000]`. **`minLotAmount`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum order amount, in lots, that can be placed and executed. Supports values in the range `[0.00000001, 1]`. **`maxLotAmount`** `integer | nullable` *Not applicable to Spot markets.* The maximum order amount, in lots, that can be placed and executed. Supports only integer values in the range `[1, 10000]`. **`tickSize`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum price increment. **`lotStep`** `decimal string | nullable` *Not applicable to Spot markets.* The minimum lot amount increment. Supports values in the range `[0.00000001, 1]`. By default, equals to the `minLotAmount`. **`slippageRate`** `decimal string` The expected slippage, that is, the difference between the expected execution price and the actual one. This value is used as a multiplier to calculate the funds to be put on hold for a market order execution. Supports values in the range `[1, 10]`, including decimal values with up to 4 decimal places. The default value is `1` which means that only the current bid/ask price is put on hold. For example, `1.1` means that the current bid or ask price + 10% is put on hold for each order, to cover the 10% slippage. **Mind that** the total amount funds to be held depends on the order parameters and takes into account many conditions, the slippage rate is only one of them. **`calendar`** `object` The trading calendar defining market trading hours. Structure: * **`timeZoneId`** `string` — IANA time zone identifier. * **`tradingSessions`** `array` — Weekly trading sessions: * **`dayOfWeek`** `string` — One of: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. * **`timeIntervals`** `array` — List of intervals with: * **`start`** `string` (time) — Start time in `calendar.timeZoneId`. * **`end`** `string` (time) — End time in `calendar.timeZoneId`. * **`sessionOverrides`** `array` — Optional specific-date overrides: * **`date`** `string` (date) — In `YYYY-MM-DD` format. * **`timeIntervals`** `array | nullable` — Intervals for that date. **`fundingStartTime`** `string | nullable` *Applicable to Perpetual markets only.* The time of the first funding settlement, in the following format: `HH:MM:SS`. **`fundingIntervalInHours`** `integer | nullable` *Applicable to Perpetual markets only.* The funding settlement interval, in hours. Possible values: 1, 2, 3, 4, 6, 8, 12, 24. **`leverageProfile`** `object` *Not applicable to Spot markets.* The leverage profile. Structure: * **`leverageType`** `string` — Leverage type. Possible values: `Fixed`, `Dynamic`. * **`leverage`** `object` * **`useOnlyMaxLeverage`** `boolean` * **`maxLeverage`** `integer` — For `Fixed` leverage type only. * **`tiers`** `array` — For `Dynamic` leverage type only. * **`maxLeverage`** `integer` — The maximum allowed leverage for this tier. * **`maxNotionalValueInRAT`** `string | nullable` — The maximum position notional for this tier. **`commissionSettings`** `object` The commission settings. Structure: * **`type`** `string` — Leverage type. Possible values: `Fixed`, `Dynamic`. * **`charge`** `object` * **`type`** `string` — Possible values: `Percent`, `FixPerLot`. * **`assetId`** `string | nullable` — For `Fixed` commission type only. * **`size`** `decimal string` — For `Fixed` commission type only. * **`tiers`** `array` — For `Dynamic` commission type only. * **`size`** `string` — The commission amount for this tier. * **`minTradingVolumeInRAT`** `string` — The minimum required trading volume for this tier. * **`minCommissionInRAT`** `decimal string | nullable` * **`dynamicCommissionGroupId`** **`isFavorite`** `boolean` Indicates whether the market is marked as a favorite by the current user. ```json title="Response example — 200: OK" { "marketId": "string", "displayName": "string", "fullName": "string", "baseAssetId": "string", "quoteAssetId": "string", "minAmount": "string", "maxBaseAmount": "string", "minQuoteAmount": "string", "priceDeviation": "string", "priceScale": 0, "amountScale": 0, "type": "Spot", "subtype": "Cash", "swapSettings": { "type": "FixPerLot", "shortPositionSettings": { "size": "string", "assetId": "string" }, "longPositionSettings": { "size": "string", "assetId": "string" } }, "lotSize": 0, "minLotAmount": "string", "maxLotAmount": 0, "tickSize": "string", "lotStep": "string", "slippageRate": "string", "calendar": { "timeZoneId": "string", "tradingSessions": [ { "dayOfWeek": "Monday", "timeIntervals": [ { "start": "string", "end": "string" } ] } ], "sessionOverrides": [ { "date": "2025-12-18", "timeIntervals": [ { "start": "string", "end": "string" } ] } ] }, "fundingStartTime": "string", "fundingIntervalInHours": 0, "leverageProfile": { "leverageType": "Fixed", "leverage": { "useOnlyMaxLeverage": true, "maxLeverage": 0 } }, "commissionSettings": { "type": "Dynamic", "сharge": { "type": "Percent", "tiers": [ { "size": "string", "minTradingVolumeInRAT": "string" }, { "size": "string", "minTradingVolumeInRAT": "string" } ], "minCommissionInRAT": "string" }, "dynamicCommissionGroupId": "string" }, "isFavorite": true } ``` *** ### Add favorite market [#add-favorite-market] `POST` `/frontoffice/api/v6/markets/favorites/add` #### Summary [#summary-4] Add a market to the current user's favorites list. #### Request [#request-4] ##### Body [#body] **`marketId`** `string` `required` The market identifier to add to favorites. ```http title="Request example" POST /frontoffice/api/v6/markets/favorites/add HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "marketId": "spot.btc_usdt" } ``` #### Response [#response-4] In case of success (`200`), an empty object is returned. *** ### Remove favorite market [#remove-favorite-market] `POST` `/frontoffice/api/v6/markets/favorites/delete` #### Summary [#summary-5] Remove a market from the current user's favorites list. #### Request [#request-5] ##### Body [#body-1] **`marketId`** `string` `required` The market identifier to remove from favorites. ```http title="Request example" POST /frontoffice/api/v6/markets/favorites/delete HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "marketId": "spot.btc_usdt" } ``` #### Response [#response-5] In case of success (`200`), an empty object is returned. ## Account margin settings [#account-margin-settings] ### Get margin assets [#get-margin-assets] `GET` `/frontoffice/api/v4/account-margin-settings/assets` #### Summary [#summary-6] Use this method to retrieve a list of assets that can be used as collateral for margin trading. #### Request [#request-6] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v4/account-margin-settings/assets HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-6] In case of success, an object will be returned. Each object contains the following information: **`assets`** `array` A list of assets that can be used as a collateral for margin trading. Each array item contains: **`assetId`** `string` The asset identifier. **`assetName`** `string` The asset display name. **`available`** `decimal string` The available asset balance. This value is calculated as *Total balance* – *Locked balance*. **`total`** `decimal string` The overall amount of the asset, including locked funds. **`marginRatio`** `decimal string` The percentage of the asset value used as a collateral. Supports values in the range `[0, 1]`, where `1` represents 100.00%. **`isSelected`** `boolean` Indicates whether the asset is selected to be used as collateral. Can be `true` only for assets with the `marginRatio` more than `0`. ```json title="Response example — 200: OK" { "assets": [ { "assetId": "btc", "assetName": "btc", "available": "0.031", "total": "0.031", "marginRatio": "1", "isSelected": true }, { "assetId": "eth", "assetName": "eth", "available": "0", "total": "0", "marginRatio": "1", "isSelected": false } ] } ``` ### Select margin asset [#select-margin-asset] `POST` `/frontoffice/api/v4/account-margin-settings/assets/``{assetId}` #### Summary [#summary-7] Use this method to enable a particular asset to be used as collateral for margin trading. Only assets with the `marginRatio` more than `0` can be selected. #### Request [#request-7] ##### Path parameters [#path-parameters-1] **`assetId`** `required` The asset identifier. ```http title="Request example" POST /frontoffice/api/v4/account-margin-settings/assets/usdt HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json Accept: */* {} ``` #### Response [#response-7] In case of success, an empty object will be returned. ```json title="Response example — 200: OK" {} ``` ### Disable margin asset [#disable-margin-asset] `DELETE` `/frontoffice/api/v4/account-margin-settings/assets/``{assetId}` #### Summary [#summary-8] Use this method to prohibit a specific asset from being used as collateral for margin trading. #### Request [#request-8] ##### Path parameters [#path-parameters-2] **`assetId`** `required` The asset identifier. ```http title="Request example" DELETE /frontoffice/api/v4/account-margin-settings/assets/usdt HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-8] In case of success, an empty object will be returned. ```json title="Response example — 200: OK" {} ``` ## Info [#info] ### Get server info [#get-server-info] `GET` `/frontoffice/api/v3/info` #### Summary [#summary-9] Use this method to retrieve current server time and timezone information. #### Request [#request-9] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/info HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-9] In case of success, an object will be returned. Each object contains the following information: **`serverTime`** `string` The server time, in the Unix timestamp format. **`serverTimeZone`** `string` The server time zone. ```json title="Response example — 200: OK" { "serverTime": "1755190380", "serverTimeZone": "+00:00" } ``` ### Get server time zones [#get-server-time-zones] `GET` `/frontoffice/api/v3/info/time-zones` #### Summary [#summary-10] Use this method to retrieve available server time zones. #### Request [#request-10] *No request parameters.* ```http title="Request example" GET /frontoffice/api/v3/info/time-zones HTTP/1.1 Host: {host} Authorization: Bearer JWT Accept: */* ``` #### Response [#response-10] In case of success, an array of objects will be returned. Each object contains the following information: **`id`** `string` The time zone identifier. **`offset`** `string` The UTC offset, in the following format: `HH:MM:SS`. **`offsetInMinutes`** `integer · int32` The UTC offset in minutes. **`shortLabel`** `string` The short label for the time zone. **`label`** `string` The display label for the time zone. ```json title="Response example — 200: OK" [ { "id": "Africa/Abidjan", "offset": "00:00:00", "offsetInMinutes": 0, "shortLabel": "Africa/Abidjan", "label": "(UTC+00:00) Côte d’Ivoire Time" }, { "id": "Africa/Algiers", "offset": "01:00:00", "offsetInMinutes": 60, "shortLabel": "Africa/Algiers", "label": "(UTC+01:00) Central European Time (Algiers)" }, { "id": "Africa/Bissau", "offset": "00:00:00", "offsetInMinutes": 0, "shortLabel": "Africa/Bissau", "label": "(UTC+00:00) Guinea-Bissau Time" }, ... ] ``` ## Webhooks [#webhooks] ### Create webhook API key [#create-webhook-api-key] `POST` `/frontoffice/api/v3/webhook/api-keys` #### Summary [#summary-11] Create a new webhook API key for receiving TradingView alerts. #### Request [#request-11] ##### Header parameters [#header-parameters] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ##### Body [#body-2] **`name`** `string` `required` A descriptive name for the API key, up to 100 characters. ```http title="Request example" POST /frontoffice/api/v3/webhook/api-keys HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json { "name": "My TradingView Key" } ``` #### Response [#response-11] In case of success (`201`), the created API key object is returned. **`id`** `string` The unique identifier of the API key. **`apiKey`** `string` The full API key value. The key is shown only once at creation. **`name`** `string` The name assigned to the key. **`userId`** `string` The user identifier the key is bound to. **`status`** `string` The key status: `Active`. **`createdAt`** `string` The timestamp when the key was created. **`expiresAt`** `string` The timestamp when the key expires (one year from creation). ```json title="Response example" { "id": "01JZ3CVZKN20410JPYYH1YZJSK", "apiKey": "wh_key_abc123def456...", "name": "My TradingView Key", "userId": "01JZ3CVZKN20410JPYYH1YZJSK", "status": "Active", "createdAt": "2026-02-02T12:00:00Z", "expiresAt": "2027-02-02T00:00:00Z" } ``` The API key is shown only once in the creation response. It can't be retrieved again after this call. *** ### List webhook API keys [#list-webhook-api-keys] `GET` `/frontoffice/api/v3/webhook/api-keys` #### Summary [#summary-12] Retrieve all webhook API keys for the authenticated user along with the webhook URL. #### Request [#request-12] ##### Header parameters [#header-parameters-1] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ```http title="Request example" GET /frontoffice/api/v3/webhook/api-keys HTTP/1.1 Host: {host} Authorization: Bearer JWT ``` #### Response [#response-12] In case of success (`200`), the webhook URL and a list of API keys are returned. **`webhookUrl`** `string` The webhook URL to configure in TradingView alerts. **`apiKeys`** `array of objects` The list of API keys. **`apiKeys[].id`** `string` The unique identifier of the API key. **`apiKeys[].name`** `string` The name assigned to the key. **`apiKeys[].status`** `string` The key status. Possible values: * `Active` * `Revoked` * `Expired` **`apiKeys[].createdAt`** `string` The timestamp when the key was created. **`apiKeys[].expiresAt`** `string` The timestamp when the key expires. ```json title="Response example" { "webhookUrl": "https://trading.example.com/frontoffice/api/v3/webhook/alerts/01JZ3...", "apiKeys": [ { "id": "01JZ3CVZKN20410JPYYH1YZJSK", "name": "My TradingView Key", "status": "Active", "createdAt": "2026-02-02T12:00:00Z", "expiresAt": "2027-02-02T00:00:00Z" } ] } ``` *** ### Revoke webhook API key [#revoke-webhook-api-key] `DELETE` `/frontoffice/api/v3/webhook/api-keys/{id}` #### Summary [#summary-13] Revoke an active webhook API key. After revocation, the key can no longer be used to authenticate webhook requests. #### Request [#request-13] ##### Header parameters [#header-parameters-2] **`Authorization`** `required` Bearer JWT token with `trading-ui` permission. ##### Path parameters [#path-parameters-3] **`id`** `string` `required` The unique identifier of the API key to revoke. ```http title="Request example" DELETE /frontoffice/api/v3/webhook/api-keys/01JZ3CVZKN20410JPYYH1YZJSK HTTP/1.1 Host: {host} Authorization: Bearer JWT ``` #### Response [#response-13] In case of success (`200`), a confirmation object is returned. **`success`** `boolean` Indicates whether the key was revoked successfully. **`message`** `string` A description of the result. ```json title="Response example" { "success": true, "message": "API key revoked successfully" } ``` *** ### Receive TradingView alert [#receive-tradingview-alert] `POST` `/frontoffice/api/v3/webhook/alerts/{userId}` #### Summary [#summary-14] Accept a webhook alert from TradingView and place an order on the specified trading account. TradingView calls this endpoint when an alert triggers. #### Request [#request-14] ##### Path parameters [#path-parameters-4] **`userId`** `string` `required` The B2TRADER user identifier (ULID format). ##### Body [#body-3] **`apiKey`** `string` `required` The webhook API key for authentication. **`accountId`** `string` `required` The trading account identifier. **`symbol`** `string` `required` The market symbol with a type prefix (`spot.`, `cfd.`, or `perp.`) followed by the pair name. For example: `spot.btc_usdt`, `cfd.eur_usd`, `perp.btc_usdt`. **`side`** `string` `required` The order side. Possible values: * `buy` * `sell` **`quantity`** `decimal string` `required` The order quantity in the base asset. **`orderType`** `string` The order type. Default: `market`. Possible values: * `market` * `limit` * `stop` * `stop_limit` **`price`** `decimal string` The limit price. Required for `limit` and `stop_limit` orders. **`stopPrice`** `decimal string` The stop price. Required for `stop` and `stop_limit` orders. **`leverage`** `decimal string` The leverage ratio. Applicable to CFD and Perpetual Futures markets only. **`takeProfit`** `decimal string` The take profit trigger price. **`stopLoss`** `decimal string` The stop loss trigger price. **`timeInForce`** `string` The time-in-force policy. Default: `gtc`. Possible values: * `gtc` * `ioc` * `fok` * `day` **`comment`** `string` A custom comment, up to 256 characters. **`deduplicationId`** `string` A UUID for idempotency. Duplicate requests with the same ID within five minutes return a cached response. ```http title="Request example" POST /frontoffice/api/v3/webhook/alerts/01JZ3CVZKN... HTTP/1.1 Host: {host} Content-Type: application/json { "apiKey": "wh_key_abc123def456...", "accountId": "01JZ3CVZKN20410JPYYH1YZJSK", "symbol": "spot.btc_usdt", "side": "buy", "quantity": "0.01", "comment": "TV Strategy Signal" } ``` #### Response [#response-14] In case of success (`200`), an order confirmation is returned. **`success`** `boolean` Indicates whether the order was placed successfully. **`orderId`** `string` The unique identifier of the created order. **`orderStatus`** `string` The initial status of the order. **`message`** `string` A description of the result. **`timestamp`** `string` The timestamp of the response. ```json title="Response example" { "success": true, "orderId": "01JZ3CVZKN20410JPYYH1YZJSK", "orderStatus": "Working", "message": "Order placed successfully", "timestamp": "2026-02-02T12:34:56.789Z" } ``` #### Rate limits [#rate-limits] Webhook requests are limited to five requests per second per user. If the limit is exceeded, the response returns a `429` status code with the following headers: * `X-RateLimit-Limit`: Maximum requests per window * `X-RateLimit-Remaining`: Remaining requests in the current window * `X-RateLimit-Reset`: Unix timestamp when the window resets ## Orders [#orders] ### Place SPOT order [#place-spot-order] `POST` `/frontoffice/api/v3/orders` #### Summary [#summary] Use this method to create and submit a new order for SPOT markets. #### Request [#request] ##### Header parameters [#header-parameters] **`accountId`** `required` The trading account identifier. ##### Body [#body] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For Market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/v3/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "spot.btc_usdt", "side": "Buy", "orderType": "Limit", "timeInForce": "Gtc", "requestedAmount": 0.02, "requestedPrice": 115193.35, "comment": "Strategy A" } } ``` #### Response [#response] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` — the order was created manually via UI or API. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. Right after the order is created commission is `0`. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the originally requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.btc_usdt", "marketDisplayName": "SPOT BTC/USDT", "orderId": "01K1ZTB4DB0S6Y2NH81S781BQX", "orderType": "Limit", "side": "Buy", "status": "Pending", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.02", "remainingAmount": "0.02", "requestedPrice": "115193.35", "executionPrice": "0", "createdAt": "2025-08-06T13:50:13.931Z", "updatedAt": "2025-08-06T13:50:13.9325008Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Place CFD order [#place-cfd-order] `POST` `/frontoffice/api/cfd/v4/orders` #### Summary [#summary-1] Use this method to create and submit a new order for CFD markets. #### Request [#request-1] ##### Header parameters [#header-parameters-1] **`accountId`** `required` The trading account identifier. ##### Body [#body-1] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/cfd/v4/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Limit", "timeInForce": "Gtd", "requestedLotAmount": 1, "requestedPrice": 3280, "leverage": 75, "cancellationDate": "2025-08-10T00:00:00Z", "stopLoss": { "price": 3320, "isTrailing": false }, "takeProfit": { "price": 3200 }, "comment": "Strategy A" } } ``` #### Response [#response-1] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2253Q9X3VTJ68PNWY40JC6Q", "status": "Pending" } } ``` ### Place PF order [#place-pf-order] `POST` `/frontoffice/api/perpetual/v4/orders` #### Summary [#summary-2] Use this method to create and submit a new order for Perpetual markets. #### Request [#request-2] ##### Header parameters [#header-parameters-2] **`accountId`** `required` The trading account identifier. ##### Body [#body-2] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `perp.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` * `Retry` — Market orders only **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/perpetual/v4/orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json { "order": { "marketId": "perp.eth_usdt", "side": "Buy", "orderType": "Market", "timeInForce": "Ioc", "requestedLotAmount": 10, "leverage": 159, "comment": "Strategy A" } } ``` #### Response [#response-2] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K228VN55N7WFZRG70M24T9J1", "status": "Working" } } ``` ### Cancel order [#cancel-order] `DELETE` `/frontoffice/api/v3/orders/``{orderId}` #### Summary [#summary-3] Use this method to cancel an active order placed on SPOT, CFD, or Perpetual markets. #### Request [#request-3] ##### Header parameters [#header-parameters-3] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters] **`orderId`** `required` The order identifier to cancel. ```http title="Request example" DELETE /frontoffice/api/v3/orders/01K2PF9XS29WN4JZRHMCTTQYJB HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Accept: */* ``` #### Response [#response-3] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The canceled order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` * `StopOrder` * `FixApi` * `System` **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the originally requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.eth_usdt", "marketDisplayName": "SPOT ETH/USDT", "orderId": "01K2PF9XS29WN4JZRHMCTTQYJB", "orderType": "Limit", "side": "Buy", "status": "Cancelled", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.1", "remainingAmount": "0.1", "requestedPrice": "4450", "executionPrice": "0", "createdAt": "2025-08-15T08:59:51.97Z", "updatedAt": "2025-08-15T09:00:06.2791048Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Modify order [#modify-order] `PATCH` `/frontoffice/api/v3/orders/``{orderId}` #### Summary [#summary-4] Use this method to modify a resting (not yet fully executed) order placed on SPOT, CFD, or Perpetual markets. The order keeps its `orderId`, its creation timestamp, and its place in your order history — nothing is cancelled and no new order is created. The market, side, and order type cannot be changed. To change them, cancel the order and place a new one. If the order is already fully filled, cancelled, expired, or currently executing, the modification is rejected and the order is left exactly as it was. #### Request [#request-4] ##### Header parameters [#header-parameters-4] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-1] **`orderId`** `required` The order identifier to modify. ##### Body [#body-3] **`order`** `object` `required` The new values to apply to the order. **`order.requestedPrice`** `decimal string` `required` The new limit price. **`order.requestedAmount`** `decimal string` `required` The new quantity of the base asset to buy or sell. If the order is already partially filled, this is the order's total requested amount, not the remaining amount — it must not be lower than what has already executed. **`order.timeInForce`** `string` `required` The new time-in-force policy. Possible values: `Gtc`, `Gtd`, `Day`. **`order.cancellationDate`** `string | nullable` The new expiration date, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required when `timeInForce` is `Gtd`; ignored otherwise. **`order.leverage`** `integer | nullable` The new leverage. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.takeProfit`** `object | nullable` The new Take Profit trigger. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.takeProfit.price`** `decimal string` `required` **`order.stopLoss`** `object | nullable` The new Stop Loss trigger. CFD and Perpetual markets only, and only while the order has zero executed volume. Omit to leave the current value unchanged. **`order.stopLoss.price`** `decimal string` `required` **`order.stopLoss.isTrailing`** `boolean` `required` **`order.comment`** `string | nullable` The new comment. ```http title="Request example" PATCH /frontoffice/api/v3/orders/01K2PF9XS29WN4JZRHMCTTQYJB HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json ``` ```json title="Request body example" { "order": { "requestedPrice": "4400", "requestedAmount": "0.15", "timeInForce": "Gtc" } } ``` #### Response [#response-4] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The modified order, under its unchanged `orderId`. **`order.marketId`** `string` The market identifier, same as before the modification. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The order identifier — unchanged by the modification. **`order.orderType`** `string` The order type — unchanged by the modification. **`order.side`** `string` The order side — unchanged by the modification. **`order.status`** `string` The current [order status](../get-started/order-statuses#market-and-limit-orders). Possible values: * `Started` * `Pending` * `Working` * `Completed` * `Cancelled` * `Expired` * `Rejected` **`order.source`** `string` The source of the order. Possible values: * `Manual` * `StopOrder` * `FixApi` * `System` **`order.timeInForce`** `string` The order's time-in-force policy, reflecting the new value. **`order.commission`** `decimal string` The fee charged for the execution of the order, expressed in the quote asset. **`order.requestedAmount`** `decimal string` The order's total requested amount, reflecting the new value. **`order.remainingAmount`** `decimal string` The amount of the base asset that remains unfilled. **`order.requestedPrice`** `decimal string | nullable` The limit price, reflecting the new value; `null` for market orders. **`order.executionPrice`** `decimal string` The volume-weighted average price at which the order was executed. **`order.createdAt`** `string` The original timestamp when the order was created — unchanged by the modification. **`order.updatedAt`** `string` The timestamp of this modification, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.rejectDetails`** `string` The reason and details for order rejection when `status` is `Rejected`. Currently unused and not populated. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired; `null` if not cancelled. **`order.fillFactor`** `decimal string` The ratio of the filled quantity to the currently requested quantity (`filledAmount / requestedAmount`). ```json title="Response example — 200: OK" { "order": { "marketId": "spot.eth_usdt", "marketDisplayName": "SPOT ETH/USDT", "orderId": "01K2PF9XS29WN4JZRHMCTTQYJB", "orderType": "Limit", "side": "Buy", "status": "Pending", "source": "Manual", "timeInForce": "Gtc", "commission": "0", "requestedAmount": "0.15", "remainingAmount": "0.15", "requestedPrice": "4400", "executionPrice": "0", "createdAt": "2025-08-15T08:59:51.97Z", "updatedAt": "2025-08-15T09:14:22.4471048Z", "rejectDetails": "", "cancellationDate": null, "fillFactor": "0" } } ``` ### Get SPOT order data [#get-spot-order-data] `POST` `/frontoffice/api/v3/order-data` #### Summary [#summary-5] Use this method to retrieve and validate order data for SPOT market orders before placing. #### Request [#request-5] ##### Header parameters [#header-parameters-5] **`accountId`** `required` The trading account identifier. ##### Body [#body-4] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.requestedBaseAmount`** `decimal string | nullable` The requested amount in base asset units. **`order.requestedQuoteAmount`** `decimal string | nullable` The requested amount in quote asset units. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. ```http title="Request example" POST /frontoffice/api/v3/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=3.0 Accept: */* { "order": { "marketId": "spot.eth_usdt", "side": "Buy", "orderType": "Limit", "requestedBaseAmount": 0.2, "requestedPrice": 4600 } } ``` #### Response [#response-5] In case of success, an object will be returned. Each object contains the following information: **`baseAmount`** `decimal string` The calculated base asset amount for the order. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmount`** `decimal string` The estimated commission amount to be charged. **`total`** `decimal string` The total quote asset amount, including the estimated commission. ```json title="Response example — 200: OK" { "order": { "baseAmount": "0.2", "quoteAmount": "920", "commissionAmount": "9.2", "total": "929.2" } } ``` ### Get CFD order data [#get-cfd-order-data] `POST` `/frontoffice/api/cfd/v4/order-data` #### Summary [#summary-6] Use this method to retrieve and validate order data for CFD market orders before placing. #### Request [#request-6] ##### Header parameters [#header-parameters-6] **`accountId`** `required` The trading account identifier. ##### Body [#body-5] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.isTrailing`** `boolean | nullable` If `true`, enables the Trailing behavior for Stop loss. ```http title="Request example" POST /frontoffice/api/cfd/v4/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "takeProfit": { "triggerSize": 15000, "triggerType": "points" }, "stopLoss": { "triggerSize": "4020", "triggerType": "price", "isTrailing": false }, "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Market", "leverage": 135, "requestedLotAmount": 1 } } ``` #### Response [#response-6] In case of success, an object will be returned. Each object contains the following information: **`requiredMarginInRAT`** `decimal string` The required margin amount, in conversion to RAT. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmountInRAT`** `decimal string` The estimated commission amount to be charged, in conversion to RAT. **`marginLevel`** `decimal string | nullable` The resulting margin level. **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "order": { "requiredMarginInRAT": "34.4613643", "quoteAmount": "4004.345", "commissionAmountInRAT": "0", "marginLevel": "5.3015", "takeProfit": { "price": "3989.345", "rate": "0.0037", "points": 15000, "pnl": "17.42713545" }, "stopLoss": { "price": "4020", "rate": "-0.0039", "points": -15655, "pnl": "-18.18812036" } } } ``` ### Get PF order data [#get-pf-order-data] `POST` `/frontoffice/api/perpetual/v4/order-data` #### Summary [#summary-7] Use this method to retrieve and validate order data for Perpetual market orders before placing. #### Request [#request-7] ##### Header parameters [#header-parameters-7] **`accountId`** `required` The trading account identifier. ##### Body [#body-6] **`order`** `object` The order data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`order.stopLoss.isTrailing`** `boolean | nullable` If `true`, enables Trailing behavior for Stop loss. ```http title="Request example" POST /frontoffice/api/perpetual/v4/order-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "takeProfit": { "triggerSize": "0.01", "triggerType": "rate" }, "stopLoss": { "triggerSize": "-100", "triggerType": "pnl", "isTrailing": false }, "marketId": "perp.btc_usdt", "side": "Buy", "orderType": "Limit", "leverage": 100, "requestedLotAmount": 0.5, "requestedPrice": 118450 } } ``` #### Response [#response-7] In case of success, an object will be returned. Each object contains the following information: **`requiredMarginInRAT`** `decimal string` The required margin amount, in conversion to RAT. **`quoteAmount`** `decimal string` The calculated quote asset amount for the order. **`commissionAmountInRAT`** `decimal string` The estimated commission amount to be charged, in conversion to RAT. **`marginLevel`** `decimal string | nullable` The resulting margin level. **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "order": { "requiredMarginInRAT": "592.25", "quoteAmount": "59225", "commissionAmountInRAT": "0", "marginLevel": "0.3582", "takeProfit": { "price": "119634.5", "rate": "0.01", "points": 11845, "pnl": "592.25" }, "stopLoss": { "price": "118250", "rate": "-0.0016", "points": -2000, "pnl": "-100" } } } ``` ## Stop orders [#stop-orders] Stop orders are accepted while the market is closed according to its trading calendar. The market's own status must still be `Open` — a `Paused` or `Halted` market rejects Stop orders too. At submission the platform validates the requested and activation price scales, the amount scale, the market minimum amount, and the time in force: a Stop Market order requires `Ioc` or `Fok`, a Stop Limit order requires an explicit value. The stop price is additionally checked against the best bid and ask **only when a price is available** — while the market is closed there may be no top of the book to compare against, in which case the check is skipped. The accepted order is stored with the standard `WaitingForActivation` status — no new status value was introduced — and is evaluated against the first available price when the session opens; if the market gapped past the stop price, it triggers at the open. An order accepted while no price was available first has its internal pricing finalised from the next incoming price, so its activation can take one extra price update. No balance or margin is reserved at submission. The margin check runs at trigger time, and an order that fails it is cancelled with a failure reason rather than dropped. `Cancel Stop order` also works while the market is closed. Market and Limit orders are still rejected during non-trading hours. ### Place SPOT Stop order [#place-spot-stop-order] `POST` `/frontoffice/api/v3/stop-orders` #### Summary [#summary-8] Use this method to create and submit a new Stop order for SPOT markets. #### Request [#request-8] ##### Header parameters [#header-parameters-8] **`accountId`** `required` The trading account identifier. ##### Body [#body-7] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `spot.btc_usdt`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For Market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/v3/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "spot.btc_usdt", "side": "Buy", "orderType": "Market", "activationPrice": 128000, "requestedAmount": 0.01, "timeInForce": "Ioc", "comment": "Strategy A" } } ``` #### Response [#response-8] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders, same as in the request; `null` for market orders. **`activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order, same as in the request. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. **`order.comment`** `string | nullable` The text note attached to the order, up to 100 characters. ```json title="Response example — 200: OK" { "order": { "marketId": "spot.btc_usdt", "marketDisplayName": "SPOT BTC/USDT", "orderId": "01K2MNC3BVR5WRTBEE9YWAS91K", "orderType": "Market", "side": "Buy", "requestedPrice": "0", "activationPrice": "128000", "requestedAmount": "0.01", "timeInForce": "Ioc", "status": "WaitingForActivation", "createdAt": "2025-08-14T16:07:25.8193038Z", "updatedAt": "2025-08-14T16:07:25.8193044Z", "cancellationDate": null, "comment": null } } ``` ### Place CFD Stop order [#place-cfd-stop-order] `POST` `/frontoffice/api/cfd/v4/stop-orders` #### Summary [#summary-9] Use this method to create and submit a new Stop order for CFD markets. #### Request [#request-9] ##### Header parameters [#header-parameters-9] **`accountId`** `required` The trading account identifier. ##### Body [#body-8] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/cfd/v4/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "cfd.eth_eur", "side": "Sell", "orderType": "Limit", "activationPrice": 3200, "requestedLotAmount": 0.5, "timeInForce": "Gtd", "leverage": 76, "requestedPrice": 3500, "cancellationDate": "2025-08-18T00:00:00Z", "stopLoss": { "price": "3900", "isTrailing": false }, "takeProfit": { "price": "3100" }, "comment": "Strategy A" } } ``` #### Response [#response-9] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2MNRWP2J1S8T9TKTCXWYY87", "status": "WaitingForActivation" } } ``` ### Place PF Stop order [#place-pf-stop-order] `POST` `/frontoffice/api/perpetual/v4/stop-orders` #### Summary [#summary-10] Use this method to create and submit a new Stop order for Perpetual markets. #### Request [#request-10] ##### Header parameters [#header-parameters-10] **`accountId`** `required` The trading account identifier. ##### Body [#body-9] **`order`** `object` Order creation data. **`order.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. Must match one of the available markets returned by the [Get markets](settings#get-markets) endpoint. **`order.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`order.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`order.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`order.requestedLotAmount`** `decimal string` The quantity of the base asset to buy or sell, in lots. Lot size is defined per market and determines the base asset quantity represented by one lot. Upon execution, this defines the opened position size in lots. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.cancellationDate`** `string | nullable` For GTD orders: The date and time when the order will be automatically canceled if not executed, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required if `timeInForce` is set to `Gtd`; ignored for other time-in-force values. **`order.leverage`** `integer` The leverage factor applied to the position. Leverage determines margin required to open and maintain the position (for example, with leverage 10, only 10% of the position's notional value is required as margin). **`order.stopLoss`** `object` The Stop loss settings. **`order.stopLoss.price`** `decimal string` The Stop loss price. **`order.stopLoss.isTrailing`** `boolean` Indicates if the Stop loss is Trailing. **`order.takeProfit`** `object` The Take profit settings. **`order.takeProfit.price`** `decimal string` The take profit price. **`order.comment`** `string | nullable` A text note to attach to the order, up to 100 characters. The comment is inherited by the resulting position and can't be edited after the order is placed. ```http title="Request example" POST /frontoffice/api/perpetual/v4/stop-orders HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "order": { "marketId": "perp.btc_usdt", "side": "Sell", "orderType": "Market", "activationPrice": 115000, "requestedLotAmount": 1, "timeInForce": "Fok", "leverage": 22, "stopLoss": { "price": "118020", "isTrailing": true }, "takeProfit": { "price": "113873" }, "comment": "Strategy A" } } ``` #### Response [#response-10] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The created order. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` ```json title="Response example — 200: OK" { "order": { "orderId": "01K2MNM0S8B2R9DS7BWJ8PGYPR", "status": "WaitingForActivation" } } ``` ### Cancel Stop order [#cancel-stop-order] `DELETE` `/frontoffice/api/v3/stop-orders/``{orderId}` #### Summary [#summary-11] Use this method to cancel an active Stop order placed on SPOT, CFD, or Perpetual markets. #### Request [#request-11] ##### Header parameters [#header-parameters-11] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-2] **`orderId`** `required` The Stop order identifier to cancel. ```http title="Request example" DELETE /frontoffice/api/v3/stop-orders/01K2MNGAWPMQJ7WGATFSCAS1G4 HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-11] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The canceled order. **`order.marketId`** `string` The market identifier, same as in the request. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The unique identifier of the order assigned by the system. **`order.orderType`** `string` The order type, same as in the request. **`order.side`** `string` The order side, same as in the request. **`order.requestedPrice`** `decimal string | nullable` The limit price for Limit orders (the maximum price for a buy or minimum price for a sell). Must be `null` or omitted for Market orders. **`order.activationPrice`** `decimal string | nullable` The trigger price that activates the Stop order. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, same as in the request. **`order.timeInForce`** `string` The time-in-force policy, same as in the request. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The timestamp when the order was created, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.updatedAt`** `string` The timestamp of the most recent update to the order, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`; `null` if not cancelled. ```json title="Response example — 200: OK" { "order": { "marketId": "perp.btc_usdt", "marketDisplayName": "Perpetual BTC/USDT", "orderId": "01K2MNGAWPMQJ7WGATFSCAS1G4", "orderType": "Limit", "side": "Sell", "requestedPrice": "115100", "activationPrice": "115000", "requestedAmount": "1", "timeInForce": "Gtc", "status": "Rejected", "createdAt": "2025-08-14T16:09:44.5986099Z", "updatedAt": "2025-08-14T16:09:44.5986103Z", "cancellationDate": null } } ``` ### Modify Stop order [#modify-stop-order] `PATCH` `/frontoffice/api/v3/stop-orders/``{orderId}` #### Summary [#summary-12] Use this method to modify a Stop order placed on SPOT, CFD, or Perpetual markets, while it is still waiting to be triggered. The order keeps its `orderId` — nothing is cancelled and no new order is created. The market, side, and order type cannot be changed. To change them, cancel the order and place a new one. If the order has already triggered, been cancelled, or expired, the modification is rejected and the order is left exactly as it was. #### Request [#request-12] ##### Header parameters [#header-parameters-12] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-3] **`orderId`** `required` The Stop order identifier to modify. ##### Body [#body-10] **`order`** `object` `required` The new values to apply to the order. **`order.activationPrice`** `decimal string` `required` The new trigger price that activates the Stop order. **`order.requestedPrice`** `decimal string` `required` The new limit price for a Stop-Limit order. Must be `0` for a Market order. **`order.requestedAmount`** `decimal string` `required` The new quantity of the base asset to buy or sell. **`order.timeInForce`** `string` `required` The new time-in-force policy. **`order.cancellationDate`** `string | nullable` The new expiration date, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. Required when `timeInForce` is `Gtd`; ignored otherwise. **`order.leverage`** `integer | nullable` The new leverage. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.takeProfit`** `object | nullable` The new Take Profit trigger. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.takeProfit.price`** `decimal string` `required` **`order.stopLoss`** `object | nullable` The new Stop Loss trigger. CFD and Perpetual markets only. Omit to leave the current value unchanged. **`order.stopLoss.price`** `decimal string` `required` **`order.stopLoss.isTrailing`** `boolean` `required` **`order.comment`** `string | nullable` The new comment. ```http title="Request example" PATCH /frontoffice/api/v3/stop-orders/01K2MNGAWPMQJ7WGATFSCAS1G4 HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json ``` ```json title="Request body example" { "order": { "activationPrice": "115200", "requestedPrice": "0", "requestedAmount": "1", "timeInForce": "Gtc" } } ``` #### Response [#response-12] In case of success, an object will be returned. Each object contains the following information: **`order`** `object` The modified order, under its unchanged `orderId`. **`order.marketId`** `string` The market identifier, same as before the modification. **`order.marketDisplayName`** `string` The market ticker. **`order.orderId`** `string` The order identifier — unchanged by the modification. **`order.orderType`** `string` The order type — unchanged by the modification. **`order.side`** `string` The order side — unchanged by the modification. **`order.requestedPrice`** `decimal string | nullable` The limit price, reflecting the new value. **`order.activationPrice`** `decimal string | nullable` The trigger price, reflecting the new value. **`order.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell, reflecting the new value. **`order.timeInForce`** `string` The time-in-force policy, reflecting the new value. **`order.status`** `string` The current [order status](../get-started/order-statuses#stop-orders). Possible values: * `WaitingForActivation` * `Activated` * `Rejected` **`order.createdAt`** `string` The original timestamp when the order was created — unchanged by the modification. **`order.updatedAt`** `string` The timestamp of this modification, in the following format: `YYYY-MM-DDTHH:MM:SS.sssZ`. **`order.cancellationDate`** `string | nullable` The timestamp when the order was cancelled or expired; `null` if not cancelled. ```json title="Response example — 200: OK" { "order": { "marketId": "perp.btc_usdt", "marketDisplayName": "Perpetual BTC/USDT", "orderId": "01K2MNGAWPMQJ7WGATFSCAS1G4", "orderType": "Limit", "side": "Sell", "requestedPrice": "115300", "activationPrice": "115200", "requestedAmount": "1", "timeInForce": "Gtc", "status": "WaitingForActivation", "createdAt": "2025-08-14T16:09:44.5986099Z", "updatedAt": "2025-08-14T16:22:10.1123456Z", "cancellationDate": null } } ``` ## Positions [#positions] ### Close position [#close-position] `POST` `/frontoffice/api/v4/positions/``{positionId}``/close` #### Summary [#summary-13] Use this method to close a specific position entirely or partially. #### Request [#request-13] ##### Header parameters [#header-parameters-13] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-4] **`positionId`** `required` The position identifier to close. ##### Body [#body-11] **`closePositionLotAmount`** `decimal string | nullable` The portion of the position to close, in lots. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2PFXDP1FWCJSGTX4GJ6JHM0/close HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-13] In case of success, an object will be returned. Each object contains the following information: **`positionId`** `string` The position identifier. ```json title="Response example — 200: OK" { "positionId": "01K2PFXDP1FWCJSGTX4GJ6JHM0" } ``` ### Bulk close positions [#bulk-close-positions] `POST` `/frontoffice/api/v4/positions/bulk-close` #### Summary [#summary-14] Use this method to close multiple positions simultaneously based on different criteria such as all positions, positive PnL only, or negative PnL only. #### Request [#request-14] ##### Header parameters [#header-parameters-14] **`accountId`** `required` The trading account identifier. ##### Body [#body-12] **`mode`** `string` `required` The bulk close mode. Possible values: * `AllPositions` — close all positions. * `PositivePnl` — close only positions with positive PnL. * `NegativePnl` — close only positions with negative PnL. ```http title="Request example" POST /frontoffice/api/v4/positions/bulk-close HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "mode": "AllPositions" } ``` #### Response [#response-14] In case of success, an object will be returned containing identifiers of closed positions. ```json title="Response example — 200: OK" { "status": "accepted", "positionIds": [ "01K228VNC2Q7E7K9W8GABWBZ5Z", "01K22BZ2DCETJZKW6MK81N1T8Y", "01K2CXF06A3A5SK2YFJT67CMZ5", "01K2CXF2ZJ6MJYMEK663TBBY8K", "01K2PFXDP1FWCJSGTX4GJ6JHM0" ] } ``` ### Get trigger data [#get-trigger-data] `POST` `/frontoffice/api/v4/positions/``{positionId}``/trigger-data` #### Summary [#summary-15] Use this method to retrieve Stop loss and Take profit settings for an open position. #### Request [#request-15] ##### Header parameters [#header-parameters-15] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-5] **`positionId`** `required` The position identifier. ##### Body [#body-13] **`stopLoss.triggerType`** `string · enum | nullable` The trigger calculation type for Stop loss. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`stopLoss.triggerSize`** `decimal string | nullable` The trigger value in selected units. **`stopLoss.isTrailing`** `boolean | nullable` Indicates if Stop loss is Trailing. **`takeProfit.triggerType`** `string · enum | nullable` The trigger calculation type for Take profit. Possible values: * `Price` * `Rate` * `Points` * `Pnl` **`order.takeProfit.triggerSize`** `decimal string | nullable` The trigger value in selected units. ```http title="Request example" POST /frontoffice/api/v4/positions/01K2HYXA7N2G9NHTFEWYVM9SEQ/trigger-data HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "stopLoss": { "triggerSize": "-0.01", "triggerType": "rate", "isTrailing": true }, "takeProfit": { "triggerSize": 2500, "triggerType": "points" } } ``` #### Response [#response-15] In case of success, an object will be returned. Each object contains the following information: **`takeProfit.price`** `decimal string` The calculated Take profit price, based on trigger settings. **`takeProfit.rate`** `decimal string` The calculated Take profit rate. **`takeProfit.points`** `integer · int64` The calculated take profit offset, in points. **`takeProfit.pnl`** `decimal string` The projected PnL at Take profit. **`stopLoss.price`** `decimal string` The calculated Stop loss price, based on trigger settings. **`stopLoss.rate`** `decimal string` The calculated Stop loss rate. **`stopLoss.points`** `integer · int64` The calculated Stop loss offset, in points. **`stopLoss.pnl`** `decimal string` The projected PnL at Stop loss. ```json title="Response example — 200: OK" { "takeProfit": { "price": "248.27", "rate": "0.1119", "points": 2500, "pnl": "21.5" }, "stopLoss": { "price": "221.04", "rate": "-0.01", "points": -223, "pnl": "-1.91" } } ``` ### Submit triggers [#submit-triggers] `PUT` `/frontoffice/api/v4/positions/``{positionId}``/triggers` #### Summary [#summary-16] Use this method to modify Stop loss and Take profit settings for an open position. #### Request [#request-16] ##### Header parameters [#header-parameters-16] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-6] **`positionId`** `required` The position identifier. ##### Body [#body-14] **`stopLoss.price`** `decimal string` The Stop loss trigger price. **`stopLoss.isTrailing`** `boolean` If `true`, enables the Trailing behavior for Stop loss. **`takeProfit.price`** `decimal string` The Take profit trigger price. ```http title="Request example" PUT /frontoffice/api/v4/positions/01K2HYXA7N2G9NHTFEWYVM9SEQ/triggers HTTP/1.1 Host: {host} Authorization: Bearer JWT accountId: {accountId} Content-Type: application/json; x-api-version=4.0 Accept: */* { "stopLoss": { "price": "165.13", "isTrailing": true }, "takeProfit": { "price": 250 } } ``` #### Response [#response-16] In case of success, an object will be returned containing the identifier of the updated position. ```json title="Response example — 200: OK" { "positionId": "01K2HYXA7N2G9NHTFEWYVM9SEQ" } ``` ## Commissions [#commissions] ### Get account trading volume [#get-account-trading-volume] `GET` `/frontoffice/api/v3/commission/``{dynamicCommissionGroupId}``/account-trading-volume` #### Summary [#summary-17] Use this method to obtain a cumulative account trading volume used for calculating the commission tier. #### Request [#request-17] ##### Header parameters [#header-parameters-17] **`accountId`** `required` The trading account identifier. ##### Path parameters [#path-parameters-7] **`dynamicCommissionGroupId`** `required` The dynamic commission group identifier. Use [Get market](settings#get-market) to obtain. ```http title="Request example" GET /frontoffice/api/v3/commission/{dynamicCommissionGroupId}/account-trading-volume HTTP/1.1 Host: {host} Authorization: Bearer JWT Content-Type: application/json; x-api-version=4.0 Accept: */* ``` #### Response [#response-17] In case of success, an object will be returned containing current trading volume, in RAT, for the account. ```json title="Response example — 200: OK" { "currentTradingVolumeInRAT": "string" } ``` ## Get full balance [#get-full-balance] ### Connection [#connection] ```text title="URL" /frontoffice/ws/v3/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"FullBalance"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "FullBalance", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of balance objects. **`item.assetId`** `string` The asset identifier. **`item.available`** `decimal string` The available asset balance. This value is calculated as *Total balance* – *Locked balance*. **`item.total`** `decimal string` The overall amount of the asset, including locked funds. **`item.locked`** `decimal string` The asset amount locked on the account for execution of all placed Limit orders. ```json title="Example" { "type": 2, "invocationId": "0", "item": [ { "assetId": "eur", "available": "497838.8", "total": "497838.8", "locked": "0" } ] } ``` ## Get margin data [#get-margin-data] ### Connection [#connection-1] ```text title="URL" /frontoffice/ws/v3/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"MarginData"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "MarginData", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.marginBalanceInRAT`** `decimal string` The total amount of funds that can be used as a collateral for trading, in RAT. This value is calculated as SUM (*TotalAmountX* × *MarginRatioX* × *Rate X/RAT*) Where: * *TotalAmountX* is the the total amount of the asset X, including both available and locked funds. * *MarginRatioX* is the Margin ratio set for the asset X. * *Rate X/RAT* is the constantly updated rate of the asset X to the BP root asset. **`item.creditInRAT`** `decimal string` The promotional trading credit granted to the account by the broker, in RAT. Credit is included in the account equity but excluded from the withdrawable amount. During a rolling deployment, older payloads might omit this field. In that case, default it to `0`. **`item.unrealizedPnlInRAT`** `decimal string` The total potential profit or loss earned from all open positions. This value is calculated as *Σ(Unrealized PnL for Long positions + Unrealized PnL for Short positions)*, where: * *Unrealized PnL for Long positions* = *Position size* × (*Current price* – *Open price*) * *Unrealized PnL for Short positions* = *Position size* × (*Open price* – *Current price*) **`item.equityInRAT`** `decimal string` The potential balance if all open positions were closed right now. This value is calculated as *Margin balance* + *Credit* + *Unrealized PnL*. **`item.usedMarginInRAT`** `decimal string` The amount of funds that is used for maintaining all open positions. Is opposed to the *Free margin*. The Used margin for positions on a specific market is calculated using the maximum value between the total margin of long positions and the total margin of short positions: MAX(*MarketPositionLong*, *MarketPositionShort*). **`item.freeMarginInRAT`** `decimal string` The amount of funds that can be used for opening new positions. **`item.marginLevel`** `decimal string` The ratio of funds to a used collateral, in percents. This value is calculated as *Equity* / *Used margin* × 100%. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "marginBalanceInRAT": "497838.8", "creditInRAT": "0", "unrealizedPnlInRAT": "-5.25", "equityInRAT": "497833.55", "usedMarginInRAT": "100.18", "freeMarginInRAT": "497733.37", "marginLevel": "4969.3905" } } ``` ## Get order book [#get-order-book] ### Connection [#connection] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide the `marketId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Book"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", "cfd.eur_chf" ], "invocationId": "0", "target": "Book", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.instrument`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.askTotalAmount`** `string` The total ask amount. **`item.bidTotalAmount`** `string` The total bid amount. **`item.asks`** `array of objects` The array of ask price objects. **`item.asks.price`** `string` The price, in the quote asset. **`item.asks.amount`** `string` The total amount of the base asset available at a corresponding price level. **`item.asks.total`** `string` The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. **`item.bids`** `array of objects` The array of bid price objects. **`item.bids.price`** `string` The price, in the quote asset. **`item.bids.amount`** `string` The total amount of the base asset available at a corresponding price level. **`item.bids.total`** `string` The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. **`item.version`** `string` The order book version. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "instrument": "cfd.eur_chf", "askTotalAmount": "18700000", "bidTotalAmount": "19100000", "asks": [ { "price": "0.93677", "amount": "5000000", "total": "4683850" }, { "price": "0.93676", "amount": "0", "total": "0" }, { "price": "0.93676", "amount": "0", "total": "0" } ], "bids": [ { "price": "0.93654", "amount": "0", "total": "0" }, { "price": "0.93654", "amount": "0", "total": "0" }, { "price": "0.93655", "amount": "5000000", "total": "4682750" } ], "version": "12498", "snapshot": false } } ``` ## Get trading data [#get-trading-data] ### Connection [#connection-1] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"TradingData"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "spot.bnb_btc" ] ], "invocationId": "0", "target": "TradingData", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.markets`** `array of objects` The array of market objects. **`item.markets.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.markets.type`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.markets.displayName`** `string` The market ticker. **`item.markets.fullName`** `string` The market full name or description (optional). **`item.markets.price`** `decimal string` The current top-of-the-book price, in the quote asset. **`item.markets.priceInRAT`** `decimal string` The current top-of-the-book price, in conversion to the root asset of the platform. **`item.markets.priceChange24hr`** `decimal string` The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. **`item.markets.priceChangeAbs24hr`** `decimal string` The price change over the last 24 hours. This value is calculated as *Current price* – *Price 24h ago*. **`item.markets.highPrice24hr`** `decimal string` The highest trade price over the last 24 hours. **`item.markets.lowPrice24hr`** `decimal string` The lowest trade price over the last 24 hours. **`item.markets.markPrice`** `decimal string` *Applicable to Perpetual markets only.* The mid-spread price, in conversion to RAT. **`item.markets.fundingRate`** `decimal string` *Applicable to Perpetual markets only.* The current funding rate. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "markets": [ { "marketId": "cfd.eur_chf", "type": "Cfd", "displayName": "cfd.eur_chf", "fullName": "", "price": "0.93586", "priceInRAT": "1", "priceChange24hr": "-0.0006", "priceChangeAbs24hr": "-0.00049", "highPrice24hr": "0.93695", "lowPrice24hr": "0.93134", "markPrice": null, "fundingRate": null } ], "snapshot": false } } ``` ## Get top of the book [#get-top-of-the-book] ### Connection [#connection-2] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Tob"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "spot.eth_usdt" ] ], "invocationId": "0", "target": "Tob", "type": 4 } ``` *** ### Message [#message-2] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.markets`** `array of objects` The array of market objects. **`item.markets.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.markets.ask`** `decimal string` The top-of-the-book ask price. **`item.markets.bid`** `decimal string` The top-of-the-book bid price. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "markets": [ { "marketId": "spot.eth_usdt", "ask": "2483.82", "bid": "2483.81" } ], "snapshot": false } } ``` ## Get trading chart [#get-trading-chart] ### Connection [#connection-3] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide the `marketId` and `timescale` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Chart"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", "cfd.eth_eur@15m" ], "invocationId": "0", "target": "Chart", "type": 4 } ``` *** ### Message [#message-3] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.instrument`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.low`** `decimal string` The lowest base asset price within the specified time interval. **`item.high`** `decimal string` The highest base asset price within the specified time interval. **`item.open`** `decimal string` The base asset price at the beginning of the specified time interval. **`item.close`** `decimal string` The base asset price at the end of the specified time interval. **`item.start`** `dateTime` The beginning of the specified time interval, in ISO 8601 format. **`item.end`** `dateTime` The end of the specified time interval, in ISO 8601 format. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "instrument": "cfd.eth_eur", "low": "2240.88", "high": "2270.29", "open": "2265.63", "close": "2255.99", "start": "2025-05-21T15:30:00Z", "end": "2025-05-21T15:45:00Z" } } ``` ## Get market summary [#get-market-summary] ### Connection [#connection-4] ```text title="URL" /marketdata/v5/info?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. In the second element, provide a list of `marketIds` as an array of strings. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"Summary"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46", [ "cfd.eur_chf" ] ], "invocationId": "0", "target": "Summary", "type": 4 } ``` *** ### Message [#message-4] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.items`** `array of objects` The array of data objects. **`item.items.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.items.last`** `decimal string` The price of the last trade. **`item.items.high24hr`** `decimal string` The highest trade price over the last 24 hours. **`item.items.low24hr`** `decimal string` The lowest trade price over the last 24 hours. **`item.items.percentChange`** `decimal string` The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. **`item.snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "items": [ { "marketId": "cfd.eur_chf", "last": "0.93597", "high24hr": "0.93695", "low24hr": "0.93134", "percentChange": "-0.02" } ], "snapshot": false } } ``` ## Guest market data [#guest-market-data] Every stream on this page has an anonymous counterpart on a separate hub. Use it to read live market data without an access token — for example, to drive a public dashboard. ### Connection [#connection-5] ```text title="URL" /marketdata/v5/guest ``` No `access_token` query parameter and no `Authorization` header. The connection carries no account, so guest traffic is subject to its own limits, separate from the authenticated ones: a per-instance cap on concurrent connections and a per-client-IP cap on concurrent connections. A connection beyond either cap is rejected with a `GuestConnectionLimitExceeded` hub error. The per-IP cap keys off the real-client-IP header configured for the deployment; connections whose IP cannot be resolved share one fallback bucket. ### Differences from the authenticated hub [#differences-from-the-authenticated-hub] The five stream targets are identical — `Book`, `TradingData`, `Tob`, `Chart`, and `Summary` — and each returns the same message shape as documented above. Two things change: * **`arguments` has one element, not two.** Drop the `accountId` element and pass only what the authenticated hub takes as its second element: | Target | `arguments` | | ------------- | ---------------------------------------- | | `Book` | `[ "cfd.eur_chf" ]` | | `Chart` | `[ "cfd.eth_eur@15m" ]` | | `TradingData` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | | `Tob` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | | `Summary` | `[ [ "cfd.eur_chf", "spot.btc_usdt" ] ]` | * **Prices are not account-specific.** A guest stream and an authenticated stream on the same instrument can therefore quote different prices. Only markets that are active and well-configured are streamed. A reconnect needs no credentials. ```json title="Example: subscribe to a guest order book" { "arguments": [ "cfd.eur_chf" ], "invocationId": "0", "target": "Book", "type": 4 } ``` For guest snapshots, instrument lists, and candle history over REST, see [Guest](../rest-api/guest). ## Get open orders [#get-open-orders] ### Connection [#connection] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"OpenOrders"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "OpenOrders", "type": 4 } ``` *** ### Message [#message] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of market objects. **`item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.marketDisplayName`** `string` The market ticker. **`item.marketFullName`** `string` The market full name or description (optional). **`item.orderId`** `string` The unique identifier of the order assigned by the system. **`item.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`item.status`** `string` The current [order status](../get-started/order-statuses). Possible values: * `Started` * `Pending` * `Working` **`item.source`** `string` The source of the order. Possible values: * `Manual` — the order was created manually via UI or API. **`item.reason`** `string` The reason for placing the order. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`item.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`item.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`item.requestedAmount`** `decimal string` The quantity of the base asset to buy or sell. For market orders, this represents the total base amount to fill; the executed amount may be lower if liquidity is insufficient. **`item.remainingAmount`** `decimal string` The order amount that hasn't yet been filled, in the base asset. **`item.requestedPrice`** `decimal string` The limit price for Limit orders; `null` for Market orders. **`item.executionPrice`** `decimal string` The volume-weighted average price of the order executions. **`item.createdAt`** `dateTime` The timestamp when the order was created, in ISO 8601 format. **`item.updatedAt`** `dateTime` The timestamp of the most recent update to the order, in ISO 8601 format. **`item.cancellationDate`** `dateTime` The timestamp when the order was cancelled or expired, in ISO 8601 format; `null` if not cancelled. **`item.commissionAssetId`** `string` The currency in which the commission was held. **`item.commissionAmount`** `decimal string` The total commissions put on hold for executing the order. **`item.leverage`** `int` *Applicable only to CFD markets.* The leverage ratio used when placing the order. **`item.fillFactor`** `decimal string` The proportion of the order amount filled so far, where `1` represents 100% fulfillment. **`item.comment`** `string | nullable` The text note attached to the order, up to 100 characters. **`item.takeProfit`** `decimal string` The Take Profit price, if set. **`item.stopLoss`** `decimal string` The Stop Loss price, if set. ```json { "type": 2, "invocationId": "0", "item": [ { "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "orderId": "01JVQBFSTVC40VK03A0AY7K016", "timeInForce": "Gtc", "status": "Pending", "source": "Manual", "reason": "Trader", "side": "Buy", "orderType": "Limit", "requestedAmount": "10000", "remainingAmount": "10000", "requestedPrice": "0.9", "executionPrice": "0", "createdAt": "2025-05-20T17:22:31.899Z", "updatedAt": "2025-05-20T17:22:31.9001213Z", "cancellationDate": null, "commissionAssetId": "eur", "commissionAmount": "0", "leverage": 1, "fillFactor": "0", "takeProfit": null, "stopLoss": null, "comment": null } ] } ``` ## Get open positions [#get-open-positions] ### Connection [#connection-1] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"OpenPositions"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "OpenPositions", "type": 4 } ``` *** ### Message [#message-1] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `object` The dataset object. **`item.item`** `array of objects` The array of position objects. **`item.item.positionId`** `string` The unique identifier of the position assigned by the system. **`item.item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.item.marketDisplayName`** `string` The market ticker. **`item.item.marketFullName`** `string` The market full name or description (optional). **`item.item.createdAt`** `dateTime` The timestamp when the position was opened, in ISO 8601 format. **`item.item.updatedAt`** `dateTime` The timestamp of the most recent update to the position, in ISO 8601 format. **`item.item.side`** `string` The position side. Possible values: * `Buy` * `Sell` **`item.item.status`** `string` The current position status. Always `"Open"`. **`item.item.leverage`** `int` *Applicable only to CFD markets.* The leverage ratio used when opening the position. **`item.item.positionLotAmount`** `decimal string` The position volume, in lots. **`item.item.positionPriceInRAT`** `decimal string` The current position price, in conversion to RAT. **`item.item.rateToRAT`** `decimal string` The current exchange rate of a quote asset to RAT. **`item.item.usedMarginInRAT`** `decimal string` The amount of trader’s funds used for maintaining a position, in conversion to RAT. **`item.item.openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`item.item.currentMarketPrice`** `decimal string` The current market price of the base asset: bid for Long positions and ask for Short positions. **`item.item.unrealizedPnlDayInRAT`** `decimal string` The potential profit or loss earned for a current day, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *First bid price for today*). For **Short** positions, this value is calculated as *Position size* × (*First ask price for today* – *Current ask price*). If a position was opened today, then the *Open VWAP* is used instead of the *First price for today*. **`item.item.unrealizedPnlDayPercent`** `decimal string` The potential profit or loss earned for a current day, in percents. **`item.item.unrealizedPnlTotalInRAT`** `decimal string` The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *Open VWAP*). For **Short** positions, this value is calculated as *Position size* × (*Open VWAP* – *Current ask price*). **`item.item.unrealizedPnlTotalPercent`** `decimal string` The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to RAT, in percents. **`item.item.takeProfit`** `decimal string` The Take Profit price, if set. **`item.item.stopLoss`** `decimal string` The Stop Loss price, if set. **`item.item.positionModifier`** `string` The reason for the latest position update. **`item.item.comment`** `string | nullable` The text note inherited from the opening order, up to 100 characters. **`snapshot`** `boolean` The data snapshot. If `snapshot: true`, it indicates the message contains the full dataset. Subsequent messages with `snapshot: false` only include updates or changes since the initial snapshot. ```json title="Example" { "type": 2, "invocationId": "0", "item": { "item": [ { "positionId": "01JP4H3AMS7Q1H6Y6H3XJ52JTA", "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "createdAt": "2025-03-12T06:36:31.257Z", "updatedAt": "2025-03-12T06:36:31.257Z", "side": "Buy", "status": "Open", "leverage": 1, "positionLotAmount": "0.01", "positionPriceInRAT": "1000.46", "rateToRAT": "1.07", "usedMarginInRAT": "1000.53", "openPrice": "0.96304", "currentMarketPrice": "0.93501", "unrealizedPnlDayInRAT": "1.86", "unrealizedPnlDayPercent": "0.0018", "unrealizedPnlTotalInRAT": "-29.93", "unrealizedPnlTotalPercent": "-0.0291", "takeProfit": null, "stopLoss": null, "positionModifier": "Trader", "comment": null }, { "positionId": "01JVQB9ZWJ6G4QV0P98X0QWNA7", "marketId": "cfd.eur_chf", "marketType": "Cfd", "marketDisplayName": "EUR/CHF", "marketFullName": "", "createdAt": "2025-05-20T17:19:21.49Z", "updatedAt": "2025-05-20T17:19:21.491321Z", "side": "Buy", "status": "Open", "leverage": 100, "positionLotAmount": "0.1", "positionPriceInRAT": "10004.6", "rateToRAT": "1.07", "usedMarginInRAT": "100.06", "openPrice": "0.93666", "currentMarketPrice": "0.93501", "unrealizedPnlDayInRAT": "18.61", "unrealizedPnlDayPercent": "0.0018", "unrealizedPnlTotalInRAT": "-17.02", "unrealizedPnlTotalPercent": "-0.0017", "takeProfit": null, "stopLoss": null, "positionModifier": "Trader", "comment": null } ], "snapshot": false } } ``` ## Get closed positions [#get-closed-positions] ### Connection [#connection-2] ```text title="URL" /frontoffice/ws/v4/account?access_token={YOUR_ACCESS_TOKEN} ``` **`arguments`** `array` The connection parameters. In the first element, provide the `accountId` as a string. **`invocationId`** `string` The invocation identifier. Must be unique and increase by 1 for each sent message. **`target`** `string` The stream name. Specify `"ClosePositionsOrders"`. **`type`** `int` The operation type. Set to `4` to indicate a subscription to the stream. ```json title="Example" { "arguments": [ "67d0456f8c7b1108e4cf5d46" ], "invocationId": "0", "target": "ClosePositionsOrders", "type": 4 } ``` *** ### Message [#message-2] **`type`** `string` The operation type. `2` indicates the streaming is in progress. **`invocationId`** `string` The invocation identifier. Same as in the request. **`item`** `array of objects` The array of position objects. **`item.marketId`** `string` The market identifier, in the following format: `{marketType}.{baseAssetId}_{quoteAssetId}`, for example: `cfd.eth_eur`. **`item.marketType`** `string` The market type. Possible values: * `Spot` * `Cfd` * `Perp` **`item.marketDisplayName`** `string` The market ticker. **`item.marketFullName`** `string` The market full name or description (optional). **`item.orderId`** `string` The unique identifier of the order assigned by the system. **`item.orderType`** `string` The [order type](../get-started/order-types). Possible values: * `Market` * `Limit` **`item.timeInForce`** `string` The [time-in-force policy](../get-started/time-in-force) for the order, controlling its lifetime. Possible values: * `Gtc` * `Ioc` * `Fok` * `Gtd` * `Day` **`item.side`** `string` The order side, indicating the direction of the trade. Possible values: * `Buy` * `Sell` **`item.positionCloseLotAmount`** `decimal string` The closed volume, in lots, which is equivalent to the corresponding filled order volume. **`item.reason`** `string` The reason for position closing. Possible values: * `Trader` * `StopOut` * `MarketHalted` * `MarketDisabled` * `TakeProfit` * `StopLoss` * `Admin` **`item.realizedPnlInRAT`** `decimal string` The actual profit or loss earned, in conversion to RAT. For **Long** positions, this value is calculated as *Position size* × (*Close price* – *Open price*). For **Short** positions, this value is calculated as *Position size* × (*Open price* – *Close price*). **`item.closedAt`** `dateTime` The timestamp when the position was closed, in ISO 8601 format. **`item.positionId`** `string` The unique identifier of the position assigned by the system. **`item.openPrice`** `decimal string` The volume-weighted average price (VWAP) at which the position was opened. **`item.closePrice`** `decimal string` The volume-weighted average price (VWAP) of trades related to a position-closing order. **`item.positionPriceInRAT`** `decimal string` The position price, in conversion to RAT. **`item.rateToRAT`** `decimal string` The conversion rate to RAT. **`item.openedAt`** `dateTime` The timestamp when the position was opened, in ISO 8601 format. ```json title="Example" { "type": 2, "invocationId": "0", "item": [ { "marketId": "cfd.eur_chf", "marketFullName": "", "marketDisplayName": "EUR/CHF", "marketType": "Cfd", "orderId": "01JVSQ8WFA3QZ6AQTKYPXVXDWA", "orderType": "Market", "timeInForce": "Ioc", "side": "Sell", "positionCloseLotAmount": "0.01", "reason": "Trader", "realizedPnlInRAT": "-29.25", "closedAt": "2025-05-21T15:26:57.0027785Z", "positionId": "01JP4H3AMS7Q1H6Y6H3XJ52JTA", "openPrice": "0.96304", "closePrice": "0.93571", "positionPriceInRAT": "1001.2", "rateToRAT": "1.07", "openedAt": "2025-03-12T06:36:31.257Z" } ] } ``` You can connect B2Trader to **ChatGPT** as a **connector**. It uses the same B2Trader MCP URL and OAuth sign-in as every other agent. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` Ask your broker for the exact base URL for your platform. The read-only connector may also be discoverable directly in ChatGPT's connector directory. Connector availability depends on your ChatGPT plan. ## Connect the B2Trader connector [#connect-the-b2trader-connector] 1. In ChatGPT, open **Settings** → **Connectors**. 2. Choose to add a connector by **URL** (custom connector). 3. Paste the B2Trader MCP **URL** for the surface you want (read-only or full access). 4. Confirm. ChatGPT reads the endpoint's OAuth metadata and opens the sign-in page for your platform in your browser. 5. Sign in with the credentials you normally use. Depending on how your broker set up your platform, this is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account. Authentication uses OAuth 2.1 with PKCE — no API key is pasted into ChatGPT. 6. **Full access only:** approve the consent screen (see [The full-access consent screen](#the-full-access-consent-screen)). 7. ChatGPT lists the connector as connected, and the B2Trader tools become available to it. ## The full-access consent screen [#the-full-access-consent-screen] When you connect the **full-access** surface, B2Trader shows an explicit consent screen before issuing a token. It reads: Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. * **Approve** — ChatGPT receives a token carrying the `mcp:trade` scope and can trade on your account. * **Decline** — no token is issued and ChatGPT stays disconnected from the full-access surface. The read-only surface does **not** show this screen — it only grants the `mcp:read` scope. Before approving full access, read [Full-access safety](full-access-safety). ## What "connected" looks like [#what-connected-looks-like] * The connector appears as connected in ChatGPT's settings. * B2Trader tools are available to ChatGPT in your chats. * On read-only, no order-placing or position-closing tools appear — they are not part of that surface. ## Disconnecting [#disconnecting] * In ChatGPT, remove the connector to stop it calling B2Trader. * To revoke B2Trader's side of the grant, use the account console — see [How to stop your agent](full-access-safety#how-to-stop-your-agent). You can connect B2Trader to **Claude** in two places: * **claude.ai** (web and desktop app) — add B2Trader as a **custom connector**. * **Claude Desktop** — add B2Trader as an MCP server; the OAuth sign-in completes through Claude's hosted redirect (`https://claude.ai/api/mcp/auth_callback`). Both use the same B2Trader MCP URL and the same OAuth sign-in. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` Ask your broker for the exact base URL for your platform. The read-only connector may also be discoverable directly in Claude's connector directory. ## Connect on claude.ai [#connect-on-claudeai] 1. Open **Settings** → **Connectors** in claude.ai. 2. Click **Add custom connector**. 3. Paste the B2Trader MCP **URL** for the surface you want (read-only or full access). 4. Click **Add**. Claude reads the endpoint's OAuth metadata and opens the sign-in page for your platform in your browser. 5. Sign in with the credentials you normally use. Depending on how your broker set up your platform, this is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account. Authentication uses OAuth 2.1 with PKCE — you are **not** pasting an API key into Claude. 6. **Full access only:** approve the consent screen (see [The full-access consent screen](#the-full-access-consent-screen)). 7. Claude shows the connector as **Connected**, and the B2Trader tools appear in the tool list for your conversations. ## Connect in Claude Desktop [#connect-in-claude-desktop] 1. Open **Claude Desktop** → **Settings** → **Connectors**. 2. Add a new MCP server pointing at the B2Trader MCP URL for your surface. 3. Claude Desktop opens your browser for OAuth sign-in and completes the flow through Claude's **hosted** redirect (`https://claude.ai/api/mcp/auth_callback`), a pre-registered redirect URI. 4. Sign in and — for full access — approve the consent screen. 5. The B2Trader tools appear in Claude Desktop once the connector reports **Connected**. ## The full-access consent screen [#the-full-access-consent-screen] When you connect the **full-access** surface, B2Trader shows an explicit consent screen before issuing a token. It reads: Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. * **Approve** — Claude receives a token carrying the `mcp:trade` scope and can trade on your account. * **Decline** — no token is issued and Claude stays disconnected from the full-access surface. The read-only surface does **not** show this screen — it only grants the `mcp:read` scope. Before approving full access, read [Full-access safety](full-access-safety). ## What "connected" looks like [#what-connected-looks-like] * The connector is listed as **Connected** in Claude's settings. * B2Trader tools (for example `trader_get_accounts`, plus platform market-data and portfolio tools) are available to Claude in your conversations. * On read-only, no order-placing or position-closing tools appear — they are not part of that surface. ## Disconnecting [#disconnecting] * In Claude, remove the connector to stop it calling B2Trader. * To revoke B2Trader's side of the grant, use the account console — see [How to stop your agent](full-access-safety#how-to-stop-your-agent). If you are building your own agent (for example with an Agent SDK) or using an MCP client that is not Claude or ChatGPT, you connect to the same two B2Trader endpoints and the same OAuth flow. This page covers the OAuth details a custom client needs. Pick the surface you need first — see [Overview](overview): * Read-only: `https:///mcp-read-only` * Full access: `https:///mcp-full-access` `` is the domain you open your B2Trader terminal on, not a separate API address. ## OAuth discovery [#oauth-discovery] Your client needs no B2Trader-specific configuration beyond the MCP URL. B2Trader is an OAuth 2.1 protected resource and advertises everything a compliant client needs: 1. Your client calls the MCP endpoint without a token and receives `401 Unauthorized` with a `WWW-Authenticate: Bearer resource_metadata="…"` header. 2. That header points at the protected-resource metadata (RFC 9728) for the surface you called — each surface has its own document: `https:///.well-known/oauth-protected-resource/mcp-read-only` and `https:///.well-known/oauth-protected-resource/mcp-full-access`. Fetching it returns the resource identifier, the authorization server (your broker's Keycloak realm), and `scopes_supported` — one scope only, matching the surface: `[mcp:read]` for `/mcp-read-only`, `[mcp:trade]` for `/mcp-full-access`. 3. Your client runs the standard OAuth 2.1 **authorization-code flow with PKCE** against that authorization server, requesting the scope for the surface you want. 4. B2Trader validates the token's audience (`bbp-mcp`) and the required scope (`mcp:read` for read-only, `mcp:trade` for full access) before serving any tool. Use a compliant MCP client library — it performs discovery, PKCE, and token refresh for you. You only supply the MCP URL. ## Pre-registered OAuth clients [#pre-registered-oauth-clients] B2Trader ships two pre-registered public OAuth clients. Use the one matching your surface: | Surface | `client_id` | Scope | Consent | | ----------- | ----------------- | ----------- | ---------------------------- | | Read-only | `mcp-read-only` | `mcp:read` | None | | Full access | `mcp-full-access` | `mcp:trade` | Explicit trade-scope consent | Both are **public** clients (no client secret) and require **PKCE (S256)**. A custom client authenticates as one of these `client_id`s and completes the browser sign-in as any other agent does. Depending on how your broker set up your platform, the page that opens is either the B2Trader sign-in form or the sign-in page of the portal you normally use to access your account — your client behaves the same either way. ## Command-line agents (Codex CLI, Claude Code) [#command-line-agents-codex-cli-claude-code] Command-line MCP clients default to **Dynamic Client Registration (DCR)** — on first connect they try to register a brand-new OAuth client with the authorization server instead of using a fixed `client_id`. The B2Trader Keycloak realm does not permit anonymous DCR, so these tools must be told to use one of the pre-registered `client_id`s above: * **Codex CLI:** ```bash codex mcp add --url --oauth-client-id mcp-full-access codex mcp login ``` Use `mcp-read-only` in place of `mcp-full-access` for the read-only surface. * **Claude Code:** ```bash claude mcp add --transport http --client-id mcp-full-access --callback-port 8080 ``` Without an explicit `client_id`, both tools fall back to anonymous DCR, which the authorization server rejects — the connection fails before you reach the sign-in page. ## Redirect URIs [#redirect-uris] The pre-registered clients accept these redirect URIs: | Redirect URI | Use | | ------------------------------------------------------- | ----------------------------------------------------- | | `https://claude.ai/api/mcp/auth_callback` | Claude (claude.ai) | | `https://chatgpt.com/connector_platform_oauth_redirect` | ChatGPT | | `http://localhost:8080/*` | Claude Code — fixed callback port | | `http://127.0.0.1/*` | Codex CLI and other loopback clients — ephemeral port | If your custom agent runs locally, use one of the loopback redirects above. Most Agent SDKs and MCP client libraries (including Codex CLI) default to an ephemeral-port loopback callback on `127.0.0.1`, matching `http://127.0.0.1/*`, so no configuration change is needed. Claude Code is the exception: it needs a **fixed** callback port to match a registered redirect, so pass `--callback-port 8080` (matching `http://localhost:8080/*`) as shown above. ## Adding a custom redirect URI (broker step) [#adding-a-custom-redirect-uri-broker-step] If your agent runs on a hosted callback URL that is **not** one of the above (for example a server-side agent with its own public redirect), your broker must add that redirect URI to the pre-registered client in Keycloak before sign-in will succeed. A redirect URI that is not registered on the client fails at the sign-in step with an "Invalid redirect URI" error from Keycloak. Send your broker the exact callback URL your agent uses and which surface it needs (read-only or full access). Adding a redirect URI is a broker-side change to the MCP client registration. It requires no product change and is the documented path for onboarding custom, non-marketplace agents. ## Full access [#full-access] If your custom agent uses the full-access surface, the same [full-access safety](full-access-safety) rules apply: no per-action confirmation, irreversible actions, and the prompt-injection risk of an autonomous agent. Read that page before granting `mcp:trade`. The full-access surface (`/mcp-full-access`) lets a connected AI agent trade on your account **directly**. This page explains exactly what that means and how to stay in control. Read it before you approve the full-access consent screen. Connecting this AI agent lets it place, cancel and close orders and set triggers on your account directly, with no per-action confirmation. These actions are irreversible. This differs from the in-terminal AI chat, which confirms each trade. ## No per-action confirmation [#no-per-action-confirmation] The in-terminal **AI Assistant chat** asks you to confirm each trade before it executes. The full-access MCP surface does **not**. Once connected, the agent can place, cancel, and close orders and set price triggers on its own, as fast as it decides to — there is no confirmation dialog and no "are you sure?" step. ## Actions are irreversible [#actions-are-irreversible] Trades execute against the live market. A filled order, a closed position, or a cancelled order **cannot be undone**. If your agent makes a mistake — or is manipulated into one — the market result stands. ## Prompt-injection risk [#prompt-injection-risk] An autonomous agent acts on the text it reads. If your agent processes untrusted content — a web page, an email, a chat message, a document — that content can contain hidden instructions telling the agent to trade against your interest. This is called **prompt injection**. Because the full-access surface has no confirmation gate, a successful injection can move real money before you notice. To reduce the risk: * Prefer the **read-only** surface unless you specifically need the agent to trade. * Only grant full access to agents and workflows you trust and control. * Be cautious about letting a full-access agent read untrusted external content in the same session it can trade. ## How to stop your agent [#how-to-stop-your-agent] You have two independent controls. Use either — or both. 1. **Stop it in the agent (fastest).** Disconnect or remove the B2Trader connector in your agent (Claude, ChatGPT, or your custom client). The agent immediately stops making new calls. 2. **Revoke the grant in B2Trader.** Open your **account console** (your broker's Keycloak account page) → **Applications**, find the connected MCP application, and **revoke** its access. This removes your consent so the agent cannot obtain a new token. There is no broker-side "kill switch" that instantly voids a token already in the agent's hands. A token the agent already holds stays valid until it expires (see [Access tokens are short-lived](#access-tokens-are-short-lived)). Revoking in the account console stops **new** tokens; disconnecting in the agent stops it using the one it has. Do both to be certain. ## You still get execution notifications [#you-still-get-execution-notifications] Every order the agent places, cancels, or closes fires the **same account notifications** you already receive for terminal activity. Your normal notification channels keep working, so a full-access agent cannot act silently — watch them to see what your agent is doing. ## Access tokens are short-lived [#access-tokens-are-short-lived] The agent's access token has a **short lifetime**. If you revoke consent in the account console, the agent can finish using its current token but cannot get a new one once it expires — so a revoked grant fully lapses within the token's short window, without any forced server-side revocation. ## Choosing read-only instead [#choosing-read-only-instead] If you do not need the agent to trade, connect the **read-only** surface (`/mcp-read-only`) instead. Its tools cannot place or change anything — the trading tools are not part of that surface at all. See [Overview](overview) for the comparison. B2Trader can expose your trading account to external AI agents through the **Model Context Protocol (MCP)** — an open standard that lets AI applications such as Claude and ChatGPT call a defined set of tools on your behalf. Once you connect an agent, it can read your market data and portfolio, and — on the full-access surface — place and manage orders directly. This is different from the **in-terminal AI Assistant chat**, which runs inside the B2Trader terminal and confirms each trade with you before it executes. An external MCP agent runs in *its own* application (Claude, ChatGPT, or your own client) and connects to B2Trader over the internet using your account sign-in. Connecting an AI agent is optional — it's your choice whether to use it. The MCP surfaces are available by default, though your broker can restrict or disable them for your platform. The MCP endpoints live on the same domain you use to open your B2Trader terminal, so wherever these pages show `https:///…`, that means your terminal address — not a separate API address. If a connection URL below doesn't work, contact your broker. ## Two surfaces [#two-surfaces] B2Trader publishes **two** separate MCP endpoints. You choose one when you connect your agent. | | Read-only | Full access | | ------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Endpoint path** | `/mcp-read-only` | `/mcp-full-access` | | **What the agent can do** | View market data, your portfolio, order and position history, and analytics | Everything in read-only **plus** place, cancel, and close orders and set price triggers | | **Tools exposed** | 23 | 39 | | **Trading** | None — mutating tools are not present at all | Full trading, with **no per-action confirmation** | | **OAuth scope** | `mcp:read` | `mcp:trade` | | **Consent screen** | No extra consent | Explicit trade-scope consent (see [Full-access safety](full-access-safety)) | | **Marketplace-listed** | Yes | No — connect by URL | The **read-only** surface is the one listed in AI marketplaces (for example the Claude and ChatGPT connector directories). It is safe to connect broadly: the trading tools are **structurally absent** — the agent cannot see or call them. The **full-access** surface is connected by pasting its URL directly. It grants your agent the ability to trade with no confirmation gate. Read [Full-access safety](full-access-safety) before you connect it. ## Tool categories [#tool-categories] Both surfaces expose the same read tools; the full-access surface adds the mutating ones. | Category | Read-only | Full access | | ------------------------------------------------------------------------------ | --------- | ----------- | | Market data — B2Trader platform prices (tickers, order book, market summaries) | Yes | Yes | | Portfolio & account (balances, margin, open positions) | Yes | Yes | | Order & position history | Yes | Yes | | Analytics & reference data | Yes | Yes | | Place / cancel / close orders (single) | No | Yes | | Bulk order / position actions | No | Yes | | Set & edit price triggers, other account mutations | No | Yes | | **Total tools** | **23** | **39** | The 16 tools that the full-access surface adds are the mutating actions: single trading actions, bulk trading actions, and non-trading account mutations. ## Which surface to choose [#which-surface-to-choose] * **Choose read-only** if you want an agent to analyze markets, summarize your portfolio, or answer questions about your trading history. This is the recommended default and the safest option. * **Choose full access** only if you deliberately want your agent to trade for you without confirming each action, and you understand the risks in [Full-access safety](full-access-safety). ## Prerequisites [#prerequisites] Before connecting any agent you need: * A **B2Trader account** on a platform that offers the MCP surfaces. They are available by default; a broker can restrict or disable them. * Your account must be **active** (`bbp.spot.status = Active`) — the same status required to trade in the terminal. A non-active account can sign in, but its tool calls are rejected by the platform. * An AI application that supports MCP with OAuth — for example [Claude](connect-claude), [ChatGPT](connect-chatgpt), or a [custom agent](connect-custom-agent). ## How connecting works [#how-connecting-works] You never paste an API key or password into your agent. Connection uses **OAuth 2.1 with PKCE**: 1. You add the B2Trader MCP URL to your agent. 2. The agent discovers B2Trader's authorization server automatically — it reads the endpoint's protected-resource metadata at `/.well-known/oauth-protected-resource/mcp-read-only` or `/.well-known/oauth-protected-resource/mcp-full-access`, depending on the surface. 3. Your browser opens the sign-in page for your platform, where you sign in with the credentials you normally use. 4. For the full-access surface, you approve an explicit consent screen describing what the agent may do. 5. The agent receives a short-lived access token and is connected. No long-lived secret is stored in the agent. The sign-in page you see depends on how your broker set up your platform: either the B2Trader sign-in form, or the sign-in page of the portal you normally use to access your account, which opens automatically. If you are already signed in there in the same browser, no sign-in prompt appears. The per-client steps are covered in the connection guides: * [Connect Claude](connect-claude) * [Connect ChatGPT](connect-chatgpt) * [Connect a custom agent](connect-custom-agent) * [Full-access safety](full-access-safety) ## Global interface controls [#global-interface-controls] ### Account selection [#account-selection] The **Account select** is located in the topbar and enables you to switch between your trading accounts. Each account shows its type: `H` (Hedging) or `N` (Netting). Once you switch the account, all the widgets automatically adjust to show relevant information for the selected account. Account select #### Account status [#account-status] An account can have a status that limits what you can do with it. When a status applies, a status indicator is shown on the account, and a banner explains the restriction. Account status is managed by your administrator. The following statuses are visible to you: * **Halted**: A banner reads *Account is locked for trading. Contact your administrator.* The trading controls are disabled, but you can still deposit and withdraw funds, and your balances, positions, and history stay visible. * **Frozen**: A banner reads *Account is frozen. Contact your administrator.* The account is view-only. All controls are disabled, while your balances, positions, and history stay visible. To restore trading on an account that is Halted or Frozen, contact your administrator. Archived accounts don't appear in the account list. ### Instrument selection [#instrument-selection] The **Instrument select** is located in the topbar and enables you to switch between various markets and trading pairs. Once you change the market, all the widgets automatically adjust to show relevant information for the selected instrument. Instrument select #### Favorite markets [#favorite-markets] Mark instruments as favorites for quick access. To add or remove a market from favorites, click the **star icon** next to the market name in the instrument selection list. Favorite markets can be accessed in two ways: * **Favorites tab** in the instrument selection panel — filters the list to show only your favorite markets. * **Favorites dropdown** in the topbar — provides quick access to favorite markets from anywhere in the terminal. ### Settings [#settings] Use this control to access interface and system settings. Refer to [Settings](settings) for details. Settings ### Other controls [#other-controls] * **Introduction tour**: Access the interactive platform walkthrough. Introduction tour * **Alerts**: View new system notifications. Unread alerts * **Analytics**: Open the **Account Analytics** view with the **Equity Curve** chart — your account balance and equity dynamics over time (Margin Balance, Equity, Total Equity, Unrealized PnL, Deposits / Withdrawals) for a selected period and granularity. The data updates hourly. Click **Back to Trading** to return to the terminal. Analytics * **Log out**: Log out of the system to securely terminate the session. After that you’re navigated to the Login page. Log out ## Working with widgets [#working-with-widgets] > For more information about available widgets, refer to the **Widgets** section of this guide. ### Add widgets to your workspace [#add-widgets-to-your-workspace] **To add a new widget**: 1. Click the **Add Widget** button. 2. Browse the available widgets. 3. Click any widget to add it to your workspace. Add Widget **To add widgets to existing panels**: 1. Look for the **+** button next to the tabs in a panel's header. 2. Click it to open the widget catalog. 3. Select a widget to add it as a new tab to that panel. Add widget tabs ### Move and position widgets [#move-and-position-widgets] **To move a widget**: 1. Click and hold the **move handle** in the top-right corner of the panel header. 2. Drag it to desired location on the page. 3. Drop it. Move widgets **To rearrange widget tabs within a panel**: 1. Click and hold any widget tab. 2. Drag it left or right to reorder. 3. Release to set the new position. ### Resize widgets [#resize-widgets] **To resize a widget panel**: * **Single edge**: Hover over any edge until you see the resize cursor, then drag. * **Corner resize**: Drag a corner to adjust both width and height simultaneously. * **Precision**: Use edge dragging for fine-tuned sizing. Resize widgets ### Remove widgets and tabs [#remove-widgets-and-tabs] **To remove a tab**: 1. Click the **×** button in the top-right corner of the widget tab. 2. The tab will be removed immediately. 3. When you remove the last tab from a panel, the entire panel disappears. Remove tabs and widget panels ### Link panels to a group [#link-panels-to-a-group] Each panel header has a **Link to group** button — the circle icon **next to the move handle** in the top-right corner. Linking panels to the same colored group keeps them in sync: when you select an instrument in one linked panel, the other panels in the same group switch to it automatically. **To link a panel to a group**: 1. Click the **Link to group** button (next to the move handle) in the panel's top-right corner. 2. Select one of the color groups (Group 1–5). 3. Repeat for other panels, choosing the same group to keep them synchronized. Link to group ### Customize widget content [#customize-widget-content] Certain widgets let you customize which columns to display and their order: Look for the **column settings** button in the widget header. **To customize columns**: 1. Click the **column settings** button. 2. **Show/hide columns**: Check or uncheck boxes (grayed-out columns are required). 3. **Reorder columns**: Drag and drop items in the list. 4. **Reset**: Click *Reset to default* to restore original settings. Configure columns ## Managing workspaces [#managing-workspaces] ### Create new workspaces [#create-new-workspaces] **To create a workspace**: 1. Click the **+** tab next to your existing workspaces. 2. Choose a template: * **Pre-built templates**: Start with common widget combinations. * **Empty**: Build completely from scratch. 3. Enter a name for your workspace. 4. Start customizing. Add a new workspace ### Workspace management [#workspace-management] **To rename or delete a workspace**: 1. Click the menu icon on the workspace tab. 2. Select **Rename** or **Remove**. Workspace menu **To reorder workspaces**: 1. Click and hold any workspace tab. 2. Drag it left or right to reorder. 3. Release to set the new position. ## Market info panel [#market-info-panel] Click the **info icon** next to a market symbol in widgets to view: * Detailed market information. * Trading session schedules. * Leverage details (for CFD and PF markets). * Fee details. * Funding details (for PF markets). Market info ## Pro tips [#pro-tips] ### Efficient layout building [#efficient-layout-building] * Start with a template that is close to your needs, then customize. * Group related widgets in tabs to save screen space. * Use larger panels for charts, smaller ones for order books. ### Layout best practices [#layout-best-practices] * **Save multiple workspaces** for different trading strategies. * **Test your layout** during low-activity periods. * **Keep essential widgets visible** (account info, positions, alerts). Guest mode lets you open the Trading terminal and look around without an account. You get the real interface with live market data, so you can judge the platform and its market coverage before you sign up. Everything that would move money or show someone's balance stays behind login. You do not switch Guest mode on. Open the terminal URL without a session and it loads in Guest mode on its own — there is no redirect to a login page first. On your first visit a short disclaimer appears, stating that the page is for information only and that the instruments actually available for trading are determined by current legislation. Click **OK** to dismiss it; it is remembered in your browser and does not appear again. Your broker can turn the disclaimer off. ## What you can do as a guest [#what-you-can-do-as-a-guest] * Browse the full list of instruments your broker offers, and filter, group, and search it exactly as a logged-in trader would. * Follow live prices, the [Order book](../widgets/order-book), and [Market depth](../widgets/market-depth). * Work with the [Price chart](../widgets/price-chart): change the instrument, change the timeframe, and use the chart tools. * Open the [AI Assistant](../widgets/ai-assistant) widget for market analysis. * Fill in the [Place order](../widgets/place-order) form — order type, side, quantity, price, stop loss, take profit, time in force. The fields behave the same as they do for a logged-in trader, so you can see exactly what placing an order involves. ## What needs logging in [#what-needs-logging-in] In the [Place order](../widgets/place-order) widget the order submit button is replaced by a **Log In** button. You can fill in the whole form and see the calculated figures, but there is no way to submit an order as a guest. Account-related widgets are not hidden either. Each is covered by an overlay with a padlock icon, the message *Log in to unlock all features*, and a **Log In** button, so you can see where your own data will appear once you have an account. The affected widgets are: * [Assets](../widgets/assets) * [Margin](../widgets/margin) * [Open orders](../widgets/open-orders) * [Open positions](../widgets/open-positions) * [Closed positions](../widgets/closed-positions) * [Order history](../widgets/order-history) * [Stop orders](../widgets/stop-orders) * [Messages](../widgets/messages) * [Price control](../widgets/price-control) ## Your guest workspace [#your-guest-workspace] Guest mode opens with a workspace laid out by your broker. It is the same on every visit and it is not saved: rearranging widgets as a guest does not carry over to your next visit, and it never becomes your workspace after you log in. ## Logging in from Guest mode [#logging-in-from-guest-mode] Use **Log In** in the terminal topbar, or the **Log In** button on any account widget overlay or in the Place order widget — they all do the same thing. After you log in, the terminal reloads into the full trading experience and opens your saved workspace. On a first login, when you have no saved workspace yet, it opens the default one. If you are already logged in to your broker's client portal in the same browser, the terminal detects that session on load and takes you straight into the full trading experience — no second login. ## Logging out [#logging-out] Logging out returns you to Guest mode on the same address, not to a login page, so you can keep watching the markets. Your account data is cleared from the browser first, so no balances, positions, orders, or history remain visible. Access settings by clicking the **gear icon** in the topbar of the Trading terminal. Settings Settings are organized into tabs: * [Interface](#interface): Configure language, time display, and visual theme. * [Widgets](#widgets): Customize widget display options. * [Action Confirmation](#action-confirmation): Choose which actions require additional confirmation. * [Account margin](#account-margin): Manage collateral assets for margin trading. * [Trading report](#trading-report): Generate comprehensive trading and account reports, including an official Client Account Statement. * [API token management](#api-token-management): Generate and manage tokens for accessing the Trading API. * [TradingView Webhooks](#tradingview-webhooks): Configure TradingView webhook alerts for automated order execution. ## Interface [#interface] Configure global interface preferences: **Language** Select the interface language from the dropdown menu. **24 hour mode** * Enable: Display time in 24-hour format. * Disable: Display time in 12-hour format with AM/PM. **Dark theme** * Enable: Apply dark color scheme. * Disable: Apply light color scheme. ## Widgets [#widgets] Configure display options for the following widgets. ### Price chart [#price-chart] **Display positions** When enabled, open positions are shown on the chart along with: * Position size and current PnL. * Quick access to edit price triggers and close positions. * Color coding: Long positions (green), Short positions (red). **Display orders and triggers** When enabled, the following orders and triggers are displayed on the chart: * Active Limit and Stop orders with order type, price, and amount. * Stop loss, Take profit, and Trailing stop triggers. * Quick access to edit triggers and cancel orders. * Color coding: Buy orders (green), Sell orders (red). **Display executed orders** When enabled, executed orders are shown on the chart with order type indicators: * Green `B` tag for Buy orders. * Red `S` tag for Sell orders. Clicking `B` or `S` will open details of one or more orders that were executed during the candle interval. **Market quick trade panel** When enabled, a panel is displayed on the chart for placing Market orders with: * Quick amount selection from preset values. * Leverage ratio input (when applicable). Amount presets can be configured in the corresponding field displayed when the option is enabled. **Limit quick trade panel** When enabled, a panel is displayed on the chart for placing Limit orders with: * Quick amount selection from preset values. * Leverage ratio input (when applicable). Amount presets can be configured in the corresponding field displayed when the option is enabled. ## Action Confirmation [#action-confirmation] Choose which trading actions require an additional confirmation dialog before execution. **Cancel orders** * Enable: A confirmation dialog is displayed before canceling orders. * Disable: Orders are canceled immediately without confirmation. This setting applies to single and bulk order cancellations from the **Open Orders** widget and the **Price chart**. The confirmation dialog includes a **"Don't ask again"** checkbox. To skip the confirmation for future order cancellations, check this box. **Full Close Positions** * Enable: A confirmation dialog is displayed before closing positions. * Disable: Positions are closed immediately without confirmation. This setting applies to single and bulk position closures from the **Open Positions** widget. **Limit order cross-TOB warning** * Enable: A confirmation dialog is displayed before a Limit order is submitted if its price crosses the current top-of-book — that is, when a Buy price is at or above the best ask, or a Sell price is at or below the best bid. The dialog shows the entered price and the current best bid/ask, and includes a **Do not show this warning again** checkbox. * Disable: Crossing Limit orders are submitted immediately without the warning. The warning is enabled by default. The dialog checkbox and this toggle share the same global setting and stay in sync. The warning is informational only — it does not block the order. If you confirm, the order is submitted with the original price. The warning applies only to standard Limit orders; Stop-limit, Take-profit-limit, IOC, FOK, and other order types are not affected. If best bid or best ask data is unavailable (empty book or disconnected feed), the order is submitted without the warning. ## Account margin [#account-margin] Control which assets can be used as collateral for margin trading. ### Asset list [#asset-list] The following information is provided about each asset: **Asset** The alphabetical code of the asset. The first asset in the list is the **root asset** of the platform. *** **Caption** The asset name. *** **Available** The balance available for trading, calculated as *Total – Halted*, where *Halted* represents funds locked for pending Limit orders. *** **Total** The complete asset balance including locked funds. *** **Margin ratio** The percentage of asset value that can be used as collateral for margin trading. *** **Use as margin** Enable this toggle to use the asset as collateral for margin trading. Configure which assets can be used as collateral for margin trading by toggling the **Use as margin** setting for each asset. Only assets with **Margin ratio** greater than 0 (zero) can be enabled. The platform root asset is enabled by default and can't be disabled. ### Filtering options [#filtering-options] Click the **funnel icon** to configure the asset list display: * **Show/Hide zero balances**: Control visibility of assets with zero balance. By default, hidden. * **Show/Hide assets unused as margin**: Control visibility of assets with disabled margin usage. * **Show/Hide assets with zero margin ratio**: Control visibility of assets that can't be used as collateral. By default, hidden. ## Trading report [#trading-report] Generate comprehensive reports containing: * **Trade history** * Closed positions * Executed orders * Individual trades * **Transfers history** * All account transfers * **Account statistics** * Total balance * Realized PnL * Position swaps * Position funding * Commissions * Margin Balance, Equity, Margin Used, Free Margin, Margin Level, Unrealized PnL, and As Of — the same account summary values as the HTML statement, see [Client Account Statement](#client-account-statement) To generate a report: 1. Select a custom period of time (UTC time), or generate a report for your entire account history using the **All data** range. The following timeframe presets have been implemented for your convenience: * **Today** * **Current**: week, month, quarter * **Previous**: week, month, quarter * **All data**. 2. Click **Download**. Once generated, the report will be automatically downloaded to your computer as a zipped file. ### Client Account Statement [#client-account-statement] Along with the CSV file, the downloaded archive contains an HTML **Client Account Statement**: a self-contained document you can open directly in your browser, without any additional software. Besides your trade and transfer history, the statement can include: * Your broker's trading entity details and logo, when configured. * The statement period, currency, and the generation date and time, in UTC. * Your account details: legal name, account number, and account type, when available. * A point-in-time account summary — Margin Balance, Equity, Margin Used, Free Margin, Margin Level, and Unrealized PnL — as of the end of the selected period, or the latest available snapshot while the period is still open, with the exact time printed next to the summary. * Legal texts configured by your broker, such as a disclaimer or a confidentiality statement. A field your broker hasn't configured is left out of the statement rather than shown blank. If the requested period ends before account summary data becomes available, the statement states that account summary data isn't available for that period, instead of showing the summary. To save the statement as a PDF file, open the downloaded HTML file in your browser, then use your browser's Print dialog and select **Save as PDF**. ## API token management [#api-token-management] Generate tokens for accessing the [Trading API](https://api-docs.b2trader.b2broker.com/): * **Limit**: 10 tokens per account * **Validity**: 1 year * **Management**: Can be revoked or deleted at any time To generate a token: 1. Click **+ Create new**. 2. In the **New API token** popup, fill in a **Name** for the token, to help you identify it later. 3. Click **Create**. The newly generated token will be displayed and available for copying, along with its name and expiration date. The token only reveals once in the creation popup. Copy and store it securely before closing the popup. The token can't be retrieved again after closing. ## TradingView Webhooks [#tradingview-webhooks] Use TradingView Webhooks to automatically execute orders on your trading account based on alerts from TradingView. When a TradingView alert triggers, it sends a webhook request to B2TRADER, which places an order according to the parameters specified in the alert message. This feature supports all market types: Spot, CFD, and Perpetual Futures. ### Set up the webhook [#set-up-the-webhook] #### Step 1: Create a webhook API key [#step-1-create-a-webhook-api-key] To create a webhook API key in the Trading terminal: 1. Click the **gear icon** in the topbar to open Settings. 2. Navigate to the **TradingView Webhooks** tab. 3. Click **+ Create new**. 4. In the popup, fill in a **Name** for the key. 5. Click **Create**. The popup displays the generated API key and the webhook URL. Copy both values and store them securely. The API key is shown only once at creation. It can't be retrieved after closing the popup. The following limits apply: * Maximum 10 active keys per user * Each key is valid for 1 year from creation * Keys can be revoked at any time #### Step 2: Configure the alert in TradingView [#step-2-configure-the-alert-in-tradingview] 1. In TradingView, create a new alert or edit an existing one. 2. In the **Notifications** section, enable **Webhook URL**. 3. Paste the webhook URL copied from the terminal. 4. In the **Message** field, enter the alert body in JSON format (see [Alert message format](#alert-message-format)). 5. Save the alert. When the alert triggers, TradingView sends the message to B2TRADER, and the order is placed automatically. ### Alert message format [#alert-message-format] The alert message is a JSON object with the following fields: | Field | Required | Description | | ----------------- | ----------- | -------------------------------------------------------------------------- | | `apiKey` | Yes | Webhook API key generated in the terminal | | `accountId` | Yes | Trading account ID | | `symbol` | Yes | Market symbol with type prefix (see [Symbol format](#symbol-format)) | | `side` | Yes | Order side: `buy` or `sell` | | `quantity` | Yes | Order quantity in base asset | | `orderType` | No | `market` (default), `limit`, `stop`, or `stop_limit` | | `price` | Conditional | Limit price. Required for `limit` and `stop_limit` orders | | `stopPrice` | Conditional | Stop price. Required for `stop` and `stop_limit` orders | | `leverage` | No | Leverage ratio. Applicable to CFD and Perpetual Futures markets only | | `takeProfit` | No | Take profit trigger price | | `stopLoss` | No | Stop loss trigger price | | `timeInForce` | No | `gtc` (default), `ioc`, `fok`, or `day` | | `comment` | No | Custom comment, up to 256 characters | | `deduplicationId` | No | UUID for idempotency. Duplicates within 5 minutes return a cached response | #### Symbol format [#symbol-format] The symbol must include a market type prefix: | Market type | Prefix | Example | | ----------------- | ------- | --------------- | | Spot | `spot.` | `spot.btc_usdt` | | CFD | `cfd.` | `cfd.eur_usd` | | Perpetual Futures | `perp.` | `perp.btc_usdt` | #### Examples [#examples] **Market buy order (Spot):** ```json { "apiKey": "wh_key_your_api_key_here", "accountId": "your_account_id", "symbol": "spot.btc_usdt", "side": "buy", "quantity": "0.01" } ``` **Limit sell order with TP/SL (CFD):** ```json { "apiKey": "wh_key_your_api_key_here", "accountId": "your_account_id", "symbol": "cfd.eur_usd", "side": "sell", "orderType": "limit", "price": "1.0900", "quantity": "1000", "leverage": "10", "takeProfit": "1.0800", "stopLoss": "1.0950", "timeInForce": "gtc" } ``` ### Manage webhook API keys [#manage-webhook-api-keys] To view or manage your webhook API keys, navigate to **Settings** > **TradingView Webhooks**. The following information is provided about each key: | Column | Description | | ----------- | ----------------------------------------------- | | **Name** | The name assigned to the key at creation | | **Status** | Current key status: Active, Revoked, or Expired | | **Created** | The date and time the key was generated | | **Expires** | The date and time the key expires | To revoke a key, click the **Revoke** button next to the key entry. ### Rate limits [#rate-limits] Webhook requests are limited to 5 requests per second per user. If this limit is exceeded, the request returns a `429` error code and the order isn't placed. ### Troubleshooting [#troubleshooting] The following table describes common error scenarios and their solutions: | Issue | Cause | Solution | | -------------------------------- | ------------------------------------------------------------ | --------------------------------------------------- | | `Invalid API key` | The API key is incorrect or wasn't copied in full | Generate a new key and update the TradingView alert | | `API key expired` | The key has passed its 1-year validity period | Generate a new key | | `API key revoked` | The key was manually revoked | Generate a new key | | `Invalid symbol format` | The symbol is missing a market type prefix | Add the prefix: `spot.`, `cfd.`, or `perp.` | | `Price required for limit order` | A `limit` or `stop_limit` order is missing the `price` field | Add the `price` field to the alert message | | `Rate limit exceeded` | More than 5 requests were sent within 1 second | Reduce the alert frequency in TradingView | | `Account not found` | The `accountId` doesn't exist or isn't accessible | Verify the account ID in the terminal | A market can be assigned one of the following statuses: * **Open**: The market is operating properly and accepts orders via Trading terminal and API. Market data for charts is persisted. * **Paused**: The market stops accepting incoming orders via Trading terminal and API (previously placed Limit orders still await execution). Market data for charts is persisted. * **Halted**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is persisted. * **Disabled**: The market stops accepting incoming orders via Trading terminal and API. All open Limit orders will be cancelled. Market data for charts is not persisted. * **Archived**: The market is retired from regular operations. It doesn't accept trading activity, isn't included in market synchronization responses, and its historical chart data is deleted. ## Market and Limit orders [#market-and-limit-orders] Orders can be assigned one of the following statuses: * **Started**: The order has passed preliminary checks. * **Pending**: For Limit orders: the order is waiting for a price trigger. * **Working**: The order is being executed. * **Completed**: The order has been executed in its full amount. * **Cancelled**: The order has been cancelled by a trader. * **Rejected**: The order has been rejected by the system and has never been assigned the *Working* status. * **Expired**: The order has been cancelled due to [Time in force](time-in-force) settings. Some part of it may have already been executed. The status is applicable for GTD and Day orders only. ## Stop orders [#stop-orders] Orders can be assigned one of the following statuses: * **Waiting for activation**: The order awaits the Activation price trigger. * **Activated**: The Activation price has been reached, a new Market or Limit order has been placed. * **Rejected**: The Activation price has been reached, but an issue occurred with placing of a new Market or Limit order. The following order types are supported: * **Market**: An instruction to instantly buy or sell a certain asset amount at a currently best price on the market. Such orders are not listed in the order book. * **Limit**: An instruction to buy or sell a certain asset amount at a specified price. Limit orders are placed in the order book and executed only after the market price reaches the specified limit price (or at a better price). * **Stop Market**: Such an order is not placed unless the current market price meets a specified stop (or trigger) price, after which the order is placed as a regular Market order due to be executed or cancelled, depending on its Time in force. * **Stop Limit**: The order is similar to the Stop Market order in the sense that you need to indicate the stop price at which the order must be placed, after which it becomes a regular Limit order awaiting execution at a specified limit price. For Stop buy orders, the stop price should be above the best ask price; for Stop sell orders, the stop price should be below the best bid price (otherwise, the orders will be activated instantly). Stop Market and Stop Limit orders are accepted while a market is closed according to its trading calendar. The order is stored with the standard **Waiting for activation** status and is evaluated against the first available price when the session opens. Market and Limit orders are still rejected while the market is closed. The market's own status must still be Open — a Paused or Halted market rejects every order type. Refer to [Time in force](time-in-force) to learn about execution parameters that can be specified for different order types. When trading on CFD or Perpetual markets, the following triggers can be enabled to manage investments and mitigate risks: * **Take profit**: A take-profit order is used to sell or buy an asset automatically once it hits a predefined price, ensuring the trader locks in profits. For example, if a trader buys ETH at $2,000 and sets the Take profit at $2,100, the platform will sell the ETH automatically when the market price reaches $2100, securing the trader's profit. * **Stop loss**: A stop-loss order is a tool to limit potential losses. It automatically sells an asset when its price falls to a predetermined level. For example, if a trader buys ETH at $2,000 and sets the Stop loss at $1,900, the asset will be sold if the price drops to $1,900, capping the loss to $100 per ETH. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified percentage. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. For example, a trader buys ETH at $2,000 and sets the Trailing stop at $1900 with a 10% adjustment. If ETH rises to $2,200, the Trailing stop increases to $2,090. A drop to $2,090 triggers the sale, locking in gains. The triggers are applicable to all order types: Market, Limit, Stop Market, and Stop Limit. Multiple triggers can be applied simultaneously. The triggers can be adjusted anytime until a position is fully closed. The Take profit, Stop loss, and Trailing stop always operate with the current position volume. For **buy** orders, the triggers are activated by the top-of-the-book **bid** price. For **sell** orders, the triggers are activated by the top-of-the-book **ask** price. Triggers do not activate if a position is in the *Stop out* state. However, if the position persists after the *Stop out*, triggers can then be activated. The following time-in-force settings can be specified for orders: * **FOK** (fill-or-kill): Such orders are either filled instantly or killed (cancelled). In other words, a fill-or-kill order must be fulfilled instantly or not executed at all. FOK orders are used when partial delivery of assets isn't acceptable for any reason. * **IOC** (immediate-or-cancel): This setting implies that any part of an order that can't be filled instantly must be cancelled. Upon placing an IOC order, an attempt will be made to instantly execute it (in full or in part) at the best possible price, after which any remaining, unfilled part will be cancelled. If no amount is available at a specified price upon placing such order, it's cancelled instantly. * **GTC** (good-‘til-cancelled): The default setting applied to all limit orders. Open GTC orders are awaiting execution until they are cancelled explicitly by a trader or filled. * **GTD** (good-‘til-date): Can be applied to limit and stop limit orders. Such orders remain listed in the order book until a specified date or until they are cancelled by a trader. By that time the order can be partially executed. * **DAY**: Can be applied to limit and stop limit orders. Such orders remain listed in the order book until 23:59 of the current day or until they are cancelled by a trader. By that time the order can be partially executed. * **Retry**: Can be applied to market orders only. A Retry order aims to fill your full volume by repeatedly filling the unfilled remainder at current market prices. The average price may be worse than shown, and in thin markets a remainder may stay unfilled. The order expiration time is defined by the time settings specified for the BP, without taking into account the time settings of the devices from which the BP is accessed. ## iOS v1.35 [#ios-v135] This version includes: * **Account Analytics** A new **Account Analytics** screen displays an equity curve and detailed trading statistics for your account. Select a time period and granularity level to filter performance data, and switch between accounts using the built-in account selector. * **AI Assistant** A new **AI Assistant** widget provides AI-powered market analysis for each instrument, including trade recommendations, market sentiment, signal drivers, suggested actions, and key metrics. * **Quick order from the chart** You can now place orders directly from the **Price chart** by tapping a price pin. The **Quick Order** panel opens pre-filled at the selected price level for faster order placement. * **Customizable workspace** You can now reorder and show or hide bottom tabs in **Settings**, allowing you to tailor the terminal layout to your trading preferences. * **Adaptive interface by market type** Tabs, **Margin Level**, and perpetual funding indicators are now automatically hidden for accounts that do not have access to the corresponding market types, providing a cleaner and more focused interface. * **Landscape mode for the chart** Tapping the **Expand** button on the **Price chart** now automatically rotates the chart to landscape mode for a wider view. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.34 [#ios-v134] This version includes: * **Drag Take Profit and Stop Loss on the chart** **Take Profit** and **Stop Loss** levels can now be adjusted by dragging their lines directly on the **Price chart**. Changes are applied to the order immediately, with automatic rollback if an error occurs. * **Demo accounts** Demo trading accounts are now supported, allowing you to practice trading strategies and explore the platform without risking real funds. * **Favourite markets** You can now mark markets as favourites for quick access. Favourite markets appear as chips in the market list and are indicated with an icon in the terminal. * **Credit in margin details** A dedicated **Credit** row has been added to the margin details section, providing visibility into credit amounts allocated to your trading account. * **Comments for orders, positions, and trades** You can now add a comment when placing an order or managing a position. The comment is visible throughout the trading lifecycle — on open orders, open positions, and in trade history. * **Margin Level display** When **Margin Level** data is unavailable, the field now displays "–" instead of 0% for clearer data visibility. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.33 [#ios-v133] This version includes: * **Navigate to market from alerts** You can now open the market chart directly from the **All Alerts** screen, providing faster access to price data for monitored instruments. * **Quick market navigation from trading widgets** Tapping a market name in **Open orders**, **Stop orders**, **Order history**, **Open positions**, or **Closed positions** now switches to that market directly, enabling faster navigation between instruments. * **Hide zero balances settings relocated** The **Hide zero balances** toggle has been moved to the **Assets** tab for more intuitive access. * **Improved backend error messages** Backend error messages are now mapped to user-friendly descriptions, providing clearer feedback when issues occur. * **Improved RAT rounding** All Rate to RAT and margin-related values now display according to the root asset scale rules, ensuring consistent and accurate financial data across the app. * **Corrected Stop Market order calculations** **Value** and **Amount** calculations for **Stop Market** orders have been updated for improved accuracy. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.32 [#ios-v132] This version includes: * **Quick close button for open positions** The **Open positions** widget now features a quick **Close** button on each position card, allowing you to close individual positions with a single tap without opening position details. * **Quick cancel button for open orders** The **Open orders** widget now features a quick **Cancel** button on each order card, enabling faster order cancellation directly from the list view. * **Click-to-fill price from Order book** Tapping a price level in the **Order book** widget now automatically fills the selected price into the **Place order** form, streamlining the order placement process. * **Hide zero balances** A new **Hide zero balances** toggle has been added to the **Assets** widget, allowing you to filter out assets with zero balance for a cleaner portfolio overview. * **Deposit and transfer options** A new **Deposit** button has been added to the account screen, providing quick access to deposit and transfer options. The available actions depend on your platform configuration. * **Redesigned account selection header** The account selection section in the terminal header has been redesigned for improved navigation and a cleaner appearance. * **Updated closed positions design** The **Closed positions** widget has been updated with a refreshed layout for better readability and consistency with other trading widgets. * **Confirmation bottom sheet** Order and position actions now display a confirmation bottom sheet, helping to prevent accidental trades and providing a clearer review step before execution. * **Settings button relocated** The **Settings** button has been moved from the **Price chart** widget to the terminal header for easier access across all views. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.31 [#ios-v131] This version includes: Experience an advanced trading workflow with the introduction of our new **tiered leverage system**, offering dynamic leverage based on position size and enhanced margin visibility. This update also brings improved commission transparency with a dedicated Fees tab, enhanced market info, a new deposit shortcut, and updated screens for tiered commissions. We've also refined formatters to respect your selected app language for a more consistent experience. *** ## iOS v1.30 [#ios-v130] This version includes: * **Notifications widget** A new **Notifications** widget has been implemented providing quick access to system notifications related to price changes, Margin calls, Stop outs, Take profit and Stop loss triggers. * **Closing open positions from the Price chart** Open positions can now be closed directly on the **Price chart** screen ensuring quick reaction to volatile market conditions and efficient trade management. This feature is available if the **Display positions** setting is activated for the Price chart. * **Closing all open positions** The **Open positions** tab now features the **Close all** button that liquidates all open positions at once. This allows you to react immediately to sharp price moves, limiting losses, and removes the necessity to close positions individually. * **Canceling all active orders** The **Open orders** tab now features the **Cancel all** button allowing to close all *Pending* and *Working* orders at once. This reduces reaction time in volatile markets and removes the necessity to close orders individually. * **Market details in Place order** The market name and last price values have been added to the **Advanced** mode of the **Place order** widget. The price is updated in real time. * **Asset balance in RAT** The **Assets** list now displays **Available** and **Total** balance equivalents in RAT for better portfolio overview and value tracking. * **Simplified Markets list** The market full names have been removed from the **Markets** list for cleaner appearance. * **Trading session status** The **Trading session status** in the **Position details** is now accompanied by an info icon and an explanatory tooltip. * **Automatic horizontal scrolling for tabs** The horizontal auto scroll has been added to tabs. Active tabs are now automatically centered for optimal visibility and better accessibility to all available tabs. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.29 [#ios-v129] This version includes: * **Perpetual Futures (PF) trading now available in the app** PF trading is now supported in the app, introducing a new market type and expanding trading opportunities. To support this, the following features have been added for perpetual markets: * The **Funding**/**Countdown** information, including a countdown timer and current funding rate, helping traders stay informed about upcoming settlements. * A new **Funding** tab that displays the current funding rate, a historical chart, and detailed rate and settlement information. * **Updated account creation process** When creating a trading account in the app, the **account type** can now be selected: **Hedging** or **Netting**, enabling traders to plan and adjust their trading strategies to maximize profit or reduce risk. Depending on the platform settings, the option may be prefilled or require manual selection. The account type can’t be changed after the account is created. * **Support for Take Profit, Stop Loss, and Trailing Stop** The **Take Profit**, **Stop Loss**, and **Trailing Stop** triggers are now supported in the app for CFD and PF trading. They can be applied to Market, Limit, and Stop orders, as well as to currently open positions. * **Support for price alerts** Price alerts are now fully supported in the app: * Multiple alerts can be added to monitor different price levels for any instrument. * Configure alerts based on a fixed price or a percentage change. * View a list of all configured alerts for each instrument. * Adjust or delete existing alerts as needed. * Triggered alerts are automatically removed to keep the list up to date. * **Enhanced Price chart widget** Several visual enhancements have been added to the Price chart widget to provide greater clarity and deeper trading insights: * Active **Limit** and **Stop orders** that aren’t yet in final status are now visually represented using horizontal lines – green for buy orders and red for sell orders. This enables traders to view active orders in real time on the chart, relative to current market price movements. This feature can be turned on or off in the Price chart settings. * **Executed orders** are now visually represented using arrow icons – green for buy orders and red for sell orders. This feature is available for the **Line** and **Candles** chart display options and can also be turned on or off in the Price chart settings. * **Stop Loss** (SL) and **Take Profit** (TP) levels are now visually displayed as color-coded horizontal lines, labeled with their abbreviations. Tap on a line to reveal the exact price on the Y-axis and access the option to delete the level. * **Improved filtering** To help traders quickly find the necessary data, advanced filtering options have been added to the following widgets: **Open positions**, **Closed positions**, **Open orders**, **Stop orders**, and **Order history**. New filters include: * **Market options**, such as All Markets, Current Market, Spot, CFD, and Perpetual. * **Time period** selectors specific to each widget. * **Status** filters for the Order history widget. * **Admin-managed orders and positions** On the **Open positions**, **Closed positions**, and **Order history** widgets, if BP Admins have managed positions or orders, this is now indicated in the **Reason** field within the position or order details. Admins may manage these to assist traders upon request, address suspicious activity, mitigate risks, or resolve outstanding positions before account termination. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## iOS v1.28 [#ios-v128] This version includes: * **Performance upgrade** Streamlined top-of-the-book ask and bid prices in the Place Order widget are now received through a dedicated socket for faster obtaining and display. * **Mobile and Web Consistency** Unified colors and naming for a consistent experience across platforms. * **User experience enhancements** Placeholders are now displayed for empty fields and widgets for improved UX clarity. * **Internal improvements** Enhanced system logs for better diagnostics. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. ## Android v3.0.0 [#android-v300] This version includes: * **Lite Mode** A new **Lite Mode** offers a simpler way to trade: a streamlined home screen with your balance, an asset list with **Favourites**, and one-tap access to **Deposit** and **Convert**. **Convert** swaps one asset for another, showing a live price chart and the conversion rate before you confirm. **Lite Mode** supports **Spot** markets only. * **AI Chat** A new in-app **AI Chat** assistant answers questions about your portfolio and the markets, and can prepare trading actions — including multi-step plans — for your approval. * **AI Summary in Market Info** The **Market Info** screen now includes an **AI Summary** tab with an AI-generated overview of key metrics and signal insights. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.12.0 [#android-v2120] This version includes: * **AI Assistant** A new **AI Assistant** provides AI-powered market analysis for each market, including trade recommendations, a 12-month price forecast, market sentiment, signal drivers, suggested actions, and key metrics. * **Account Analytics** A new **Account Analytics** screen displays an equity curve and detailed trading statistics for your account. * **Account status indicators** Account statuses such as **Halted** and **Frozen** are now shown with badges and a warning banner, and the related trading actions are restricted accordingly. * **Quick order from the chart** You can now place orders directly from the **Price chart**, enabling faster reaction to market movements. * **Take Profit / Stop Loss on the chart** **Take Profit** and **Stop Loss** levels can now be set by dragging their lines directly on the **Price chart**, with support for trailing Stop Loss. * **Cross-price limit order warning** A warning is now displayed before you place a **Limit** order whose price crosses the top of the **Order book**. This warning can be enabled or disabled in **Settings**. * **Customizable trading terminal** You can now customize the trading terminal layout and tab order from the new **Workspace** settings. * **Adaptive interface by market type** Margin- and perpetual-related tabs and indicators are now hidden for accounts with access to **Spot** markets only, providing a cleaner interface tailored to the account type. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.11.0 [#android-v2110] This version includes: * **Comment field in Place Order** An optional **Comment** field has been added to the **Place order** form in **Advanced Mode**. The field supports up to 100 characters and is available for all order types across Spot, CFD, and Perpetual markets. * **Full-screen chart mode** The **Price chart** widget now supports full-screen mode. Tap the **Expand** button to switch to a landscape view for a more detailed chart analysis. * **Credit information in margin details** A **Credit** row has been added to the margin section, providing visibility into credit amounts allocated to trading accounts. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.10.0 [#android-v2100] This version includes: * **Quick close button for open positions** The **Open positions** widget now features a quick **Close** button on each position card, allowing you to close individual positions with a single tap without opening position details. * **Demo accounts** Demo trading accounts are now supported in the app, allowing you to practice trading strategies and explore the platform without risking real funds. * **Favourite markets** You can now mark markets as favourites for quick access. Favourite markets are synchronized between the web and mobile terminals. * **Click-to-fill price from Order book** Tapping a price level in the **Order book** widget now automatically fills the selected price into the **Place order** form, streamlining the order placement process. * **Hide zero balances** A new **Hide zero balances** toggle has been added to the **Assets** widget, allowing you to filter out assets with zero balance for a cleaner portfolio overview. * **Deposit and transfer options** A new **Deposit** button has been added to the account screen, providing quick access to deposit and transfer options. The available actions depend on your platform configuration. * **Navigate to market from alerts** You can now open the market chart directly from the **All Alerts** screen, providing faster access to price data for monitored instruments. * **Quick market navigation from trading widgets** Tapping a market name in **Open orders**, **Stop orders**, **Order history**, **Open positions**, or **Closed positions** now switches to that market directly, enabling faster navigation between instruments. * **Improved RAT rounding** All Rate to RAT and margin-related values now display according to the root asset scale rules, ensuring consistent and accurate financial data across the app. * **Improved market status display** The **Market Closed** label is now automatically removed once live data starts updating, providing a more accurate representation of market availability. * **Corrected Stop Market order calculations** **Value** and **Amount** calculations for **Stop Market** orders have been updated for improved accuracy. * Bug fixes and improvements to ensure a more seamless and efficient user experience. *** ## Android v2.9.0 [#android-v290] This version includes: This update introduces the new **tiered leverage system**, enhanced fee transparency and fully redesigned Fees tab, quick Deposit/Trade shortcuts on account cards for faster navigation and various UI improvements across the app. *** ## Android v2.8.0 [#android-v280] This version includes: * **Asset balance in RAT** The **Assets** list now displays **Available** and **Total** balance equivalents in RAT for better portfolio overview and value tracking. * **Simplified Markets list** The market full names have been removed from the **Markets** list for cleaner appearance. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.7.0 [#android-v270] This version includes: * **Key position parameters on the TP/SL editing** Key position parameters, such as **Name**, **Side**, **Amount**, **Open price**, **Current price**, and **Leverage** are displayed at the top of the Take Profit/Stop Loss configuration screen to give you immediate, accurate context and reduce input errors. Values are updated in real time. * **Closing positions on the Price chart** You can now close positions directly on the **Price chart** widget, by tapping a position indicator. * **Canceling all active orders** The **Open orders** widget now features the **Cancel all** button allowing to close all *Pending* and *Working* orders at once. This reduces reaction time in volatile markets and removes the necessity to close orders individually. * **Closing all open positions** The **Open positions** widget now features the **Close all** button allowing to liquidate all open positions at once. This allows you to react immediately to sharp price moves, limiting losses, and removes the necessity to close positions individually. * **Closed position details** The **Order type** and **Time in force** values are now displayed for every closed position to improve trade execution transparency. * **Price chart settings saved** The **Price chart** widget now remembers your preferred timeframe and chart type settings. Each time you open the terminal, it displays the chart with your last selected settings. * **Market details in Place order** The market name and last price values have been added to the **Advanced** mode of the **Place order** widget. The price is updated in real time. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.6.0 [#android-v260] This version includes: * **Perpetual Futures (PF) trading now available in the app** PF trading is now supported in the app, introducing a new market type and expanding trading opportunities. To support this, the following features have been added for perpetual markets: * The **Funding/Countdown** information, including a countdown timer and current funding rate, helping traders stay informed about upcoming settlements. * A new **Funding** tab that displays the current funding rate, a historical chart, and detailed rate and settlement information. * **Improved filtering** To help traders quickly find the necessary data, advanced filtering options have been added to the following widgets: **Open positions**, **Closed positions**, **Open orders**, **Stop orders**, and **Order history**. New filters include: * **Market options**, such as All Markets, Current Market, Spot, CFD, and Perpetual. * **Time period** selectors specific to each widget. * **Status** filters for the Order History widget. * **Enhanced Price chart widget** Several visual enhancements have been added to the Price chart widget to provide greater clarity and deeper trading insights: * Active **Limit** and **Stop orders** that aren’t yet in final status are now visually represented using horizontal lines – green for buy orders and red for sell orders. This enables traders to view active orders in real time on the chart, relative to current market price movements. This feature can be turned on or off in the Price chart settings. * **Executed orders** are now visually represented using arrow icons – green for buy orders and red for sell orders. This feature is available for the **Line** and **Candles** chart display options and can also be turned on or off in the Price chart settings. * **Stop Loss** (SL) and **Take Profit** (TP) levels are now visually displayed as color-coded horizontal lines, labeled with their abbreviations. Tap on a line to reveal the exact price on the Y-axis and access the option to delete the level. * Expanded capabilities for account administration and risk management for Brokers have been added. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.5.0 [#android-v250] This version includes: * **Stop Loss and Take Profit on the Price chart widget** * Introduction of Stop-Loss (SL) and Take-Profit (TP) lines on the Price chart for enhanced trading insights. * TP and SL are displayed as color-coded lines with only abbreviations visible. * Tap to view prices on the Y-axis and access deletion options. * **Full support for price alerts in the app** * Alerts can be set for specific price levels. * Alerts can be configured based on either a set price or a percentage change. * A list of configured alerts is available for each instrument. * Options to delete or adjust alerts are provided. * Triggered alerts are automatically removed from the list. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. *** ## Android v2.4.0 [#android-v240] This version includes: * **New mobile features** * Introduction of Take Profit, Stop Loss, and Trailing Stop functionalities in the Mobile app. * Support for Netting accounts in the Mobile app. * **Mobile and Web consistency** Unified colors and naming for a consistent experience across platforms. * **User experience enhancements** For order lists, the All/Spot/CFD filter is only displayed when there are both Spot and CFD orders, for improved UX clarity. * Bug fixes and improvements affecting the display and usability of the app's interface for a more seamless user experience. ## August 26, 2026 [#august-26-2026] ### New features [#new-features] #### Sound notification settings [#sound-notification-settings] You can now independently control two notification sounds in terminal settings: the existing **price alert sound** (on by default) and a new **trade executed sound** (off by default). Your preference persists across sessions and devices. #### Edit pending orders in place [#edit-pending-orders-in-place] Resting **Stop** and **Limit** orders can now be modified directly — adjust price, size, or price triggers without cancelling and recreating the order. #### Account status indicators [#account-status-indicators] Trading accounts can now show one of four statuses — **Active**, **Halted**, **Frozen**, or **Archived**. When trading, deposits, or withdrawals are restricted on an account, you now see a clear status badge and an explanatory message instead of a silent failure. ## July 30, 2026 [#july-30-2026] ### New features [#new-features-1] #### Retry time-in-force for market orders [#retry-time-in-force-for-market-orders] A new **Retry** time-in-force is now available for market orders alongside **IOC**. A Retry order aims to fully execute the requested volume by resubmitting or filling the remainder rather than leaving it open. Closing a **CFD** or **Perpetual Futures** position now uses Retry by default, so a large position closes completely in one action. #### AI Assistant: external market data [#ai-assistant-external-market-data] The **AI Assistant** widget can now surface external market statistics (price, market cap, 24-hour volume, all-time high/low) and recent third-party news for the asset behind a market, alongside its existing platform-data analysis. *** ### Improvements [#improvements] #### Guest mode layout redesign [#guest-mode-layout-redesign] The default **Guest mode** layout has been redesigned with a cleaner 5-widget arrangement (chart, AI Assistant, place order, order book, depth) and refined chart defaults. *** ### Resolved issues [#resolved-issues] * Resolved an issue where **Guest mode**'s default chart showed incorrect data for **Gold (XAU/USD)**; the default chart is now **BTC/USD**. * Resolved an issue that could delay instant withdrawal processing. ## June 10, 2026 [#june-10-2026] ### New features [#new-features-2] #### Guest mode [#guest-mode] A new **Guest mode** lets you explore the Trading terminal without signing in. As a guest you can browse markets and market categories, follow live price streams and interactive charts, and open the **AI Assistant** widget for market analysis. A dedicated guest workspace is provided, and the [Place order](../widgets/place-order) panel opens in the advanced view by default. A **Sign in** action is always available so you can switch to a full trading session at any time. ## June 2, 2026 [#june-2-2026] ### Improvements [#improvements-1] #### Full account history in Trading reports [#full-account-history-in-trading-reports] You can now generate [Trading reports](../get-started/settings) for your entire account history. The previous **92-day** limit has been removed, and a new **All data** range has been added to the report period selector alongside the existing presets. #### Stop orders during closed market sessions [#stop-orders-during-closed-market-sessions] You can now place **Stop** orders while a market is closed according to its trading schedule. The order is accepted and activates automatically once the market reopens, instead of being rejected at placement. #### More accurate unrealized PnL [#more-accurate-unrealized-pnl] Unrealized PnL is now calculated using the correct order book side for each position direction, improving the accuracy of the PnL shown across your widgets. #### Limit price crossing warning [#limit-price-crossing-warning] When you place a limit order at a price that crosses the current top of book, the terminal now shows a warning, helping you avoid an unintended immediate execution. ## April 9, 2026 [#april-9-2026] ### New features [#new-features-3] #### Trading credit [#trading-credit] Your broker can now grant you **trading credit** — a promotional bonus balance you can use for trading. Credit appears as a separate **Credit Balance** alongside your own funds and becomes available for placing trades immediately upon issuance. You are notified when credit is granted or revoked. Trading credit is a trading-only bonus and cannot be withdrawn as cash, so it is excluded from your withdrawable balance. *** ### Improvements [#improvements-2] #### Fee-aware 100% allocation [#fee-aware-100-allocation] The **100%** button in the [Place order](../widgets/place-order) widget now accounts for commissions and margin requirements when allocating funds, so the calculated amount reflects what is actually available for the trade. #### Faster price updates [#faster-price-updates] The price update frequency in terminal widgets has been increased, providing more responsive market data across your workspace. ## March 18, 2026 [#march-18-2026] ### New features [#new-features-4] #### Webhook API for TradingView alerts [#webhook-api-for-tradingview-alerts] A new **Webhook API** has been added, enabling you to connect **TradingView** alerts to your trading workflow. You can generate and copy authentication tokens directly from the Trading terminal to configure webhook-based alerts in **TradingView**. *** ### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. ## March 3, 2026 [#march-3-2026] ### New features [#new-features-5] #### Long-term trading data history [#long-term-trading-data-history] The three-month limit on trading data history has been removed. You can now access the full history of your orders, positions, and trades without time restrictions, enabling deeper analysis of past trading activity. #### AI Assistant widget [#ai-assistant-widget] A new **AI Assistant** widget is now available in the Trading terminal. The widget provides AI-powered market analysis for the selected instrument, including: * A recommendation gauge displaying a score from **Strong Sell** to **Strong Buy** * A 12-month price forecast with target price and percentage change * A market sentiment bar showing the bullish/bearish ratio * Signal drivers section with technical, on-chain, and sentiment factors * Suggested trading actions and key market metrics The widget can be added to any workspace like other terminal widgets. *** ### Improvements [#improvements-3] #### Updated order cancellation confirmation [#updated-order-cancellation-confirmation] The order cancellation confirmation dialog now includes a **Don't ask again** checkbox when canceling triggers from the **TradingView** chart. This allows you to skip the confirmation step for future trigger cancellations, streamlining the trading workflow. *** ### Resolved issues [#resolved-issues-2] There have been no customer-facing issues reported in this release. ## February 25, 2026 [#february-25-2026] ### New features [#new-features-6] #### Redesigned Market Depth widget [#redesigned-market-depth-widget] The [Market Depth](../widgets/market-depth) widget has been completely redesigned with an updated visual layout. Bid and ask labels are now displayed when hovering over a price level, providing better visibility into the order book at a glance. #### Redesigned widget adding experience [#redesigned-widget-adding-experience] The process of adding widgets to workspaces has been redesigned with a more intuitive and streamlined flow. The new interface makes it easier to customize your trading workspace layout by providing a clearer visual selection of available widgets. #### Order and position comments [#order-and-position-comments] A new **Comment** field has been added to orders, positions, and trades throughout the Trading terminal. You can now attach notes directly to your trading activities, making it easier to annotate trading decisions and keep records of your reasoning. #### Favorites [#favorites] You can now mark instruments as favorites for quick access across the Trading terminal. The [Favorite markets](../get-started/customizing-your-terminal#favorite-markets) feature integrates with the instrument selection panel, making it faster to locate and trade your preferred instruments. #### Multi-language support [#multi-language-support] The Trading terminal now supports additional languages: **Chinese (Simplified)**, **Spanish**, **Portuguese**, **French**, **Turkish**, and **Farsi**. Existing translations have also been updated to reflect the latest interface changes. *** ### Improvements [#improvements-4] #### Updated order calculations [#updated-order-calculations] The **Value** and **Amount** calculation logic has been improved for more accurate order handling: * For **Stop Market** orders, the estimated values are now calculated using updated formulas that align with the actual execution logic. * For **Spot** market orders, the **Slippage Rate** is now correctly applied only to buy orders and has been removed from sell order calculations. * The **Slippage Rate** attribute has been removed from **CFD** and **PF** market forms and information displays, as it is not applicable to these market types. #### Improved TP/SL trigger management [#improved-tpsl-trigger-management] Removing Take Profit and Stop Loss triggers is now easier in the TradingView charting widget. Instead of opening a dialog and unchecking the trigger, you can now click the close button directly on the trigger to remove it immediately. #### Updated default columns [#updated-default-columns] The default columns displayed in the [Open positions](../widgets/open-positions) and [Open orders](../widgets/open-orders) widgets have been updated to show the most relevant information by default, reducing the need for manual customization. #### Account margin value formatting [#account-margin-value-formatting] Account margin values such as **Balance**, **Equity**, **Margin**, and **Free margin** in the [Margin](../widgets/margin) widget are now formatted according to the **Root Asset Scale**. This ensures that numerical precision matches the asset's defined scale, eliminating misleading decimal places. #### Updated Settings experience [#updated-settings-experience] The [Settings](../get-started/settings) experience has been improved: * The **Action Confirmation** section text has been rewritten for clarity. The description now reads: "Choose which actions will require additional confirmation," making the toggle behavior immediately clear. * The **One-click trading** configuration has been updated with improved toggle controls and clearer options for enabling or disabling confirmation dialogs on trading actions. #### Improved order validation [#improved-order-validation] Order validation logic has been updated across the Trading terminal, providing clearer feedback on invalid inputs and reducing errors during order placement and management. #### Workspace tab styling [#workspace-tab-styling] Visual improvements have been applied to workspace tabs: gaps have been added between tabs for better visual separation, tab padding has been corrected, and hovered tabs now display a proper card-style fill matching the updated design system. ## December 19, 2025 [#december-19-2025] ### New features [#new-features-7] #### Volume-based tiered commissions [#volume-based-tiered-commissions] You can now benefit from **volume-based commission tiers** that automatically reduce your trading fees as your monthly volume grows. **Key points**: * **Trade more, pay less**: For markets with tiered fees, your 30‑day trading volume (in the root asset, for example USD) is tracked across all markets included in the same group. As you move into higher tiers, your commission percentage decreases. * **Clear fee overview**: Open [Market info](../get-started/customizing-your-terminal#market-info-panel) and switch to the **Fees** tab to see your **Current volume** for the month, the configured **Min. fee**, and the full **Commission tiers** table with volume ranges and fee %. A check mark highlights the tier you are currently in. * **Grouped volume**: Your traded volume is aggregated across markets to which the dynamic commission is applied. * **No surprises**: Orders on markets without tiered fees continue to use the existing flat commission model. Tiered markets simply adjust your fee according to the tier that matches your current trading volume. #### New settings [#new-settings] The [Settings](../get-started/settings) menu has been enriched with the following configuration options: * **Widgets**: This updated section now provides access to multiple widgets’ display settings. Along with existing [Price chart](../widgets/price-chart), you can now configure: * One-click trading for [Open positions](../widgets/open-positions): When enabled, single and bulk position closing are executed immediately, without going through additional confirmation dialogs. * One-click trading for [Open orders](../widgets/open-orders): When enabled, single and bulk order cancellations are executed immediately, without going through additional confirmation dialogs. * **API token management**: This new section allows you to generate and manage tokens for accessing the [Trading API](https://api-docs.b2trader.b2broker.com/). Up to 10 tokens can be generated per account. The validity period for each token is one year. The tokens can be revoked or deleted anytime. *** ### Improvements [#improvements-5] #### Responsive widget layout [#responsive-widget-layout] Widget content now adapts dynamically to the available space, ensuring that key information such as primary values, titles, and critical actions remains visible even when widgets are resized or minimized. Layouts have been refined to avoid unnecessary empty areas while preventing clipping of important elements, delivering a more readable and informative experience across all widget sizes. #### Clearer margin level display [#clearer-margin-level-display] The [Margin](../widgets/margin) widget has been updated to provide a clearer signal. Now, whenever no margin is used (for example, when you have no open positions), the **used margin** value displays **–** instead of 0%. This aligns with common brokerage practices and helps you better understand the current risk state at a glance. #### Smarter default filters for Assets and Account margin [#smarter-default-filters-for-assets-and-account-margin] Certain default filters are now applied automatically when the Trading terminal is opened for the first time. In the [Assets](../widgets/assets) widget, **Hide zero balances** is enabled by default, so assets with zero balance are not shown. In the [Account margin](../get-started/settings#account-margin) settings, **Hide zero balances** and **Hide assets with zero margin ratio** are enabled by default, hiding assets that carry no margin or balance. If you change any of these filters, the platform remembers their states. #### Improved quick trade panels [#improved-quick-trade-panels] The **Market quick trade panel** has been moved not to cover the important controls of the [Price chart](../widgets/price-chart). Additionally, it now displays the **cross icon** to quickly close the panel if needed. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## November 7, 2025 [#november-7-2025] ### New features [#new-features-8] #### Tiered leverage system [#tiered-leverage-system] With this release, we're excited to introduce the **tiered leverage system** that provides more sophisticated leverage options based on your position sizes, offering better risk management. **Key points:** * **Dynamic leverage tiers**: Markets can now offer tiered leverage where your maximum available leverage decreases as your position size increases. This allows you to access higher leverage on smaller positions while maintaining appropriate risk controls on larger trades. * **Enhanced market information**: Markets with tiered leverage now display comprehensive leverage information in the **Market info** panel. A new **Leverage** tab shows all available tiers, including the notional value ranges and maximum leverage for each tier. * **Improved position tracking**: Your open positions now display both the leverage you selected when opening the position (**Requested leverage**) and the actual leverage being applied (**Leverage**). Detailed tooltips explain how these values are calculated, giving you better visibility into your margin usage. * **Smart leverage selection**: When placing orders on markets with tiered leverage, the system automatically calculates your margin requirements across all applicable tiers. You can see the exact margin required before placing your order. **How it works** For markets with dynamic leverage, your position is allocated across different tiers based on its notional value. Each tier has its own maximum leverage limit, typically starting with higher leverage for smaller positions and decreasing as position size grows. This allows you to maintain appropriate risk management. **Order placement** When trading on tiered markets, you can still select your preferred leverage (up to the maximum allowed for the first tier), and the system will automatically apply the appropriate leverage limits. The margin calculator shows you the exact requirements before you place your order. All existing positions continue to operate normally with no changes to your current trading experience. Markets without tiered leverage continue to work exactly as before. *** ### Improvements [#improvements-6] #### Improved documentation experience [#improved-documentation-experience] The documentation window is now fully resizable, allowing traders to adjust both vertical and horizontal dimensions independently. All screenshots can now be zoomed, making detailed interface elements clearly visible. #### Streamlined market selection [#streamlined-market-selection] The market selection control is now displayed as the **chevron icon** directly next to the market name in widgets. The magnifying glass icon has been removed. Both the market name and chevron are now clickable and open the market selector. #### Reorganized market information access [#reorganized-market-information-access] The market info popover has been relocated under the **info icon** in the widget header to maintain accessibility while keeping the market name area focused solely on selection functionality, creating a cleaner and more consistent user interface. #### Enhanced workspace tab design [#enhanced-workspace-tab-design] A clear distinction between active and inactive workspace tabs has been achieved due to intuitive styling. Workspace option buttons are now hidden by default to reduce visual clutter and only appear when tabs are active or being hovered over. This applies to both default and custom workspace tabs, creating a cleaner interface while maintaining full functionality when needed. *** ### Resolved issues [#resolved-issues-4] There have been no customer-facing issues reported in this release. ## October 9, 2025 [#october-9-2025] ### New features [#new-features-9] #### Placing orders from the Price chart [#placing-orders-from-the-price-chart] The [Price chart](../widgets/price-chart) widget now supports direct order placement with two new quick trading panels. The **Market quick trade panel** provides a persistent interface for instant buy/sell orders, while the **Limit quick trade panel** allows hover-based order placement at specific price levels. When enabled through **Price chart settings**, both panels offer configurable amount presets and leverage ratio selection for margin trading (when applicable), creating a seamless trading experience without leaving the chart view. #### Bulk order canceling [#bulk-order-canceling] The [Open orders](../widgets/open-orders) widget introduces a **Cancel all** button that closes all active orders simultaneously. This feature provides better risk management capabilities during volatile market conditions. #### In-platform documentation [#in-platform-documentation] User documentation is now integrated directly within the Trading terminal interface. This eliminates the need to switch between applications when accessing help materials or reference guides, keeping essential information readily available during trading sessions. #### New market subtype [#new-market-subtype] The new **Commodities** subtype has been added for CFD markets, enhancing the market categorization system. *** ### Improvements [#improvements-7] #### Enhanced position tracking [#enhanced-position-tracking] A new **Direction** column has been added to **Trades** info in the [Open positions](../widgets/open-positions) and [Closed positions](../widgets/closed-positions) widgets. It indicates whether a position size increased (In) or decreased (Out) as a result of each trade. This enhancement provides clearer visibility into position movement patterns. #### Cross rates calculation precision [#cross-rates-calculation-precision] Accuracy for cross-rate calculations has been improved by introducing a new cross-rate scale parameter. It has a default value of 8 and can be adjusted in configuration files. This addresses the previous limitation where cross rates were rounded to the root asset type scale (typically 2 decimal places), causing incorrect zero values in certain scenarios. The improvement ensures accurate cross-rate calculations across all currency and cryptocurrency pairs, regardless of their relative values. #### Redesigned Settings interface [#redesigned-settings-interface] The **Settings** menu has been restructured with a new tabbed popup interface. Related configuration options are now logically grouped, making settings easier to navigate and manage. #### Pre-filled Limit order price [#pre-filled-limit-order-price] Limit order placement now includes automatic price pre-population using the best bid or ask price from the order book. This static pre-fill reduces manual entry requirements and helps prevent pricing errors during order submission. #### Updated sorting of open positions [#updated-sorting-of-open-positions] [Open positions](../widgets/open-positions) are now sorted chronologically with the newest positions displayed at the top, improving visibility of recent trading activity. #### Improved messages [#improved-messages] User communications have been updated throughout the platform, including improved Introduction tour messaging for better onboarding and clearer system notifications. #### UI enhancements [#ui-enhancements] UI improvements for this release include: * **Support for dynamic resizing of the trading interface layout**: The trading interface now features a responsive layout system that dynamically adjusts to browser window resizing. Widgets automatically scale and reposition to maintain optimal viewing regardless of screen size changes. * **Loader**: [Order history](../widgets/order-history) and [Closed positions](../widgets/closed-positions) widgets now display loading indicators when fetching additional data. * **Improved PnL representation**: When displayed on charts, the PnL values are now accompanied by "+" or "–" signs for immediate profit/loss recognition. * **Improved scrollbars**: Scrollbar positioning has been refined to prevent overlay of table content, ensuring all data remains visible and accessible. *** ### Resolved issues [#resolved-issues-5] There have been no customer-facing issues reported in this release. ## July 2, 2025 [#july-2-2025] ### New features [#new-features-10] #### Trading reports [#trading-reports] We've implemented a new feature enabling you to generate trading reports for a specific period of time and download them as zipped CSV files to your computer. The report includes a detailed information on: * **Trade history** * Closed positions * Executed orders * Trades * **Transfers history** * **Account statistics** * Total balance * Realized PnL * Swaps * Funding * Commissions The data is available for any period within the last **92 days** (UTC time). The following timeframe presets have been implemented for your convenience: * Today * Current: week, month, quarter * Previous: week, month, quarter Access the new **Trading report** menu under the **Settings** icon on the topbar of the Trading terminal. *** ### Improvements [#improvements-8] #### Admin-managed orders and positions [#admin-managed-orders-and-positions] In the [Open positions](../widgets/open-positions), [Closed positions](../widgets/closed-positions), and [Order history](../widgets/order-history) widgets, if BP Admins have managed positions or orders, this is now indicated in the Reason field within the position or order details. Admins may manage these to assist traders upon request, address suspicious activity, and mitigate risks. *** ### Resolved issues [#resolved-issues-6] There have been no customer-facing issues reported in this release. ## May 30, 2025 [#may-30-2025] ### New features [#new-features-11] #### PF trading [#pf-trading] We are excited to introduce **Perpetual Futures (PF) trading** on our platform. These contracts feature a funding fee mechanism based on the Mark price and Funding rate. A positive rate means Long positions pay Shorts, and a negative rate means the reverse. You can see the countdown to the next funding fee settlement in the [Market summary](../widgets/market-summary) widget. This update also includes a new market type — Perpetual — enhancing your trading opportunities. *** ### Improvements [#improvements-9] #### Price chart setting [#price-chart-setting] The [Price chart](../widgets/price-chart) widget now supports displaying of open positions, as well as open and executed orders. Click the **gear icon** in the topbar to access Price chart settings and enable desired options. #### Close all positions [#close-all-positions] The [Open positions](../widgets/open-positions) widget now features a new **Close all** option, offering enhanced management capabilities. This update provides a more efficient way to handle multiple positions by allowing you to simultaneously close: * All open positions * All open positions with positive PnL * All open positions with negative PnL #### Enhanced price control [#enhanced-price-control] The following enhancements have been implemented for the [Price control](../widgets/price-control) widget: * **Editable price alerts**: You can now adjust existing price alerts by clicking a price. * **Enhanced market additions**: Price and percentage fields now automatically open for editing when a new market is added to the widget. * **Visual indicators**: Arrows near price triggers aren’t shown if the price feed is unavailable, reducing clutter and potential confusion. #### Historical data limits [#historical-data-limits] The [Order history](../widgets/order-history) and [Closed positions](../widgets/closed-positions) widgets now provide historical data with a limit of **92 days**. *** ### Resolved issues [#resolved-issues-7] There have been no customer-facing issues reported in this release. ## April 17, 2025 [#april-17-2025] ### New features [#new-features-12] #### Netting account type [#netting-account-type] With this release, a new **Netting** account type has been enabled. It intelligently consolidates all orders placed on the same market into a single position. Previously, the system supported only Hedging, where each order opens a separate position. **Key points of netting** * **Reduced margin requirements**: Instead of calculating margin requirements separately for each position, netting combines them, lowering overall capital needs. * **Lower trading costs**: By holding opposing positions, traders often incur double position swaps. Netting treats these positions as one, reducing unnecessary costs. * **Streamlined position management**: Managing multiple positions manually can become complicated, especially when balancing between different trade sizes, directions, leverages and margin requirements. Netting helps with it by combining positions into a single one. **Netting VS Hedging** Netting may sometimes lack the flexibility required for complex hedging strategies. In contrast, hedging excels by allowing traders to hold both long and short positions simultaneously without offsetting them. This enhances the ability to track and adjust individual trades easily while permitting precise margin management for separate positions. The Hedging type is perfectly suited for traders seeking detailed control over their positions. On the other hand, the Netting type ensures simplicity and reduced margin requirements, making it the perfect choice for straightforward trading strategies. **Workflow changes** When opening a new trading account, you must now choose its type: either Hedging or Netting. This choice is permanent and influences all future trades in the account. In the account selection interface, each account displays its type: `H` for Hedging or `N` for Netting. All existing accounts are automatically assigned to the Hedging type. *** ### Improvements [#improvements-10] #### Improved widget control [#improved-widget-control] With this release, you now have enhanced control over the viewing experience: * **Configuring widget columns**: Certain widgets allow you to configure widget columns in a way that best suits your needs, offering you the flexibility to select which columns you wish to display or hide. Additionally, you can arrange the order of these columns for your convenience, ensuring that the information you prioritize is always at your fingertips. * **Rearranging widget tabs**: All widgets now feature drag-and-drop functionality for rearranging tabs effortlessly. This user-friendly feature offers a more customized and organized interface, making it easier than ever to personalize your widget experience. #### Enhanced Order book [#enhanced-order-book] The Order book widget has been upgraded with new customizable settings. This update introduces intuitive controls, empowering you to adjust the widget view according to your preference: * **Full view**: Shows both buy and sell orders along with the market spread. * **Buy only view**: Displays only buy orders and the market spread. * **Sell only view**: Displays only sell orders and the market spread. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. ## January 15, 2025 [#january-15-2025] ### New features [#new-features-13] #### Take profit, Stop loss, Trailing stop [#take-profit-stop-loss-trailing-stop] With this release, the following new triggers for open positions have been implemented on the platform: * **Take profit**: A take-profit trigger is used to close a position automatically once the market hits a predefined price, ensuring the trader locks in profits. * **Stop loss**: A stop-loss order is a trigger to limit potential losses. It automatically closes a position when its price changes to a predetermined level. * **Trailing stop**: A trailing-stop order allows a trader to set a Stop price that dynamically adjusts as the market price moves. It's different from a regular stop-loss order because the Stop price isn't stationary but follows the market price by a specified value. When the asset price moves favorably, the Stop price updates, securing potential gains. However, if the price falls, the Stop price stays fixed to protect profits or limit losses. These settings can be used when trading on CFD markets and can be applied to Market, Limit, and Stop orders, as well as for currently open positions. The new settings can be enabled when placing an order via the [Place order](../widgets/place-order) widget (Advanced mode). Until a position is fully closed, they can also be adjusted or canceled via the [Open positions](../widgets/open-positions) widget. The information about applied settings is also available in the corresponding widgets: [Closed positions](../widgets/closed-positions), [Open orders](../widgets/open-orders), and [Order history](../widgets/order-history). *** ### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December, 2024 [#december-2024] #### New features [#new-features-14] ##### CFD trading [#cfd-trading] With this release, we're excited to announce the support for CFD (Contract for Difference) trading on our brokerage platform. This empowers you to trade with dynamic leverage, using your funds as collateral to secure positions confidently. Enjoy the flexibility to go both long and short, capitalizing on both bullish and bearish markets. Our CFD trading support boasts an intuitive interface, robust risk management tools, and real-time data. ##### Innovative market approach and instrument picker [#innovative-market-approach-and-instrument-picker] * **Market type**: Markets are now classified into Spot and CFD, reflecting their differing parameters. A panel indicating CFD or Spot is now included in all widgets. * **Market parameters and trading schedule**: Click a market name to access its key parameters and scheduled trading sessions. * **Market categories**: Now accessible via the top bar, offering a hierarchical view for easier selection and switching between markets. ##### Account margin settings [#account-margin-settings] Access the new [Account margin settings](../get-started/settings) to monitor your balances and configure assets to be used as collateral for CFD trading. ##### Reworked Place order widget [#reworked-place-order-widget] Place any order with a [single widget](../widgets/place-order) now. Choose Quick IOC Market or Stop with adjusted leverage — all conveniently in one place, along with an order summary. ##### Positions [#positions] Discover two new widgets for position monitoring: * [Open positions](../widgets/open-positions): Offers real-time monitoring of currently open positions with price changes, PnL, used margin, and other parameters. * [Closed positions](../widgets/closed-positions): Provides historical data on position details, prices, and realized PnL. ##### Risk management [#risk-management] You now have three essential widgets to maintain control: * [Margin](../widgets/margin): Monitor your margin account parameters in real time and respond swiftly to changes. * [Price control](../widgets/price-control): Set price alerts tailored to your specific needs and parameters. * [Messages](../widgets/messages): Receive system notifications and price alerts directly. ##### Market data [#market-data] Two new widgets have been introduced to enhance market monitoring: * [Market summary](../widgets/market-summary): Provides detailed information and updates on price changes for a specific market. * [All markets](../widgets/all-markets): Displays price change statistics across all markets simultaneously. #### Improvements [#improvements-11] * Performance has increased significantly, allowing each trader to hold up to 1,000 CFD positions open. * Limits have been increased to 3,000 requests per second. #### Resolved issues [#resolved-issues-10] There have been no customer-facing issues reported in this release. *** ### June 20, 2024 [#june-20-2024] #### Improvements [#improvements-12] * Account selection is now available from the topbar of the Trading terminal. Once you change your account, all the widgets will automatically adjust to show relevant information for the selected account. * Tabs are now available in the Trading terminal. You can place up to 10 tabs to open multiple workspaces simultaneously for better information organization. You can utilize pre-configured layouts for your workspaces or create custom ones. *** ### June 13, 2024 [#june-13-2024] #### New features [#new-features-15] ##### iOS mobile application [#ios-mobile-application] With this release, our team is thrilled to announce the launch of the brand-new iOS mobile app. The mobile app is closely integrated with B2CORE mobile. Along with single sign-on implemented, it allows you to seamlessly navigate between the apps, without re-entering credentials. In the mobile app, just like in the web version of the Trading terminal, you can access all of your BP accounts, place orders, monitor market data, and so on. For your convenience, it all can be done in a very similar way as in the web version. A consistent and user-friendly interface makes using the app easy and intuitive. Among the key features and services that the new BP mobile offers: * The account list with detailed balances, to always keep your funds under control. Creation and renaming of accounts, to keep your funds well organized. * Asset balances screen, with the amounts of free and frozen funds specified and with the possibility to hide assets with zero balances. * The Order book and price chart, to monitor and analyze trading data and make buy or sell decisions, with a quick and easy jump to the order placing screen. * Candles and line charts, with easy switching and the possibility to scroll the data for historical values. * Limit & Market order placing, with all time in force options supported in the Web version (Market: IOC, FOK; Limit: IOC, FOK, GTC, GTD, Day). * Open and history orders lists, with easy access to order parameters and details, quick canceling or repeating an order. * Light and dark themes and many more. ### October 18, 2023 [#october-18-2023] #### New features [#new-features-16] With this initial release, our team is happy to announce the launch of our new Trading terminal. ##### Placing orders [#placing-orders] The platform currently supports placing Market, Limit, Stop Market, and Stop Limit orders (refer to [Order types](../knowledge-base/order-types)). You can also choose from various [Time in force](../knowledge-base/time-in-force) options such as FOK, IOC, GTC, GTD, and DAY. ##### Widgets [#widgets] The platform provides you with enhanced widgets that are specifically designed for convenient trading. These widgets allow you to easily place orders, access the Order book, monitor open orders and order history, and much more. Refer to [Place order](../widgets/place-order) and the other pages of the Widgets section for more information. ##### Dashboard [#dashboard] The customizable dashboard allows you to personalize the layout to suit your needs and keep you focused on what's important. Refer to [Interface overview](../get-started/customizing-your-terminal) to learn more about workspace customization. ## Summary [#summary] This widget provides AI-powered market analysis and trading recommendations for the selected market. AI Assistant The widget is organized into the following sections: * [AI Recommendation](#ai-recommendation): Overall recommendation score. * [Forecast](#forecast): Price target and market sentiment. * [Signal Drivers](#signal-drivers): Technical, on-chain, and sentiment signals. * [Suggested Actions](#suggested-actions): AI-generated trading suggestions. * [Key Metrics](#key-metrics): Market data overview. ## AI Recommendation [#ai-recommendation] Displays a numeric score from 0 to 100 representing the overall AI assessment of the market, along with a label such as **Strong Buy**, **Buy**, **Neutral**, **Sell**, or **Strong Sell**. A higher score indicates a more favorable outlook. ## Forecast [#forecast] **1Y Price Target** The forecasted price in one year and the expected percentage change from the current price. *** **Market Sentiment** A visual bar showing the ratio between bullish and bearish sentiment among market participants. ## Signal Drivers [#signal-drivers] Signals that influence the AI recommendation, categorized into three types: * **Technical**: Signals based on technical analysis indicators such as RSI and Moving Averages. * **On-Chain**: Signals based on blockchain data such as ETF inflows, active addresses, and total value locked (TVL). * **Sentiment**: Signals based on community and analyst opinions. Each signal includes a description and an impact assessment: **Bullish**, **Bearish**, or **Neutral**. ## Suggested Actions [#suggested-actions] A list of AI-generated trading suggestions based on the current market conditions. These are informational recommendations, not automated trading signals. ## Key Metrics [#key-metrics] The following market data is displayed: **All-Time High** The highest price ever recorded for the asset (in USD) and the percentage difference from the current price. *** **All-Time Low** The lowest price ever recorded for the asset (in USD) and the percentage difference from the current price. *** **24h Volume** The total trading volume over the last 24 hours in USD. *** **Market Cap** The total market capitalization of the asset in USD. ## In Guest mode [#in-guest-mode] The widget works in Guest mode too, with the same sections, so you can read the analysis for any instrument your broker offers before you have an account. AI-generated insights are for informational purposes only. The AI Assistant widget can be enabled or disabled by the platform administrator. If the widget isn't available in the **Add Widget** menu, contact your broker. ## Summary [#summary] Use this widget to monitor price data on all markets available on the platform. The widget is dynamic and is continuously updated in real time. All markets ## Fields [#fields] The following information is provided about each market: **Market** The market type (Spot, CFD, or Perpetual), market ticker and full name of the market. *** **Current price** The current market price, in the quote asset and in the platform root asset. This value is green if the price is rising and red if it's falling. *** **24h change** The price change over the last 24 hours, in absolute and percentage values. This value is calculated as *Current price* – *Price 24h ago*. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. ## Summary [#summary] This widget displays the list of all asset balances on your account. Assets ## Settings [#settings] ### Hide zero balances [#hide-zero-balances] Use this option to hide all assets with zero balances from the list. It's enabled by default. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each asset: **Asset** The alphabetical code of the asset. The first asset in the list is the **root asset** of the platform. *** **Caption** The asset name. *** **Available** The balance at your disposal, meaning the difference between your total assets and a sum of all limit orders placed by this time. This value is calculated as *Total – Halted*, where *Halted* is the asset amount frozen on the account for execution of placed Limit orders. *** **Available, \{RAT}** The available balance, in conversion to the platform root asset. *** **Total** The overall amount of the asset available in your wallet, including locked funds. *** **Total, \{RAT}** The total balance, in conversion to the platform root asset. ## Summary [#summary] This widget displays a list of your closed positions on the selected account. The entire history of your closed positions is available. Closed positions The widget lists only closed positions. For a list of currently open positions, use the [Open positions](open-positions) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists closed positions for the last three months. To display positions closed during a specific time period, use the **Select date range** field. The most recently closed positions appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ### View related orders [#view-related-orders] Click the **chevron icon** in a position row to expand a list of position-closing orders. As positions can be partially closed, there may be more than one line. For each executed position-closing order, a separate line is added. ## Fields [#fields] The following information is provided about each position: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Position ID** The position identifier. *** **Side** The position side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Pos. closed size** The closed volume, in lots, which is equivalent to the corresponding filled order volume. *** **Open price** The volume-weighted average price (VWAP) at which the position was opened. *** **Close price** The volume-weighted average price (VWAP) of trades related to a position-closing order. *** **Close order ID** The identifier of an order closing the position. *** **Realized PnL, \{RAT}** The actual profit or loss earned, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Close price* – *Open price*). For **Short** positions, this value is calculated as *Position size* × (*Open price* – *Close price*). *** **\{RAT} notional** The equivalent of the closed volume in the platform root asset. *** **History rate to \{RAT}** The rate to the platform root asset at the moment of position closing. *** **Reason** The reason for closing a position. Possible values: * **Trader**: The position was closed by you. * **Admin**: The position was closed by an Admin. * **Stop-out**: The position was automatically closed by the system, as a result of Stop out. * **Stop loss**: The position was closed by the [Stop loss](../knowledge-base/price-triggers) trigger. * **Take profit**: The position was closed by the [Take profit](../knowledge-base/price-triggers) trigger. * **Webhook alert**: The position was closed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). *** **Comment** The text note inherited from the opening order. Up to 100 characters. The comment can't be edited after the order is placed. *** **Open date, time** The date and time when a position was opened. *** **Closed date, time** The date and time when a position-closing order was last updated (fully executed). ## Summary [#summary] This widget helps you monitor margin parameters and statistics. Margin ## Fields [#fields] All values are in displayed in conversion to the platform root asset: **Your margin level** The ratio of your funds to a used collateral, in percents. This value is calculated as *Equity* / *Used margin* × 100%. Possible values: * **Empty**: No open positions. * **Low risk**: Everything is ok. * **Margin call**: Your margin level fell below the set Margin call value. You received a notification urging you to increase the margin level to avoid a Stop out. Remember that if you ignore this warning, the margin level may continue to decrease. During the Margin call, you can only close existing positions; opening new positions isn’t possible. * **Stop out level**: Your margin level fell below the set Stop out value; the platform started a process of liquidating your positions. This process continues until the margin level exceeds this required value. **ANY** currently open position can be closed regardless of its side and volume. *** **Margin balance** The total amount of your funds that can be used as a collateral for CFD trading. It’s calculated as Σ(*TotalAmountX* × *MarginRatioX* × *Rate X/RAT*), where: * *TotalAmountX* is the the total amount of the asset X, including both available and locked funds. * *MarginRatioX* is the Margin ratio set for the asset X. * *Rate X/RAT* is the constantly updated rate of the asset X to the platform root asset. The Margin balance is continually recalculated based on price fluctuations. An increase in the prices of assets boosts available Balance & Free margin. Conversely, a decrease in asset prices may reduce the available Balance and Free margin. Additionally, a decline in the prices of assets with open positions may trigger Margin calls and Stop outs. *** **Credit** A promotional bonus granted by your broker for margin (CFD and Perpetual) trading, shown in the platform root asset (RAT). When you have no credit, this row shows 0. Credit increases your Equity and Free margin and can be used as collateral to open positions. It becomes available immediately when granted and never expires. However, credit cannot be withdrawn as cash, so it is excluded from your withdrawable balance. Your broker can revoke credit at any time, and the row updates in real time when this happens. The row includes an info tooltip that reads: *Promotional credit for margin trading only. Cannot be withdrawn.* *** **Equity** The potential balance of your account if all your positions were closed right now. This value is calculated as *Margin balance* + *Credit* + *Unrealized PnL*. *** **Used margin** The amount of funds that is used for maintaining all your open positions. Is opposed to the *Free margin*. The Used margin for positions on a specific market is calculated using the maximum value between the total margin of long positions and the total margin of short positions: MAX(*MarketPositionLong*, *MarketPositionShort*). **Example** **Step 1: Initial balance** * Margin balance: $10,000 * Opened positions: 0 * Free margin: $10,000 * Used margin: $0 **Step 2: Open a long position (Leverage 1:100)** * Market: CFD EUR/USD * Position size: 1 lot (100,000 units) * Current price: $1.001 * Required margin: $(100,000 × 1.001) / 100 = $1,001 * After opening: * Free margin: $8,999 * Used margin: $1,001 **Step 3: Open a long position (Leverage 1:20)** * Market: CFD EUR/USD * Position size: 1 lot (100,000 units) * Current price: $1.001 * Required margin: $(100,000 × 1.001) / 20 = $5,005 * After opening: * Free margin: $3,994 * Used margin: $6,006 **Step 4: Open a short position (Leverage 1:100)** * Market: CFD EUR/USD * Position size: 9 lots (900,000 units) * Current price: $1 * Required margin: $(900,000 × 1.001) / 100 = $9,009. The system verifies that upon opening this position, the MarketUsedMargin remains valid by satisfying the condition: **MarketUsedMargin** = MAX(*MarketPositionLong*, *MarketPositionShort*) = MAX(6,006, 9,009) = 9,009. Since the condition is met, the position opens. * After opening: * Free margin: $991 * Used margin: $9,009 As a result, you can open multiple opposite positions without significantly increasing the Used margin. Furthermore, closing positions never increases the Used margin. *** **Free margin** The amount of funds that can be used for opening new positions. *** **Unrealized PnL** The total potential profit or loss earned from all open positions. This value is calculated as *Σ(Unrealized PnL for Long positions + Unrealized PnL for Short positions)*, where: * *Unrealized PnL for Long positions* = *Position size* × (*Current price* – *Open price*) * *Unrealized PnL for Short positions* = *Position size* × (*Open price* – *Current price*) ## Summary [#summary] Use this widget to assess the current market depth indicating the actual liquidity of an asset, which is evaluated based on the number of currently open orders to buy and sell it as well asset prices and volumes at various price levels. Market depth The widget is dynamic and is continuously updated in real time. The widget displays a chart indicating the overall volume of buy (green) and sell (red) orders at various price levels awaiting execution at the moment. You can hover the mouse pointer over the chart to learn the exact price and volume of an asset traded at a specific price level. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ## Summary [#summary] Use this widget to monitor statistics on a specific instrument. The widget is dynamic and is continuously updated in real time. Market summary To monitor multiple instruments at a time, use the [Watch list](watch-list) widget. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the first column. To change the market, click the market symbol and select a different one from the list. ## Fields [#fields] The following information is provided about each instrument: **Market** The market type (Spot, CFD, or Perpetual), market ticker and full name of the market. *** **Current price** The current top-of-the-book price, in the quote asset. *** **Current price, \{RAT}** The current top-of-the-book price, in conversion to the platform root asset. *** **24h change** The price change over the last 24 hours. This value is calculated as *Current price* – *Price 24h ago*. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h change, %** The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h high** The highest trade price over the last 24 hours. This value is always green. *** **24h low** The lowest trade price over the last 24 hours. This value is always red. *** **Info icon** Click this icon to view market details and trading sessions schedule. ## Summary [#summary] This widget displays a list of received notifications, both system and configured via the [Price control](price-control) widget. Messages ## Settings [#settings] ### Mark as read [#mark-as-read] Unread alerts are marked with a red dot in the list: * Click the dot to mark the notification as read. * Click **Mark all as read** to mark all new notifications as read at once. * Click the **three dots** icon in the upper right corner of the widget to access the **Hide read notifications option**. The counter of unread alerts is also displayed on the **bell icon** in the topbar. ## Summary [#summary] This widget displays a list of Limit orders that have been placed from this specific account and are currently open and assigned one of the following [statuses](../knowledge-base/order-statuses): *Started*, *Pending*, or *Working*. Open orders The widget lists only open orders, that are currently not filled or partially filled. For a list of orders in the final statuses, use the [Order history](order-history) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the orders for all the time. To display orders for a specific time period, use the **Select date range** field. The most recent order appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Filled** The order amount that has been filled so far. *** **Fee** The total commission paid for executing an order and the currency in which the commission was paid. *** **Remaining** The order amount that hasn’t yet been filled. *** **Limit price** For Limit orders, the Limit price set when placing the order. *** **Avg execution price** The order execution price, as an average price of all trades executed while filling the order. *** **Take profit** The [Take profit](../knowledge-base/price-triggers) value, if set. *** **Stop loss** The [Stop loss](../knowledge-base/price-triggers) value, if set. *** **Used leverage** For margin trading, the leverage ratio used when placing an order. *** **Status** The current order [status](../knowledge-base/order-statuses): *Started*, *Pending*, or *Working*. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Valid until** The date and time when an order expires. *** **Order ID** The system identifier of an order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Reason** The reason for placing the order: * **Trader**: The order was placed by you. * **Admin**: The order was placed by an Admin. * **Stop-out**: The order was placed by the system, to close positions as a result of Stop out. * **Webhook alert**: The order was placed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). ## Cancel orders [#cancel-orders] To cancel an order, click the **×** in the corresponding row. To cancel all active orders at once, click the **Cancel all** button in the widget header. ## Summary [#summary] This widget displays a list of your positions currently open on the selected account. Open positions The widget lists only open positions. For a list of closed positions, use the [Closed positions](closed-positions) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists open positions for all the time. To display positions opened during a specific time period, use the **Select date range** field. The most recent position appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ### View related trades [#view-related-trades] Click the **chevron icon** in a position row to expand a list of related trades. ### Close positions [#close-positions] To close a position, hover over it and click the **CLOSE** button that appears. To close all/multiple positions at once, click **Close all** and select the desired option: close all positions or close positions with positive/negative PnL. ## Fields [#fields] The following information is provided about each position: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Position ID** The position identifier. *** **Side** The position side: Buy or Sell. *** **Position size** The current position volume, in lots. *** **Open price** The volume-weighted average price (VWAP) at which the position was opened. *** **Current price** The current market price of the base asset: bid for Long positions and ask for Short positions. *** **Stop loss** The [Stop loss](../knowledge-base/price-triggers) value, if set when placing the order. If the value wasn't set, you can use the **Add** button to configure it. *** **Take profit** The [Take profit](../knowledge-base/price-triggers) value, if set when placing the order. If the value wasn't set, you can use the **Add** button to configure it. *** **Unrealized PnL, DAY, \{RAT}** The potential profit or loss earned for a current day, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *First bid price for today*). For **Short** positions, this value is calculated as *Position size* × (*First ask price for today* – *Current ask price*). If a position was opened today, then the *Open VWAP* is used instead of the *First price for today*. *** **Unrealized PnL, DAY, %** The potential profit or loss earned for a current day, in percents. *** **Unrealized PnL, Total, \{RAT}** The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to the platform root asset. For **Long** positions, this value is calculated as *Position size* × (*Current bid price* – *Open VWAP*). For **Short** positions, this value is calculated as *Position size* × (*Open VWAP* – *Current ask price*). *** **Unrealized PnL, Total, %** The potential profit or loss earned for the entire period from the moment the position was opened, in conversion to the platform root asset, in percents. *** **Used margin, \{RAT}** The amount of your funds used for maintaining a position, in conversion to the platform root asset. *** **Leverage** The actual leverage ratio used for opening a position. *** **Req. leverage** The leverage ratio you requested when opening a position. *** **\{RAT} notional** The current position size equivalent in the platform root asset. *** **Rate to \{RAT}** The current exchange rate of a quote asset to the platform root asset. *** **Open date, time** The date and time when a position was opened. *** **Updated date, time** The date and time of the latest position-related trade. *** **Reason** The reason for opening a position: * **Trader**: The position was opened by you. * **Admin**: The position was opened by an Admin. * **Webhook alert**: The position was opened via a [TradingView webhook](../get-started/settings#tradingview-webhooks). *** **Comment** The text note inherited from the opening order. Up to 100 characters. The comment can't be edited after the order is placed. ## Summary [#summary] This widget displays a list of currently open buy and sell limit orders for a selected asset along with the current bid-ask spread. Order book The widget is dynamic and is continuously updated in real time. It provides three different sections displaying the following information: * Open sell orders are highlighted in red and listed in the top section. The best ask, which is the sell order with the lowest price, is displayed at the bottom of this list. * Open buy orders are highlighted in green and listed in the bottom section. The best bid, which is the buy order with the highest price, is displayed at the top of this list. * The middle section displays the current bid-ask spread indicating the gap between the best ask and bid prices declared for an asset. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Display only asks/bids [#display-only-asksbids] In the upper part of the widget, you can choose how to display the Order book: * Full view. * Buy orders only + spread. * Sell orders only + spread. ## Fields [#fields] Each row of the Order book provides the following information about a selected market: **Price, \{QUOTE}** The price, in the quote asset. *** **Amount, \{BASE}** The total amount of the base asset available at a corresponding price level. *** **Total** The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. In addition, you can use the [Market depth](market-depth) widget to evaluate the liquidity of a specific asset based on the overall volume of orders traded at various price levels. For Spot markets, hover over Order book rows to view additional information and buy or sell assets in click: **Average price** The average price, in the quote asset. *** **Total volume** The total amount of the base asset available at a corresponding price level. *** **Grand total** The total amount, in the quote asset, required to fully execute the orders at a corresponding price level. *** **Buy** / **Sell** Click the button to instantly place a Market order to buy or sell the asset at the selected price level. ## Summary [#summary] This widget provides up-to-date information about the orders executed on a selected market partially or in full, as well as the orders that were canceled, rejected, and expired. The entire order history of your account is available. Order history The widget lists only the orders to which final statuses are assigned. For a list of orders that are still being executed, use the [Open orders](open-orders) widget. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the orders with the *Completed* status for the last three months. To display orders for a specific time period, use the **Select date range** field. To display orders with specific statuses, select one or more from the dropdown above the list. The most recent order appears at the top of the list. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types). *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Filled** The order amount that has been filled. *** **Fee** The total commissions paid for executing an order and the currency in which the commission was paid. *** **Remaining** The order amount that wasn't filled. *** **Avg execution price** The order execution price, as an average price of all trades executed while filling the order. *** **Used leverage** For CFD trading, the leverage ratio used when placing an order. *** **Status** The current order [status](../knowledge-base/order-statuses): *Completed*, *Cancelled*, *Rejected*, or *Expired*. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Order ID** The system identifier of an order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Reason** The reason for placing the order: * **Trader**: The order was placed by you. * **Stop-out**: The order was placed by the system, to close positions as a result of Stop out. * **Stop loss**: The order was placed by the [Stop loss](../knowledge-base/price-triggers) trigger. * **Take profit**: The order was placed by the [Take profit](../knowledge-base/price-triggers) trigger. * **Webhook alert**: The order was placed via a [TradingView webhook](../get-started/settings#tradingview-webhooks). ## Summary [#summary] Use this widget to place new orders. Place order The widget has two states: ### The PRO toggle is disabled [#the-pro-toggle-is-disabled] In this state, you can quickly place **IOC Market** and **GTC Limit** orders by selecting the order side (Buy/Sell) and type (Market/Limit), and specifying the order size (in lots) and price (for Limit orders). You can also place orders on CFD markets with the maximum leverage automatically applied. ### The PRO toggle is enabled [#the-pro-toggle-is-enabled] In this state, you get access to more precise order settings, such as: * **Stop orders** * **Time in force** * **Leverage** * **Take profit, Stop loss, Trailing stop** * **Comment** * **Complete order information** The **Comment** field allows you to attach a text note to the order (up to 100 characters). The comment is inherited by the resulting position and can't be edited after the order is placed. ## Settings [#settings] ### Select a market [#select-a-market] The market on which the order will be placed is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Place an order [#place-an-order] To place an order, fill in the parameters, review order details and preliminary calculated values, and then confirm the order by clicking the **Place** button. For a Limit order whose price crosses the current top-of-book — Buy at or above the best ask, or Sell at or below the best bid — the platform shows a confirmation dialog before submission. The dialog shows the entered price and the current best bid/ask, and lets you confirm or cancel the order. This warning is enabled by default; you can disable it from the dialog (**Do not show this warning again**) or from the **Limit order cross-TOB warning** toggle in [Settings](../get-started/settings#action-confirmation). ### Set price triggers [#set-price-triggers] If using **Take profit, Stop loss, Trailing stop**, set the prices in consideration of the current highest market bid/ask or a specified Limit price: These values can be adjusted any time until the position is fully closed via the [Open positions](open-positions) widget. During non-trading hours, according to the trading calendar schedule, you can place only Stop Market and Stop Limit orders. The **Place** button stays enabled when the order type is Stop and is disabled for Market and Limit. A Stop order placed outside trading hours is accepted immediately and starts watching for its stop price when the market reopens. For details, see [Stop orders](stop-orders). The order controls are disabled when the selected account is Halted or Frozen. For more information, see [Account status](../get-started/customizing-your-terminal#account-status). You will not be able to place an order if the execution of the order causes your margin level to fall below the *Margin call* level. The same conditions apply to withdrawal operations. ## Summary [#summary] This widget displays a price chart showing fluctuation of prices for a selected market over a certain time period. Price chart The horizontal axis (X-axis) represents the time scale, and the vertical axis (Y-axis) indicates the price level. ## Settings [#settings] ### Select a market [#select-a-market] The current market is displayed in the widget header. To change the market, click the market symbol and select a different one from the list. ### Customization [#customization] Multiple customization options are provided, allowing you to configure the chart according to your preferences. You can switch between bar, candle, Heikin Ashi, line, area and baseline views, as well as specify the time period for which data should be displayed. The chart supports numerous financial indicators, such as moving averages and regressions, and can feature a variety of custom shapes, including arrows and lines, pitchforks, and various ranges, allowing you to perform an in-depth market analysis. ### Display options [#display-options] The widget supports displaying of open positions, price triggers, open and executed orders. Click the **gear icon** in the topbar and access [Price chart settings](../get-started/settings#price-chart) to enable desired options. ## Placing orders [#placing-orders] ### Enable placing orders [#enable-placing-orders] To enable placing orders directly from the Price chart, you need to activate the corresponding settings: 1. Click the **gear icon** in the topbar and access [Price chart settings](../get-started/settings#price-chart). 2. Activate the **Market quick trade panel** or **Limit quick trade panel** toggle, or both. 3. If needed, adjust the amount presets. These amounts will be available for quick selection when placing an order. ### Market quick trade panel [#market-quick-trade-panel] If the corresponding setting is activated, the draggable **Market quick trade panel** is constantly displayed on the Price chart. ### Limit quick trade panel [#limit-quick-trade-panel] If the corresponding setting is activated, the **+** will appear when hovering over price levels on the chart. Clicking it will open the **Limit quick trade panel**: * in the upper half of the chart — to sell; * in the lower half of the chart — to buy. ### Place a new order [#place-a-new-order] To place a new Market or Limit order from the Price chart, when a corresponding panel is displayed: 1. Select the **amount** from configured presets. 2. Select a **leverage** ratio, if trading on CFD or PF markets. 3. Click **Buy** or **Sell**. The order will be placed according to the selected type. ## Summary [#summary] Use this widget to configure alerts that will be delivered to the [Messages](messages) widget when an instrument price reaches the specified level. Price control ## Settings [#settings] ### Configure a new alert [#configure-a-new-alert] To configure a new alert: 1. Click the **Add market** button to select a required market from the list. 2. Click the **+** icon below the instrument name to add a new alert trigger. 3. In the displayed fields, specify the exact price or the price change in percents (positive or negative). The other value will be calculated automatically. 4. Click the **check mark icon** to add the trigger. Now you will receive a notification in the [Messages](messages) widget, once the instrument price hits the specified level. You can configure multiple triggers for each instrument. ### Edit alerts [#edit-alerts] Click the price to edit the existing alert. ### Remove alerts [#remove-alerts] Click the **×** button on the trigger panel to remove it and stop receiving corresponding notifications. Click the **×** button in the instrument row to remove it from the list and stop monitoring. ## Summary [#summary] This widget displays a list of untriggered Stop orders created on the selected account. Once a market price reaches your predetermined Stop price, the Stop order is activated and submitted as either a Market or Limit order. It's then removed from this widget. You can now find it in either the [Open orders](open-orders) or [Order history](order-history) widget, depending on its current status. Stop orders ## Stop orders outside trading hours [#stop-orders-outside-trading-hours] You can place Stop Market and Stop Limit orders while a market is closed according to its trading calendar, so you can prepare an entry or a protective level before the session opens. This applies to every channel: the Trading terminal, the REST API, the FIX API, and TradingView. An order placed this way behaves as follows: * It is accepted right away and appears in this widget with the standard **Waiting for activation** status. No new status was introduced for orders placed outside trading hours. * It is validated at placement against the price and amount scales and the market minimum amount. The stop price is also checked against the best bid and ask whenever a price is available — while the market is closed there may be no live price to check it against. * No balance or margin is reserved at placement. The margin check happens when the order triggers. * It stays Waiting for activation across sessions until it triggers, you cancel it, or it expires under its [Time in force](../knowledge-base/time-in-force). A Stop order placed on Friday evening is still there on Monday, and an unexpected holiday does not cancel it. * You can view and cancel it while the market is still closed. When the session opens, the order is evaluated against the first available price. If the market gapped past your stop price while it was closed, the order triggers at the open. For an order placed while no price was available, the first incoming price is used to finalise the order's internal pricing before it can trigger, so activation can take one extra price update. If the margin check fails when the order triggers, the order is cancelled and you receive the failure reason — it is never dropped silently. Market and Limit orders are still rejected while the market is closed. Only the two Stop order types are accepted — and the market itself must still be Open: a Paused or Halted market accepts no orders at all, Stop orders included. ## Settings [#settings] ### Adjust the time period [#adjust-the-time-period] By default, the widget lists the Stop Market and Stop Limit orders for all the time. The most recent order appears at the top of the list. To display orders for a specific time period, use the **Select date range** field. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each order: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Side** The order side: Buy or Sell. *** **Order type** The [order type](../knowledge-base/order-types): Stop Market or Stop Limit. *** **Time in force** The [Time in force](../knowledge-base/time-in-force). *** **Amount** The order amount, in the base currency. *** **Stop price** The stop price specified when creating an order. When the market reaches this price, the Stop order will be placed (as a Market or Limit order. *** **Limit price** The price of a Limit order that will be placed when the Stop price is triggered. *** **Used leverage** For CFD trading, the leverage ratio used when placing an order. *** **Created at** The date and time when an order was placed. *** **Updated at** The date and time of the latest update to the order. *** **Comment** The text note attached to the order when it was placed. Up to 100 characters. The comment can't be edited after the order is placed. *** **Order ID** The system identifier of an order. ## Summary [#summary] Use this widget to monitor statistics on multiple instruments at a time. The widget is dynamic and is continuously updated in real time. Watch list ## Settings [#settings] ### Add/remove instruments [#addremove-instruments] Click the **Add market** button to select a required market from the list. Click the **×** button in the instrument row to remove it from the list and stop monitoring. ### Configure columns [#configure-columns] Click the **Configure columns** button in the widget header to adjust the displayed information: * **Mark or unmark column checkboxes**: To display or hide them; the column checkboxes highlighted in grey can’t be unmarked. * **Drag and drop the columns**: To adjust their order in the table. ## Fields [#fields] The following information is provided about each instrument: **Market** The market type (Spot, CFD, or Perpetual) and market ticker. *** **Full name** The market full name or description. *** **Last price** The price of the last trade. *** **24h change, %** The price change over the last 24 hours, in percents. This value is calculated as ((*Current price* – *Price 24h ago*) / *Current price*) × 100. This value is green if the price is rising and red if it's falling. A dash in this field means that there is no *Price 24h ago* data available. *** **24h low** The lowest trade price over the last 24 hours. *** **24h high** The highest trade price over the last 24 hours. 欢迎使用 **B2TRANSLATE**,这是一款与 B2BROKER 产品集成的综合在线本地化工具。 该工具可帮助您高效地将产品的 Web 用户界面(WebUI)翻译成多种语言,确保您的应用程序能够面向全球用户。 B2TRANSLATE 采用清晰的层级结构来组织翻译,让复杂本地化项目的管理变得直观易懂: 1. **项目类型**:您的 B2BROKER 产品。 2. **项目**:每个产品中的独立 WebUI,例如测试和生产网站。 3. **键和翻译**:特定的 UI 元素及其本地化文本。 让我们更详细地了解各个组成部分。 ## 项目类型 [#project-types] **项目类型** 直接对应于您购买的 B2BROKER 产品。 它们会自动添加到您的 B2TRANSLATE 中。 如果您拥有多个产品,为方便起见,您可以在单个页面上访问所有产品。 每个产品可以拥有一个或多个 WebUI,例如当您有多个实例时。 在这种情况下,项目类型包含代表这些 WebUI 的不同 **项目**。 如果您需要调整项目类型,请联系您的客户经理。 ## 项目 [#projects] **项目** 是您产品的独立 WebUI。 每种项目类型都包含一个 **DEMO** 项目,其中提供完整的类别、语言和翻译集。 该项目中的键不与任何特定 WebUI 关联,仅用于演示。 虽然您无法修改 DEMO 项目中的翻译,但可以将其复制到其他项目中。 除 DEMO 外,每种项目类型还包含一个或多个“实际”项目。 这些项目与您产品的 WebUI 关联,并完全由您控制。 您可以为这些项目中的键设置和编辑翻译。 如果您需要调整项目,请联系您的客户经理。 ## 键和翻译 [#keys-and-translations] **键** 是引用特定 UI 元素的标识符。 **翻译** 是分配给这些键的各种语言的文本字符串。 例如,可以为键 `MyProject.CreateNewDeposit` 分配英文翻译“Deposit funds”,它将显示为 WebUI 中相关 UI 元素的标题。 键列表因产品而异,并且可能会随着产品版本发布而更新。 B2TRANSLATE 提供灵活的筛选器来检测新增键和空键,确保您的 WebUI 保持最新。 有关更多信息,请参阅 [筛选键](../user-guide/filter-keys)。 ### 默认翻译和自定义翻译 [#default-and-custom-translations] 每个键具有以下翻译字段: * **Source**(只读):由 B2TRANSLATE 提供的预定义英文翻译。此字段无法编辑。 * **B2TRANSLATE**(只读):由 B2TRANSLATE 提供的所选语言的预定义翻译(如果该语言不同于英语)。此字段无法编辑。 * **Custom translation**(用户可编辑):用户提供的所选语言的自定义翻译。该值初始为空,可随时编辑。有关自定义翻译的更多信息,请参阅 [添加或修改翻译](../user-guide/manage-translations/add-or-modify-translations)。 ### WebUI 中的显示逻辑 [#display-logic-in-webui] B2TRANSLATE 使用智能回退系统来显示翻译: 1. 自定义翻译(如存在) ↓(如为空) 2. 所选语言的默认翻译(如存在) ↓(如为空) 3. 源英文翻译 ↓(如被明确设为空) 4. 无翻译(空白) * **键**:`MyProject.Button.BuyNow` * **语言**:西班牙语 * **源英文翻译**:Buy Now * **默认西班牙语翻译**:Comprar Ahora * **自定义西班牙语翻译**:¡Comprar Ya! → **显示结果**:¡Comprar Ya!(自定义西班牙语翻译) *** * **键**:`MyProject.Button.BuyNow` * **语言**:西班牙语 * **源英文翻译**:Buy Now * **默认西班牙语翻译**:Comprar Ahora * **自定义西班牙语翻译**:– → **显示结果**:Comprar Ahora(默认西班牙语翻译) *** * **键**:`MyProject.Button.BuyNow` * **语言**:西班牙语 * **源英文翻译**:Buy Now * **默认西班牙语翻译**:– * **自定义西班牙语翻译**:¡Comprar Ya! → **显示结果**:¡Comprar Ya!(自定义西班牙语翻译) *** * **键**:`MyProject.Button.BuyNow` * **语言**:西班牙语 * **源英文翻译**:Buy Now * **默认西班牙语翻译**:– * **自定义西班牙语翻译**:– → **显示结果**:Buy Now(源英文翻译) ### 类别 [#categories] **类别** 代表产品的不同功能模块,用于对键进行分组。 您可以按特定类别筛选键。 每个项目都包含 **default** 类别,其中包含在整个产品中使用的键,例如错误消息或 UI 元素名称。 这些键会被翻译成英语以及购买期间选择的任何其他语言。 类别集合取决于产品,且无法编辑。 ## 主要功能 [#main-features] B2TRANSLATE 为您提供全面的工具集,以实现高效的翻译管理。 ### 进度跟踪和质量控制 [#progress-tracking-and-quality-control] * **完成情况监控**:按语言或项目跟踪翻译进度。 * **智能筛选**:即时识别新增键和缺失的翻译。 * **质量保证**:确保所有 WebUI 元素均得到完整覆盖。 ### 效率和自动化工具 [#efficiency-and-automation-tools] * **翻译复用**:在项目之间复制翻译,减少重复工作。 * **AI 驱动的翻译**:与 ChatGPT 集成,以获得自动翻译协助(请联系您的客户经理以获取访问权限)。 * **批量操作**:通过 CSV 导出/导入,支持大规模编辑工作流程。 ### 高级本地化功能 [#advanced-localization-features] * **复数形式处理**:支持复杂语法规则,确保翻译准确。 * **实时更新**:更改会立即反映在已连接的 WebUI 中。 * **协作工作流程**:适合多用户翻译项目的团队友好型界面。 ### 支持和反馈 [#support-and-feedback] * **集成反馈系统**:直接在平台内提交建议和报告问题。 * **专属支持**:联系您的客户经理以获取技术协助。 准备开始翻译了吗?探索 **用户指南**,掌握 B2TRANSLATE 的翻译管理功能。 您在 B2TRANSLATE 中的个人控制项分为两个位置: * **账户**页面,可通过侧边栏中的齿轮图标打开,您可以在此更改密码并管理个人 API 令牌。 * 侧边栏底部的控制栏,您可以在此切换界面语言、打开通知以及退出登录。 包含导航项、账户入口和底部控制项的 B2TRANSLATE 侧边栏 ## 打开账户设置 [#open-your-account-settings] 要打开账户设置,请点击侧边栏中的**账户**(齿轮图标)。随即会打开包含两个选项卡的**设置**页面: * **个人 API 令牌** — 创建和撤销用于以编程方式访问 API 的令牌。 * **更改密码** — 更新您用于登录的密码。 这些设置仅适用于您自己的账户。 ## 更改密码 [#change-your-password] ### 打开密码表单 [#open-the-password-form] 前往**账户** > **更改密码**。 ### 输入密码 [#enter-your-passwords] 输入您的**当前密码**,然后输入并确认您的**新密码**。强度指示器会显示新密码的强度。 ### 保存更改 [#save-the-change] 点击**保存**。下次登录时,您需要使用新密码。 新密码必须满足以下要求: * 至少包含八个字符 * 至少包含一个字母、一个数字和一个特殊字符 * 与当前密码不同 如果您输入的**当前密码**不正确,B2TRANSLATE 会报告错误,且不会更改密码。 设置页面上的更改密码选项卡 ## 管理个人 API 令牌 [#manage-personal-api-tokens] 个人 API 令牌是一种用于以编程方式访问 B2TRANSLATE API 的身份验证方法,适用于集成和自动化工作流。令牌会代表您执行操作,因此您无需共享登录凭据。 个人 API 令牌已从原先的个人资料菜单移至**账户** > **个人 API 令牌**。 列出现有令牌的个人 API 令牌选项卡 ### 创建令牌 [#create-a-token] ### 打开令牌选项卡 [#open-the-tokens-tab] 前往**账户** > **个人 API 令牌**,然后点击**创建令牌**。 ### 为令牌命名并设置过期时间 [#name-the-token-and-set-the-expiration] 输入一个**令牌名称**,以便您识别令牌的使用位置。使用日历设置**过期日期**,或者点击快捷选项之一 — **30 天**、**60 天**或**90 天**。 ### 复制令牌 [#copy-the-token] 点击**创建令牌**。令牌值只会显示一次。请复制并将其存储在安全的位置。 令牌值仅显示一次,之后无法再次获取。如果您丢失了它,请删除该令牌并创建一个新令牌。 创建令牌对话框,包含名称字段和过期日期 ### 撤销令牌 [#revoke-a-token] 要撤销不再需要的令牌,请在**个人 API 令牌**选项卡的列表中找到它,然后点击**删除**。使用该令牌的任何集成都会立即停止工作。 ## 查看通知 [#view-your-notifications] B2TRANSLATE 会通过侧边栏底部的通知铃铛,向您告知后台事件 — 例如已完成的 AI 翻译、已准备好的导出或已完成的导入。 * 铃铛上的红色徽章显示未读通知的数量。 * 要查看最近的通知,请点击铃铛。 * 将通知标记为已读即可清除它,或者点击**全部标记为已读**以一次性清除所有通知。 * 当通知数量超过五条时,请点击**所有通知**以打开完整历史记录。 除了应用内铃铛外,通知还可以发送至**电子邮件**、**Slack**或**Telegram**。工作区管理员会配置这些投递渠道,并选择每种事件的接收者。 从侧边栏铃铛打开的通知面板 ## 更改界面语言 [#change-the-interface-language] B2TRANSLATE 提供多种语言。要更改界面语言,请点击侧边栏左下角的语言选择器(地球图标),然后从列表中选择一种语言。您的选择会保存,并在下次登录时继续生效。 ## 退出登录 [#sign-out] 要退出登录,请点击侧边栏底部的退出图标。B2TRANSLATE 会结束您的会话并返回**登录**页面。 购买的产品设置完成后,您将收到用于登录 B2TRANSLATE 的凭据。 要访问您的 B2TRANSLATE 账户,请前往 **登录** 页面,输入您的电子邮件地址和密码,然后点击 **登录**。 如果您忘记了密码,请点击 **忘记密码?** 链接并按照说明操作。 **双重身份验证 (2FA)** 出于安全考虑,所有 B2TRANSLATE 账户都必须使用身份验证器应用生成的代码进行 2FA 验证。 * 如果您的 B2TRANSLATE 账户已启用 2FA,请输入来自应用的 2FA 代码以完成登录流程,例如 **Google Authenticator** 或 **Twilio Authy**。 * 如果您的账户尚未启用 2FA,系统将在登录期间提示您进行设置。请按照屏幕上的说明在手机上安装身份验证器应用,并将其设置为生成用于 B2TRANSLATE 的 2FA 代码。 要筛选键,请在 **Translations** 页面中点击页面右上角的 **Filters** 按钮。 筛选条件 您可以按以下参数筛选键: **筛选方式** 选择以下选项之一: * **空键**:筛选已保存空翻译的键。对于此类键,WebUI 中会显示空字符串。 * **无翻译**:筛选没有自定义翻译的键。对于此类键,WebUI 中会显示默认翻译。 * **过去 2 周内的新键**:筛选在过去 2 周内添加的键。 * **过去 4 周内的新键**:筛选在过去 4 周内添加的键。 *** **创建时间范围** 选择一个日期范围,以筛选在该时间段内添加的键。 *** **更新时间范围** 选择一个日期范围,以筛选在该时间段内修改的键。 *** **类别** 选择一个类别,以筛选其中包含的键。 *** **键** 输入键标识符或关键词,以筛选标识符匹配的键。 *** **源文本** 输入翻译文本或关键词,以筛选默认英文翻译匹配的键。 *** **自定义翻译** 输入翻译文本或关键词,以筛选自定义翻译匹配的键。 *** 点击 **Apply** 以筛选键。 要重置筛选条件,请点击 **Clear all**。 应用筛选条件 在此页面上,您可以查看项目可用的语言列表。 Languages 查看每种语言的以下信息: **语言** 语言的名称。 *** **代码** 根据 ISO 639-1 标准的语言双字母代码。 *** **项目** 已添加并使用该语言的项目数量。 ## 项目列表 [#project-list] 在此页面上,您可以查看项目列表。 项目按项目类型分组,并以标签页形式显示在项目列表上方。 Projects 以下是每个项目提供的信息: **名称** 项目名称。 点击名称可导航至项目类别列表。 *** **语言** 项目中可用的语言数量。 *** **所有密钥** 项目中的密钥总数,包括已翻译和未翻译的密钥。 *** **UUID** 项目的系统标识符,采用 UUID 格式。 *** **操作** 点击项目行中的**三个点**,即可访问[下载和上传翻译](manage-translations/download-and-upload-translations)功能。 ## 翻译 [#translations] 要打开项目的翻译视图,请在项目列表中点击其名称。 Keys and translations ### 可用控件 [#available-controls] 在表格上方,您可以找到: * **环境**下拉菜单:对于 *Customer* 角色,仅可使用 `production`。 * **语言**下拉菜单:使用它可在您的项目可用语言之间快速切换。 * **快速搜索**字段:点击**放大镜图标**,可按标识符或翻译内容搜索密钥。 * **筛选器**按钮:点击它可打开筛选面板。有关详细信息,请参阅[筛选密钥](filter-keys)。 对于某些项目类型,表格上方会显示平台,例如 *Web*、*iOS*、*Android* 等。 在页面右上角,您可以找到: * **导入密钥**按钮:使用它可[从另一个项目复制翻译](manage-translations/copy-translations)。 * **上传 CSV**按钮:使用它可[将翻译作为 CSV 文件上传](manage-translations/download-and-upload-translations)。 * **设置**按钮:使用它可选择翻译视图中显示哪些语言(**语言**)及其显示顺序(**语言顺序**)。 页面底部提供分页控件和**行数**选择器。 ### 翻译表格 [#translations-table] 表格中的每一行代表一个密钥及其翻译: **密钥** * **类别**徽章。 * **密钥标识符**。 * **复制**按钮,用于快速将密钥标识符复制到剪贴板。 * **创建时间** / **更新时间**信息:密钥创建日期;或者,在其**自定义翻译**被编辑后,最后修改日期。 Key *** **翻译** * **源语言**:预定义的英文翻译。此列为只读,可帮助您理解密钥的含义和上下文。 * **B2TRANSLATE**:预定义的所选语言翻译(若其不同于英语)。此列为只读。 * **自定义翻译**:所选语言的自定义翻译。此字段最初为空,且可随时编辑。对于包含复数形式的密钥,此值会显示[Other 形式](manage-translations/handle-plural-forms#the-other-form)。 每一列都会显示带有相应语言代码的徽章。 请参阅[WebUI 中的显示逻辑](../get-started/introduction-to-b2translate#display-logic-in-webui),以了解翻译优先级。 有关管理翻译的分步说明,请参阅本指南中的[管理翻译](manage-translations)部分。 Translations *** **操作** * **使用 AI 翻译**:使用 ChatGPT 将源英文翻译为所选语言。有关详细信息,请参阅[使用 AI 翻译](manage-translations/translate-with-ai)。 * **重置为源翻译**:将自定义翻译恢复为预定义翻译——恢复为所选语言(如果提供了该语言的默认翻译)或英语。 * **保存为空**:明确将此密钥的翻译设置为空。 * **显示历史记录**:查看翻译的更改历史记录。 保存明确为空的自定义翻译会导致 WebUI 中不显示任何文本。 请谨慎使用此选项,并仅在确实需要此行为时使用。 Actions *** **详细信息** 点击**三个点**以打开详细信息: * **信息**标签:适用于所有密钥,包含有关自定义翻译何时添加及最后修改时间的信息。 * **复数形式**标签:适用于包含复数形式的密钥。请参阅[处理复数形式](manage-translations/handle-plural-forms),了解如何根据所选语言的语法要求正确配置依赖数量的内容。 Details 在此页面上,您可以查看已发放给客户的奖金完整列表、监控奖金状态,并可根据需要手动向客户发放奖金。有关向客户发放奖金的流程详情,请参阅[奖金简介](./#introduction-to-bonuses)。 ## 常规信息 [#general-information] 每笔奖金均提供以下信息: **ID** 奖金标识符。 *** **客户 ID** 客户标识符。 *** **客户名称** 客户的名称。 *** **客户邮箱** 客户的电子邮件地址。 *** **标签** 分配给客户的标签,用于对向[Back Office 管理员](../system/users/users)显示的客户列表进行排序。 *** **账户** 获得奖金入账的交易账户号码。 *** **当前金额** 当前奖金金额。 *** **初始金额** 初始奖金金额。 *** **奖金名称** 在 B2CORE UI 中向客户显示的奖金名称。 对于临时奖金,默认名称为领取奖金时所使用的临时奖金计划名称。若要在 B2CORE UI 中显示其他名称,请在[奖金详情](#details)中的 **Caption** 字段内输入所需名称。 对于手动发放的奖金,奖金名称是在[手动向客户添加奖金](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients)时于 **Caption** 字段中指定的值。 *** **状态** 奖金状态: * `Queued` — 已向客户交易账户发放奖金,但尚未作为信用额添加至该账户。 * `Pending` — 已将奖金作为信用额添加至客户交易账户,并已计算出客户必须交易的所需交易量。 * `Processing` — 正在处理奖金核销。 * `Completed` — 已成功满足奖金要求,表明客户在指定天数内完成了所需交易量,且奖金信用额已计入账户余额。 * `On completing` — 正在将奖金信用额添加至账户余额。 * `Expired` — 未满足奖金要求,因此已从账户中撤销奖金信用额。 * `Error` — 处理奖金时发生错误。 *** **创建者** 为客户创建奖金的 Back Office 用户的电子邮件地址和 ID。点击 ID 可打开相应 Back Office 用户的个人资料。 *** **创建时间** 向客户交易账户发放奖金的日期和时间。 要查看奖金详情,请点击 view-button(**查看**)。 如果与向客户交易账户发放或扣除特定奖金相关的任何交易失败,相应的奖金行将被高亮显示,且 **感叹号** 图标将出现在 **查看** 按钮旁边。您可以在奖金详情的[奖金交易选项卡](#bonus-transactions)中查看奖金交易历史记录。 *** **过期时间** 已发放奖金计划过期或已过期的日期和时间。 ## 详情 [#details] 详情页面分为两个选项卡: * [奖金详情](#bonus-details) * [奖金交易](#bonus-transactions) ### 奖金详情 [#bonus-details] 在详情选项卡中,您可以查看奖金设置以及客户必须满足的要求,以便在其账户余额中获得奖金信用额。 此外,您还可以重新激活状态为 `Expired` 的奖金,并撤销状态为 `Pending` 的奖金。为此,请点击页面右上角的 **Actions** 按钮,并在下拉菜单中选择相应选项。 选项卡中提供以下信息: **创建时间** 向客户交易账户发放奖金的日期和时间。 *** **金额** 奖金金额。 *** **状态** 奖金状态。 *** **已完成交易量** 计入客户必须完成的所需交易量中的已平仓头寸交易量,以便客户在其账户余额中获得奖金信用额。 *** **临时奖金**\ *仅适用于临时奖金* 领取奖金时所使用的临时奖金计划名称。 *** **激活时间** 将奖金金额作为信用额添加至客户交易账户的日期和时间。 *** **客户** 客户的电子邮件地址。 *** **账户** 获得奖金发放的交易账户号码。 *** **虚拟交易量** 此字段用于重新激活已过期的奖金。 *** **标题** 在 B2CORE UI 中向客户显示的奖金名称。 如果此字段为空: * 对于临时奖金,将在 B2CORE UI 中向客户显示领取奖金时所使用的临时奖金计划名称。 * 对于手动发放的奖金,将在 B2CORE UI 中向客户显示与获得奖金的账户关联的平台名称。 *** **有效期(天)** 完成奖金要求的天数。将奖金金额作为信用额添加至客户交易账户后,客户必须在指定天数内完成所需交易量,才能在账户余额中获得奖金信用额。 *** **每单位手数** 应用于奖金金额的比率,用于确定客户必须完成的交易量,以便在其账户余额中获得奖金信用额: `Required volume = Bonus amount / Lot per unit` 假设奖金金额为 100 USD,且 **Lot per unit** 选项设置为 2。若要在账户余额中获得 100 USD 的奖金信用额,客户必须完成以下交易量: `100 / 2 = 50 lots`。 *** **立即设置信用额** * 如果**已启用**,当客户使用同一交易账户同时从多个计划领取奖金时,所有已领取的奖金将立即作为信用额添加至其账户,使客户能够使用信用资金进行交易。 * 如果**已禁用**,当客户使用同一交易账户同时从多个计划领取奖金时,已领取的奖金将依次添加至其账户。只有在第一笔已领取的奖金处理完成并获得最终状态(`Completed` 或 `Expired`)后,第二笔已领取的奖金才会作为信用额添加至客户交易账户,依此类推。 *** **忽略开仓/平仓间隔(秒)** 客户必须保持头寸开仓的最短时长(以秒为单位),该头寸才能计入奖金计划的已交易量。 *** **当余额 > 0 时自动启用交易** 当账户余额从零或负数变为正数时,是否自动恢复该账户名为 `Trade Enabled` 的权限取决于此设置: * 如果**已启用**,当账户余额变为正数时,将自动恢复 `Trade Enabled` 权限,使客户能够恢复在其账户上交易,包括使用奖金信用额。 * 如果**已禁用**,当账户余额变为正数时,不会自动恢复 `Trade Enabled` 权限。 *** **忽略的品种组** 一个或多个品种组,在这些品种组中的交易不会计入奖金计划的已交易量。 对于 cTrader,必须在此字段中选择单个品种而非品种组,即使 cTrader 平台中提供品种组也是如此。 此字段为可选字段,可以留空。 ### 奖金交易 [#bonus-transactions] 在交易选项卡中,您可以查看与向客户交易账户发放或扣除特定奖金相关的交易历史记录、检查其状态,并在必要时重试失败的交易。 对于状态为 `Error` 的失败交易,将显示 retry button(**重试**)。点击该按钮可尝试再次处理交易。 **重试** 按钮仅对被分配了 `Retry bonus operation` [权限](../system/users/groups)的 Back Office 用户可用。如果您没有此权限,该按钮将被隐藏。 要更新选项卡中显示的交易信息,请点击右上角显示的 refresh button(**刷新**)。 选项卡中提供以下信息: **操作 ID** 分配给奖金交易的标识符。 *** **订单 ID** 与奖金交易关联的订单标识符(如适用)。 *** **金额** 奖金金额。 *** **状态** 交易状态: * `New` — 交易已发起。 * `In progress` — 正在处理交易。 `New` 和 `In progress` 状态为中间状态,仅会短暂显示。 * `Success` — 交易已成功执行。 * `Error` — 交易因某个问题而失败。 *** **尝试次数** 执行交易的尝试次数。 *** **最后尝试日期** 最近一次尝试处理交易的日期和时间。 *** **备注** 用于标识交易的说明: * **Credit accrued** — 奖金金额作为信用额添加至客户的交易账户。 * **Credit cleared** — 在满足奖金要求后,从账户中扣除已发放的奖金。这发生在将奖金金额添加至账户余额之前。 * **Balance accrued** — 在满足奖金要求后,将已发放的奖金添加至账户余额。 * **Credit expired** — 已发放的奖金已过期,并从账户中扣除。 * **Bonus cancelled** — 从账户提取资金时,将撤销已发放的奖金。 *** **错误消息** 对于状态为 `Error` 的交易,此字段显示有关错误的详细信息。 *** **创建日期** 发起交易的日期和时间。 **另请参阅** [如何手动向客户发放奖金](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients) [如何在客户入金时自动入账奖金](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits) 在此页面上,您可以管理现有奖金预设并创建新的预设。 **奖金预设**包含预先配置的设置,可简化以下场景中的奖金配置: * 用于临时奖金计划,无需手动指定所有奖金计划设置(详情请参阅[如何创建临时奖金计划](../../how-to-articles/manage-bonuses/how-to-create-a-temporary-bonus-program)) * 用于管理员在[奖金发放](bonus-distribution)页面向客户发放奖金时的手动奖金(详情请参阅[如何手动向客户发放奖金](../../how-to-articles/manage-bonuses/how-to-manually-credit-bonuses-to-clients)) * 用于客户入金时自动向其发放奖金的流程(详情请参阅[如何在客户入金时自动向其发放奖金](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits)) ## 常规信息 [#general-information] 每个预设均提供以下信息: **ID** 奖金预设的标识符。 *** **平台** 可应用奖金预设的[交易平台](../products/platforms)。 *** **名称** 奖金预设的名称。 *** **优先级** 分配给奖金预设的优先级索引。 可为每个支持奖金的交易平台创建多个预设,例如 **MT4/5** 和 **cTrader**。为特定平台创建且索引**最低**的预设,将用于在客户入金时自动向其发放奖金。 *** **有效期** 客户必须在此天数内满足奖金要求。当奖金金额作为信用额添加到客户交易账户后,客户必须在指定天数内完成所需交易量,才能将奖金信用额计入账户余额。 *** **每单位手数** 应用于奖金金额的比率,用于确定客户必须交易的成交量,以便将奖金信用额计入其账户余额: `所需成交量 = 奖金金额 / 每单位手数` 假设奖金金额为 100 USD,且 **每单位手数**选项设置为 2。要将 100 USD 的奖金计入账户余额,客户必须交易以下成交量: `100 / 2 = 50 手`。 *** **立即设置为信用额** * 如果为 **Enabled**,当客户使用同一交易账户同时从多个计划领取奖金时,所有已领取的奖金将立即作为信用额添加到其账户中,使客户能够使用信用资金进行交易。 * 如果为 **Disabled**,当客户使用同一交易账户同时从多个计划领取奖金时,已领取的奖金会依次添加到其账户中。只有在第一个已领取的奖金处理完毕并被赋予最终状态(`Completed` 或 `Expired`)后,第二个已领取的奖金才会作为信用额添加到客户交易账户,依此类推。 *** **忽略开仓/平仓间隔** 客户必须保持持仓开启的最短时长(以秒为单位),达到该时长的持仓才会计入已交易成交量。 *** **忽略的交易品种组** 一个或多个交易不会计入已交易成交量的交易品种组。 对于 cTrader,尽管 cTrader 平台提供交易品种组,仍必须在此字段中选择单个交易品种,而非交易品种组。 此字段为可选项,可以留空。 *** **如果余额 > 0,则自动启用交易** 当账户余额从零或负数变为正数时,名为 `Trade Enabled` 的权限是否会自动恢复,取决于此设置: * 如果为 `Enabled`,当账户余额变为正数时,`Trade Enabled` 权限会自动恢复,使客户能够继续在其账户上交易,包括使用奖金信用额。 * 如果为 `Disabled`,当账户余额变为正数时,`Trade Enabled` 权限不会自动恢复。 ## 详细信息 [#details] 在详细信息页面上,您可以修改所选奖金预设的参数并对其应用限制。要应用限制,请点击页面右上角的 **Actions** 按钮。以下类型的限制可以单独或组合应用于奖金预设: * **国家/地区限制** — 使预设仅适用于来自特定国家/地区的客户。 * **客户类型限制** — 使预设仅适用于所选类型的客户,例如企业客户或个人客户。 * **验证等级限制** — 使计划仅适用于具有特定验证等级的客户。 * **司法管辖区限制** — 使预设仅适用于属于所选司法管辖区的客户。 * **介绍经纪商限制** — 使预设仅适用于由指定 IB 推荐的客户。 * **产品限制** — 使预设仅可用于特定[产品](../products/products)。 例如,您可以使用此限制来防止将预设应用于管理美分交易账户的产品。如果该预设用于入金时自动发放奖金,则不会向美分账户发放这些奖金。但是,该预设仍可应用于符合限制条件的其他产品。 如果客户或产品不符合限制条件,则无法使用该预设发放奖金。如果该预设用于自动奖金,此规则同样适用于[入金时自动发放奖金的流程](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits)。 **另请参阅** [如何创建奖金预设](../../how-to-articles/manage-bonuses/how-to-create-a-bonus-preset) ## 奖金简介 [#introduction-to-bonuses] 奖金可为积极参与交易的客户提供额外的资金激励和福利。它们还可作为吸引新客户、留住现有客户或鼓励使用特定交易品种进行交易的工具。 **MetaTrader 4/5** 和 **cTrader** 支持奖金。 向客户发放奖金的流程包括两个步骤: 1. 首先,奖金金额会以信用资金的形式添加至客户交易账户。这些信用资金会增加客户的交易资本,使客户能够在账户中以更大的仓位进行交易。 2. 客户的最终目标是将奖金金额从信用资金转换为其账户余额,即可从账户中提取的真实资金。为实现这一目标,客户必须满足特定的奖金要求,并在规定期限内完成所需的交易量。如果客户未能满足奖金要求,奖金信用额度将从客户账户中撤销。 在此页面上,您可以查看已创建的临时奖金计划列表并创建新的计划。 **临时奖金计划**是限时优惠,会显示在 B2CORE UI 的**奖金**页面上,客户可以在该页面领取所需计划中的奖金。有关向客户发放奖金的流程详情,请参阅[奖金简介](./#introduction-to-bonuses)。 ## 常规信息 [#general-information] 每个临时奖金计划均提供以下信息: **ID** 奖金计划标识符。 *** **名称** 显示给客户的 B2CORE UI 中的奖金计划名称。 *** **金额** 奖金金额。 *** **货币** 奖金计划货币。只有以指定货币计价的交易账户才能用于领取给定计划的奖金。 *** **每单位手数** 应用于指定奖金金额的比率,用于确定客户必须交易的交易量: `所需交易量 = 奖金金额 / 每单位手数` 假设**金额**字段设置为 100 USD,且**每单位手数**选项设置为 2。为了在其账户余额中获得 100 USD 的奖金,客户必须交易以下交易量: `100 / 2 = 50 手`。 *** **创建时间** 创建奖金计划的日期和时间。 *** **到期时间** 奖金计划的结束日期和时间,在此之后客户将无法再从该计划中领取奖金。 要查看奖金计划详情,请点击**编辑**按钮。 ## 详情 [#details] 在详情页面上,您可以查看其他计划设置和要求: **平台** 奖金计划可用的[交易平台](../products/platforms)。只有在指定平台上开设的交易账户才能用于领取给定计划的奖金。 *** **名称** 显示给客户的 B2CORE UI 中的奖金计划名称。 *** **金额** 奖金金额。 *** **货币** 奖金计划货币。只有以指定货币计价的交易账户才能用于领取给定计划的奖金。 *** **到期时间** 奖金计划的结束日期和时间,在此之后客户将无法再从该计划中领取奖金。 *** **平台组** 在交易平台上创建的一个或多个组,其中的交易将计入奖金计划的已交易量。 *** **有效期(天)** 满足计划要求的天数。奖金金额被领取并作为信用额添加到客户交易账户后,客户必须在指定天数内完成所需交易量,才能在账户余额中获得奖金信用额。 *** **每单位手数** 应用于指定奖金金额的比率,用于确定客户为在其账户余额中获得奖金信用额而必须交易的交易量。 *** **立即设置信用额** * 如果**已启用**,当客户使用同一交易账户一次从多个计划领取奖金时,所有已领取的奖金都会立即作为信用额添加到其账户中,使客户能够使用信用资金进行交易。 * 如果**已禁用**,当客户使用同一交易账户一次从多个计划领取奖金时,已领取的奖金会依次添加到其账户中。只有在第一个已领取奖金处理完毕并被分配最终状态(`Completed` 或 `Expired`)后,第二个已领取奖金才会作为信用额添加到客户交易账户中,依此类推。 *** **忽略的开仓/平仓间隔(秒)** 客户必须保持持仓开放的最短时长(以秒为单位),该持仓才会计入奖金计划的已交易量。 *** **如果余额 > 0,自动启用交易** 当账户余额从零或负数变为正数时,名为 `Trade Enabled` 的权限是否会自动恢复,取决于此设置: * 如果**已启用**,当账户余额变为正数时,`Trade Enabled` 权限会自动恢复,使客户能够继续在其账户上交易,包括使用奖金信用额。 * 如果**已禁用**,当账户余额变为正数时,`Trade Enabled` 权限不会自动恢复。 *** **忽略的交易品种组** 一个或多个交易品种组,其中的交易不会计入奖金计划的已交易量。 对于 cTrader,必须在此字段中选择单个交易品种,而不是交易品种组,即使 cTrader 平台上提供了交易品种组。 此字段为可选字段,可以留空。 *** 要对选定的临时奖金计划应用限制,请点击页面右上角的**操作**按钮。以下类型的限制可以单独或组合应用于奖金计划: * **国家/地区限制** — 使该计划仅面向特定国家/地区的客户。 * **客户类型限制** — 使该计划仅面向选定类型的客户,例如公司或个人。 * **验证级别限制** — 使该计划仅面向具有特定验证级别的客户。 * **司法管辖区限制** — 使该计划仅面向属于选定司法管辖区的客户。 * **介绍经纪商限制** — 使该计划仅面向指定 IB 推荐的客户。 如果客户不符合限制条件,该临时奖金计划不会在 B2CORE UI 中向该客户显示,且客户将无法领取该奖金。 **另请参阅** [如何创建临时奖金计划](../../how-to-articles/manage-bonuses/how-to-create-a-temporary-bonus-program) 在此页面中,您可以查看完整的客户账户列表。 要查看特定客户的账户,请前往客户详情页面的[账户选项卡](general/accounts-tab)。 ## 常规信息 [#general-information] 每个客户账户均提供以下信息: **账户 ID** 账户在系统中的标识符。 *** **账号** 账户号码。 *** **显示号码** 在 B2CORE UI 中向客户显示的账号。 *** **客户 ID** 账户所有者的标识符。 *** **客户名称** 账户所有者的名称。 *** **客户状态** 账户所有者资料在 B2CORE UI 中的[当前状态](../references/client-statuses)。 *** **电子邮箱** 账户所有者的电子邮箱地址。 *** **标签** 分配给账户所有者的标签,用于浏览向[后台管理员](../system/users/)显示的客户列表。 *** **国家/地区** 账户所有者的[国家/地区](../system/countries)。 *** **公司** 账户所有者的公司。 *** **产品** 为账户指定的[产品](../products/products)。 *** **平台** 开户所使用的[平台](../products/platforms)。 *** **类型** 账户类型: * **个人** * **交易** * **模拟** * **合作伙伴** * **外部** *** **货币** 账户货币。 *** **杠杆** 账户杠杆。 *** **余额** 账户中的总余额,以账户货币计。 *** **余额(USD)** 账户中的总余额,以 USD 计。 *** **余额(EUR)** 账户中的总余额,以 EUR 计。 *** **信用额度** 账户中可用的信用资金。 *** **冻结金额** 账户中被冻结资金的金额。 *** **可用资金** 账户中可用资金的金额。 *** **净值** 对于 MetaTrader 账户,指账户净值。 *** **净值(不含信用额度)** 对于 MetaTrader 账户,指不含信用资金的账户净值。 *** **净值(不含信用额度),USD** 对于 MetaTrader 账户,指不含信用资金的账户净值,以 USD 计。 *** **可用保证金** 对于 MetaTrader 账户,指账户可用保证金。 *** **创建时间** 账户创建的日期和时间。 *** **内部客户类型** 供内部使用:分配给客户的内部类别。 *** **客户验证级别** 账户所有者获得的验证级别。 ## 操作 [#actions] 要为客户创建新账户,请点击页面右上角的 **创建** 按钮。 *** 要一次性向多个客户账户存入资金,请点击页面右上角的 **+更新余额** 按钮,然后上传包含所需数据的 CSV 文件(详情请参阅[如何更新余额](../../how-to-articles/manage-finances/how-to-update-balances))。 *** 要从页面导出数据,请点击页面右上角的 **导出** 按钮,然后选择所需的文件格式。导出的文件将反映您当前的可见性设置,以及已应用的排序和筛选条件。 真实和模拟交易账户的余额可能不会像相应交易平台上显示的余额那样实时更新。 要查看账户详情,请选择一个账户并点击 **编辑** 按钮。 ## 详情 [#details] 详情页面包含以下选项卡: * **账户** — 在此选项卡中,您可以查看账户详情、已分配的访问权限以及账户所有者信息 * **交易记录** — 在此选项卡中,您可以按交易类型筛选交易记录(此选项卡中显示的字段将在本指南的相应章节中说明) 要了解特定客户账户上的交易记录,请前往客户详情页面的[交易记录选项卡](general/transactions-tab)。 在此页面中,您可以创建、查看和管理客户注册后可自动分配的司法管辖区。司法管辖区可帮助您根据地区或监管需求细分客户,确保运营效率和合规性。 基于司法管辖区的限制可用于控制对特定产品、入金和出金方式或验证级别的访问权限,使其仅对特定司法管辖区的客户可用,同时限制其他客户的访问。 司法管辖区根据客户的**国家/地区**和**客户类型**组合分配给客户。 ## 要点 [#key-points] * 如果客户注册时选择的国家/地区和客户类型与现有司法管辖区匹配,该司法管辖区将自动分配给客户。 * 如果注册期间未找到匹配的国家/地区和客户类型组合,则不会向客户分配司法管辖区。 * 如果客户注册时无需选择国家/地区,则在 KYC 流程中设置国家/地区后,系统会自动分配司法管辖区,并将客户类型纳入考虑。 * 当客户的国家/地区发生变化时,如果存在匹配的司法管辖区,系统会自动更新该司法管辖区,并将客户类型纳入考虑。 * 也可以在不更改国家/地区的情况下,在客户详情中手动分配或更改司法管辖区。 每个司法管辖区提供以下信息: **ID** 司法管辖区标识符。 *** **名称** 司法管辖区名称。 *** **描述** 提供有关司法管辖区额外详细信息的描述。 *** **国家/地区** 司法管辖区中包含的国家/地区列表。 *** **客户类型** 与司法管辖区关联的[客户类型](types)列表。 *** **标签** 与司法管辖区关联的一个或多个[客户标签](../system/users/client-tags)。这些标签会随相应的司法管辖区自动分配给客户。 **另请参阅** [如何创建司法管辖区](../../how-to-articles/manage-clients/how-to-create-a-jurisdiction) [如何编辑司法管辖区](../../how-to-articles/manage-clients/how-to-create-a-jurisdiction#how-to-edit-a-jurisdiction) 在此页面上,您可以查看所有经理的列表并添加新经理。 经理是有权访问 Back Office 的用户,负责组织工作并与注册到 B2CORE 的客户沟通。 注册后,客户会根据国家限制自动分配给现有经理。此外,您还可以配置经理仅查看特定客户,例如通过[客户标签](../system/users/client-tags)分配给他们的客户。 ## 常规信息 [#general-information] 每位经理均提供以下信息: **姓名** 经理的姓名。 *** **电子邮箱** 经理的电子邮箱地址。 *** **称谓** 经理的称谓(例如 `Mr` 或 `Mrs`)。 *** **已启用** 经理资料的状态。客户只能分配给 `Enabled` 状态的经理。 *** **默认** 如果某位经理被设为默认经理,则在考虑国家限制的情况下,所有新客户都会自动分配给该经理。 同一时间只能将一位经理设为默认经理。 也可以不设置默认经理。在这种情况下,新客户仍会在考虑国家限制的前提下,按顺序分配给现有经理。 如果没有经理符合某位客户的国家限制条件,该客户将不会被分配经理。 有关分配流程的更多信息,请参阅下方的[示例](#example)。 要查看经理资料的详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 在详细信息页面上,您还可以查看经理的电话号码并编辑其资料。 要对所选经理应用国家限制,请点击页面右上角的 **操作** 按钮,并在下拉菜单中选择 **国家限制**: * **仅拒绝** — 该经理可以被分配所有客户,但来自所选国家的客户除外。 * **仅允许** — 该经理只能被分配来自指定国家的客户。 * **规则** — 应用了 **仅拒绝** 或 **仅允许** 规则的国家列表。 ## 示例 [#example] 本示例说明将新客户分配给经理的流程。 假设我们有一位 **默认经理**,其国家限制设置为 **仅允许** `Vietnam`,这意味着 **默认经理** 只能被分配来自越南的客户。 除 **默认经理** 外,还有两位非默认经理: * **经理 1** 的国家限制设置为 **仅拒绝** `Germany`,这意味着该经理可以被分配所有客户,但来自德国的客户除外。 * **经理 2** 没有国家限制。 分配流程如下: 来自 `Vietnam` 的客户 — 该客户将被分配给 **默认经理**,因为在这种情况下符合国家限制。 来自 `Germany` 的客户 — 由于国家限制,该客户无法被分配给 **默认经理**;出于同样的原因,也无法被分配给 **经理 1**。因此,该客户将被分配给 **经理 2**。 来自 `China` 的客户 — 由于国家限制,该客户无法被分配给 **默认经理**。该客户将被随机分配给 **经理 1** 或 **经理 2**。在本例中,假设该客户被分配给 **经理 1**。 来自 `UAE` 的客户 — 由于国家限制,该客户无法被分配给 **默认经理**。由于上一位客户被分配给 **经理 1**,该客户将按顺序被分配给 **经理 2**。 **另请参阅** [如何添加经理](../../how-to-articles/manage-system-settings/how-to-add-a-manager) 当您的客户创建新请求时,该请求会显示在请求列表中。 所有传入请求都会被分配为 **待处理** 状态,且必须逐一处理(批准或拒绝)。 默认情况下,此页面仅列出待处理请求。顶部面板中显示的 **铃铛** 图标表示待处理请求的总数。 您可以将页面数据导出为 CSV 或 XLSX 文件。为此,请点击页面右上角的 **导出** 按钮,选择文件格式,然后选择将数据下载到您的计算机,或发送至您个人资料中的电子邮件地址。生成文件中的数据将与当前可见性设置以及已应用的排序和筛选参数保持一致。 ## 常规信息 [#general-information] 每个客户请求提供以下信息: **№** 请求的序号。 *** **客户 ID** 提交请求的客户标识符。 *** **客户名称** 提交请求的客户名称。 *** **客户电子邮件** 提交请求的客户电子邮件地址。 *** **标签** 分配给客户并用于对展示给[后台管理员](../system/users/)的客户列表进行排序的标签。 *** **类型** 请求类型: * **账户** — 创建账户的请求(当特定产品需要此类请求时) * **地址** — 更新 `individual` 客户 **居住地** 地址的请求。 * **归档** — 归档交易账户的请求 * **头像** — 上传客户个人资料图片的请求 * **删除账户** — 删除账户的请求 * **入金** — 存入资金的请求 * **兑换** — 兑换资金的请求(当特定货币对需要此类请求时) * **出金** — 提取资金的请求 * **个人资料** — 更新客户个人资料信息的请求 * **转账** — 在同一客户的账户之间转移资金的请求 * **内部转账** — 在同一 B2CORE 系统内将资金从一位客户转移至另一位客户的请求 * **验证** — 根据提交的文件更新客户验证等级的请求 * **客户测试** — 检查客户认证测试结果的请求 * **介绍经纪商** — 加入 IB 计划的请求 * **PaymentSystem 入金协助** 和 **PaymentSystem 出金协助** — 当通过 [PSS-connected](../../integrations/payment-systems#payment-system-service-pss) 方法发起的入金或出金状态无法自动确定时创建的请求。在此类情况下,交易在 B2CORE 后台中会被分配 `Assistance` 状态。管理员必须审核交易详情,并决定是继续与外部支付系统同步状态,还是将其标记为失败(详情请参阅[如何处理处于 Assistance 状态的交易](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status))。 * **静态入金协助** — 当通过[静态入金](../finance/static-deposit)方法进行的入金状态无法自动确定时创建的请求 *** **内部客户类型** 供内部使用:分配给客户的内部类别。 *** **状态** 请求的当前状态: * **待处理** — 请求已提交,但尚未由管理员处理 * **已批准** — 请求已由管理员批准 * **已拒绝** — 请求已由管理员拒绝 * **已取消** — 请求已取消 *** **验证等级** 客户获得的验证等级。 *** **日期** 提交请求的日期和时间。 *** **处理日期** 请求被处理(批准或拒绝)的日期和时间,您可通过将其与请求创建时间进行比较来评估处理时长。 *** **处理人** 处理该请求的[后台用户](../system/users/users)的电子邮件地址。 *** **国家/地区** 客户所在的国家/地区。 *** **账户号码** 客户账户的标识符。 *** **金额** 交易金额。 *** **币种** 交易币种。 *** **方式** 用于[入金](../system/deposit-system#deposit-methods)或[出金](../system/payout-system#payout-methods)的方式。 *** **交易 ID** 系统中的交易标识符。 *** **公司简称** 客户公司的简称。 *** **公司全称** 客户公司的全称。 *** **交易已批准** 指示交易是否已由财务部门批准的内部状态。 *** **合规已批准** 指示出金是否已通过合规检查的内部状态。 要查看请求详情,请点击 **编辑** 按钮。 ## 详情 [#details] 在请求详情中,您可以查看与特定请求类型相关的所有信息。 **交易监控** 部分显示通过 **SumSub** 对入金和出金执行的 KYT 检查结果(`green` 或 `red`)。要使用此功能,您必须拥有已启用并正确配置 **Fraud Prevention** 的有效 **SumSub** 账户,同时还需在 B2CORE 后台中启用相应的 **SumSub** 外部连接。 请求详情中提供以下操作: 点击 **添加评论** 按钮可为请求添加评论。 点击 **选项** 按钮可设置请求在列表中突出显示时使用的颜色。 拥有 `Update requests` 权限的管理员还可点击 **审计** 按钮检查交易。系统随后会汇总相应账户上的所有传入交易;如果发现余额存在重大差异,将显示通知。 对于某些支付系统,您还可以通过编辑相应请求,直接更改入金或出金金额。 要处理请求,请点击 **批准** 或 **拒绝**。 **另请参阅** [处理结果](../system/requests#resolutions) [如何创建请求解决类型](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution-type) [如何创建请求解决方案](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution) [如何为特定货币对的兑换启用请求](../../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs) [如何更新兑换请求中的汇率](../../how-to-articles/manage-currencies/how-to-update-rates-in-exchange-requests) 在此页面上,您可以查看和管理可分配给客户的类别。 以下是有关每个客户类别的数据: **ID** 类别标识符。 *** **名称** 类别名称。 *** **说明** 类别描述。 *** **已启用** 如果为 `Yes`,则此客户类别可供选择。 *** **默认** 如果为 `Yes`,则这是分配给新客户的默认类别。 *** **客户数量** 此类别中的客户总数。 在此页面上,您可以查看已创建的产品组列表并创建新产品组。 产品组有助于将多个[产品](products)组织为类别,并决定它们在 B2CORE UI 中向客户显示的方式,从而确保结构化展示。 ## 常规信息 [#general-information] 系统会为每个产品组提供以下信息: **ID** 产品组的标识符。 *** **优先级** 分配给产品组的优先级索引。 *** **标题** 产品组标题。此标题将分配给 Back Office 中的产品组,并且会在 B2CORE UI 中对客户可见。 要查看产品组详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 在详细信息页面上,您可以查看以下附加信息: **描述** 产品组的描述。 *** **类型** 产品组的类型。可能的类型包括 `Default`、`Payment account` 类型及其他类型。 在此页面上,您可以查看已配置的平台列表并创建新平台。 B2CORE 中的平台可用于连接外部系统和交易平台,实现无缝的数据传输和请求处理,确保 B2CORE 中的数据与相应外部平台上的数据保持同步。 ## 常规信息 [#general-information] 每个平台提供以下信息: **ID** 平台标识符。 *** **标题** 显示在其他 Back Office 页面上的平台名称。 *** **名称** Back Office 中使用的唯一平台名称。 *** **平台** 配置连接的平台名称。 *** **状态** 平台状态:`Enabled` 或 `Disabled`。 要查看平台详情,请点击 **Edit** 按钮。 ## 详情 [#details] 详情页面提供以下信息: **名称** Back Office 中使用的唯一平台名称。 *** **标题** 显示在其他 Back Office 页面上的平台名称。 *** **短标题** 平台的简称。此字段为可选项。 *** **状态** 平台状态:`Enabled` 或 `Disabled`。 *** **模拟** 指示该平台是否用于模拟账户或真实账户: * `Yes` — 该平台用于 *模拟* 账户。客户可以通过 B2CORE UI,使用基于指定平台创建的产品开立模拟账户。 * `No`— 该平台用于 *真实* 账户。客户可以通过 B2CORE UI,使用基于指定平台创建的产品开立真实账户。 *** **入金转账请求** 指定是否启用客户通过 B2CORE UI 向平台账户转账的请求: * `Yes` — 已启用客户通过 B2CORE UI 向平台账户转账的请求。 * `No` — 通过 B2CORE UI 向平台账户转账时无需请求。 *** **出金转账请求** 指定是否启用客户通过 B2CORE UI 从平台账户转账的请求: * `Yes` — 已启用客户通过 B2CORE UI 从平台账户转账的请求。 * `No`— 通过 B2CORE UI 从平台账户转账时无需请求。 *** 根据平台的不同,将显示 **Settings** 或 **External connection** 部分。这两个部分均用于建立与相应平台的连接。连接参数集取决于平台。 **外部连接** 在此部分中,您可以点击 **Set connection** 按钮,为平台选择此前已在 **Systems** > **External connections** 中配置的连接;或者使用 **Click to edit connection** 按钮跳转至连接配置并修改连接参数。 *** **设置** 在此部分中,指定平台所需的连接参数。 *** **测试连接** 点击 **Test connection** 按钮以验证连接设置。 绿色按钮表示连接已正确配置。 红色按钮表示某些连接设置无效。按钮下方显示的错误会说明需要解决的连接问题。 ## MetaTrader 4/5 [#metatrader-45] 通过内部 WEBAPI 服务在 B2CORE 中建立与 MT4 和 MT5 的连接,无需在 **System** > **External Connections** 中创建连接。必须在 MT4 和 MT5 的平台详情中指定以下设置: ### MetaTrader 连接 [#metatrader-connection] **主机** 用于访问 MT 服务器的 IP 地址和端口号。 *** **登录名** 用于访问 MT Manager 的登录名。 *** **密码** 用于访问 MT Manager 的密码。 *** ### WEBAPI 连接 [#webapi-connection] WEBAPI 连接设置由您的客户经理提供。 **主机** 用于访问 WEBAPI 的域名和端口号。 *** **访问令牌** 用于访问 WEBAPI 的令牌。 *** ### **设置** [#settings] **最大不活动天数** 如果在此期间未检测到任何活动,交易账户将在指定天数后被归档。 *** **使用编号设置** 默认情况下,此设置处于禁用状态。 *** **Web Terminal URL** 网页交易终端的 URL。指定后,B2CORE UI 和移动应用中相应平台的账户卡片上将显示 **Trade** 按钮,客户可通过点击进入交易(有关详情,请参阅 [如何启用从 B2CORE UI 和移动应用一键访问交易](../../how-to-articles/manage-platforms/how-to-enable-one-click-access-to-web-trading-terminals))。 *** **在平台上使用报告** 默认情况下,此设置处于启用状态。 启用后,MT4/5 账户将在相应平台上创建,并激活 **Send reports** 选项。禁用后,通过 B2CORE 创建的账户将不会启用此选项。 **另请参阅** [如何集成 MetaTrader 4/5](../../how-to-articles/manage-platforms/how-to-intergate-mt) 在此页面中,您可以查看所有产品的列表及其基本信息。 B2CORE 中的产品定义了在 B2CORE 和相应外部平台上创建钱包和交易账户的流程,同时还指定应用于这些账户的设置。每个产品都关联到 B2CORE 中的一个[平台](platforms),该平台又连接到外部平台,例如 MetaTrader 4/5、cTrader 或其他支持的平台,从而确保数据无缝同步。 ## 基本信息 [#general-information] 每个产品均提供以下信息: **ID** 由系统自动生成的产品标识符。 *** **名称** 在 Back Office 中使用的产品名称。 *** **标题** 在 B2CORE UI 中显示的产品名称。 *** **平台** 产品可用的[平台](platforms)。 *** **组** 产品所属的[组](groups)。 *** **类型** 产品的类型。产品可以属于以下类型之一: * **个人** * **交易** * **模拟** * **合作伙伴** * **外部** *** **货币** 为产品添加的一种或多种货币。 *** **状态** 产品状态: * **已禁用** — 产品未激活,且不会显示在 B2CORE UI 中。无法创建与该产品关联的账户。所有新产品在创建时均会被分配此状态。 * **存在** — 产品不会显示在 B2CORE UI 中。只能在 Back Office 中创建与该产品关联的账户。 * **隐藏** — 产品不会显示在 B2CORE UI 中。只能在 Back Office 中创建与该产品关联的账户。 * **已启用** — 产品处于激活状态。 * **默认** — 产品显示在 B2CORE UI 中。可在 Back Office 或 B2CORE UI 中创建与该产品关联的账户。 要查看产品详情,请点击 **编辑** 按钮。 创建产品时,您还需要指定 **系数** 值:将其设置为 `100`,以货币子单位(例如美分)计价与产品关联的账户;否则,将其设置为 `1`。不支持以货币子单位计价账户的平台不能使用 `100` 的 **系数** 值,例如 **eWallets**、**PrimeXM**、**Centroid** 和 **OneZero**。 ## 详情 [#details] 详情页面分为三个选项卡:**信息**、**货币** 和 **详细信息**。 ### 信息选项卡 [#info-tab] 该选项卡包含常规产品设置: **杠杆** 分配给产品的一个或多个杠杆比例。 *** **默认杠杆** 在触发 **登录时自动创建** 选项后,分配给新创建的产品关联账户的默认杠杆比例。 *** **组权限** 所选用户的权限组。 *** **权限** 和 **默认账户权限** 分配给基于该产品开设的账户的权限。 默认权限将应用于客户首次登录 B2CORE UI 时自动创建的账户。要在首次登录 B2CORE UI 时创建账户,请启用 **登录时自动创建** 选项。 有关可用权限列表,请参阅[产品权限](../references/product-permissions)。 *** **最大账户数** 客户可为添加到产品的每种货币创建的最大账户数量。 例如,如果产品添加了 `USD` 和 `EUR` 作为货币,且 **最大账户数** 选项设置为 **1**,则客户可以基于该产品创建一个 `USD` 账户和一个 `EUR` 账户。 * 要不限制基于该产品可创建的账户数量,请输入 **-1**。 * 要禁止客户创建账户,请指定 **0**。 **最大账户数** 限制会独立应用于每个产品,不会与为其他产品设置的限制重叠。 *** **邮件** 电子邮件通知设置。可选选项: * **默认** 或 **发送** — 在创建新的交易账户时自动向客户发送电子邮件通知,包括开始交易所需的凭据和详细信息。 * **不发送** — 禁用新账户的电子邮件通知。 例如: * 对于 **MT** 产品,请在 **邮件模板** 字段中使用 **默认** 和 `accountCreated` 模板。 * 对于 **cTrader** 产品,请使用 **不发送**,以防止通过 B2CORE 创建 cTrader 账户时发送电子邮件通知。这是因为所有 cTrader 账户均关联到一个 cTrader ID,该 ID 使用同一个密码。 *** **邮件模板** 电子邮件通知模板。 *** **初始金额**\ *仅适用于模拟账户* 模拟账户的初始余额。 *** **优先级** 产品在列表中的序列号。 *** **协议链接** 客户必须同意的文档链接,以便通过 B2CORE UI 开设账户。 *** **链接信息** 提供产品附加信息的资源链接,客户可在通过 B2CORE UI 创建账户时点击该链接。 *** **需要请求** 如果为 `Yes`,则在 B2CORE UI 中开设新账户需要 Back Office 管理员批准。 *** **最低入金金额 (USD)** 基于该产品开设账户所需的最低入金金额(以 USD 计)。 客户可以一次性存入全部金额,也可以分多次入金以将所需金额存入账户。满足最低入金要求后,该账户即可供客户使用。 *** **登录时自动创建** 如果为 `Yes`,则每位客户首次登录 B2CORE UI 时都会自动创建一个产品关联账户。 *** **账户号码前缀**\ *仅适用于 DXtrade 产品* 添加到 DXtrade 账户号码开头的前缀,有助于区分例如真实账户和模拟账户,或同一 DXtrade 基础架构中属于不同品牌的账户。前缀最大长度为 14 个字符。 此前缀仅应用于基于该产品创建的新账户。现有账户保持不变。 *** **首次转账激活**\ *仅适用于 MT5 产品* 如果为 `Enabled`,则创建 MT5 账户时不会授予 **Trade enabled** 权限。客户首次成功向该账户转账后,将获得此权限。 *** **代理账户**\ *仅适用于 MT 产品* 与产品关联的代理账户号码。代理账户是 MT4/5 上用于 IB 和合作伙伴佣金计算的特殊非交易账户,当 IB 逻辑由 MT4/5 服务器管理,而非使用 [B2CORE IB](https://docs.ib.b2core.b2broker.com/) 时使用。在产品设置中指定后,代理账户将应用于并显示在相应 MT4/5 平台上基于该产品创建的账户中。 *** **账户类型**\ *仅适用于 cTrader 产品* 账户类型:Hedged 或 Netted。 *** **保证金计算类型**\ *仅适用于 cTrader 产品* 创建 cTrader 账户时应用的每个交易品种总保证金要求类型。账户创建后无法更改此类型。可选选项: * **最大值** — 每个交易品种的总保证金要求为该交易品种所有多头和空头仓位中的最大保证金要求 * **总和** — 每个交易品种的总保证金要求为该交易品种所有仓位的全部保证金要求之和 * **净值** — 每个交易品种的总保证金要求为该交易品种所有多头和空头仓位保证金要求之间的差额 如果未选择保证金计算类型,将应用默认的 cTrader 类型。 *** 默认情况下,**最小账户号码**、**最大账户号码** 和 **最后号码** 字段不适用于产品配置。您可以通过客户经理和 B2CORE 开发团队提出请求以启用这些字段。 **最小账户号码**\ *仅适用于 MT 产品* 通过 B2CORE 在相应 MT4/5 平台上创建的账户可分配的最小账户号码,无论是通过 Back Office、B2CORE UI 还是移动应用创建。 *** **最大账户号码**\ *仅适用于 MT 产品* 通过 B2CORE 在相应 MT4/5 平台上可创建的最大账户号码,无论是通过 Back Office、B2CORE UI 还是移动应用创建。 **最小账户号码** 和 **最大账户号码** 选项共同定义了通过 B2CORE 在相应 MT4/5 平台上创建新账户时分配账户号码的范围。 *** **最后号码**\ *仅适用于 MT 产品* 显示通过 B2CORE 在相应 MT4/5 平台上最近创建的账户号码。随着通过 B2CORE 创建新账户,此值会自动更新,直至达到指定的 **最大账户号码**。使用此字段可跟踪账户编号序列中的当前位置。 如果一个或多个账户是直接在平台上创建而非通过 B2CORE 创建,您可以编辑 **最后号码** 字段以指定正确的最后一个账户号码。 通过 B2CORE 创建新账户时,账户号码将按 `Last number + 1` 计算,以避免使用已存在的号码。如果生成的号码已存在,B2CORE 将尝试将其递增一并重试,最多 **四次**。四次尝试均失败后,将显示错误,必须手动解决。 ### 货币选项卡 [#currencies-tab] 该选项卡包含多币种账户的产品货币列表: **ID** 产品货币标识符。 *** **货币** 货币的字母代码 *** **标题** 显示在 B2CORE UI 中的货币名称。 *** **状态** 产品中的货币状态:**已启用** 或 **已禁用**。 ### 操作 [#actions] 点击页面右上角的 **操作** 按钮,为产品账户设置以下限制: **国家限制** 按国家/地区授予或限制对产品账户的访问权限: * 选择 **类型** — **仅拒绝** 或 **仅允许**。 * 在 **规则** 下拉列表中,选择允许或限制访问账户的国家/地区名称。 * 点击 **保存**。 *** **客户类型限制** 按客户类型授予或限制对产品账户的访问权限: * 选择 **类型** — **仅拒绝** 或 **仅允许**。 * 在 **规则** 下拉列表中,选择客户类型。 * 点击 **保存**。 *** **验证自动创建** 按验证级别授予或限制对产品账户的访问权限: * 选择 **类型** — **仅拒绝** 或 **仅允许**。 * 在 **规则** 下拉列表中,选择客户验证级别。 * 点击 **保存**。 *** **介绍经纪商限制** 为特定 IB 合作伙伴的客户授予或限制对产品的访问权限: * 选择 **已启用** — **是** 或 **否**。 * 选择 **类型** — **仅允许** 或 **仅拒绝**。 * 在 **规则** 字段中,指定分配给 IB 合作伙伴的客户标识符。您可以向列表中添加一个或多个客户。 * 点击 **保存**。 如果您选择 **仅允许** 选项,则仅向指定合作伙伴的 IB 客户*授予*该产品的访问权限。其他合作伙伴的 IB 客户无法访问此产品。 如果您选择 **仅拒绝** 选项,则仅对指定合作伙伴的 IB 客户*限制*该产品的访问权限。其他合作伙伴的 IB 客户可以访问此产品。 **另请参阅** [如何创建钱包](../../how-to-articles/manage-products/how-to-create-a-wallet) 在 **权限** 页面上,您可以查看为产品配置的权限组列表,并创建新的组。 权限组包含一组可分配给[产品](products)的权限。配置产品设置时,选择一个权限组即可为产品分配该组中包含的所有权限。 ## 常规信息 [#general-information] 每个权限组提供以下信息: **ID** 权限组的标识符。 *** **名称** 权限组的名称。 *** **状态** 如果为 **已启用**,则可以在产品详情页面的 **组权限** 字段中选择该权限组。 要查看权限组详情,请点击 **编辑** 按钮。 ## 详情 [#details] 每个权限组提供以下附加信息: **权限** 权限组中包含的权限列表。 ## 服务提供商 [#providers] 在此页面上,您可以查看 SMTP 服务提供商连接列表并配置新连接。 选择提供无限制每日邮件发送量的 SMTP 服务提供商非常重要,例如 [Mailchimp](https://mailchimp.com/)、[SendGrid](https://sendgrid.com/) 或 [Mailgun](https://www.mailgun.com/)。 **不适用的 SMTP 服务提供商** 对每日邮件发送量设有限制的服务提供商不适用于 SMTP 配置。这些服务通常专为个人或小规模使用而设计,无法满足大型邮件列表的需求。 此类服务提供商的示例包括:Gmail、Yahoo Mail、Outlook (Hotmail)、iCloud Mail、AOL Mail、Zoho Mail(免费版)、Yandex Mail、Proton Mail、GMX Mail 或 Mail.ru。 ### 常规信息 [#general-information] 系统会为每个 SMTP 连接提供以下信息: **ID** 分配给该连接的标识符。 *** **标题** 在 Back Office 中分配给该连接的名称。 *** **驱动程序** 用于发送邮件的驱动程序(smtp)。 *** **主机** SMTP 主机。 *** **端口** SMTP 端口号。 *** **用户名** 用于身份验证的 SMTP 用户名。 *** **发件人地址** 向邮件收件人显示的发件人电子邮件地址。 *** **发件人名称** 向邮件收件人显示的发件人名称。 **另请参阅** [如何配置 SMTP](../../how-to-articles/manage-mailing-options/how-to-configure-smtp) *** **加密** 用于与 SMTP 服务提供商进行安全通信的加密协议。可选项包括: * TSL * SSL *** **已启用** 连接状态。 如果为 `true`,则连接已启用;否则为 `false`。 如果已配置唯一的 SMTP 服务提供商连接,则无法将其禁用。 要查看连接详细信息,请点击 **编辑** 按钮。 ### 详细信息 [#details] 在详细信息页面中,除常规信息外,还会显示已屏蔽的 **密码** 字段。 要验证连接设置,请点击 **测试连接** 按钮。按钮上显示绿色勾选标记表示连接已正确配置。 ## 队列 [#queue] 在此页面上,您可以查看未发送邮件队列,并在必要时删除邮件。 **ID** 系统中的邮件标识符。 *** **电子邮件** 电子邮件地址。 *** **主题** 邮件主题。 *** **上次尝试日期** 上次尝试发送邮件的日期。 *** **下次尝试日期** 下次尝试发送邮件的日期。 *** **尝试次数** 发送邮件的尝试次数。 *** **状态** 表示邮件发送尝试结果的状态。 *** **原因** 尝试失败的原因。 ## 模板 [#templates] 在此页面上,您可以查看用于系统邮件发送的电子邮件模板列表,并在必要时覆盖这些模板。 **名称** 模板名称。 *** **模板 ID** 系统中的模板标识符。 *** **收件人** 使用该模板的收件人类型。 *** **已启用** 表示模板是否已启用。 *** **状态** 表示是否使用默认模板,或该模板是否已被覆盖。 *** **上次修改时间** 模板上次修改的日期和时间。 要自定义模板,请点击 **覆盖** 按钮。 ## 模板块 [#template-chunks] 在此页面上,您可以查看可重复使用的电子邮件模板部分列表——布局和块(例如页眉和页脚)——这些部分在多个电子邮件模板之间共享,并可在必要时覆盖它们。 **名称** 布局或块的名称。 *** **类型** 模板部分的类型:`Layout` 或 `Chunk`。 *** **状态** 表示是否使用默认模板部分,或该部分是否已被覆盖。 *** **上次修改时间** 模板部分上次修改的日期和时间。 要自定义布局或块,请点击 **覆盖** 按钮。 ## 日志 [#log] 在此页面上,您可以查看邮件发送日志。 **ID** 系统中的邮件标识符。 **活动队列 ID** 包含该邮件的队列标识符。 **电子邮件** 客户电子邮件地址。 **主题** 邮件主题。 **尝试日期** 上次尝试发送邮件的日期和时间。 **状态** 邮件送达状态(可选项:IN PROGRESS、FAIL 和 SUCCESS)。 **原因** 邮件送达失败的原因。 在此页面中,您可以查看所有已配置的公告并创建新公告。 公告可以是**必填**的,即在客户执行所需操作之前阻止其继续与 B2CORE UI 交互;也可以是**可选**的,即当客户点击 B2CORE UI 顶部栏中的 **公告**图标时显示。 ## 常规信息 [#general-information] 每个公告均提供以下信息: **ID** 公告标识符。 *** **类型** 表示公告是否需要客户操作的公告类型: * **必填** — 公告包含一个按钮,并会阻止客户继续与 B2CORE UI 交互,直到客户点击该按钮。 * **可选** — 点击 B2CORE UI 顶部栏中的 **公告**图标时会显示公告,且不需要客户操作。 *** **标题** 公告标题。 *** **文本** 公告正文文本。 *** **按钮文本**\ *仅适用于必填类型的公告* 按钮标签。 *** **目标电子邮件** 将向其显示公告的客户电子邮件地址列表。 *** **已启用** 如果设置为 `Yes`,则公告处于活动状态并会向目标客户显示。 要查看公告详情,请点击**编辑**按钮。 ## 详情 [#details] 在详情页面中,您可以查看和编辑公告字段,包括: **按钮文本** 公告中显示的按钮上的文本。 *** **按钮 URL** 客户点击公告中显示的按钮后将被重定向到的 URL。 对于**可选**类型的公告,会显示**关闭**按钮。如果指定了按钮 URL,客户点击**关闭**按钮时将被重定向到该 URL。 *** **截止日期** 向客户显示公告的截止日期。 详细信息还包含额外的**公告反应**部分。此部分列出与公告互动过的客户,包括: * 点击按钮的客户(适用于**必填**类型的公告)。 * 通过点击 B2CORE UI 顶部栏中的**公告**图标打开公告的客户(适用于**可选**类型的公告)。 * 每次互动的日期和时间。 **另请参阅** [如何创建公告](../../how-to-articles/manage-advertising-options/how-to-create-an-announcement) 在此页面上,您可以查看已配置横幅的列表并创建新横幅。 使用横幅宣传或告知您的客户重要新闻、活动或服务更新。 您可以创建多个横幅,并将其显示在 B2CORE UI 的各个页面以及移动应用或移动浏览器中。您可以在横幅上添加一个包含外部资源 URL 的按钮。点击该按钮后,将打开指定的 URL。 可以根据所选的**国家/地区**、**验证级别**、**客户类型**和**司法管辖区**配置向客户显示横幅。 ## 常规信息 [#general-information] 系统会提供有关每个横幅的以下信息: **ID** 横幅标识符。 *** **浅色标题** 为浅色主题指定的横幅标题。 *** **深色标题** 为深色主题指定的横幅标题。 指定横幅标题是可选的。您可以将这些字段留空,并创建不带标题的横幅。 *** **创建时间** 创建横幅的日期和时间。 *** **创建者** 创建横幅的 Back Office 用户的电子邮件地址。 *** **横幅 URL** 用于定义 B2CORE UI 中显示横幅的页面的 URL 尾部(例如,`/dashboard`、`/wallets`、`funds/deposit` 或其他)。 在移动应用中,所有横幅都将显示在**首页**屏幕顶部。 *** **横幅优先级** 如果配置了多个横幅,则其在 B2CORE UI 或移动应用中的显示顺序。 *** **横幅类型** 横幅类型:**Desktop** 或 **Mobile**。 *** **已启用** 如果为 `Yes`,则会在 B2CORE UI 或移动应用中向客户显示横幅;否则为 `No`。 要查看横幅详细信息,请点击**编辑**按钮。 ## 详细信息 [#details] 在详细信息页面上,您可以在以下选项卡之间切换: **横幅** 在此选项卡上,您可以调整横幅设置。桌面和移动横幅类型可用的设置不同。 *** **浅色** 在此选项卡上,您可以调整浅色主题的横幅设置。 *** **深色** 在此选项卡上,您可以调整深色主题的横幅设置。 要对横幅应用国家/地区或验证级别限制,请点击页面右上角的**操作**按钮,然后选择以下选项之一: * **国家/地区限制** — 仅向来自特定国家/地区的客户显示横幅。 * **验证级别限制** — 仅向具有特定验证级别的客户显示横幅。 **另请参阅** [如何创建横幅](../../how-to-articles/manage-advertising-options/how-to-create-a-banner) [如何按国家/地区和验证级别限制横幅显示](../../how-to-articles/manage-advertising-options/how-to-create-a-banner#how-to-restrict-banner-display) 在此页面上,您可以查看可用小部件列表,并在 B2CORE UI 的 **仪表板** 页面上自定义其显示方式。 **ID** 系统中的小部件标识符。 *** **标题** 小部件名称。 *** **顺序** 小部件在 B2CORE UI 中的序号。 *** **排序操作** 此列中的箭头按钮用于更改小部件的顺序(使用 **顺序** 列中的序号)。 *** **默认显示** 指示小部件是否默认显示在客户仪表板上。 *** **删除** 如果启用了此开关,B2CORE UI 中的小部件将具有关闭按钮,可暂时关闭该小部件(直到刷新页面或重置 **仪表板**)。 **另请参阅** [如何配置默认仪表板](../../how-to-articles/manage-advertising-options/how-to-configure-the-default-dashboard) [如何向仪表板添加行情滚动组件交易品种](../../how-to-articles/manage-advertising-options/how-to-add-ticker-widget-symbols-to-the-dashboard) 在此页面上,您可以自定义在 B2CORE UI 中向客户显示的菜单,包括添加自定义菜单项的选项,用于将客户重定向到第三方外部资源或网页以获取附加功能。 要查看可用菜单项列表,请点击位于 **General** 行中的 **eye** 图标。 ## 常规信息 [#general-information] 以下是每个菜单项提供的信息: **ID** 菜单项的标识符。 *** **名称** 在 Back Office 中使用的菜单项名称。 *** **标题** 在 B2CORE UI 中显示的菜单项名称。 *** **类型** 菜单项的类型: * **default** — 与特定 B2CORE 功能关联的预定义菜单项。这些项目无法删除,但可以在 B2CORE UI 或移动应用的菜单中隐藏。 * **custom** — 将客户重定向到指定 URL 以获取附加功能的自定义菜单项。这些项目可以从 B2CORE UI 和移动应用的菜单中删除或隐藏。 *** **新建** 如果为 `Yes`,菜单项将在 B2CORE UI 中标记为“新建”标签。 *** **可见** 指示菜单项在 B2CORE UI 中是可见还是隐藏: * **active toggle** 表示菜单项在 B2CORE UI 菜单中可见。 * **inactive toggle** 表示菜单项已从 B2CORE UI 菜单中隐藏。 要更改菜单项在 B2CORE UI 中的显示顺序,请按所需顺序拖放它们。 要查看菜单项详细信息,请点击 **Edit** 按钮。 ## 详细信息 [#details] 在详细信息页面上,您可以配置以下选项: **验证等级许可** [验证等级](../verification/levels)列表,表示菜单项仅对已获得指定等级的客户可见。 *** **客户类型许可** [客户类型](../clients/types)列表,表示菜单项仅对被分配指定类型的客户可见。 **另请参阅** [如何在 B2CORE UI 中配置菜单](../../how-to-articles/manage-advertising-options/how-to-configure-a-menu-in-the-b2core-ui) [如何添加自定义菜单项](../../how-to-articles/manage-advertising-options/how-to-add-custom-menu-items) 以下状态可以分配给客户请求: * **待处理** — 表示请求已由客户发送,但尚未由管理员处理。 * **已批准** — 表示请求已由管理员批准。 * **已拒绝** — 表示请求已由管理员拒绝。 可将以下状态分配给客户资料: * **活跃** — 表示正常状态。客户可以登录 B2CORE UI。 * **非活跃** — 表示注册问题。客户无法登录 B2CORE UI。 * **已封禁** — 表示客户被禁止登录 B2CORE UI。 * **已删除** *(已弃用)* — 此状态已不再使用,不应分配。 以下是用于通知客户和[后台用户](../system/users/users)(如管理员或经理)有关特定系统事件的预配置电子邮件类型列表。每种类型均关联一个可自定义为多种语言的电子邮件模板,并用于通过电子邮件发送通知。对于每种电子邮件类型,使用条件均在**描述**列中说明。 有关 B2COPY 事件通知相关的电子邮件类型,请参阅 [B2COPY 产品文档](https://docs.b2copy.b2broker.com/admin-guide/configure-b2copy/use-email-templates-to-notify-clients-about-important-events)。 ## 致客户 [#to-clients] 以下是用于通知客户的电子邮件类型列表: ## 致后台用户 [#to-back-office-users] 以下是用于通知后台用户(如管理员或经理)的电子邮件类型列表: 以下是支持用于通过电子邮件、短信、Slack 或 Telegram 向 [Back Office 用户](../system/users/)发送[事件通知](../system/event-notifications)的事件类型列表。 如果特定事件类型提供了用于通过电子邮件、Slack 或 Telegram 发送通知的预配置模板,模板名称会显示在 **模板** 列中。对于没有预配置模板的事件类型,应创建自定义模板。 以下是在后台配置产品设置时可分配给[产品](../products/products)的权限列表。 * **已启用** — 若已选择,基于该产品创建的账户将被启用。 * **已启用交易** — 若已选择,客户可以在账户上进行交易。 * **入金** — 若已选择,客户可以向账户入金。 * **出金** — 若已选择,客户可以从账户出金。 * **可见** — 若已选择,账户将显示在 B2CORE UI 或移动应用中。 * **转账入金** — 若已选择,客户可以向账户转入资金。 * **转账出金** — 若已选择,客户可以从账户转出资金。 * **兑换** — 若已选择,客户可以在账户上进行兑换。 * **禁止从 TR 创建** — 若已选择,客户无法在 B2CORE UI 或移动应用中创建账户;但是,他们仍可使用在首次登录 B2CORE UI 后自动创建的账户,或由管理员通过后台为其创建的账户。 以下是 B2CORE 支持的加密货币支付方式列表。 对于由连字符分隔的两个代码组成的方式名称(例如 `USDT-ETH`),第一个代码表示进行交易的加密货币,第二个代码表示发起和存储交易的区块链。 对于每种方式,您都可以找到一个图标,该图标可在 B2CORE UI 中显示为入金或出金方式的图标。使用这些图标可轻松识别支付方式。 若要向[入金](../system/deposit-system#deposit-methods)或[出金方式](../system/payout-system#payout-methods)添加图标,请在配置该方式时,于 **图标** 字段中输入图标名称,例如 `usdt-eth`。 ## 币种 [#coins] | 图标 | 方式 | 图标名称 | | -------------------------------------------------- | -------- | ------------ | | | BCH | bch | | | BTC | btc | | | DASH | dash | | | DOGE | doge | | | ETH | eth-etherium | | | ETH-ARB | eth-arb | | | ETH-BASE | eth-base | | | LTC | ltc | | | TRX | trx | | | XLM | xlm-stellar | | | XMR | xmr | | | XRP | xrp | | | ZEC | zec | ## 稳定币 [#stablecoins] | 图标 | 方式 | 图标名称 | | --------------------------------------------------- | ------------- | ------------- | | | BUSD-BSC | busd-bsc | | | BUSD-T-BSC | busd-t-bsc | | | BUSD-ETH | busd-eth | | | DAI-BSC | dai-bsc | | | DAI-ETH | dai-eth | | | USDC-ARB | usdc-arb | | | USDC-AVAX | usdc-avax | | | USDC-BSC | usdc-bsc | | | USDC-ETH | usdc-eth | | | USDC-SOL | usdc-sol | | | USDC-TRX | usdc-trx | | | USDP-BSC | usdp-bsc | | | USDP-ETH | usdp-eth | | | USDT-ARB | usdp-arb | | | USDT-AVAX | usdt-avax | | | USDT-BNB | usdt-bnb | | | USDT-BSC | usdt-bsc | | | USDT-ETH | usdt-eth | | | USDT-OMNI | usdt-omni | | | USDT-Optimism | usdt-optimism | | | USDT-SOL | usdt-sol | | | USDT-TON | usdt-ton | | | USDT-TRX | usdt-trx | | | UST-BSC | ust-bsc | | | UST-ETH | ust-eth | | | TUSD-ETH | tusd-eth | ## 代币 [#tokens] | 图标 | 方式 | 图标名称 | | ------------------------------------------------ | ---------- | ---------- | | | 1INCH-BSC | 1inch-bsc | | | 1INCH-ETH | 1inch-eth | | | AAVE-ETH | aave-eth | | | AKRO-ETH | akro-eth | | | ALPHA-ETH | alpha-eth | | | ALPHA-BSC | alpha-bsc | | | AMP-ETH | amp-eth | | | AUDIO-ETH | audio-eth | | | AXS-ETH | axs-eth | | | BADGER-ETH | badger-eth | | | BAL-ETH | bal-eth | | | BAND-BSC | band-bsc | | | BAND-ETH | band-eth | | | BAT-BSC | bat-bsc | | | BAT-ETH | bat-eth | | | BZRX-ETH | bzrx-eth | | | CAKE-BSC | cake-bsc | | | CEL-ETH | cel-eth | | | CHR-ETH | chr-eth | | | CHZ-ETH | chz-eth | | | COMP-ETH | comp-eth | | | CRV-ETH | crv-eth | | | ENJ-ETH | enj-eth | | | FET-ETH | fet-eth | | | FTM-BSC | ftm-bsc | | | FTM-ETH | ftm-eth | | | FTT-ETH | ftt-eth | | | GRT-ETH | grt-eth | | | HOT-ETH | hot-eth | | | LEO-ETH | leo-eth | | | LINK-BSC | link-bsc | | | LINK-ETH | link-eth | | | LRC-ETH | lrc-eth | | | MANA-ETH | mana-eth | | | MATIC-ETH | matic-eth | | | MKR-BSC | mkr-bsc | | | MKR-ETH | mkr-eth | | | NU-ETH | nu-eth | | | OCEAN-ETH | ocean-eth | | | OMG-ETH | omg-eth | | | QNT-ETH | qnt-eth | | | RARI-ETH | rari-eth | | | REEF-BSC | reef-bsc | | | REEF-ETH | reef-eth | | | REN-ETH | ren-eth | | | REV-ETH | rev-eth | | | RSR-ETH | rsr-eth | | | SAND-ETH | sand-eth | | | SHIB-ETH | shib-eth | | | SNX-BSC | snx-bsc | | | SNX-ETH | snx-eth | | | SRM-ETH | srm-eth | | | SUSHI-BSC | sushi-bsc | | | SUSHI-ETH | sushi-eth | | | SXP-BSC | sxp-bsc | | | SXP-ETH | sxp-eth | | | TEL-ETH | tel-eth | | | UNI-BSC | uni-bsc | | | UNI-ETH | uni-eth | | | YFI-BSC | yfi-bsc | | | YFI-ETH | yfi-eth | | | ZRX-ETH | zrx-eth | 下表列出了 B2CORE 支持的加密货币和法定货币。每种货币均标明了 ISO 代码、Alpha 代码、小数精度和图标(如有)。这些图标用于在 B2CORE UI 中以图形方式展示货币。 ## 法定货币 [#fiat] | 图标 | ISO 代码 | Alpha 代码 | 精度 | 名称 | | ----------------------------------------------------------- | ------ | ---------------- | -- | ---------------------------- | | | 8 | ALL | 2 | 阿尔巴尼亚列克 | | | 12 | DZD | 2 | 阿尔及利亚第纳尔 | | | 32 | ARS | 2 | 阿根廷比索 | | | 36 | AUD | 2 | 澳大利亚元 | | | 44 | BSD | 2 | 巴哈马元 | | | 48 | BHD | 3 | 巴林第纳尔 | | | 50 | BDT | 2 | 孟加拉塔卡 | | | 51 | AMD | 2 | 亚美尼亚德拉姆 | | | 52 | BBD | 2 | 巴巴多斯元 | | | 60 | BMD | 2 | 百慕大元 | | | 64 | BTN | 2 | 不丹努尔特鲁姆 | | | 68 | BOB | 2 | 玻利维亚诺 | | | 72 | BWP | 2 | 博茨瓦纳普拉 | | | 84 | BZD | 2 | 伯利兹元 | | | 90 | SBD | 2 | 所罗门群岛元 | | | 96 | BND | 2 | 文莱元 | | | 104 | MMK | 2 | 缅甸元 | | | 108 | BIF | 0 | 布隆迪法郎 | | | 116 | KHR | 2 | 柬埔寨瑞尔 | | | 124 | CAD | 2 | 加拿大元 | | | 132 | CVE | 0 | 佛得角埃斯库多 | | | 136 | KYD | 2 | 开曼群岛元 | | | 144 | LKR | 2 | 斯里兰卡卢比 | | | 152 | CLP | 0 | 智利比索 | | | 156 | CNY (alias: CNH) | 2 | 人民币元 | | | 170 | COP | 2 | 哥伦比亚比索 | | | 174 | KMF | 0 | 科摩罗法郎 | | | 188 | CRC | 2 | 哥斯达黎加科朗 | | | 191 | HRK | 2 | 克罗地亚库纳 | | | 192 | CUP | 2 | 古巴比索 | | | 203 | CZK | 2 | 捷克克朗 | | | 208 | DKK | 2 | 丹麦克朗 | | | 214 | DOP | 2 | 多米尼加比索 | | | 222 | SVC | 2 | 萨尔瓦多科朗 | | | 230 | ETB | 2 | 埃塞俄比亚比尔 | | | 232 | ERN | 2 | 厄立特里亚纳克法 | | | 238 | FKP | 2 | 福克兰群岛镑 | | | 242 | FJD | 2 | 斐济元 | | | 262 | DJF | 0 | 吉布提法郎 | | | 270 | GMD | 2 | 冈比亚达拉西 | | | 292 | GIP | 2 | 直布罗陀镑 | | | 320 | GTQ | 2 | 危地马拉格查尔 | | | 324 | GNF | 0 | 几内亚法郎 | | | 328 | GYD | 2 | 圭亚那元 | | | 332 | HTG | 2 | 海地古德 | | | 340 | HNL | 2 | 洪都拉斯伦皮拉 | | | 344 | HKD | 2 | 港元 | | | 348 | HUF | 2 | 匈牙利福林 | | | 352 | ISK | 0 | 冰岛克朗 | | | 356 | INR | 2 | 印度卢比 | | | 360 | IDR | 2 | 印度尼西亚盾 | | | 364 | IRR | 2 | 伊朗里亚尔 | | | 365 | IRT | 2 | 伊朗土曼 | | | 368 | IQD | 3 | 伊拉克第纳尔 | | | 376 | ILS | 2 | 以色列新谢克尔 | | | 388 | JMD | 2 | 牙买加元 | | | 392 | JPY | 0 | 日元 | | | 398 | KZT | 2 | 哈萨克斯坦坚戈 | | | 400 | JOD | 3 | 约旦第纳尔 | | | 404 | KES | 2 | 肯尼亚先令 | | | 408 | KPW | 2 | 朝鲜元 | | | 410 | KRW | 0 | 韩元 | | | 414 | KWD | 3 | 科威特第纳尔 | | | 417 | KGS | 2 | 吉尔吉斯斯坦索姆 | | | 418 | LAK | 2 | 老挝基普 | | | 422 | LBP | 2 | 黎巴嫩镑 | | | 426 | LSL | 2 | 莱索托洛蒂 | | | 430 | LRD | 2 | 利比里亚元 | | | 434 | LYD | 3 | 利比亚第纳尔 | | | 440 | LTL | 2 | 立陶宛立特 | | | 446 | MOP | 2 | 澳门元 | | | 454 | MWK | 2 | 马拉维克瓦查 | | | 458 | MYR | 2 | 马来西亚林吉特 | | | 462 | MVR | 2 | 马尔代夫拉菲亚 | | | 478 | MRO | 1 | 毛里塔尼亚乌吉亚 | | | 480 | MUR | 2 | 毛里求斯卢比 | | | 484 | MXN | 2 | 墨西哥比索 | | | 496 | MNT | 2 | 蒙古图格里克 | | | 498 | MDL | 2 | 摩尔多瓦列伊 | | | 504 | MAD | 2 | 摩洛哥迪拉姆 | | | 512 | OMR | 3 | 阿曼里亚尔 | | | 516 | NAD | 2 | 纳米比亚元 | | | 524 | NPR | 2 | 尼泊尔卢比 | | | 532 | ANG | 2 | 荷属安的列斯盾 | | | 533 | AWG | 2 | 阿鲁巴弗罗林 | | | 548 | VUV | 0 | 瓦努阿图瓦图 | | | 554 | NZD | 2 | 新西兰元 | | | 558 | NIO | 2 | 尼加拉瓜科多巴 | | | 566 | NGN | 2 | 尼日利亚奈拉 | | | 578 | NOK | 2 | 挪威克朗 | | | 586 | PKR | 2 | 巴基斯坦卢比 | | | 590 | PAB | 2 | 巴拿马巴波亚 | | | 598 | PGK | 2 | 巴布亚新几内亚基那 | | | 600 | PYG | 0 | 巴拉圭瓜拉尼 | | | 604 | PEN | 2 | 秘鲁索尔 | | | 608 | PHP | 2 | 菲律宾比索 | | | 634 | QAR | 2 | 卡塔尔里亚尔 | | | 643 | RUB | 2 | 俄罗斯卢布 | | | 646 | RWF | 0 | 卢旺达法郎 | | | 654 | SHP | 2 | 圣赫勒拿镑 | | | 678 | STD | 2 | 圣多美和普林西比多布拉 | | | 682 | SAR | 2 | 沙特里亚尔 | | | 690 | SCR | 2 | 塞舌尔卢比 | | | 694 | SLL | 2 | 塞拉利昂利昂 | | | 702 | SGD | 2 | 新加坡元 | | | 704 | VND | 0 | 越南盾 | | | 706 | SOS | 2 | 索马里先令 | | | 710 | ZAR | 2 | 南非兰特 | | | 728 | SSP | 2 | 南苏丹镑 | | | 748 | SZL | 2 | 斯威士兰里兰吉尼 | | | 752 | SEK | 2 | 瑞典克朗 | | | 756 | CHF | 2 | 瑞士法郎 | | | 760 | SYP | 2 | 叙利亚镑 | | | 764 | THB | 2 | 泰铢 | | | 776 | TOP | 2 | 汤加潘加 | | | 780 | TTD | 2 | 特立尼达和多巴哥元 | | | 784 | AED | 2 | 阿联酋迪拉姆 | | | 788 | TND | 3 | 突尼斯第纳尔 | | | 800 | UGX | 0 | 乌干达先令 | | | 807 | MKD | 2 | 马其顿第纳尔 | | | 810 | RUR | 2 | 俄罗斯卢布 | | | 818 | EGP | 2 | 埃及镑 | | | 826 | GBP | 2 | 英镑 | | | 834 | TZS | 2 | 坦桑尼亚先令 | | | 840 | USD | 2 | 美元 | | | 858 | UYU | 2 | 乌拉圭比索 | | | 860 | UZS | 2 | 乌兹别克斯坦索姆 | | | 882 | WST | 2 | 萨摩亚塔拉 | | | 886 | YER | 2 | 也门里亚尔 | | | 901 | TWD | 2 | 新台币 | | | 931 | CUC | 2 | 古巴可兑换比索 | | | 932 | ZWL | 2 | 津巴布韦元A/10 | | | 933 | BYN | 2 | 白俄罗斯卢布 | | | 934 | TMT | 2 | 土库曼斯坦马纳特 | | | 936 | GHS | 2 | 加纳塞地 | | | 937 | VEF | 2 | 委内瑞拉玻利瓦尔 | | | 938 | SDG | 2 | 苏丹镑 | | | 940 | UYI | 0 | 乌拉圭指数单位比索 (URUIURUI)(基金代码) | | | 941 | RSD | 2 | 塞尔维亚第纳尔 | | | 943 | MZN | 2 | 莫桑比克梅蒂卡尔 | | | 944 | AZN | 2 | 阿塞拜疆马纳特 | | | 946 | RON | 2 | 罗马尼亚列伊 | | | 947 | CHE | 2 | WIR 欧元(补充货币) | | | 948 | CHW | 2 | WIR 法郎(补充货币) | | | 949 | TRY | 2 | 土耳其里拉 | | | 950 | XAF | 0 | 中非金融合作法郎 BEAC | | | 951 | XCD | 2 | 东加勒比元 | | | 952 | XOF | 0 | 西非法郎 BCEAO | | | 953 | XPF | 0 | CFP 法郎(太平洋法郎) | | | 955 | XBA | | 欧洲复合货币单位(EURCO)(债券市场单位) | | | 956 | XBB | | 欧洲货币单位 (E.M.U.-6)(债券市场单位) | | | 957 | XBC | | 欧洲记账单位 9(E.U.A.-9)(债券市场单位) | | | 958 | XBD | | 欧洲记账单位 17(E.U.A.-17)(债券市场单位) | | | 959 | XAU | 2 | 黄金(一金衡盎司) | | | 960 | XDR | | 特别提款权 | | | 961 | XAG | 3 | 白银(一金衡盎司) | | | 962 | XPT | 2 | 铂金(一金衡盎司) | | | 963 | XTS | | 保留用于测试目的的代码 | | | 964 | XPD | 2 | 钯金(一金衡盎司) | | | 965 | XUA | | 非洲开发银行记账单位 | | | 967 | ZMW | 2 | 赞比亚克瓦查 | | | 968 | SRD | 2 | 苏里南元 | | | 969 | MGA | 1 | 马达加斯加阿里亚里 | | | 970 | COU | 2 | 实际价值单位 (UVR)(基金代码) | | | 971 | AFN | 2 | 阿富汗阿富汗尼 | | | 972 | TJS | 2 | 塔吉克斯坦索莫尼 | | | 973 | AOA | 2 | 安哥拉宽扎 | | | 975 | BGN | 2 | 保加利亚列弗 | | | 976 | CDF | 2 | 刚果法郎 | | | 977 | BAM | 2 | 波斯尼亚和黑塞哥维那可兑换马克 | | | 978 | EUR | 2 | 欧元 | | | 979 | MXV | 2 | 墨西哥投资单位 (UDI)(基金代码) | | | 980 | UAH | 2 | 乌克兰格里夫纳 | | | 981 | GEL | 2 | 格鲁吉亚拉里 | | | 984 | BOV | 2 | 玻利维亚 Mvdol(基金代码) | | | 985 | PLN | 2 | 波兰兹罗提 | | | 986 | BRL | 2 | 巴西雷亚尔 | | | 990 | CLF | 4 | 发展单位(基金代码) | | | 994 | XSU | | SUCRE | | | 997 | USN | 2 | 美元(次日)(基金代码) | | | 999 | XXX | | 无货币 | ## 加密货币 [#crypto] | 图标 | ISO 代码 | Alpha 代码 | 精度 | 名称 | | --------------------------------------------------------------- | ------ | ----------------- | -- | ------------------------------------------- | | | 1000 | BTC (alias: XBT) | 8 | 比特币 | | | 1002 | ETH | 18 | 以太坊 | | | 1003 | LTC | 8 | 莱特币 | | | 1004 | ETC | 8 | 以太坊经典 | | | 1005 | DASH (alias: DSH) | 8 | DASH | | | 1006 | BCH | 8 | 比特币现金 | | | 1007 | XMR | 8 | 门罗币 | | | 1009 | PZM | 8 | Prizm | | | 1010 | XRP | 6 | 瑞波币 | | | 1012 | XEM | 8 | XEM | | | 1015 | TFT | 8 | ThreeFold Token | | | 1018 | ADA | 8 | ADA | | | 1019 | DOGE | 8 | 狗狗币 | | | 1020 | ZEC | 8 | Zcach | | | 1021 | XLM | 7 | Stellar | | | 1022 | EOS | 8 | EOS | | | 1023 | BWK | 8 | Bulwark | | | 1025 | NSD | 8 | Nasdacoin | | | 1026 | TRX | 8 | Tron | | | 1027 | FUT | 8 | FutPlayCoin | | | 1029 | MPC | 8 | MediaPlayCash | | | 1995 | XTZ | 8 | Tezos | | | 1996 | WAVES | 8 | Waves | | | 1997 | ICX | 8 | Icon | | | 1999 | BSV | 8 | Bitcoin SV | | | 2000 | B2B (alias: B2BX) | 18 | B2BX | | | 2005 | USDT | 8 | 泰达币 | | | 2006 | EURT | 8 | Tether EUR | | | 2007 | R | 8 | Revain | | | 2008 | OMG | 8 | OmiseGO | | | 2009 | IOST | 8 | IOSToken | | | 2010 | VIU | 8 | Viuly | | | 2011 | EOS Token | 8 | EOS Token | | | 2012 | SRNT | 18 | Serenity | | | 2014 | NEO | 8 | NEO | | | 2016 | BXN | 8 | BITTXN | | | 2018 | DTC | 8 | DateCoin | | | 2020 | OLXA | 2 | OLXA | | | 2021 | PAX | 8 | PAX | | | 2022 | TUSD | 8 | TrueUSD | | | 2023 | GUSD | 8 | Gemini Dollar | | | 2024 | USDC | 8 | USD Coin | | | 2025 | BNB | 8 | Binance Coin | | | 2030 | XGT | 8 | XGT | | | 2032 | HDP | 4 | HedPay | | | 2033 | NADM | 8 | NeoAdam | | | 2034 | NOAH | 18 | NOAHCOIN | | | 2035 | TC | 8 | Titan Coin | | | 2036 | GGC | 18 | GG World Lottery | | | 2037 | SIM | 18 | Simmitri | | | 2038 | CTC | 18 | Catholic Coin | | | 2039 | MYX | 8 | Myoho | | | 2040 | CRAFTR | 18 | CraftR | | | 2041 | XRX | 8 | Global Property Register | | | 2042 | USDQ | 18 | USDQ | | | 2043 | ELLEX | 18 | Ellex Coin | | | 2044 | ANX | 8 | COINANX | | | 2045 | BNX | 8 | BTCNEXT Coin | | | 2046 | BFCL | 18 | BFCL Token | | | 2047 | ERN | 8 | EURON | | | 2048 | NWX | 8 | NIWIX Token | | | 2049 | C3W | 8 | C3 Wallet | | | 2050 | QDAO | 18 | Q DAO | | | 2051 | SPD | 18 | SPINDLE | | | 2053 | ZTX | 18 | Zulu Republic Token | | | 2054 | ITM | 8 | ITADAKI-MASU Coin | | | 2055 | DEC | 8 | Darico Ecosystem Coin | | | 2056 | KRWQ | 8 | KRWQ Stablecoin by Q DAO v1.0 | | | 2057 | NZE | 8 | Nagezeni | | | 2058 | NIOX | 8 | NIOX | | | 2060 | VEST | 8 | VestChain | | | 2061 | BKZ | 8 | Bitkruz Token | | | 2066 | FMT | 8 | Free Market Token | | | 2068 | DAI | 8 | Dai Stablecoin | | | 2070 | AZ | 8 | AZ Token | | | 2071 | B21 | 8 | B21 Token | | | 2075 | PDATA | 8 | PDATA | | | 2077 | BUSD | 8 | Binance USD | | | 2078 | ZVC | 8 | Zeven Coin | | | 2081 | ARBIS | 8 | ARBIS | | | 2083 | BII | 8 | Bitcoin 2 | | | 2084 | BDS | 8 | Bitcoin Dollar Stable | | | 2086 | BWON | 8 | Bitcoin BWON | | | 2087 | BYUN | 8 | Bitcoin BYUN | | | 2088 | NEX | 8 | NEX | | | 2090 | TEX | 8 | TEX | | | 2106 | AKRO | 18 | Akropolis | | | 2107 | ALPHA | 18 | Alpha Finance Lab | | | 2110 | BZRX | 18 | bZx Protocol | | | 2111 | CHR | 6 | Chromia | | | 2113 | MANA | 18 | Decentraland | | | 2114 | FTT | 18 | FTX Token | | | 2115 | LRC | 18 | Loopring | | | 2117 | COMP | 18 | Compound | | | 2121 | RSR | 18 | Reserve Rights | | | 2122 | SRM | 6 | Serum | | | 2123 | SHIB | 18 | SHIBA INU | | | 2126 | SNX | 18 | Synthetix | | | 2128 | SAND | 18 | The Sandbox | | | 2132 | BAND | 18 | Band Protocol | | | 2133 | BAT | 18 | Basic Attention Token | | | 2136 | SUSHI | 18 | SushiSwap | | | 2141 | YFI | 18 | yearn.finance | | | 2146 | FTM | 18 | Fantom | | | 2147 | AXS | 18 | Axie Infinity | | | 2153 | CHZ | 18 | Chiliz | | | 2160 | 1INCH | 18 | 1inch | | | 2161 | OCEAN | 18 | Ocean Protocol | | | 2947 | CAKE | 18 | PancakeSwap | | | 2949 | CRV | 18 | Curve DAO Token | | | 2956 | REN | 18 | Ren | | | 2957 | CEL | 4 | Celsius | | | 2959 | ENJ | 18 | Enjin Coin | | | 2962 | GRT | 18 | The Graph | | | 2964 | AAVE | 18 | Aave | | | 2968 | COVIP | 8 | COVIP | | | 2969 | SCAMUNKNOWN | 8 | 诈骗警报:未知状态。审核由 Q DeFi Rating 完成 | | | 2970 | SCAMMEDIUMRISK | 8 | 诈骗警报:中等风险。审核由 Q DeFi Rating 完成 | | | 2971 | SCAMHIGH | 8 | 诈骗警报:高概率。审核由 Q DeFi Rating 完成 | | | 2972 | NOAHARK | 8 | NOAH 的 DeFi ARK v.1 治理代币 | | | 2973 | FLR | 8 | Spark | | | 2974 | FXRP | 8 | Spark | | | 2975 | XYM | 8 | XYM | | | 2976 | QDEFI | 8 | Q DeFi Rating & Governance token v2.0 Token | | | 2977 | T34 | 8 | Platinum Software TECHNOLOGIES | | | 2978 | CNYQ | 8 | CNYQ Stablecoin by Q DAO | | | 2979 | JPYQ | 8 | JPYQ Stablecoin by Q DAO | | | 2980 | MILK2 | 8 | MILK2 Coin | | | 2981 | SHAKE | 8 | SHAKE Coin | | | 2982 | MATIC | 8 | Matic Network | | | 2983 | ERG | 8 | Ergo | | | 2984 | LTCP | 8 | Litecoin PoS | | | 2985 | ZRX | 8 | 0x | | | 2986 | BIP | 8 | Minter | | | 2987 | ATOM | 8 | Cosmos | | | 2988 | GRAM | 8 | Telegram Open Network IOU | | | 2989 | JPYQ | 8 | JPYQ | | | 2990 | NOAHP | 8 | NOAH.platinum | | | 2991 | CC | 8 | Custom Coin | | | 2993 | SPD | 8 | Spindle | | | 2994 | OWC | 8 | ODUWA Coin | | | 2995 | NCER | 0 | NIWIX Certificate | | | 2996 | NWX | 8 | NIWIX Token | | | 2997 | ERN | 8 | EURON | | | 2998 | BFCL | 8 | BFCL Token | | | 2999 | ABBC | 8 | ABBC | | | 3007 | UMA | 18 | UMA Voting Token v1 | | | 3099 | ALICE | 6 | ALICE | 以下状态可分配给入金、出金、转账、内部转账和兑换等交易: * **新建** — 已创建交易,但尚未处理。 * **待处理** — 表示交易请求正在等待管理员审批,或发生了某些技术问题。 * **冻结** *(仅适用于出金)* — 请求的出金金额正在客户账户中被冻结。 * **冻结失败** *(仅适用于出金)* — 冻结请求的出金金额时发生错误。 * **退款** *(仅适用于出金)* — 冻结请求的出金金额后,交易未继续处理,该金额已成功退还给客户。 * **退款失败** *(仅适用于出金)* — 由于技术问题,冻结在客户账户中的请求出金金额未能退还。 * **处理中** — 交易正在处理。 * **完成** — 交易已成功完成。 * **部分完成** — 由于技术问题,交易处理未完成。此类交易需要在 [财务 > 交易](../finance/transactions) 页面中处理(详情请参阅[如何处理状态为 Partial 的交易](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-partial-status))。 * **需协助** — 表示无法自动确定交易状态,且该交易需要手动操作。此状态仅适用于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的方法发起的入金和出金。管理员必须决定是继续与用于处理该交易的外部支付系统同步状态,还是将其标记为失败(详情请参阅[如何处理状态为 Assistance 的交易](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status))。 * **失败** — 交易因参数错误而失败。 * **拒绝** — 交易请求被管理员拒绝。 * **取消** — 交易被客户取消。 ## 储蓄简介 [#introduction-to-savings] 储蓄计划为客户提供了一种投资闲置资金并通过将其存入储蓄账户赚取利息的方式。这些计划提供了一种被动增长加密货币或法定货币资产的方法,类似于传统银行储蓄账户。 ## 关键要点 [#key-points] * 储蓄计划可基于 `Fixed` 和 `Flexible` 策略运行。 * 在 `Fixed` 策略中,客户必须投资预定义金额,并在计划期限内赚取固定利率。这些计划设有客户必须持有资金的固定期限,利息会根据计划中设定的支付周期进行累积和支付。 * `Flexible` 策略允许客户存入最低要求金额或更多资金,并进行额外存款。利率是灵活的,并由层级决定,层级会根据投资金额分配利率。采用灵活策略的计划没有时间限制,利息每日累积,并于每月第一天支付给客户。 * 要订阅储蓄计划,客户必须拥有以计划货币计价的钱包。赚取的利息随后会支付到相同的客户钱包。 * 当客户订阅储蓄计划并投资所需金额时,系统会为其创建个人储蓄计划,其中包括利息支付列表。 * 对于两种策略,均禁止部分提现。客户只能提取全部投资资金,这将导致其相应的储蓄计划终止。 在此页面上,您可以查看客户订阅储蓄计划后为其创建的储蓄计划列表。 ## 常规信息 [#general-information] 每个计划提供以下信息: **ID** 计划标识符。 *** **状态** 计划状态。 *** **策略** 储蓄策略: * `Fixed` — 固定利率 * `Flexible` — 浮动利率 *** **预设** 包含客户所订阅储蓄计划设置的预设标识符。 点击该标识符可前往预设详情页面并查看计划设置。 *** **客户** 客户标识符。 点击该标识符可前往客户详情页面并查看客户信息。 *** **钱包账户号码** 用于支付已赚取利息的客户钱包标识符。 *** **详情** 客户所订阅储蓄计划的主要设置(例如货币、投资金额、准入费和取消罚金)。 *** **创建时间** 客户订阅储蓄计划的日期和时间。 要查看支付计划详情,请点击 view-button。 ## 详情 [#details] 在详情页面上,您可以查看客户所订阅储蓄计划的设置。此外,还会显示利息支付列表。 对于 `Fixed` 策略,支付列表包括计划支付以及已支付至客户钱包的款项。 对于 `Flexible` 策略,列表仅显示已支付至客户的钱款。 要查看向所有客户支付的全部利息,请前往 [财务 > 交易](../finance/transactions),并按 **类型** 列中的 **储蓄支付** 进行筛选。处于 **已完成** 状态的支付会列在 **交易** 中。 详情页面会为每笔利息支付提供以下信息: **ID** 支付交易的标识符。 *** **金额** 利息金额。 *** **到期日**\ *仅适用于 Fixed 策略* 计划支付的日期和时间。 *** **状态** 支付状态: * `Scheduled` — 表示支付已计划安排,但尚未完成 * `Paid` — 表示支付已支付给客户 * `Cancelled` — 表示由于客户决定在计划期限结束前(对于 `Fixed` 策略)或罚金期结束前(对于 `Flexible` 策略)提取投资金额,因此支付被取消。 *** **支付日期** 仅适用于状态为 `Paid` 的利息支付。 向客户支付利息的日期和时间。 在此页面上,您可以查看包含储蓄计划设置的预设列表、修改预设以及创建新预设。 预设无法删除,但可以通过将其状态更改为 **Inactive** 来停用。 ## 常规信息 [#general-information] 每个储蓄计划均提供以下信息: **ID** 储蓄计划的标识符。 *** **名称** 储蓄计划的唯一名称,会显示给 B2CORE UI 中的客户。 *** **策略** 储蓄策略: * `Fixed` — 固定利率 * `Flexible` — 浮动利率 *** **币种** 储蓄计划的币种。若要订阅该计划,您的客户必须拥有以该计划币种计价的钱包。 *** **状态** 储蓄计划的状态。 * 如果状态为 **Active**,B2CORE UI 中会显示包含储蓄计划详情的卡片,客户可以订阅该计划。 * 如果状态为 **Inactive**,B2CORE UI 中不会显示储蓄计划卡片。 *** **创建时间** 储蓄计划的创建日期和时间。 *** **最后更新** 储蓄计划上次更新的日期和时间。 要查看储蓄计划详情,请点击 **Edit** 按钮。 ## 详情 [#details] 在详情页面上,您可以查看和修改以下计划设置: **名称** 储蓄计划的唯一名称,会显示给 B2CORE UI 中的客户。 *** **状态** 储蓄计划的状态。 * 如果状态为 **Active**,B2CORE UI 中会显示包含储蓄计划详情的卡片,客户可以订阅该计划。 * 如果状态为 **Inactive**,B2CORE UI 中不会显示储蓄计划卡片。 *** **准入费** 客户参与储蓄计划必须支付的费用金额。订阅计划时,准入费将从以计划币种计价的客户钱包中扣除。 此字段为可选项。如果您不想收取准入费,请输入 0(零)。 *** **描述** 储蓄计划的描述,会显示给 B2CORE UI 中的客户。 ### 浮动预设详情 [#flexible-preset-details] **最低投资金额** 初始投资的最低金额。订阅计划时,客户必须投资指定的最低金额或更多。 *** **最低追加投资金额** 客户可以追加到初始投资中的最低金额。 最低投资金额和追加投资金额可以指定为整数或小数值。 *** **支付周期** 向客户钱包支付利息的频率。始终为 `The first day of each month`,且无法更改。 *** **罚金期限(天)** 在此期限(按天计算)内,客户无法在不支付罚金的情况下提取其已投资资金。 *** **罚金类型** 定义客户在罚金期限结束前提取已投资资金时如何计算罚金: * **Fixed** — 扣除固定金额作为罚金。 * **Percentage** — 扣除总投资资金的一定百分比作为罚金。 *** **赎回罚金** 对于 **Fixed** 罚金类型,指定向客户收取的确切罚金金额。该金额必须为整数或小数值,且必须低于最低投资金额。 对于 **Percentage** 罚金类型,指定从总投资资金中扣除作为罚金的百分比。 不允许部分提取。客户只能提取其已投资资金的全部金额,这将导致其储蓄计划终止。 如果客户在罚金期限内提取其已投资资金,客户可以返还至其钱包的金额计算方式如下: `总投资金额 - 罚金金额` ### 层级 [#tiers] 在此部分中,您可以查看已添加层级的数量,这些层级用于应用浮动利率。 每个层级均指定以下参数: **层级起始金额** 客户必须投资的最低金额,以获得分配给该层级的利率。该金额表示层级的起始点以及上一层级的终止点。 *** **年化利率** 应用于该层级的年利率(百分比)。 存在一个 **Tier From** 值等于 0(零)的层级,且无法删除。 例如,假设您配置了以下层级: * 层级 1:**Tier from** 为 0,**Annual percentage rate** 为 1% * 层级 2:**Tier from** 为 2,000,**Annual percentage rate** 为 2% 如果客户投资 500,该客户将获得 1% 的利率。 如果客户追加 1,499,使总投资金额达到 1,999,利率仍保持为 1%。 客户追加更多资金且总投资金额达到 2,000 或以上后,利率将提高至 2%。 修改层级时,您可以选择 **Update Savings Plans Tiers**,将修改后的层级应用于基于所选预设已创建的储蓄计划(详见[修改采用 Flexible 策略的储蓄计划的层级](../../how-to-articles/manage-savings-programs/how-to-create-a-savings-program/configure-the-flexible-strategy-settings#modify-tiers-for-savings-programs-with-flexible-strategies))。 ### 固定预设详情 [#fixed-preset-details] **计划期限(天)** 投资至储蓄计划的金额必须持有的期限(按天计算)。计划期限可以按 30 天的间隔指定,例如 30、60、90 等。 计划期限结束时,投资金额将退还至客户钱包。 *** **支付周期(天)** 支付周期(按天计算),表示利息累积并支付至客户钱包的频率。支付周期可以按 30 天的间隔指定,例如 30、60、90 等。 *** **投资金额** 必须投入储蓄计划的金额。订阅计划时,投资金额将从以储蓄计划币种计价的客户钱包中扣除。如果客户拥有多个以计划币种计价的钱包,客户可以选择应从中扣除投资金额的钱包。 *** **利率(百分比)** 投资金额的百分比,用于计算每个支付周期结束时获得的利息。 *** **罚金类型** 定义客户在计划期限结束前提取已投资资金时如何计算罚金: * **Fixed** — 扣除固定金额作为罚金。 * **Percentage** — 扣除已投资资金的一定百分比作为罚金。 *** **取消罚金** 对于 **Fixed** 罚金类型,指定向客户收取的确切罚金金额。该金额必须为整数或小数值,且必须低于投资金额。 对于 **Percentage** 罚金类型,指定从投资金额中扣除作为罚金的百分比。 不允许部分提取。客户只能提取全部投资金额,这将导致其储蓄计划终止。 如果客户在罚金期限内提取其已投资资金,客户可以返还至其钱包的金额计算方式如下: `投资金额 - 罚金金额` **另请参阅** [如何创建储蓄计划](../../how-to-articles/manage-savings-programs/how-to-create-a-savings-program/) 在此页面上,您可以查看客户已添加到其白名单中的提现地址列表。 客户在 B2CORE UI 中启用 **地址管理** 选项后,只能将资金提现至其已添加到白名单中的钱包地址。如果禁用 **地址管理** 选项,客户可以将资金提现至任何钱包地址。 系统会提供每个已加入白名单的提现地址的以下信息: **客户 ID** 将提现地址添加到其白名单的客户标识符。 *** **客户电子邮箱** 客户的电子邮箱地址。 *** **钱包地址** 用于标识提现资金所用钱包地址的字符串值。 *** **目标标签** 用于识别交易收款人的目标标签。 仅适用于特定币种(XRP、XLM、BNB 和 XEM)。 *** **币种** 用于提现资金的钱包所计价的币种。 在此页面中,您可以查看现有黑名单列表并创建新的黑名单。 **黑名单**会阻止特定 IP 地址访问某些 API 端点。此功能有助于在应用程序级别快速阻止不需要的流量或潜在攻击者。 将 IP 加入黑名单是一项紧急措施,其可靠性不如在服务器级别阻止攻击者。请联系您的系统管理员。 ## 常规信息 [#general-information] 每个黑名单均提供以下信息: **ID** 黑名单的标识符。 *** **路由** 禁止访问的 API 端点。 *** **IP** 已列入黑名单的 IP 地址或子网掩码。 *** **启用** 黑名单的状态。 *** **备注** 加入黑名单的原因。 *** **创建时间** 创建黑名单的日期和时间。 *** **更新时间** 最后更新黑名单的日期和时间。 ## 示例 [#examples] * **阻止访问某个路径下的所有 API 端点** 若要阻止指定 IP 地址访问 `/api` 下的所有端点,请在**路由**字段中指定 `/api/*`。 * **仅阻止访问某个路径下的特定 API 端点** 若要阻止访问某个路径下的特定端点,同时允许访问其他端点,请在**路由**字段中指定更详细的路径。 例如,通过指定 `/api/v2/accounts/*`,您可以阻止指定 IP 地址访问 `/api/v2/accounts/:accountId` 和 `/api/v2/accounts/:accountId/balance` 等端点,同时仍允许其访问 `/api/v2/accounts`。 在此页面上,您可以查看因例如超过登录尝试次数限制而被临时封锁的客户列表(详情请参阅 [系统 > 设置](../system/settings))。您可以在此处解除这些客户的封锁。 **客户 ID** 客户标识符。 *** **客户电子邮件** 客户的电子邮件地址。 *** **IP** 客户登录 B2CORE UI 时使用的 IP 地址。 *** **封锁时间** 客户被封锁的日期和时间。 *** **到期时间** 封锁设定到期的日期和时间。 *** **原因** 封锁的原因。 在此页面中,您可以查看和管理列入黑名单的电子邮件域名。 如果某个域名被列入黑名单,客户将无法使用该域名的电子邮件地址在 B2CORE UI 中注册。例如,如果 `examplemail.com` 被列入黑名单,则诸如 `@examplemail.com` 的电子邮件地址将无法在 B2CORE UI 中注册。 如果为某个列入黑名单的域名启用 **Ban existing users** 复选框,使用该域名电子邮件地址的现有客户将失去对 B2CORE UI 的访问权限。 页面中提供以下信息: **ID** 分配给列入黑名单的电子邮件域名的标识符。 *** **Domain** 列入黑名单的电子邮件域名名称。 *** 若要查看详细信息或修改列入黑名单的电子邮件域名,请点击 **Edit** 按钮。 在显示的弹出窗口中,您可以查看 **Ban existing users** 复选框的状态、启用或禁用该选项,或编辑域名名称。如果进行了任何编辑,请点击 **Save** 以应用更改。 若要从黑名单中移除某个电子邮件域名,请点击 **Delete** 按钮。 您可以点击页面右上角的相应按钮,以 CSV 或 XLSX 格式导出页面数据。系统将自动将所选格式的文件下载到您的计算机。 在此页面上,您可以查看系统登录列表。 **客户 ID** 客户标识符。 *** **客户** 客户名称。 *** **客户邮箱** 客户的电子邮箱地址。 *** **IP** 客户登录 B2CORE UI 时使用的 IP 地址。 *** **授权日期** 客户登录 B2CORE UI 的日期和时间。 *** **状态** 授权结果。 在表格上方,您可以启用 **隐藏重复 IP** 选项,按唯一的邮箱 + IP 组合对条目进行分组,并隐藏重复条目。 在此页面上,您可以查看客户交易、查看风险评分、追踪资金来源,并检查与每笔交易相关的所有关键风险信号。 ## 常规信息 [#general-information] 每笔交易均提供以下信息: **客户 ID** 创建该交易的用户标识符。 *** **交易 ID** 交易的标识符。 *** **交易类型** 交易类型:入金或出金。 *** **创建日期** 交易的日期和时间。 *** **电子邮箱** 客户的电子邮箱地址。 *** **源金额** 以源货币计的交易金额。 *** **源货币** 交易货币。 *** **提供商** 风险监控提供商的名称(目前可用 **SumSubstance**)。 *** **审核结果** 风险监控提供商给出的交易检查结果:红色、绿色或错误。 *** **风险评分** 风险监控提供商给出的交易风险评分。 要查看详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 详细信息包括额外的交易信号,例如资金来源、潜在盗窃风险、交易所的洗钱(ML)风险等级等。 在此页面上,您可以查看现有白名单列表并创建新的白名单。 **白名单** 可用于限制对特定 URL 的访问,仅允许来自已列入白名单的 IP 地址进行访问。 每个白名单提供以下信息: **ID** 白名单的标识符。 *** **路由** 允许访问的 URL。 *** **IP** 已列入白名单的 IP 地址或子网掩码。 *** **启用** 白名单的状态。 *** **备注** 列入白名单的原因。 *** **创建时间** 创建白名单的日期和时间。 *** **更新时间** 白名单最后更新的日期和时间。 在此页面上,您可以查看可用货币列表、添加新货币并配置其设置。 **代码** 用作唯一货币标识符的数字代码。 *** **名称** 显示在 B2CORE UI 中的货币名称。 *** **字母代码** 货币的字母代码(由管理员在向系统添加货币时设置)。 *** **加价:卖出** 以百分比指定的卖出佣金加价。 *** **加价:买入** 以百分比指定的买入佣金加价。 *** **精度** 以货币表示金额时显示的小数位数。 您可以点击页面右上角的 **更改选项** 按钮,并指定所需值,为所有货币设置相同的买入/卖出加价。 要修改货币设置,请点击货币行中的 **编辑** 按钮,进入货币详情页面。 **另请参阅** [如何添加货币](../../how-to-articles/manage-currencies/how-to-add-a-currency) 在此页面中,您可以查看可用货币对列表并添加新的货币对。 **源货币** 基础货币的字母代码。 *** **目标货币** 计价货币的字母代码。 *** **为客户启用** 如果为 `Yes`,客户可以在 B2CORE UI 中兑换该货币对;否则为 `No`。 默认情况下,此选项设置为 `Yes`。 *** **汇率自定义优先级** 此货币对从汇率提供商获取汇率的顺序。 *** **更新时间** 货币对上次更新的日期和时间。 *** **最大金额** 货币对中每次兑换操作允许的最大金额。 *** **步长** 金额每次可变更的最小增量。 *** **为管理员启用** 如果为 `Yes`,可以通过 Back Office 兑换该货币对;否则为 `No`。 默认情况下,此选项设置为 `Yes`。 *** **需要请求** * 如果为 `Yes`,当客户在 B2CORE UI 中发起货币对兑换时,将创建管理员审批请求。审批后,将使用已批准请求中指定的汇率执行兑换。 * 如果为 `No`,将无需管理员审批即可执行该货币对的兑换。 默认情况下,此选项设置为 `No`。 **另请参阅** [如何添加兑换货币对](../../how-to-articles/manage-currencies/how-to-add-an-exchange-currency-pair) [如何为汇率提供商设置优先级](../../how-to-articles/manage-currencies/how-to-set-priorities-for-exchange-rate-providers) [如何为特定货币对的兑换启用请求](../../how-to-articles/manage-currencies/how-to-enable-requests-for-exchanges-in-specific-currency-pairs) 此页面显示已配置的汇率提供商,这些提供商用于在需要时确保交易处理期间货币兑换的准确性。 ## 常规信息 [#general-information] 每个汇率提供商会显示以下信息: **优先级** 分配给汇率提供商的优先级索引。 接收汇率的顺序取决于分配给提供商的优先级索引。索引越低,优先级越高。例如,索引为 `1` 的提供商会优先用于获取汇率。 您可以在汇率提供商详细信息中更改优先级,或者通过拖放提供商将其调整为所需顺序。 *** **提供商** 汇率提供商的名称: * B2BINPAY * BTC-Alpha * CBRF * CoinGecko * CoinMarketCap * Coinsbuy * CryptoCompare * CryptoWatch * ECB Rates * Fixer * WazirX * Xe * custom *** **名称** 分配给汇率配置的名称,用于 Back Office。 *** **源货币** 配置汇率时使用的一种或多种基础货币。 *** **目标货币** 适用汇率的一种或多种计价货币。 *** **已启用** 如果为 **是**,则汇率提供商已启用,可用于提供汇率。 要查看汇率提供商详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 在详细信息页面上,您可以查看和配置提供商所需的其他设置。 **选项** 此部分包括与特定提供商建立连接所需的连接设置。 *** 使用 **custom** 提供商时,会显示以下设置: * **汇率** — 用于兑换的固定汇率。 * **基础货币** — 使用指定固定汇率进行所有兑换时作为基础的货币。 **另请参阅** [如何配置货币汇率](../../how-to-articles/manage-currencies/how-to-configure-currency-exchange-rates) 在此页面上,您可以查看为客户认证配置的测试列表。 配置[验证级别](levels)时,您可以指定客户在提交用于获取更高级别的文件之前必须通过的认证测试。 ## 常规信息 [#general-information] 每项测试均提供以下信息: **ID** 测试的标识符。 *** **标题** 在 B2CORE UI 中向客户显示的测试标题。 *** **可见** 如果为 **是**,则该测试可供客户在 B2CORE UI 中使用;否则为 **否**。 要查看现有测试的详细信息或对其进行修改,请点击相应行中的 **编辑** 按钮。 ## 详细信息 [#details] 详细信息页面包含以下选项卡: 在此选项卡上,可以修改 **标题** 和 **可见性** 字段。 在 **详细信息** 字段中,您可以指定测试说明或客户在开始测试前应了解的其他有用信息。此类信息将显示在 B2CORE UI 中测试标题的下方。 在此选项卡上,您可以向测试添加不同类型的问题和答案选项。 可用的问题类型如下: * **开放式** — 可自由作答的开放式问题。 * **封闭式** — 可通过从给定选项列表中选择一个或多个正确答案来回答的封闭式问题。 * **问卷** — 可通过从给定选项列表中选择一个或多个答案来回答的多选题。 * **投票** — 可通过从给定选项列表中选择一个答案来回答的单选题。 **另请参阅** [如何创建客户认证测试](../../how-to-articles/manage-verification-options/how-to-create-a-client-accreditation-test) 在此页面上,您可以查看已创建的文档组列表并创建新的文档组。 ## 常规信息 [#general-information] 每个文档组提供以下信息: **优先级** 分配给文档组的优先级索引。 *** **名称** 文档组名称。 *** **标题** 显示在 B2CORE UI 中的文档组名称。 *** **类型** 文档组的类型。 *** **已启用** 如果为 `Yes`,则此组可用于验证。 要查看详细信息,请点击 **Edit** 按钮。 ## 详细信息 [#details] 详细信息包括: **名称** 文档组名称。 *** **类型** 文档组的类型。 *** **标题** 显示在 B2CORE UI 中的文档组名称,可针对不同的界面语言进行本地化。 *** **描述** 显示在 B2CORE UI 中的文档组描述,可针对不同的界面语言进行本地化。 *** **已启用** 如果为 `Yes`,则此文档组可用于验证。 *** **优先级** 分配给文档组的优先级索引。 在此页面上,您可以查看已创建的文档类型列表并创建新的文档类型。 ## 常规信息 [#general-information] 每种文档类型均提供以下信息: **优先级** 分配给该文档类型的优先级索引。 *** **名称** 在 Back Office 中使用的文档类型名称。 *** **标题** 显示在 B2CORE UI 中的文档类型名称。 *** **状态** 如果为 `Enabled`,则此文档类型可用于验证。 要查看文档类型详细信息,请点击 **Edit** 按钮。 ## 详细信息 [#details] 详细信息包括: **名称** 在 Back Office 中使用的文档类型名称。 *** **标题** 显示在 B2CORE UI 中的文档类型名称,可针对不同的界面语言进行本地化。 *** **描述** 显示在 B2CORE UI 中的文档类型描述,可针对不同的界面语言进行本地化。 *** **状态** 如果为 `Enabled`,则此文档类型可用于验证。 *** **示例** 可为此文档类型提交的文件示例。 *** **组** 包含此文档类型的一个或多个[文档组](document-groups)。 *** **最大文件数** 可为此文档类型上传的最大文件数量。 *** **优先级** 分配给该文档类型的优先级索引。 在此页面上,您可以查看客户为验证而提交的所有文档列表。 ## 常规信息 [#general-information] 每个文档提供以下信息: **ID** 文档标识符。 *** **类型** [文档类型](document-types)。 *** **状态** 文档审批的当前[客户请求状态](../references/client-request-statuses)。 *** **客户 ID** 提交文档的客户标识符。 *** **客户名称** 提交文档的客户名称。 *** **电子邮件** 提交文档的客户电子邮件地址。 *** **请求 ID** 客户文档审批请求的标识符。 *** **上传者** 指示由谁上传文档。 *** **上传时间** 文档上传的日期和时间。 要查看文档详情,请点击 **编辑** 按钮。 ## 详细信息 [#details] 详细信息包括: **类型** [文档类型](document-types)。 *** **文件** 文档文件的链接。 在此页面上,您可以查看 Back Office 中可用验证级别的列表、创建新级别并配置其设置。 ## 常规信息 [#general-information] 以下是每个验证级别提供的信息: **索引** 分配给验证级别的索引。 默认验证级别始终分配零(`0`)索引。对于其他验证级别,索引必须大于零。 *** **名称** 显示在 B2CORE UI 和移动应用中的本地化级别名称。 *** **桌面端描述** 显示在 B2CORE UI 中的本地化级别描述。B2CORE UI 的描述可以采用 HTML 格式指定。 此外,您可以通过导航至验证级别详情并填写 **移动端描述** 字段,指定在移动应用中显示的级别描述。移动应用的描述可以采用 JSON 格式指定。 *** **默认** 如果为 `Yes`,则该验证级别为默认级别,并会授予所有新注册客户;否则为 `No`。 *** **可见** 如果为 `Yes`,则该验证级别会在 B2CORE UI 的 KYC 流程中向客户显示;如果设置为 `No`,则会被隐藏。 使用设置为 `No` 的 **可见性** 创建隐藏级别(例如,具有特定交易限额的级别),这些级别可通过 Back Office 手动分配给客户。分配后,客户可以在 B2CORE UI 中通过 **个人资料** 菜单访问的 **验证** 页面上查看该级别及其描述,包括限额和其他相关信息。对于所有未分配此级别的其他客户,该级别仍会保持隐藏。 要查看验证级别详情,请单击与所选级别相关的 **编辑** 按钮。 ## 详情 [#details] 以下是每个验证级别提供的其他信息: **向导** 用于在 B2CORE UI 中运行验证流程的向导名称,使客户能够进入下一个验证级别。可选项: * **SnsWizardSDK** — 在 B2CORE UI 中打开 SumSub 弹窗,以获取验证说明并上传文件。 * **ShuftiProSDK** — 在 B2CORE UI 中打开 ShuftiPro 弹窗,以获取验证说明并上传文件。 * **DocumentsWizard** — 使用内置 KYC 提供商,并根据指定的文件组在 B2CORE UI 中显示文件上传表单。 *** **下一级别** 客户获得此验证级别后可被授予的下一个验证级别。 *** **移动端描述** 显示在移动应用中的本地化级别描述。移动应用的描述可以采用 JSON 格式指定。 *** **邮件描述** 用于电子邮件通知的级别描述。 *** **已分配的客户权限** 指定客户在获得此验证级别后可在 B2CORE UI 中执行哪些操作的[权限集](../system/client-rights)。 *** **客户测试** 客户在提交获得此验证级别所需的文件之前必须通过的一项或多项认证测试(要了解更多信息,请参阅[如何创建客户认证测试](../../how-to-articles/manage-verification-options/how-to-create-a-client-accreditation-test))。 *** **文件组** 一个或多个[组](document-groups),其中包含客户为获得此验证级别必须提交的文件。 *** **限额** 为此级别指定的 USD 交易限额(要了解更多信息,请参阅[如何按验证级别设置入金、出金和转账限额](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels))。 **另请参阅** [如何创建验证级别](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-create-verification-levels) 在此页面上,您可以查看客户加密货币钱包列表。 要查看特定客户的钱包,请前往客户详情页面上的[财务选项卡](../clients/general/finance-tab),然后选择**入金钱包**。 每个入金钱包均提供以下信息: **ID** 系统中的钱包标识符。 *** **客户 ID** 钱包所有者的标识符。 *** **客户** 钱包所有者的名称。 *** **标签** 分配给钱包所有者的标签,用于对向 [Back Office 管理员](../system/users/)显示的钱包列表进行排序。 *** **地址** 公开钱包地址。 *** **目标标签** 仅适用于特定货币(XRP、XLM、BNB 和 XEM)。 *** **区块链** 创建钱包所在的区块链网络。 *** **方式** 用于入金的[方式](../system/deposit-system#deposit-methods)详情链接。 *** **货币** 为钱包启用的货币。 在此页面上,您可以查看所有存入客户账户和钱包的入金,从而跟踪、审核和管理入金活动。 要查看特定客户的入金,请前往客户详情页面上的[交易选项卡](../clients/general/transactions-tab)。 ## 常规信息 [#general-information] 系统会提供有关每笔入金的以下信息: **入金编号** 在 B2CORE 中分配给入金的序列号。 点击以打开入金详情。 *** **客户 ID** 客户标识符。 *** **客户** 客户的姓名。 *** **电子邮件** 客户的电子邮件地址。 *** **标签** 分配给客户的标签,用于对显示给[Back Office 管理员](../system/users/users)的入金列表进行排序。 *** **国家/地区** 客户的[国家/地区](../system/countries)(如果在注册或 KYC 验证过程中指定)。 *** **司法管辖区** 分配给客户的[司法管辖区](../clients/jurisdictions)。 *** **公司简称** 客户公司的简称。 *** **公司全称** 客户公司的全称。 *** **账户号码** 资金存入的客户账户或钱包号码。 *** **支付方式** 用于存入资金的[方式](../system/deposit-system#deposit-methods)。 *** **支付名称** B2CORE Back Office 中使用的入金方式名称。 *** **方式组** 入金方式所属的[组](../system/deposit-system#deposit-groups)。 *** **KYT 状态** 由 **SumSub Fraud Prevention** 返回的 Know Your Transaction 状态,表明交易是否已通过合规检查,显示为 `green` 或 `red`。 系统会执行入金监控;但是,由于入金通过外部支付系统处理,无论 SumSub 响应为 `green` 还是 `red`,交易仍可能成功完成。 *** **金额** 入金金额。 *** **货币** 指定入金金额所使用的货币。 *** **供应商佣金** 经纪商收取的佣金。 *** **提供商佣金** 支付系统收取的佣金。 *** **佣金货币** 收取佣金所使用的货币。 *** **最终金额** 以最终货币计的入金金额(扣除佣金)。 *** **最终货币** 处理入金金额并将其记入客户账户或钱包所使用的货币。 *** **汇率** 在执行交易时,用于将入金金额兑换为最终货币的实际汇率。 该汇率可能与客户在提交交易前于 B2CORE UI 中看到的汇率不同。B2CORE UI 中显示的汇率仅供参考,可能无法反映入金执行期间应用的最终值。 *** **汇率货币** 处理入金所使用的货币。 *** **汇率 (USD)** 用于将入金金额兑换为 USD 的汇率。 *** **最终金额 (USD)** 以 USD 计的入金金额(扣除佣金)。 *** **创建时间** 发起入金的日期和时间。 *** **处理时间** 处理入金的日期和时间。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **财务已验证** 仅供内部使用。财务部门执行的检查结果。 *** **账户类型** 用于创建客户账户或钱包的[产品类型](../products/products)。 *** **内部客户类型** 仅供内部使用。内部客户资料类别。 *** **发票** 相关支付系统中支付操作的唯一标识符。 *** **交易** 区块链上交易的唯一地址。 *** **内部备注** 仅供内部使用。有关入金的可选备注。 要查看入金详情,请点击 **编辑** 按钮或 **入金编号** 列中显示的编号。 ## 详情 [#details] 详情页面显示 **交易者房间** 选项卡,其中包含下方列出的入金详情。 对于通过 [PSS 连接](../../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss)方式进行的入金,还提供额外的 **支付系统** 选项卡,其中包含扩展的[支付详情](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status#payment-details-structure)。 **ID** 在 B2CORE 中分配给入金的序列号(与 **入金编号** 列中显示的编号相同)。 **状态** 当前[交易状态](../references/transaction-statuses)。 *** **发票** 相关支付系统中支付操作的唯一标识符。 *** **入金方式** 用于存入资金的[方式](../system/deposit-system)。 *** **日期** 发起入金的日期。 *** **发票日期** 创建发票的日期。 *** **结果日期** 入金记账的日期。 *** **财务已验证** 仅供内部使用。财务部门执行的检查结果。 *** **金额** 入金金额。 *** **货币** 指定入金金额所使用的货币。 *** **供应商佣金** 经纪商收取的佣金。 *** **提供商佣金** 支付系统收取的佣金。 *** **最终金额** 以处理入金并将其记入客户账户或钱包的最终货币计的入金金额(扣除佣金)。 *** **交易** 区块链上交易的唯一地址。 *** **汇率 (USD)** 用于将入金金额兑换为 USD 的汇率。 *** **内部备注** 有关入金的可选备注。输入备注或编辑现有备注,然后点击 **保存**。 ### 信息 [#info] 此部分显示资金存入的客户账户或钱包信息。 **账户号码** 资金存入的客户账户或钱包号码。 *** **账户余额** 账户或钱包中的当前余额。 *** **账户类型** 用于创建账户或钱包的[产品类型](../products/products)。 *** **客户** 客户的姓名。 *** **电子邮件** 客户的电子邮件地址。 ### 交易监控 [#transaction-monitoring] 此部分显示通过 **SumSub** 执行的 KYT 检查结果(`green` 或 `red`)。要使用此功能,您必须拥有启用了且已正确配置 **Fraud Prevention** 的有效 **SumSub** 账户,并且已在 B2CORE Back Office 中启用相应的 **SumSub** 外部连接。 如果未显示结果,请点击 **检查交易** 按钮。如果交易已经过检查,则此按钮不可用。 **另请参阅** [如何创建入金](../../how-to-articles/manage-finances/how-to-create-a-deposit) 在此页面上,您可以查看在客户账户上进行的兑换交易列表。 要查看特定客户账户上进行的兑换,请前往客户详情页面上的[交易标签页](../clients/general/transactions-tab)。 每笔兑换交易均提供以下信息: **交易 ID** 系统中兑换交易的标识符。 *** **客户 ID** 客户标识符。 *** **客户** 客户名称。 *** **电子邮件** 客户的电子邮件地址。 *** **司法管辖区** 分配给客户的[司法管辖区](../clients/jurisdictions)。 *** **标签** 分配给客户的标签,用于对向[后台管理员](../system/users/)显示的兑换交易列表进行排序。 *** **公司简称** 客户公司的简称。 *** **公司全称** 客户公司的全称。 *** **转出账户** 从中提取兑换资产金额的源账户编号。 *** **源金额** 兑换的金额,以源账户的货币计。 *** **源货币** 源账户计价所使用的货币。 *** **转入账户** 存入兑换资产金额的目标账户编号。 *** **目标金额** 兑换的金额,以目标账户的货币计。 *** **目标货币** 目标账户计价所使用的货币。 *** **佣金** 因在基础汇率上应用加价而从兑换交易中获得的金额。这反映了通过在汇率中加入加价百分比所产生的利润。 *** **汇率** 应用于交易的最终汇率,包括附加的加价百分比。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **创建时间** 进行兑换交易的日期和时间。 *** **兑换执行者** 指示兑换是由客户在 B2CORE UI 中完成,还是由管理员在后台完成。 **另请参阅** [如何兑换资金](../../how-to-articles/manage-finances/how-to-exchange-funds) 在此页面上,您可以查看从客户账户和钱包发起的所有出金,从而跟踪、审查和管理出金活动。 要查看特定客户的出金,请前往客户详情页面上的[交易选项卡](../clients/general/transactions-tab)。 ## 常规信息 [#general-information] 以下是每笔出金提供的信息: **出金编号** 在 B2CORE 中分配给出金的序列号。 点击以打开出金详情。 *** **客户 ID** 客户标识符。 *** **客户** 客户名称。 *** **电子邮件** 客户的电子邮件地址。 *** **标签** 分配给客户的标签,用于对展示给[Back Office 管理员](../system/users/users)的出金列表进行排序。 *** **国家/地区** 客户的[国家/地区](../system/countries)(如果在注册或 KYC 验证过程中指定)。 *** **司法管辖区** 分配给客户的[司法管辖区](../clients/jurisdictions)。 *** **公司简称** 客户公司名称的简称。 *** **公司全称** 客户公司名称的全称。 *** **账户** 用于提取资金的客户账户或钱包编号。 *** **方式** 用于提取资金的[方式](../system/payout-system#payout-methods)。 *** **名称** B2CORE Back Office 中使用的出金方式名称。 *** **方式组** 出金方式所属的[组](../system/payout-system#payout-groups)。 *** **KYT 状态** **SumSub Fraud Prevention** 返回的“了解您的交易”状态,表示交易是否已通过合规检查,显示为 `green` 或 `red`。 *** **金额** 出金金额。 *** **币种** 出金金额所使用的币种。 *** **供应商佣金** 经纪商收取的佣金。 *** **提供商佣金** 支付系统收取的佣金。 *** **佣金币种** 收取佣金所使用的币种。 *** **最终金额** 扣除佣金后的出金金额,以最终币种计。 *** **最终币种** 处理出金时使用的币种。 *** **汇率** 在执行交易时,用于将出金金额兑换为最终币种的实际汇率。 该汇率可能与客户在提交交易前于 B2CORE UI 中看到的汇率不同。B2CORE UI 中显示的汇率仅供参考,可能不反映出金执行期间实际采用的最终值。 *** **汇率币种** 处理过程中出金金额兑换为的币种。 *** **汇率(USD)** 用于将出金金额兑换为 USD 的汇率。 *** **最终金额(USD)** 扣除佣金后的出金金额,以 USD 计。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **创建时间** 发起出金的日期和时间。 *** **处理时间** 处理出金的日期和时间。 *** **账户类型** 创建客户账户或钱包所依据的[产品类型](../products/products)。 *** **内部客户类型** 仅供内部使用。内部客户资料类别。 *** **发票** 相关支付系统中支付操作的唯一标识符。 *** **交易** 区块链上交易的唯一地址。 *** **区块链手续费** 区块链佣金。 *** **钱包** 提取资金的钱包公开地址。 *** **目标标签** 仅适用于 XRP、XLM、BNB 和 XEM。 *** **交易部门已批准** 仅供内部使用。财务部门执行检查的结果。 *** **合规已批准** 仅供内部使用。法务部门执行检查的结果。 *** **内部备注** 仅供内部使用。有关出金的可选备注。 要查看出金详情,请点击**编辑**按钮或**出金编号**列中显示的编号。 ## 详情 [#details] 详情页面显示**交易员空间**选项卡,其中包含以下列出的出金详情。 对于通过[PSS 连接](../../how-to-articles/manage-payment-methods/how-to-add-deposit-and-withdrawal-methods-through-pss)的方式进行的出金,还提供额外的**支付系统**选项卡,其中包含扩展的[支付详情](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status#payment-details-structure)。 **ID** 在 B2CORE 中分配给出金的序列号(与**出金编号**列中显示的编号相同)。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **发票** 相关支付系统中支付操作的唯一标识符。 *** **日期** 发起出金的日期。 *** **发票日期** 创建发票的日期。 *** **结果日期** 扣除出金金额的日期。 *** **方式** 用于提取资金的[方式](../system/payout-system)。 *** **金额** 出金金额。 *** **币种** 出金金额所使用的币种。 *** **供应商佣金** 经纪商收取的佣金。 *** **提供商佣金** 支付系统收取的佣金。 *** **最终金额** 扣除佣金后的出金金额,以处理出金时使用的最终币种计。 *** **交易** 区块链上交易的唯一地址。 *** **汇率** 在执行交易时,用于将出金金额兑换为最终币种的实际汇率。 *** **USD 汇率** 用于将出金金额兑换为 USD 的汇率。 *** **内部备注** 有关出金的可选备注。输入备注或编辑现有备注,然后点击**保存**。 *** **交易部门已批准** 仅供内部使用。财务部门执行检查的结果。 *** **合规已批准** 仅供内部使用。法务部门执行检查的结果。 ### 请求信息 [#request-info] 此部分显示与客户出金请求相关的信息,该请求需要由[Back Office 管理员](../system/users/users)批准或拒绝。 **请求 ID** 客户出金请求的标识符。 点击以打开请求详情。 *** **处理结果** [请求状态](../references/client-request-statuses)。 *** **原因** 对于被拒绝的请求,显示该请求被拒绝的原因。 ### 信息 [#info] 此部分显示有关用于提取资金的客户账户或钱包的信息。 **账户** 用于提取资金的客户账户或钱包编号。 *** **账户余额** 账户或钱包的当前余额。 *** **账户类型** 创建账户或钱包所依据的[产品类型](../products/products)。 *** **客户** 客户名称。 *** **电子邮件** 客户的电子邮件地址。 ### 交易监控 [#transaction-monitoring] 此部分显示通过 **SumSub** 执行的 KYT 检查结果(`green` 或 `red`)。要使用此功能,您必须拥有已启用并正确配置 **Fraud Prevention** 的有效 **SumSub** 账户,同时还需在 B2CORE Back Office 中启用相应的 **SumSub** 外部连接。 如果未显示结果,请点击**检查交易**按钮。如果交易已被检查,则此按钮不可用。 **另请参阅** [如何创建出金](../../how-to-articles/manage-finances/how-to-create-a-payout) 在此页面中,您可以查看已配置的报表列表以及创建新报表。 ## 常规信息 [#general-information] 每个报表均提供以下信息: **ID** 报表标识符。 *** **间隔** 报表计划。可选项: * **每日** — 每天运行并发送报表 * **每周** — 每周运行并发送一次报表 * **每月** — 每月运行并发送一次报表 *** **日期范围** 根据 Back Office 服务器时间,报表中包含数据的时间段: * **日** — 前一天 00:00 至 23:59 * **周** — 前一周周一 00:00 至周日 23:59 * **月** — 前一个月第一天 00:00 至最后一天 23:59 * **Curweek** — 从第 1 天 00:00 至昨天 23:59 的前 7 天 * **Overall** — 从最开始至昨天 23:59 * **Curmonth** — 当月第一天 00:00 至昨天 23:59 *** **文件格式** 生成报表时使用的文件格式。可选项: * HTML * XLSX * CSV *** **名称** 分配给报表的名称。 *** **发送至** 用于接收报表下载链接的电子邮件地址。 *** **上次运行** 上次运行报表并将其发送至指定电子邮件地址的日期和时间。 *** **启用** 报表状态: * **启用** — 表示报表会按计划运行并发送 * **停用** — 表示报表已被禁用 要查看报表详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 详细信息页面中会显示以下附加字段: **类别** 报表类型。可以选择一种或多种报表类型。可选项: * **客户财务报表** — 显示每位客户在指定时间段内的入金、出金和净入金金额(总入金与总出金之间的差额),以相应货币及折算为 USD 的形式展示。该报表包括以下字段:**Email**、**Verification Level**、**Currency**、**Deposit**、**Withdraw**、**(D - W)**、**(Deposit, USD)**、**(Withdraw, USD)** 和 **(Deposit - Withdrawal, USD)**。 * **交易财务报表** — 包含在指定时间段内执行的所有交易的详细信息。该报表包含多个字段,例如 **ID**、**Account ID**、**Operation ID**、**Email**、**Transaction Type**、**Method**、**Source Currency**、**Source Amount**、**Type Commission**、**Final Amount**、**Target Amount**、**Target Currency**、**Transaction Exchange Rate**、**% Markup**、**Profit Markup**、**Markup Currency** 等。 * **方式财务报表** — 包含有关在指定时间段内用于执行入金和出金操作的方法的详细信息。数据按货币分组(例如法币和加密货币),并包含有关每项操作所收取佣金和获得利润的信息。该报表包含多个字段,例如 **Method**、**Currency**、**Deposit**、**Withdraw**、**Source Commission**、**Final Deposit amount**、**Final Withdrawal amount**、**Profit Markup**、**Counterparty Commission**、**Profit (Counterparty commission)** 等。 * **货币财务报表** — 显示在指定时间段内以特定货币进行的入金、出金和净入金金额(总入金与总出金之间的差额),以及折算为 USD 的金额。该报表包括以下字段:**Currency**、**Deposit**、**Withdraw**、**(D - W)**、**(Deposit, USD)**、**(Withdraw, USD)** 和 **(Deposit - Withdrawal, USD)**。 * **余额报表** — 显示在指定时间段内客户账户的余额变化。数据按每种货币分组,还包括所有客户账户余额变化折算为 USD 的总额。该报表包括以下字段:**ID**、**Email**、**Client Name**、**Internal Client Type**、**Verification Level**、**Company Name**、**Currency**、**Balance**、**Hold**、**Rate**、**(Balance, USD)**、**Previous Balance** 和 **(Previous Balance, USD)**。 * **用户转入转出** — 此报表与 **客户财务报表** 类似,同时还包含其他字段,例如 **Transfers (D-W)** 和 **Manual (D-W)**。 * **IB 余额报表** — 显示 IB 合作伙伴在指定时间段内获得的奖励金额,以及折算为 USD 的奖励总额。该报表包括以下字段:**ID**(分配给 IB 合作伙伴的标识符)、**Email**、**Client Name**、**Internal Client Type**、**Verification Level**、**Company Name**、**Currency**、**Balance**、**Rate** 和 **(Balance, USD)**。 * **简化余额报表** — 显示客户账户中每种货币的余额,以及所有客户账户余额折算为 USD 的总额。该报表包括以下字段:**Email**、**Internal Client Type**、**Currency** 和 **Balance**。 * **LegalEntityBalancesReport** — 显示由特定法人实体提供服务的客户所有真实账户中的余额。 *** **开始小时** 根据 Back Office 服务器时间,运行报表并将其发送至指定电子邮件的小时。该值必须在 0 — 23 范围内。 *** **GMT 偏移量** 用于运行和发送报表的本地时区 GMT 偏移量。 **另请参阅** [如何创建报告](../../how-to-articles/manage-finances/how-to-create-a-report) **静态入金**为客户在 B2CORE 中向其钱包充值提供了一种可重复使用且持久的方式。与常规的一次性入金不同,静态入金允许客户多次使用相同的**静态支付详情**(也称为**身份标识**),无需为每笔交易生成包含支付详情的新支付页面。 目前,**B2BINPAY v3** 和 **Coinsbuy v3** 支付系统可配置为使用静态支付详情。有关详情,请参阅 [如何集成 B2BINPAY](../../how-to-articles/manage-payment-methods/how-to-integrate-b2binpay-v3)。 ## 常规入金与静态入金的区别 [#difference-between-regular-deposits-and-static-deposits] ### 常规入金 [#regular-deposits] **常规入金**是由客户发起的一次性交易。每次入金都需要生成一个包含支付详情的全新临时支付页面。 常规入金流程如下: 1. 在 B2CORE UI 的**入金**页面上,客户选择其钱包和入金币种,指定入金金额,并选择可用的入金方式。 2. 客户根据所选方式填写所需的附加字段。 3. 发起入金后,客户会被重定向至支付页面或显示二维码。该页面设有过期时间。 4. 入金完成或过期后,支付页面及其支付详情无法再次使用。 ### 静态入金 [#static-deposit] **静态入金**使用由客户生成的持久支付详情。这些详情可供重复使用,并永久关联至该客户。 这种方式尤其适用于加密货币和银行支付,客户可能希望在多次入金时重复使用相同的加密货币地址或银行收款信息。 静态入金流程如下: 1. 在 B2CORE UI 的**入金**页面上,客户选择其钱包和入金币种,并选择支持静态入金的入金方式。 2. 客户根据所选方式填写所需的附加字段,并生成支付详情(例如,加密货币地址或银行收款信息)。 3. 生成的支付详情会被保存,并可用于不同金额的后续入金。 4. 支付详情不会过期,并会在所选支付系统中存在期间保持有效。 ### 要点 [#key-points] * 静态支付详情可重复用于存入不同金额。 * 每组支付详情都会永久关联至特定客户。 * 支付详情不会过期,除非被明确停用,否则始终有效。 * 可为同一支付方式生成多个支付详情,客户可选择要使用的详情。 ## 未解决的请求 [#unresolved-requests] 在此页面上,您可以查看**未解决的请求**列表。当处理**静态入金**时发生问题且无法创建静态入金时,系统会创建这些请求。这些请求使管理员能够跟踪错误、识别其原因,并采取措施解决静态入金问题。 每个未解决请求均提供以下信息: ### 常规信息 [#general-information] **ID** 未解决请求的唯一标识符。 *** **状态** 请求状态: * **未解决** — 表示无法创建静态入金,且已生成未解决请求。 * **已解决** — 表示该请求已由管理员审核并手动解决。 *** **驱动程序** 发起该入金时使用的静态入金驱动程序。 *** **错误代码** 创建未解决请求的原因。下表列出了与静态入金处理相关的可能错误代码,以及其原因和可能出现这些错误的配置场景。 *** **创建日期** 创建请求的日期和时间。 要查看请求详情,请点击**眼睛**图标。 ### 详情 [#details] 详情页面显示有关静态入金及相关错误的扩展信息。问题处理完成后,可点击**解决**按钮手动关闭该请求。 在此页面上,您可以查看所有交易的完整列表,包括入金、出金、转账、兑换、IB 奖励和储蓄付款,以及它们的当前状态。 每笔交易提供以下信息: **ID** 交易标识符。 *** **客户 ID** 客户标识符。 *** **类型** 交易类型: * **入金** — 向客户账户添加资金。 * **出金** — 从客户账户提取资金。 * **转账** — 在同一客户所属的账户之间转移资金。 * **内部转账** — 在同一 B2CORE 系统内不同客户之间转移资金。 * **兑换** — 在客户账户之间将一种货币兑换为另一种货币。 * **奖励** — 记入来自 IB 计划的奖励。 * **储蓄付款** — 来自[储蓄计划](../savings)的利息付款。 如果您按类型(例如 **入金**、**出金** 或 **兑换**)筛选 **交易** 页面,在未应用其他筛选条件的情况下,结果列表将与 [财务 > 入金](deposits)、[财务 > 出金](payouts) 或 [财务 > 兑换](exchange) 中的相应列表一致。 在未应用其他筛选条件的情况下,按 **转账** 和 **内部转账**(如已启用)筛选将显示与 [财务 > 转账](transfers) 中相同的列表。 *** **来源** 来源账户的标识符。 *** **来源账户号码** 来源账户的号码。 *** **来源币种** 来源账户的计价币种。 *** **来源金额** 以来源币种计的交易金额。 *** **来源佣金** 以来源币种计收取的交易佣金金额。 *** **目标** 目标账户的标识符。 *** **目标账户号码** 目标账户的号码。 *** **目标币种** 目标账户的计价币种。 **目标金额** 以目标币种计的交易金额。 *** **目标佣金** 以目标币种计收取的交易佣金金额。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **日期** 创建交易的日期和时间。 **另请参阅** [如何处理 Partial 状态的交易](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-partial-status) [如何处理状态为 Assistance 的交易](../../how-to-articles/manage-finances/how-to-process-transactions-with-the-assistance-status) 在此页面上,您可以查看客户账户之间已完成的转账列表。 要查看特定客户账户之间的转账,请前往客户详情页面上的[交易选项卡](../clients/general/transactions-tab)。 ## 常规信息 [#general-information] 每笔转账交易均提供以下信息: **操作 ID** 系统中转账交易的标识符。 *** **客户 ID** 转出资金的客户账户所属客户的标识符,后跟转入资金的客户账户所属客户的标识符(例如,`296 -> 296` 或 `118 -> 274`)。 *** **客户名称** 客户名称。 *** **客户邮箱** 客户的电子邮件地址。 *** **内部客户类型** 仅供内部使用。内部客户资料类别。 *** **司法管辖区** 分配给客户的[司法管辖区](../clients/jurisdictions)。 *** **类型** 转账交易的类型: * `Transfer` – 在同一客户的账户之间转移资金。 * `Internal transfer` – 在同一 B2CORE 系统内将资金从一位客户转移给另一位客户。 *** **标签** 分配给客户的标签,用于对向[后台管理员](../system/users/)显示的转账交易列表进行排序。 *** **公司简称** 客户公司的简称。 *** **公司全称** 客户公司的全称。 *** **转出账户** 转出资金的源账户号码。 *** **源平台** 开设源账户的[平台](../products/platforms)。 *** **源类型** 源账户所属[产品类型](../products/products)。 *** **源金额** 以源账户货币计的转账金额。 *** **源货币** 源账户的计价货币。 *** **转入账户** 转入资金的目标账户号码。 *** **目标平台** 开设目标账户的[平台](../products/platforms)。 *** **目标类型** 目标账户所属[产品类型](../products/products)。 *** **目标金额** 以目标账户货币计的转账金额。 *** **目标货币** 目标账户的计价货币。 *** **状态** 当前[交易状态](../references/transaction-statuses)。 *** **创建时间** 完成转账的日期和时间。 *** **处理时间** 处理转账的日期和时间。 要查看交易详情,请点击 **Edit** 按钮或 **Operation ID** 列中显示的编号。 ## 详细信息 [#details] 每笔转账交易还提供以下附加信息: **内部客户类型** 仅供内部使用。内部客户资料类别。 *** **源佣金** 以源账户货币计的佣金。 *** **目标佣金** 以目标账户货币计的佣金。 *** 如果您的客户需要提交资金转账请求,并且这些请求将逐一处理(批准或拒绝),则会提供以下有关客户请求的信息: **请求 ID** 客户资金转账请求的标识符。 *** **处理结果** [请求状态](../references/client-request-statuses)。 *** **原因** 请求被拒绝的原因。 **另请参阅** [如何创建转账](../../how-to-articles/manage-finances/how-to-create-a-transfer) 您可以向 B2CORE UI 和移动应用中显示的菜单添加自定义项。 在移动应用中,这些项显示在 **服务** 部分。此功能从 **iOS** v1.29 和 **Android** v2.6.0 起受支持。 要能够添加自定义菜单项,您应被授予 `Update menu` 权限(有关详细信息,请参阅[如何添加用户组并授予权限](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions))。 要添加自定义菜单项: 导航至 **Promotion** > **Menu**。 要查看可用菜单项列表,请点击 **General** 行中的 **眼睛** 图标。 自定义菜单项可添加到 **General** 菜单树下或任何现有菜单项内。要进入现有项,请点击相应行中的眼睛 **图标**。 点击页面右上角的 **+Create**。 在显示的弹窗中,填写以下必填字段: * 在 **Name** 字段中,输入菜单项的唯一名称。 * 在 **Caption** 字段中,输入菜单项标题,该标题将向客户显示在 B2CORE UI 菜单或移动应用的 **服务** 部分中。 * 在 **External URL** 字段中,指定外部资源或网页的 URL,客户点击该菜单项时将被重定向至该地址。 * 在 **Icon** 字段中,指定将用作 B2CORE UI 菜单图标的图片 URL。 图片必须符合以下要求: * **格式**:SVG * **尺寸**:16×16 像素 * **样式**:单色(单一颜色,通常为黑色或白色:#000000/ #FFFFFF) * **背景**:透明(推荐) 您还可以选择对菜单项设置限制: * 要使菜单项仅对具有特定验证级别的客户可用,请在 **Verification Level Allowance** 下拉列表中选择相应级别。 * 要使菜单项仅对被分配特定类型的客户可用,请在 **Client Type Allowance** 下拉列表中选择相应类型。 如果未在这些下拉列表中选择任何选项,菜单项将对所有客户可用,且不受任何限制。 要在 B2CORE UI 中将菜单项标记为“新”,请启用 **New** 复选框。 要使菜单项在 B2CORE UI 和移动应用中可见,请启用 **Visible** 复选框;否则,该菜单项将被隐藏。 点击 **Save** 以添加自定义菜单项。 自定义菜单项将显示在菜单树中。要调整其位置,只需将其拖放至所需位置。 如有需要,可点击 **Caption** 字段中标题右侧的按钮,为该项标题指定本地化属性。 您可以在 B2CORE UI 的主菜单下添加 **联系我们** 部分,以显示您的支持邮箱或其他联系信息,方便客户与您联系。 您可以通过 B2TRANSLATE 进行配置。有关 B2TRANSLATE 的更多信息,请参阅[产品文档](https://docs.b2translate.b2broker.com/)。 要完成以下步骤,您必须已注册 B2TRANSLATE,并且有权访问与您的 B2CORE 关联的项目。 要添加 **联系我们** 部分: 导航至 **系统** > **设置**,找到与您的 B2CORE 关联的 B2TRANSLATE 项目的 UUID 并将其复制。 登录 B2TRANSLATE。 在 B2TRANSLATE 中,转到 **项目**,然后通过 UUID 查找相关项目。 在 **default** 类别中找到键 `B2Core.Shared.ModelTranslates.EmailTranslateKeys.Email1`。 如果 **翻译** 字段旁的 **挂锁** 图标处于锁定状态,请将其解锁。 在 **翻译** 字段中输入联系信息。支持 HTML 格式化(详情请参阅 B2TRANSLATE 文档中的[添加或修改翻译](https://docs.b2translate.b2broker.com/user-guide/manage-translations/add-or-modify-translations))。 示例: ```html

Contact Us

Send email ```
更改将自动保存。 请保持 **挂锁** 图标处于解锁状态。
使用上述提供的 HTML 示例后,**联系我们** 部分将显示在 B2CORE UI 的主菜单下方,随后显示 **发送邮件** 链接,客户可使用该链接快速发送消息。 通过此方法,您可以在 B2CORE UI 中添加重要信息,例如联系信息、支持链接或其他消息。 要添加行情滚动组件交易品种: 导航至 **Promotion** > **Dashboard**。 在 **Widgets List** 页面上,选择 **Ticker Widget MT4** 或 **Ticker Widget MT5**,然后点击位于 **Actions** 列中的 **Edit** 按钮。 要添加交易品种,请点击 **Edit** 页面上显示的 **+Create** 按钮。 在显示的 **Add ticker instrument** 弹出窗口中,指定以下信息: * 在 **Symbol** 字段中,输入要添加的交易品种。 * 在 **Show** 下拉列表中,选择以下两个选项之一: * **Yes** – 在 B2CORE UI 的 **Dashboard** 中对应的组件内显示该交易品种。 * **No** – 允许从下拉列表中选择该交易品种,并将其添加到 B2CORE UI 的 **Dashboard** 中对应的组件。 点击 **Save** 以应用更改。 您可以自定义在 B2CORE UI 中向客户显示的菜单。 要自定义菜单,您应被授予 `Update menu` 权限(详情请参阅[如何添加用户组并授予权限](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions))。 要自定义 B2CORE UI 菜单: 导航至 **Promotion** > **Menu**。 要查看可用菜单项列表,请点击位于 **General** 行中的 **eye** 图标。 要在 B2CORE UI 中显示或隐藏菜单项,请切换 **Visible** 列中的开关。 要更改菜单项在 B2CORE UI 中的显示顺序,请按所需顺序拖放菜单项。 点击与所选菜单项对应的 **Edit** 按钮,并配置以下选项: * 在 **Caption** 字段中,指定要在 B2CORE UI 中向客户显示的菜单项名称。 * 要仅向获得特定验证等级的客户显示菜单项,请在 **Verification level allowance** 下拉列表中选择相应等级。默认情况下,此字段会显示在 Back Office 中配置的所有验证等级。 * 要仅向被分配特定类型的客户显示菜单项,请在 **Client Type Allowance** 下拉列表中选择相应类型。 * 要在 B2CORE UI 中将菜单项标记为“新”,请启用 **New** 复选框。 点击 **Save** 以应用更改。 当客户首次登录 B2CORE UI 时,他们会看到默认的 **仪表板**。作为管理员,您可以更改默认 **仪表板** 的小组件和布局,以向客户展示最重要的信息。 点击 **重置** 按钮可恢复默认仪表板配置。 要设置默认仪表板配置,请执行以下操作: 导航至 **推广** > **仪表板**。 对于要在 **仪表板** 上显示的小组件,请启用位于 **默认显示** 列中的开关。 要允许客户关闭 **仪表板** 上显示的小组件,请启用位于 **删除** 列中的开关。对于此类小组件,B2CORE UI 中将提供 **关闭** (⨯) 按钮。 要设置小组件在 **仪表板** 上的大小和位置,请从列表中选择一个小组件,然后点击位于 **操作** 列中的 **编辑** 按钮。 在 **编辑** 页面中,通过在 **宽度** 和 **高度** 字段中输入整数值,以点为单位指定小组件大小。 仪表板宽度限制为 50 点,小组件的宽度不得超过此值。 每个小组件的最小宽度以及最小和最大高度各不相同,具体取决于其显示的数据。如果您指定的值不被接受,将显示相应的错误消息。 通过在 **位置 X** 和 **位置 Y** 字段中指定坐标,在 **仪表板** 上定位小组件。仅接受正值。位置 X 和 Y 表示小组件左上角的坐标。 要在 **仪表板** 上正确定位小组件,**宽度** 和 **位置 X** 字段中指定的值之和必须小于或等于 **仪表板** 宽度,即 50 点。 `Width + Position X <= 50` 点击 **保存**。 您可以创建横幅,这些横幅将向您的客户显示在 B2CORE UI、移动应用或移动浏览器中。 ## 如何创建桌面端横幅 [#how-to-create-a-desktop-banner] 要创建将向您的客户显示在 B2CORE UI 中的横幅: 导航至 **Promotion** > **Banners**。 点击页面右上角的 **+Create**。 在显示的 **Create Banner** 弹出窗口中,填写以下字段: * 在 **Caption** 字段中,输入横幅标题。您可以将此字段留空,创建不带标题的横幅。 * 在 **Banner URL** 字段中,输入用于定义横幅将在 B2CORE UI 中显示在哪个页面的 URL 尾部(例如,`/dashboard`、`/wallets`、`/funds/deposit` 或其他)。 * 在 **Banner priority** 字段中,输入一个整数值,用于定义在创建多个横幅时横幅的显示顺序。例如,优先级设置为 1 的横幅将首先显示在网页上;优先级设置为 2 的横幅将显示在第一个横幅之后,依此类推。 * 从 **Banner Type** 下拉列表中选择 **Desktop**。 点击 **Save** 以创建横幅。 点击横幅行中的 **Edit** 按钮以配置横幅设置。 在 **Edit banner** 页面上,填写以下字段: ### Banner 选项卡 [#banner-tab] * 在 **Button link** 字段中,输入外部资源的 URL 路径。点击横幅上显示的按钮时将打开此 URL。 ### Light 和 Dark 选项卡 [#light-and-dark-tabs] * **Caption** 字段显示您在创建横幅时输入的标题。您可以通过插入以下 HTML 代码来更改不同主题的标题字体颜色和粗细: `Banner Title` * 在 **Button** 字段中,输入要显示为按钮标签的文本。 * 在 **Text** 字段中,输入将显示在横幅标题下方的文本。您可以通过插入以下 HTML 代码来更改不同主题的文本字体颜色和粗细: `Text that will be displayed on your banner` * 在 **Banner Background** 字段中,指定要用作所选主题背景的图片 URL。 * 要应用本地化设置,请点击 **Caption**、**Button** 和 **Text** 字段右侧的按钮,并输入所需语言的翻译。 点击 **Save** 以应用更改。 配置横幅设置后,在 **Banner** 选项卡中将 **Enabled** 下拉列表设为 **Yes**,以在 B2CORE UI 中显示横幅。 ## 如何为移动应用创建横幅 [#how-to-create-a-banner-for-the-mobile-app] 要创建将向您的客户显示在移动应用中或通过移动浏览器访问 B2CORE 时显示的横幅: 导航至 **Promotion** > **Banners**,然后点击页面右上角的 **+Create**。 在显示的 **Create Banner** 弹出窗口中,填写以下字段: * 在 **Caption** 字段中,输入横幅标题。您可以将此字段留空,创建不带标题的横幅。 * 在 **Banner URL** 字段中,输入 `/dashboard`。所有横幅都将显示在应用 **Home** 屏幕的顶部。 * 在 **Banner Priority** 字段中,指定一个整数值,用于定义在创建多个横幅时横幅的显示顺序。 * 从 **Banner Type** 下拉列表中选择 **Mobile**。 * 点击 **Save**。 在 **Banner** 选项卡中,指定以下设置: * **Title** 字段显示第 2 步中指定的横幅标题。您可以将此字段留空,创建不带标题的横幅。 * 在 **Sub Title** 字段中,输入横幅副标题。您可以将此字段留空,创建不带副标题的横幅。 * 从 **Vertical Align** 和 **Horizontal Align** 下拉列表中选择适当的值,以垂直和水平对齐标题及副标题。 * 在 **Button Link** 字段中,指定外部资源的 URL。在移动应用中轻触横幅后将打开此 URL。 * 在 **Button Title** 字段中,指定按钮标题。您可以将此字段留空,创建不带按钮的横幅。 * 在 **Preview Text** 字段中,指定点击横幅后显示的预览描述。您可以将此字段留空,创建不带预览文本的横幅。 * 将 **Preview Enabled** 选项设为 **Yes**,以使横幅预览在移动应用中可用。 * 在 **Padding** 字段中,指定点数以定义文本块四个边的内边距区域。 * 要使横幅在移动应用中对您的客户可用,请将 **Enabled** 字段设为 **Yes**,然后点击 **Save**。 要为横幅的浅色和深色主题指定背景图片,请切换至 **Light** 或 **Dark** 选项卡。 在 **Image URL** 字段中,指定要用作横幅背景图片的图片 URL。 移动应用的推荐横幅尺寸为 840 × 360 px(宽高比为 21:9)。支持的图片格式为 PNG。 点击 **Save** 以应用更改。 ## 如何限制横幅显示 [#how-to-restrict-banner-display] 您可以通过应用基于 **国家/地区**、**验证等级**、**客户类型** 或 **司法管辖区** 的限制来控制哪些客户可以看到横幅。您还可以组合这些限制,以实现更精确的定向。 要对横幅应用限制: 导航至 **Promotion** > **Banners**。 选择横幅并点击 **Edit** 按钮。 ### 国家/地区限制: [#country-restrictions] * 在 **Edit banner** 页面上,点击页面右上角的 **Actions** 按钮,然后在下拉列表中选择 **Country restrictions**。 * 在 **Restrictions** 弹出窗口中,填写以下字段: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 横幅将显示给除来自所选国家/地区的客户以外的所有客户。 * **Allow only** — 横幅将仅显示给来自所选国家/地区的客户。 * 在 **Rules** 下拉列表中,选择一个或多个国家/地区。 ### 验证等级限制: [#verification-level-restrictions] * 在 **Edit banner** 页面上,点击页面右上角的 **Actions** 按钮,然后在下拉列表中选择 **Verification level restriction**。 * 在 **Restrictions** 弹出窗口中,填写以下字段: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 横幅将显示给除具有所选等级的客户以外的所有客户。 * **Allow only** — 横幅将仅显示给具有所选等级的客户。 * 在 **Rules** 下拉列表中,选择一个或多个验证等级。 ### 客户类型限制: [#client-type-restrictions] * 在 **Edit banner** 页面上,点击页面右上角的 **Actions** 按钮,然后在下拉列表中选择 **Client type restrictions**。 * 在 **Restrictions** 弹出窗口中,填写以下字段: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 横幅将显示给除具有所选客户类型的客户以外的所有客户。 * **Allow only** — 横幅将仅显示给具有所选客户类型的客户。 * 在 **Rules** 下拉列表中,选择一个或多个客户类型。 ### 司法管辖区限制 [#jurisdiction-restrictions] * 在 **Edit banner** 页面上,点击页面右上角的 **Actions** 按钮,然后在下拉列表中选择 **Jurisdiction restrictions**。 * 在 **Restrictions** 弹出窗口中,填写以下字段: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 横幅将显示给除位于所选司法管辖区的客户以外的所有客户。 * **Allow only** — 横幅将仅显示给位于所选司法管辖区的客户。 * 在 **Rules** 下拉列表中,选择一个或多个司法管辖区。 点击 **Save** 以应用限制。 要创建公告: 导航至 **Promotion** > **Announcements**。 点击 **+Create**。 选择公告**类型**: * **Required** — 包含一个按钮,并会阻止与 B2CORE UI 的交互,直到客户点击该按钮。 * **Optional** — 不需要客户操作,并会在客户点击 B2CORE UI 顶部栏中的 **Announcements** 图标时显示。 输入公告**标题**。 点击 **Save** 以创建公告。新创建的公告默认处于禁用状态。 点击公告行中的 **Edit** 以配置其设置。 填写以下字段: * 如有需要,添加**标题**的本地化版本。 * 将 **Enable** 设置为 **Yes**。 * **Button text** *(仅适用于 Required 公告)* — 输入操作按钮的标签。 * **Targeted emails** — 输入客户邮箱,以将公告限制为特定收件人。您也可以上传包含邮箱地址的 CSV 文件。 * **Text** — 输入公告消息,并在需要时添加本地化版本。 * **Button URL** — 指定客户点击公告中显示的按钮后将被重定向到的 URL。 * **Due to Date** — 设置到期日期。在此日期之后,公告将不再显示在 B2CORE UI 中。 点击 **Save** 以激活公告。 您可以为在 MT4/5 上交易的客户配置返现奖励计划。 返现根据已平仓头寸,按客户 MT 账户在一天内交易的每手交易量计算,并于次日存入客户账户。 返现将通过使用 **cashback** 提供商的入金方式存入客户账户(详情请参阅[如何创建用于发放返现奖励的入金方式](how-to-configure-cashback-programs-for-mt4-and-mt5#how-to-create-a-deposit-method-for-rewarding-cashback))。 要配置返现计划: 导航至 **Cashback** > **MetaTrader Volume**。 选择要为其配置返现计划的 MT 平台:**MetaTrader 4** 或 **MetaTrader 5**。 在 **Preferences** 选项卡上,配置以下设置: * 在 **Cashback value** 字段中,输入每交易一手所奖励的固定费率。返现值可以用整数或小数表示。 返现金额的计算方式如下: `Cashback amount = Cashback value * Number of traded lots` * 在 **Cashback currency** 下拉菜单中,选择返现计划币种。 * 在 **Account destination type** 下拉菜单中,选择返现存入的账户类型: * **Trade** — 返现将奖励至客户的 MT 交易账户,该账户曾进行用于返现计算的交易量交易。 * **Personal** — 返现将奖励至客户 `personal` 类型的账户,例如以返现计划币种计价的钱包。 * 在 **Ignored symbols groups** 下拉菜单中,选择要从返现计算中排除的交易品种。 * 在 **Accounts platform groups allowance** 下拉菜单中,选择 MT 账户组。默认情况下,MT 平台上配置的所有账户组均处于选中状态。 * 如果 **Accounts number allowance** 字段为空,则包含在 **Accounts platform groups allowance** 字段中所选组内的所有 MT 交易账户均可获得返现。 * 在 **Accounts number allowance** 字段中,输入以逗号分隔的 MT 账号。 * 如果此字段中列出了一个或多个 MT 账号,则仅列出的账户可获得返现,且 **Accounts platform groups allowance** 选项将被忽略。 要启用返现计划,请选择 **Enabled**。 点击 **Save** 以应用更改。 保存更改后,**Updated** 字段将显示返现计划的配置日期或最后修改日期。 ## 如何添加返现奖励层级 [#how-to-add-cashback-reward-tiers] 您可以添加一个或多个层级,以确定在一天内交易量达到特定数量的客户所享受的更高返现费率。 添加返现奖励层级: 导航至 **Cashback** > **MetaTrader Volume**。 选择要为其配置返现奖励层级的 MT 平台:**MetaTrader 4** 或 **MetaTrader 5**。 进入 **Tier** 选项卡,然后点击 **+Create**。 在 **Name** 字段中,输入层级名称。 在 **Cashback value** 字段中,输入提高后的返现费率。如果 MT 账户在一天内的交易量达到所需层级交易量,则将使用此费率替代 **Preferences** 选项卡上指定的费率。 在 **Trading volume, lots** 字段中,输入获得更高返现所需交易的手数。 点击 **Save** 以应用更改。 如果客户在一天内在其 MT 账户上交易的交易量达到或超过层级交易量,则该 MT 账户的返现将按照提高后的返现费率计算。 ## 如何创建用于发放返现奖励的入金方式 [#how-to-create-a-deposit-method-for-rewarding-cashback] 返现通过使用 **cashback** 提供商的入金方式奖励给客户。此方式仅用于存入返现,客户无法在 B2CORE UI 中使用该方式。 创建用于发放返现的入金方式: 导航至 **System** > **Deposit system** > **Deposit methods**。 点击 **+Create**,并填写以下字段: * 在 **Name** 字段中,输入在 Back Office 中使用的入金方式名称。 * 在 **Caption** 字段中,输入在 Back Office 中使用的入金方式标题。 * 在 **Provider** 下拉菜单中,选择 **cashback**。 * 在 **Currency** 下拉菜单中,选择与为 MT4 或 MT5 配置的返现计划中 **Cashback currency** 字段相同的币种。 * 在 **Connection** 下拉菜单中,选择 **Not selected**。 点击 **Save** 以添加该方式。 在 **Settings** 选项卡上,填写以下字段: * 在 **Enabled** 下拉菜单中,选择 **Yes**。 * **Group** 字段默认设置为 **Not selected**。此入金方式无法包含在任何入金方式组中。 点击 **Save** 以应用更改。 进入 **TR Currencies** 选项卡,确保添加的交易币种与返现计划币种一致且已启用。 如果交易币种未启用,请点击 **Edit**,然后在 **Enabled** 下拉菜单中选择 **Yes**。 点击 **Save** 以应用更改。 ## 如何识别获得返现奖励的客户 [#how-to-identify-clients-who-received-cashback-rewards] 获取已收到返现的客户列表并查看交易详情: 导航至 **Finance** > **Deposits**。 要获取返现交易列表,请在 **Payment method** 列下显示的下拉菜单中选择用于发放返现的入金方式名称。 要查看特定交易的详细信息,请点击交易行中的 **Edit** 按钮。 您可以将 B2CORE 配置为使用 [Twilio](https://www.twilio.com/) 通信平台,通过 SMS 发送 2FA 验证码,或通过 B2CORE Back Office 向您的客户拨打电话。 ## 要点 [#key-points] * 对于电话呼叫,如果您的账户拥有多个号码,您可以选择要使用的有效 Twilio 号码。这使您能够选择最合适的本地号码,从而提高成功联系客户的可能性并增强客户信任。 * 通过 Twilio 从 B2CORE Back Office 发起的外呼也可以录音,录音将保存在您的 Twilio 账户中,以便日后播放。 通过 Back Office 配置与 Twilio 的连接需要以下信息: * Twilio 账户 SID * Twilio 身份验证令牌 * Twilio 电话号码 * TwiML App SID ## 如何注册 Twilio [#how-to-sign-up-with-twilio] 本说明介绍如何注册 Twilio 并获取通过 Back Office 连接到 Twilio 所需的信息。 本说明基于撰写时最新版本的 Twilio 创建。由于此处所述流程可能发生变化,如有任何疑问,我们建议您查阅官方 [Twilio Help Center](https://help.twilio.com/) 或联系其支持团队。 前往 [Twilio](https://www.twilio.com/) 网站并注册以创建新账户。 默认情况下,将创建一个免费试用账户。 登录您的账户,然后点击 **Upgrade** 链接将其升级为正式账户。 账户升级后,您的 Twilio 账户 SID 和身份验证令牌将自动生成。 按照以下文章中提供的说明获取 Twilio 电话号码: * [How to Search for and Buy a Twilio Phone Number from Console](https://support.twilio.com/hc/en-us/articles/223135247-How-to-Search-for-and-Buy-a-Twilio-Phone-Number-from-Console) * [Twilio Phone Number Types and Their Capabilities](https://support.twilio.com/hc/en-us/articles/223135367-Twilio-Phone-Number-Types-and-Their-Capabilities) 按照以下步骤创建 TwiML App: * 前往 [TwiML Apps page](https://console.twilio.com/?frameUrl=/console/voice/twiml/apps)。登录您的 Twilio 账户后即可访问此页面。 * 点击 **Create new TwiML App**。 * 填写 TwiML App 表单: * 在 **Friendly Name** 字段中,指定应用名称。 **Voice Configuration** * 在 **Request URL** 字段中,指定语音应用 webhook 的 URL,例如: `api.company.name.com/api/v1/voice/twilio-webhook` * 在 **Request Method** 下拉列表中,选择 **HTTP POST**。 **Messaging Configuration** * 在 **Request URL** 字段中,指定消息应用 webhook 的 URL,即您的 B2CORE Back Office 的 URL。 * 在 **Request Method** 下拉列表中,选择 **HTTP POST**。 点击 **Create** 以创建应用。 应用创建后,您的 TwiML App SID 将自动生成。 使用获取到的 Twilio 账户 SID、身份验证令牌、电话号码和 TwiML App SID,通过 B2CORE Back Office 配置与 Twilio 的连接。 ## 如何将 Twilio 配置为 2FA SMS 提供商 [#how-to-configure-twilio-as-a-2fa-sms-provider] 您可以配置 Twilio 以通过 SMS 向客户发送 2FA 验证码。 在将 Twilio 配置为 2FA SMS 提供商之前,请确保您已获取以下必要信息: * Twilio 账户 SID * Twilio 身份验证令牌 * Twilio 电话号码 若要了解如何获取所需信息,请参阅[如何注册 Twilio](how-to-configure-twilio#how-to-sign-up-with-twilio)。 要将 Twilio 配置为 2FA SMS 提供商: 导航至 **System** > **SMS Providers**,然后点击页面右上角的 **+Create**。 点击页面右上角的 **+Create**。 在显示的弹出窗口中,填写以下字段: * 在 **Name** 字段中,输入您想要用于该配置的名称(例如 `twilio_sms`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该配置的标题(例如 `Twilio SMS`)。 * 在 **Provider** 下拉列表中,选择 **Twilio**。 点击 **Save** 以保存配置。 在 **Edit provider** 页面上,指定以下连接设置: * 在 **API sid** 字段中,指定您的 Twilio 账户 SID。 * 在 **API secret** 字段中,指定您的 Twilio 身份验证令牌。 * 在 **Sender phone number** 字段中,指定您的 Twilio 电话号码。 确保 **Enabled** 字段设置为 **Yes**。 点击 **Save**。 现在可以使用 Twilio 通过 SMS 发送 2FA 验证码。若要了解更多信息,请参阅[如何使用 SMS 设置 2FA](../manage-system-settings/how-to-set-up-2fa#how-to-set-up-2fa-with-sms)。 ## 如何将 Twilio 配置为电话服务提供商 [#how-to-configure-twilio-as-a-phone-service-provider] 可以将 Twilio 配置为通过 Back Office 向您的客户拨打电话。 在将 Twilio 配置为电话服务提供商之前,请确保您已获取以下必要信息: * Twilio 账户 SID * Twilio 身份验证令牌 * Twilio 电话号码 * TwiML App SID 若要了解如何获取所需信息,请参阅[如何注册 Twilio](how-to-configure-twilio#how-to-sign-up-with-twilio)。 要配置 Twilio 以拨打电话: 导航至 **System** > **External Connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面上,填写以下字段: * 在 **Name** 字段中,输入您想要用于该连接的名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **TwilioVoice**。 点击 **Save** 以保存连接。 **Twilio** 连接将显示在外部连接列表中。 点击 **Edit** 按钮以打开连接详细信息。 在 **Edit connection** 页面上,填写以下设置: * 在 **Account SID** 字段中,指定您的 Twilio 账户 SID。 * 在 **Auth token** 字段中,指定您的 Twilio 身份验证令牌。 * 在 **TwiML App SID** 字段中,指定您的 TwiML App SID。 检查连接状态。 如果连接未激活(**Enabled** 下拉列表中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 现在可以使用 Twilio 通过 Back Office 向您的客户拨打电话。 ## 如何测试 Twilio 电话服务运行情况 [#how-to-test-the-twilio-phone-service-operation] 在您配置通过 Back Office 使用 Twilio 拨打电话的连接后,可以向其中一位客户拨打电话以测试连接。 要拨打电话: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 前往 **Contacts** 选项卡。 点击 **Phones** 部分中显示的电话按钮 phone-button,使用 Twilio 拨打指定客户的电话号码。 如果您有多个有效的 Twilio 号码,可以在显示的弹出窗口中选择要用于拨号的号码。 如果 Back Office 中未显示错误消息,则表示 Twilio 连接已正确配置。 要通过 Telegram 向 Back Office 用户发送事件通知,您必须指定用户的个人 Telegram 标识符,或用于接收通知的群组或频道标识符。 要获取用户的 Telegram 标识符,用户应执行以下操作: 在 Telegram 中,向 [@getidsbot](https://t.me/getidsbot?do=open_link) 发送消息,并获取包含用户 Telegram 标识符的回复。 复制获取的标识符,并将其粘贴到[ Back Office 用户详情页面](../../back-office-guide/system/users/users#details)上的 **Telegram chat Id** 字段中。 要获取用户作为管理员的 Telegram 群组或频道标识符,用户应执行以下操作: 前往用户想要获取其标识符的 Telegram 群组或频道。 将 [@getidsbot](https://t.me/getidsbot?do=open_link) 添加至所选群组或频道,并获取包含群组或频道标识符的回复。 复制获取的标识符,并将其粘贴到配置事件通知时启用的 **Telegram** 选项下显示的 **Group Id** 字段中。 **另请参阅** [如何设置事件通知](../manage-system-settings/how-to-set-up-event-notifications) 使用与 [Twilio SendGrid](https://sendgrid.com/) 的集成,可自动同步来自 B2CORE 的客户数据,并在 SendGrid 中将其用于管理邮件列表、发送事务性和营销电子邮件,以及跟踪电子邮件表现。 在继续执行以下说明之前,您必须已注册 SendGrid 并拥有一个有效账户。 ## 如何配置与 SendGrid 的连接 [#how-to-configure-a-connection-to-sendgrid] 要在 B2CORE Back Office 中配置与 SendGrid 的连接: 导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **SendGrid**。 点击 **Save** 以创建连接。 **SendGrid** 连接将显示在外部连接列表中。 点击 **Edit** 以输入连接详情,并完成以下字段: * 在 **API URL** 字段中,输入适用于您的 SendGrid 区域的基础 URL: * `https://api.sendgrid.com/v3/` — 适用于在**美国区域**注册的 SendGrid 账户。 * `https://api.eu.sendgrid.com/v3/` — 适用于在**欧盟区域**注册的 SendGrid 账户。 您可以在 SendGrid 中通过导航至 **Settings** > **Account Details** 找到您的 **Base URL**。 * 在 **API key** 字段中,输入您的 SendGrid API 密钥。 可在 SendGrid 中通过导航至 **Settings** > **API Keys** 并创建具有所需权限的密钥来生成 **API key**: * **Full access** — 可访问所有 SendGrid 功能。 * **Restricted access** — 仅限访问选定功能,例如访问 **Marketing Campaigns** 或联系人列表。 检查连接状态。 如果连接未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活连接。 点击 **Save** 以应用更改。 配置连接后,B2CORE Back Office 中 **Clients** > **General** 下列出的所有客户将自动与 SendGrid 同步并添加为联系人。其个人详细信息的任何后续更新也将同步到 SendGrid。 ## 与 SendGrid 同步的客户数据概览 [#overview-of-client-data-synced-with-sendgrid] 以下必填和可选客户字段可以从 B2CORE 同步到 SendGrid 联系人: ### 必填字段 [#required-fields] 以下必填客户字段始终会从 B2CORE 同步到 SendGrid: * **Email** * **First name** * **Last name** ### 可选字段 [#optional-fields] 如果在 B2CORE Back Office 的客户详情中指定了以下可选字段,这些可用于业务流程的字段将从 B2CORE 同步到 SendGrid: * **Address** * **City** * **State** * **Postal code** * **Country** * **Phone** — 如果在 B2CORE Back Office 中为客户指定了多个电话号码,则会将已确认的号码发送至 SendGrid;如果没有号码已确认,则使用最近更新的号码。 ## 如何添加从 B2CORE 同步到 SendGrid 的自定义字段 [#how-to-add-custom-fields-for-syncing-from-b2core-to-sendgrid] 您可以将 B2CORE 中的其他字段同步到 SendGrid,例如客户的 **Status**、**Client type**、**Verification level** 和 **Jurisdiction**,以便在 SendGrid 联系人中显示这些信息。 在 **SendGrid** 中,添加以下字段: 登录您的 SendGrid 账户。 在 **Marketing Campaigns** 部分中,点击 **Marketing** > **Contacts** > **Custom Fields**。 点击 **Create Custom Field**。 输入字段名称,选择适当的字段类型,并指定其他参数。 保存更改以添加新的自定义字段。 在 **B2CORE Back Office** 中,设置字段映射: 导航至 **System** > **External connections**。 找到为 SendGrid 配置的连接,然后点击 **Edit** 以打开连接详情。 通过为 **Status**、**Client type**、**Verification level** 和 **Jurisdiction** 选择在 SendGrid 中创建的对应字段来设置字段映射。 Set up field mapping 点击 **Save** 以应用更改。 字段添加并映射后,客户的 **Status**、**Client type**、**Verification level** 和 **Jurisdiction** 将自动从 B2CORE 同步并显示在 SendGrid 联系人中。如果一个或多个字段未映射,则不会同步到 SendGrid 联系人。 ## 如何将 B2CORE 中的客户同步到 SendGrid 中的特定列表 [#how-to-sync-clients-from-b2core-to-specific-lists-in-sendgrid] SendGrid 中的列表是 Marketing Campaigns 功能的一部分,可帮助您组织联系人并管理电子邮件活动。 在 SendGrid 中,创建一个或多个列表: 登录您的 SendGrid 账户。 前往 **Marketing** > **Contacts** > **Lists & Segments** 点击 **Create List**。 输入列表名称。 点击 **Save** 以创建列表。 在 B2CORE Back Office 中,选择用于同步的列表: 登录 B2CORE Back Office。 导航至 **System** > **External connections**。 找到为 SendGrid 配置的连接,然后点击 **Edit** 以打开连接详情。 在 **List** 下拉列表中,选择在 SendGrid 中创建的所需列表。这将确保从 B2CORE 同步的所有客户都被添加到该列表中。 如果未选择列表,同步的客户不会被添加到任何列表。 Select the SendGrid list to sync clients from B2CORE 点击 **Save** 以应用更改。 列表添加并映射后,来自 B2CORE 的所有客户将自动同步到 SendGrid 中指定的列表。任何新注册或对现有客户的更新也将反映在同一列表中。 使用 [ActiveCampaign](https://www.activecampaign.com/) 集成,可通过将客户数据从 B2CORE 自动同步到 ActiveCampaign、管理定向电子邮件营销活动、发送通知以及提升客户参与度,简化您的营销工作。 请按照以下说明在 B2CORE Back Office 中配置 ActiveCampaign 连接并设置所需参数。 在继续执行以下说明之前,您必须已注册 ActiveCampaign 并拥有有效账户。 ## 如何配置与 ActiveCampaign 的连接 [#how-to-configure-a-connection-to-activecampaign] 要在 B2CORE Back Office 中配置与 ActiveCampaign 的连接: 导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉菜单中,选择 **ActiveCampaign**。 点击 **Save** 以创建连接。 **ActiveCampaign** 连接将显示在外部连接列表中。 点击 **Edit** 以输入连接详情,并完成以下字段: * 在 **API URL** 字段中,填写 ActiveCampaign 账户中指定的 API URL。 * 在 **API Token** 字段中,指定您的 ActiveCampaign API 密钥。 API URL 和密钥均可在您的 ActiveCampaign 账户中的 **Settings** > **Developer** 下找到。 在 ActiveCampaign 中找到 URL 和 Key 字段 检查连接状态。 如果连接未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉菜单设为 **Yes** 以激活连接。 点击 **Save** 以应用更改。 配置连接后,B2CORE Back Office 中 **Clients** > **General** 下列出的所有客户将与 ActiveCampaign 同步,并显示在您的 ActiveCampaign 账户的 **Contacts** 部分中。 ## 与 ActiveCampaign 同步的客户数据概览 [#overview-of-client-data-synced-with-activecampaign] 以下必填客户字段始终会从 B2CORE 同步到 ActiveCampaign: * **名字** * **姓氏** * **电子邮件** * **电话** 在 B2CORE Back Office 中启用 ActiveCampaign 外部连接后,任何新客户注册或对现有客户信息的更新(例如名字、姓氏、电子邮件或电话号码)都会自动同步到 ActiveCampaign。 ## 如何添加更多从 B2CORE 同步到 ActiveCampaign 的字段 [#how-to-add-more-fields-for-syncing-from-b2core-to-activecampaign] 您可以将 B2CORE 中的其他字段同步到 ActiveCampaign,例如客户的 **Status**、**Country** 和 **Client type**,以支持客户细分和定向电子邮件营销。 在 **ActiveCampaign** 中,添加以下字段: 登录您的 ActiveCampaign 账户。 前往 **Contacts** > **Fields**。 在 **Contacts** 选项卡中,点击 **Add Field**。 输入字段名称,选择相应的字段类型,并指定其他参数。 点击 **Save**,在您的 ActiveCampaign 账户中添加新字段。 下图显示了在 ActiveCampaign 中添加的 Status、Country、Client type、Jurisdiction 和 Verification level 字段: ActiveCampaign 中添加的字段 在 **B2CORE Back Office** 中,设置字段映射: 导航至 **System** > **External connections**。 找到为 ActiveCampaign 配置的连接,然后点击 **Edit** 以打开连接详情。 通过为 **Status**、**Country**、**Client type**、**Jurisdiction** 和 **Verification level** 选择在 ActiveCampaign 中创建的对应字段,设置字段映射。 设置字段映射 点击 **Save** 以应用更改。 添加并映射字段后,客户的 **Status**、**Country**、**Client type**、**Jurisdiction** 和 **Verification level** 将从 B2CORE 自动同步,并显示在 ActiveCampaign 的客户详情中。 ## 如何将 B2CORE 客户同步到 ActiveCampaign 中的特定列表 [#how-to-sync-clients-from-b2core-to-specific-lists-in-activecampaign] ActiveCampaign 中的列表可帮助您整理联系人,以便向他们发送相关信息。通过将客户分配至特定列表,您可以更有效地定位电子邮件营销活动,并向适当的受众发送个性化消息。 在 **ActiveCampaign** 中,创建一个或多个列表: 登录您的 ActiveCampaign 账户。 前往 **Contacts** > **Lists**。 点击 **Add a list**。 输入列表名称并指定其他参数。对于 **Marketing Channel**,请选择 **Email**,因为它是此集成唯一支持的渠道。 点击 **Save** 以创建列表。 在 **B2CORE Back Office** 中,选择用于同步的列表: 登录 B2CORE Back Office。 导航至 **System** > **External connections**。 找到为 ActiveCampaign 配置的连接,然后点击 **Edit** 以打开连接详情。 在 **List** 下拉菜单中,选择在您的 ActiveCampaign 账户中创建的所需列表。这将确保从 B2CORE 同步的所有客户均被添加至该列表。 如果未选择列表,同步的客户不会被添加到任何列表。 选择用于从 B2CORE 同步客户的 ActiveCampaign 列表 点击 **Save** 以应用更改。 选择并保存列表后,B2CORE 中的所有客户将自动同步到 ActiveCampaign 中指定的列表。任何新注册或对现有客户的更新也将反映在同一列表中。 要在 Slack 中发送[事件通知](../../back-office-guide/system/event-notifications),请设置 Slack 机器人并获取其管理令牌。 本说明基于撰写时 Slack 的最新版本。由于此处所述流程可能会发生变化,如有任何疑问,建议您查阅官方 [Slack 文档](https://slack.com/help)或联系其支持团队。 要设置 Slack 机器人: 前往 Slack 网站并创建一个 [Slack 应用](https://api.slack.com/apps?new_app=1)。 在 **Create an app** 窗口中,点击 **From scratch**,然后填写以下字段: * 在 **App name** 字段中,输入 Slack 机器人的名称。之后可以更改机器人名称。 * 选择要为其创建机器人的 Slack 工作区。工作区无法更改。 点击 **Create App**。 在主菜单中,点击 **App Home**。 在 **App Home** 页面上,点击 **Review Scopes to Add**。 前往 **Scopes** 部分,点击 **Add an OAuth Scope**,然后为机器人添加以下权限范围: * `chat:write` * `chat:write.public` * `users:read` * `users:read.email` 有关所有可用权限范围的列表,请参阅 [Permission scopes](https://api.slack.com/scopes)。 添加 Slack 机器人权限范围 前往 **OAuth Tokens for Your Workspace** 部分,并点击 **Install to Workspace**。 安装应用后,复制 **Bot OAuth User Token** 字段中显示的 Slack 机器人管理令牌。 复制 Slack 机器人令牌 在 B2CORE Back Office 中,前往 **Systems** > **Settings**。 将复制的令牌粘贴到 **SlackBot** 部分下显示的 **Bot token** 字段中。 点击 **Save** 以应用更改。 **另请参阅** [如何设置事件通知](../manage-system-settings/how-to-set-up-event-notifications) 若要在 Telegram 聊天、群组和频道中发送[事件通知](../../back-office-guide/system/event-notifications),请创建一个 Telegram 机器人并获取用于管理它的令牌。 本说明基于撰写时 Telegram 的最新版本编写。由于此处描述的流程可能会发生变化,如有任何疑问,建议您查阅官方 [Telegram 文档](https://core.telegram.org/bots)或联系其支持团队。 要创建 Telegram 机器人: 在 Telegram 中,向 [@BotFather](https://t.me/botfather) 发送 `/newbot` 命令。 按照说明操作,并指定以下信息: * 输入您的 Telegram 机器人的名称。 * 输入机器人的用户名。该用户名必须以“bot”结尾(例如 `NotificationsBot` 或 `notifications_bot`)。 复制显示的令牌,该令牌用于授权您的机器人并向 Bot API 发送请求。 在 B2CORE Back Office 中,导航至 **Systems** > **Settings**。 将复制的令牌粘贴到 **Telegram Bot** 部分下显示的 **Bot API Token** 字段中。 点击 **Save** 以应用更改。 **另请参阅** [如何设置事件通知](../manage-system-settings/how-to-set-up-event-notifications) 您可以在客户向其交易账户入金时自动向其入账奖金。在这种情况下,奖金金额将按入金金额的一定百分比计算。有关向客户发放奖金的流程详情,请参阅[奖金简介](../../back-office-guide/bonuses/#introduction-to-bonuses)。 要配置入金时自动入账奖金: * 在 **System** > **Settings** 页面上配置自动入账奖金的设置(请按照下列步骤操作)。 * 为每个您希望在入金时自动入账奖金的[交易平台](../../back-office-guide/products/platforms)创建一个奖金预设。为特定平台创建的预设必须具有**最低**优先级索引,才能用于自动奖金(详情请参阅[如何创建奖金预设](how-to-create-a-bonus-preset))。 如果特定交易平台没有预设,则不会向该平台上的客户交易账户自动入账奖金。 如果用于自动奖金的预设应用了任何[限制](how-to-create-a-bonus-preset#how-to-restrict-the-use-of-a-bonus-preset),则仅会向满足限制条件的客户入账奖金。 要配置入金时自动入账奖金的设置: 导航至 **System** > **Settings**。 在 **Bonuses** 部分中,指定以下设置: * 将 **Autocreate from deposit** 设置为 **Enabled**。 * 在 **Autocreated bonus percent** 字段中,输入您希望作为奖金入账给客户的入金金额百分比。 * 在 **Auto Bonus Limit** 字段中,指定可自动入账至客户交易账户的最高奖金金额。如果计算出的奖金金额超过此限额,则仅会入账允许的最高金额。 * 在 **Auto Bonus Minimum** 字段中,指定客户必须向其交易账户入金或转账的最低金额,以便针对每笔操作触发自动奖金入账。此最低金额与客户入金总额无关。 * 在 **Enable "Burn if Equity \< Credit"** 下拉列表中,选择您希望启用以下功能的平台:如果账户净值低于已入账的奖金金额,则扣除奖金信用额度。 此选项可用于 MT4/5,不支持 cTrader。 * 将 **Burn on Withdrawal** 选项设置为 **Enabled**,以便在客户从其交易账户出金时扣除奖金信用额度。 点击 **Save** 以应用更改。 ## 示例 [#example] 本示例根据 **System** > **Settings** 页面上配置的设置以及名为 `MT4` 的奖金预设,说明如何解读入金时自动入账奖金的要求: Bonus preset 假设客户向其在 `MetaTrader4 Live` 平台上开立的交易账户入金。鉴于 **Autocreate from deposit** 已设置为 **Enabled**,且 `MetaTrader4 Live` 的奖金预设可在 **Bonus presets** 页面上使用,该客户有资格获得入金奖金。获得奖金的要求如下所述: 您可以创建一个或多个奖金预设,其中包含配置奖金所需的设置。 要创建奖金预设: 导航至 **Bonuses** > **Bonus Presets**。 点击 **Create**,然后选择可应用该奖金预设的交易平台。 在 **Create Bonus Preset** 页面上,填写以下字段: * **Name** — 输入您要在 Back Office 中用于该预设的名称。 * **Priority** — 指定预设的优先级索引。在给定平台上,索引最低的预设将用于自动入账奖金。 * **Lifetime** — 指定客户必须在多少天内满足奖金计划要求。 * **Lot per unit** — 输入用于确定客户必须交易的交易量的比率。 * 该比率应用于奖金金额,所需交易量的计算方式如下:`Required volume = Bonus amount / Lot per unit` * **Set credit immediately** — 从以下两个值中选择其一: * 如果选择 **Enabled**,来自不同奖金计划的奖金会立即作为贷记添加到客户交易账户,使客户能够使用贷记资金进行交易。 * 如果选择 **Disabled**,来自不同奖金计划的奖金会依次添加到客户交易账户。只有在第一个奖金计划的奖金处理完毕并被赋予最终状态(`Completed` 或 `Expired`)后,第二笔奖金才会作为贷记添加到客户交易账户,依此类推。 * **Ignored open/close interval** — 指定客户必须保持仓位开放的最短时长(以秒为单位),仓位才会计入已交易量。 * **Autoenable trading if balance > 0** — 从以下两个值中选择其一: * 如果选择 **Enabled**,当账户余额从零或负数变为正数时,系统会自动恢复该账户的 `Trade Enabled` 权限,使客户能够继续在其账户上交易,包括使用奖金贷记。 * 如果选择 **Disabled**,当账户余额从零或负数变为正数时,系统不会自动恢复该账户的 `Trade Enabled` 权限。 * **Ignored symbol groups** — 可选地,选择一个或多个交易品种组,其中的交易不计入已交易量。 对于 cTrader,必须在此字段中选择单个交易品种,而非交易品种组,即使 cTrader 平台提供了交易品种组。 您可以将此字段留空。 点击 **Save** 以创建预设。 该预设将显示在奖金预设列表中。 检查分配给该预设的优先级索引。如果您计划使用此预设,在客户向其交易账户入金时自动向其入账奖金,这一点非常重要(有关详情,请参阅[如何在客户入金时自动向其入账奖金](how-to-automatically-credit-bonuses-to-clients-upon-deposits))。 为特定平台创建且优先级索引**最低**的预设将用于自动奖金。如有需要,请在预设详情中更改优先级。 ## 如何限制奖金预设的使用 [#how-to-restrict-the-use-of-a-bonus-preset] 您可以根据客户的**国家/地区**、**客户类型**、**验证级别**、**司法管辖区**或**介绍经纪商 (IB)** 限制奖金预设的使用。您还可以将预设限制为仅可用于特定[产品](../../back-office-guide/products/products)。 此外,您可以组合使用这些限制条件,进一步缩小使用该预设的资格范围。 如果客户不符合限制条件,则不能使用该预设向该客户入账奖金,包括通过[客户入金时自动向其入账奖金的流程](how-to-automatically-credit-bonuses-to-clients-upon-deposits)。如果限制条件应用于给定平台上用于自动奖金的预设,同样如此。 要限制奖金预设的使用: 导航至 **Bonuses** > **Bonus Presets**。 选择奖金预设,然后点击该预设行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后选择限制类型: * **Country restrictions** — 使该预设仅适用于来自特定国家/地区的客户。 * **Client type restrictions** — 使该预设仅适用于选定类型的客户,例如 Corporate 或 Individual。 * **Verification level restrictions** — 使该计划仅适用于具有特定验证级别的客户。 * **Jurisdiction restrictions** — 使该预设仅适用于属于选定司法管辖区的客户。 * **Introducing broker restrictions** — 使该预设仅适用于作为指定 IB 推荐客户的客户。 * **Product restrictions** — 使该预设仅可与特定[产品](../../back-office-guide/products/products)配合使用。 在 **Restrictions** 弹出窗口中,填写以下信息: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,从以下两个选项中选择其一: * **Deny only** — 当匹配所选规则时,此选项会阻止使用该预设。 * **Allow only** — 仅当匹配所选规则时,此选项才允许使用该预设。 * 在 **Rules** 下拉列表中,根据您应用的限制类型,选择一个或多个用于定义限制的值,例如国家/地区、客户类型、验证级别、司法管辖区、IB 或产品。 点击 **Save** 以应用更改。 现在,该奖金预设已应用使用限制。 您可以在 Back Office 创建临时奖金计划。创建奖金计划后,该计划会立即显示在 B2CORE UI 的 **Bonuses** 页面上,客户即可从该计划中领取奖金。 要创建临时奖金计划: 导航至 **Bonuses** > **Temporary Bonuses**。 点击 **Create**,然后选择要为其创建奖金计划的交易平台。 在 **Create Temporary Bonus** 页面上,填写以下字段: * 在 **Name** 字段中,输入奖金计划的名称,该名称将显示给 B2CORE UI 中的客户。 * 在 **Amount** 字段中,指定奖金金额。 * 在 **Currency** 下拉列表中,选择奖金计划的币种。只有以所选币种计价的交易账户才能用于领取该计划中的奖金。 * 在 **Expired** 字段中,设置奖金计划的结束日期和时间。 * 在 **Platform Groups** 中,选择在交易平台上创建的一个或多个组;这些组中的交易将计入奖金计划的交易量。 * 在 **Preset** 下拉列表中,您可以选择一个预设,以根据预设设置自动填写其余字段。 或者,您可以将 **Preset** 字段留空,并手动填写其余字段: * 在 **Lifetime (days)** 字段中,输入客户必须完成所需交易量的期限(以天为单位)。 * 在 **Lot per unit** 字段中,输入用于确定客户必须交易的交易量的比率。 该比率将应用于指定的奖金金额,所需交易量计算如下:`Required volume = Bonus amount / Lot per unit` * 在 **Set credit immediately** 中,选择以下两个值之一: * **Enabled** — 当客户使用同一交易账户一次从多个计划中领取奖金时,所有已领取的奖金会立即作为信用额度添加到其账户中,使客户能够使用信用资金进行交易。 * **Disabled** — 当客户使用同一交易账户一次从多个计划中领取奖金时,已领取的奖金会依次添加到其交易账户中。只有在第一个已领取的奖金处理完成并被分配最终状态(`Completed` 或 `Expired`)后,第二个已领取的奖金才会作为信用额度添加到客户交易账户中,依此类推。 * 在 **Ignored open/close interval (sec)** 字段中,指定客户必须保持仓位开启的最短时长(以秒为单位),达到该时长的仓位才会计入奖金计划的交易量。 * 在 **Autoenable trading if balance > 0** 下拉列表中,选择以下两个值之一: * **Enabled** — 当账户余额从零或负数变为正数时,账户的 `Trade Enabled` 权限会自动恢复,使客户能够继续在其账户上交易,包括使用奖金信用额度。 * **Disabled** — 当账户余额从零或负数变为正数时,账户的 `Trade Enabled` 权限不会自动恢复。 * 在 **Ignored symbol groups** 下拉列表中,选择一个或多个交易不会计入奖金计划交易量的品种组。 对于 cTrader,即使 cTrader 平台提供品种组,也必须在此字段中选择单个品种,而非品种组。 您可以将此字段留空。 点击 **Save** 创建奖金计划。 创建的奖金计划现在会列在 B2CORE UI 的 **Bonuses** 页面上。 ## 示例 [#example] 本示例说明如何理解具有以下设置的临时奖金计划要求: 临时奖金计划的设置 要从该奖金计划中获得 386 USD 的奖金金额,客户需要使用其在 `MetaTrader 5 Live` 平台上开设且以 USD 计价的活跃交易账户,在 B2CORE UI 中领取奖金。 领取奖金后,奖金将作为信用额度添加到客户交易账户中,使客户能够使用信用资金进行交易。要在账户余额中获得奖金信用额度,客户必须满足以下奖金计划要求: ## 如何限制临时奖金计划的使用 [#how-to-restrict-the-use-of-a-temporary-bonus-program] 您可以根据客户的国家/地区、客户类型、验证级别、司法管辖区或介绍经纪人 (IB) 限制临时奖金计划的使用。此外,您还可以组合使用这些限制条件,以实现更精细的访问控制。 如果客户不符合限制条件,临时奖金计划将不会在 B2CORE UI 中向该客户显示,客户也无法选择领取该奖金。 要限制临时奖金计划的使用: 导航至 **Bonuses** > **Temporary Bonuses**。 选择奖金计划,然后点击该计划行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后选择限制类型: * **Country restrictions** — 使该计划仅面向特定国家/地区的客户提供。 * **Client type restrictions** — 使该计划仅面向所选类型的客户提供,例如 Corporate 或 Individual。 * **Verification level restrictions** — 使该计划仅面向具有特定验证级别的客户提供。 * **Jurisdiction restrictions** — 使该计划仅面向所选司法管辖区内的客户提供。 * **Introducing broker restrictions** — 使该计划仅面向由指定 IB 推荐的客户提供。 在 **Restrictions** 弹出窗口中,填写以下信息: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 此选项会阻止符合所选规则的客户在 B2CORE UI 中查看和订阅该奖金计划。 * **Allow only** — 此选项仅允许符合所选规则的客户在 B2CORE UI 中查看和订阅该奖金计划。 * 在 **Rules** 下拉列表中,根据您应用的限制类型,选择一个或多个定义限制条件的值,例如国家/地区、客户类型、验证级别、司法管辖区或 IB。 点击 **Save** 应用更改。 临时奖金计划现在已应用使用限制。 您可以通过创建自定义手动奖金,或从现有临时奖金计划中选择奖金,来手动向客户发放奖金。 要手动向客户发放奖金: 导航至 **Bonuses** > **Bonus distribution**。 点击页面右上角的 **Create**,然后选择以下两个选项之一: * **Create** — 发放自定义手动奖金。 * **Create Temporary Bonus** — 从现有临时奖金计划中发放奖金。 在 **Accounts** 弹窗中,找到您要向其发放奖金的客户账户,然后点击账户行右侧的 **Select**。 您可以按 **Account ID**、**Account number**、**Currency** 或 **Client name** 搜索账户。 在显示的页面中,根据奖金类型填写字段: * 在 **Amount** 字段(必填)中,输入您要发放到该账户的奖金金额。 * 在 **Caption** 字段(必填)中,输入奖金名称,该名称将显示在客户的 B2CORE UI 中。 * 在 **Preset** 下拉列表中,您可以选择一个预设,以便根据预设设置自动填写其余字段。 或者,将 **Preset** 字段留空并手动填写其余字段(请参阅 [奖金预设](../../back-office-guide/bonuses/bonus-presets) 或字段说明)。 * 在 **Temporary bonus** 下拉列表中,选择要从中发放奖金的临时奖金计划。 所选临时奖金计划的所有设置都将应用于该客户的奖金。 点击 **Save** 以发放奖金。 根据 **Set credit immediately** 选项以及是否存在其他已发放的奖金,该奖金将立即发放至客户账户,或在前一个奖金处理完毕并获得最终状态(`Completed` 或 `Expired`)后发放。 要添加货币: 导航至 **Currencies** > **Currencies**。 点击页面右上角的 **+Create**。 在 **Currency creation** 页面中,填写以下字段: * 在 **Code** 字段中,输入要添加货币的数字代码。 * 在 **Alpha** 字段中,输入货币的字母代码。 这两个代码均由您的客户经理提供。 在 **Caption** 字段中,输入将在 B2CORE UI 中向客户显示的货币名称。 点击 **Save** 以添加货币。 添加可在 Back Office 和 B2CORE UI 中用于兑换的货币对。您可以逐个添加货币对,也可以一次添加多个货币对。 ### 如何添加货币对 [#how-to-add-a-currency-pair] 要添加货币对: 导航至 **Currencies** > **Currency pairs**。 点击页面右上角的 **+Create**。 在 **Create currency pair** 页面中,填写以下字段: * 在 **From currency** 下拉列表中,选择基础货币。 * 在 **To currency** 下拉列表中,选择计价货币。 * **Enabled for admin** 和 **Enabled for client** 选项默认设置为 **Yes**,这意味着该货币对可在 Back Office 和 B2CORE UI 中用于兑换。 * 如果您希望该货币对在 Back Office、B2CORE UI 或两者中均不可用于兑换,请为相应选项选择 **No**。 * 在 **Max amount** 字段中,输入该货币对每次兑换操作允许的最大金额。 * 在 **Step** 字段中,输入金额每次可变更的最小增量。 * 在 **Request required** 下拉列表中,选择: * **Yes** — 当客户在 B2CORE UI 中发起该货币对的兑换时,创建供管理员审批的请求。审批后,将使用已批准请求中指定的汇率执行兑换。 * **No** — 无需管理员审批即可执行该货币对的兑换。 点击 **Save** 以添加货币对。 ### 如何添加多个货币对 [#how-to-add-multiple-currency-pairs] 要一次添加多个货币对: 导航至 **Currencies** > **Currency pairs**。 点击页面右上角的 **+Create multiple**。 在 **Create currency pair** 页面中,填写以下字段: * 在 **Currencies** 下拉列表中,选择两种或更多货币以将其添加为货币对。每选择一种货币后按 **Enter**。 例如,在下拉列表中选择 `USD`、`EUR` 和 `BTC` 将创建以下货币对: `USDEUR` 和 `USDBTC`\ `EURUSD` 和 `EURBTC`\ `BTCUSD` 和 `BTCEUR` * 在 **Max amount** 字段中,输入指定货币对每次兑换操作允许的最大金额。 * 在 **Step** 字段中,输入金额每次可变更的最小增量。 * 在 **Request required** 下拉列表中,选择: * **Yes** — 当客户在 B2CORE UI 中发起指定货币对的兑换时,创建供管理员审批的请求。审批后,将使用已批准请求中指定的汇率执行兑换。 * **No** — 无需管理员审批即可执行货币对兑换。 点击 **Save** 以添加货币对。 您可以为货币配置汇率并设置汇率提供商,以确保在处理交易时能够进行准确的货币转换。 要设置汇率提供商: 导航至 **Currencies** > **Rates**。 点击页面右上角的 **+Create**。 在显示的页面中,填写以下字段: * 在 **From currencies** 和 **To currencies** 下拉列表中,选择要为其配置汇率的货币。 您可以在下拉列表中选择一种或多种货币,或选择 **All** 将配置的汇率应用于所有货币。 * 在 **Provider** 下拉列表中,选择所需的货币汇率提供商。 * 在 **Name** 字段中,输入汇率配置的名称。 点击 **Save** 以创建提供商。 在汇率列表中,找到您创建的提供商,然后点击 **Edit** 以进入提供商详情。 如果该提供商需要其他设置,将显示 **Options** 部分,您可以在其中配置该提供商的连接详情。 如果使用 **custom** 提供商,请在 **Options** 中填写以下字段: * 在 **Rate** 字段中,输入将用于转换的固定汇率。 * 在 **Base currency** 下拉列表中,选择将作为使用指定固定汇率进行所有转换的基础货币。 在 **Enabled** 下拉列表中,选择 **Yes**。 点击 **Save** 以应用更改。 设置汇率提供商后,您可以将其指定为首选提供商,为[入金](../../back-office-guide/system/deposit-system#deposit-methods)和[出金方式](../../back-office-guide/system/payout-system#payout-methods)提供汇率。如果为特定方式分配了提供商,系统会在使用该方式时优先向该提供商请求汇率。 ## 示例 [#example] 此示例说明了 `USD/EUR` 自定义汇率的设置: * 在 **From currencies** 字段中选择 `USD`,并在 **To currencies** 字段中选择 `EUR`。 * 在 **Provider** 下拉列表中,选择 **custom**。 * **Enabled** 选项设置为 **Yes**。 在 **Options** 部分中: * **Rate** 字段显示 `0.86`,即指定的自定义汇率。 * **Base currency** 设置为 USD。 自定义汇率设置 可以将客户通过 B2CORE UI 发起的特定货币对兑换配置为需要管理员批准。 当客户创建这些特定货币对的兑换时,系统会创建 **Exchange** 类型的请求,并将其列在 [Clients > Requests](../../back-office-guide/clients/requests) 页面上。只有在管理员批准相应请求后,才会使用已批准请求中指定的汇率执行这些兑换。 要为特定货币对的兑换启用请求: 导航至 **Currencies** > **Currency pairs**。 选择要为其启用兑换请求的货币对,然后点击 **Edit** 按钮。 在 **Edit currency pair** 页面上,为 **Request required** 选项选择 **Yes**。 点击 **Save** 以应用更改。 您可以为每个货币对设置获取汇率时使用的汇率提供商优先级。这有助于避免超出汇率提供商的请求限制。 导航至 **货币** > **货币对**。 选择要设置汇率提供商优先级的货币对,然后点击 **编辑** 按钮。 在 **汇率自定义优先级** 字段中,拖放此货币对支持的汇率提供商,以按所需顺序进行排列。 点击 **保存** 以应用更改。 对于尚未批准且状态为 `Pending` 的客户兑换请求,您可以更改执行兑换时使用的汇率。 要更改兑换请求中的汇率: 导航至 **Clients** > **Requests**。 默认情况下,页面上的所有请求都会按 `Pending` 状态筛选。若要仅列出 **Exchange** 类型的待处理请求,请在 **Type** 列下的筛选字段中选择 `Exchange`。 选择该请求并导航至请求详情。 在请求详情中,**Rate** 字段显示客户在 B2CORE UI 中创建兑换且请求在 Back Office 中创建时有效的汇率。该汇率包含为货币对中的货币指定的加价。 要更新汇率,请点击 **Change rate**。 在显示的 **Change rate** 弹出窗口中,使用以下任一方式更新将应用于兑换的汇率: * 在 **New rate (without markup)** 字段中输入所需汇率。 * 点击 **New rate (without markup)** 字段右侧的 **Refresh** 按钮以刷新汇率。这会从汇率提供商获取当前有效汇率,并将其显示在 **New rate (without markup)** 字段中。 在 **Verification code** 字段中,输入通过解决简单数学题获得的代码,以确认汇率更新。 点击 **Save** 以应用更新后的汇率并关闭弹出窗口。 加价将应用于更新后的汇率,重新计算后的值会显示在请求详情中的 **Rate** 字段内。 批准请求后,将使用 **Rate** 字段中的更新值执行兑换。 B2CORE 需要启用的 SMTP 服务来向您的客户发送电子邮件通知。为获得最佳性能,请选择具有高送达率且不设严格每日发送限制的 SMTP 服务提供商。 ## 建议使用和避免使用的 SMTP 服务提供商 [#smtp-providers-to-use-and-to-avoid] 请勿使用 **Gmail**、**Office 365**、**Outlook.com**、**Yahoo** 或类似服务提供商。这些服务设有严格的每日发送限制,且并非为批量或事务性电子邮件投递而设计。 为了获得可靠的性能和可扩展性,请使用专用 SMTP 服务提供商,例如 [Mailchimp](https://mailchimp.com/)、[SendGrid](https://sendgrid.com/) 或 [Mailgun](https://www.mailgun.com/)。 通过 B2CORE Back Office 配置 SMTP 服务连接需要以下信息: * SMTP 主机名 * SMTP 端口 * SMTP 用户名 * SMTP 密码 ## 如何注册 SMTP 服务提供商 [#how-to-sign-up-with-an-smtp-service-provider] 本说明介绍如何注册 SMTP 服务提供商(以 [Mailgun](https://www.mailgun.com/) 服务提供商为例)。您可以选择任何希望使用的 SMTP 服务提供商,并按照该提供商的说明配置 SMTP 设置。 本说明基于撰写时 Mailgun 的最新版本创建。由于此处所述流程可能发生变化,如有任何疑问,我们建议您查阅官方 [Mailgun 帮助中心](https://help.mailgun.com/hc/en-us)或联系其支持团队。 前往 [Mailgun](https://www.mailgun.com/) 网站,然后点击 **开始使用**。 填写必填字段,包括您的姓名、电子邮件地址和付款信息,选择您希望用于 SMTP 服务的套餐,然后点击 **创建账户**。 在 [Mailgun](https://www.mailgun.com/) 主网页上,点击 **登录**,并使用您的凭据登录 Mailgun。 导航至 **发送** > **域名**,然后点击 **添加新域名**。 填写以下信息: * 在 **域名** 字段中,输入您的公司域名。 * 选择域名区域。 点击 **添加域名**。 导航至 **发送** > **域名设置**。 在页面顶部的 **域名** 下拉列表中选择您的域名,然后转到 **DNS 记录** 选项卡。 通过您的 DNS 托管服务提供商添加以下 DNS 记录,并为其分配相应的值。 * 两条 TXT 记录 * 两条 MX 记录 * 一条 CNAME 记录 复制 **DNS 记录** 选项卡中 **主机名** 和 **输入此值** 列显示的记录名称和值,并在通过 DNS 托管服务提供商添加 DNS 记录时将其粘贴到相应字段中。 每条记录左侧显示的绿色勾选标记表示该记录已正确设置。 导航至 **发送** > **概览** > **SMTP**,以查看您的 SMTP 主机名、端口、用户名和默认密码。使用这些信息通过 B2CORE Back Office 配置 Mailgun SMTP 连接。 ## 如何通过 B2CORE Back Office 配置 SMTP 服务连接 [#how-to-configure-an-smtp-service-connection-via-the-b2core-back-office] 导航至 **邮件发送** > **系统** > **服务提供商**,然后点击页面右上角的 **+创建**。 配置 SMTP 连接设置: * 在 **标题** 字段中,输入您希望用于 SMTP 配置的标题。 * 确保 **驱动程序** 字段显示“smtp”。 * 在 **主机** 字段中,输入 SMTP 服务主机名。 * 在 **端口** 字段中,输入用于 SMTP 连接的端口号。 * 在 **用户名** 和 **密码** 字段中,输入您的 SMTP 服务凭据。 * 在 **发件人** 字段中,输入将向您的电子邮件收件人显示的电子邮件地址。 * 在 **发件人名称** 字段中,输入您希望向电子邮件收件人显示的名称(例如,可以是您的公司名称)。 * 在 **加密** 下拉列表中,选择 **TLS** 或 **SSL**,以在与 SMTP 服务通信时启用安全连接。选择 **未选择** 以禁用加密。 * 在 **已启用** 下拉列表中,选择 **已启用** 以激活 SMTP 服务连接。 点击 **测试连接**,确认您可以使用当前设置连接到 SMTP 服务。如果连接成功,**测试连接** 按钮将以绿色高亮显示。 点击 **保存**。 SMTP 配置现已添加到电子邮件服务提供商列表中。 要快速测试您设置的 SMTP 配置,请转到 B2CORE UI 的 **登录** 页面,然后点击 **立即注册!** 以注册新账户。如果您已有账户,请点击 **忘记密码?**,然后输入您的电子邮件地址。在这两种情况下,您都应收到相应的电子邮件,这表示您的 SMTP 服务连接已正确配置。 要查看最近发送电子邮件的状态,请在 Back Office 中导航至 **邮件发送** > **系统** > **日志**。 客户可能由于多种原因而无法收到电子邮件通知(例如,登录 B2CORE UI 或成功执行入金或出金操作时发送的电子邮件): * 未启用所需的电子邮件模板。 * 电子邮件服务运行存在问题。 * SMTP 服务器连接存在问题。 要确定电子邮件投递失败的原因: 使用电子邮件日志跟踪电子邮件投递情况。 * 导航至 **Mailing** > **System** > **Log**。 * 在 **Email** 列中的搜索框内,输入应接收该电子邮件的电子邮件地址。 如果电子邮件日志中未包含向指定电子邮件地址发送所需电子邮件的记录,原因可能是未启用相应的电子邮件模板。 检查电子邮件模板是否已启用。 * 导航至 **System** > **Templates** > **Email** > **Template types**。 * 在列表中查找所需的电子邮件模板(例如,`DepositSuccessful` 或 `WithdrawDone`),并检查其是否已启用。 * 如果未启用,请点击模板所在行中的 **Edit** 按钮,然后从 **Enabled** 下拉列表中选择 **Yes** 以启用该模板。 如果启用模板后问题仍未解决,请检查电子邮件服务运行情况和 SMTP 设置。 通过向您的电子邮件地址发送测试电子邮件来检查电子邮件服务运行情况。例如,您可以从其中一个账户请求出金,并检查是否已向您的电子邮件地址发送相应的电子邮件通知。 如果您已收到电子邮件,则表示客户的电子邮件服务运行存在问题。 如果您未收到电子邮件,则表示 SMTP 服务器连接存在问题。要解决这些问题,请检查您的 [SMTP 配置设置](how-to-configure-smtp),或联系您的 SMTP 服务提供商。 在此页面上,您可以查看整个后台中显示的图像列表。 系统提供了有关每个图像的以下数据: **类型** 指定图像的用户界面元素,例如: * 主菜单徽标 * 登录页面上的徽标 * 登录页面上的背景图像 *** **图像路径** 图像的路径。 **另请参阅** [如何更改后台图片](../../how-to-articles/manage-system-settings/how-to-change-back-office-images) 在此页面上,您可以查看已执行的批量操作列表。批量操作允许您同时执行影响多个客户的特定操作。 ## 常规信息 [#general-information] 每个批量操作均提供以下信息: **名称** 操作名称。 *** **操作** 操作类型。可用的操作类型包括: * 封禁客户 * 更改客户类型 * 更改内部客户类型 * 更改验证级别 * 进行入金 * 将余额清零 *** **状态** 批量操作的状态,指示其是否已成功执行。 *** **创建时间** 创建和执行批量操作的日期和时间。 *** **更新时间** 批量操作最后修改的日期和时间。 *** **用户** 执行批量操作的 [Back Office 用户](users/) 的电子邮件地址。 要查看批量操作详情,请点击 **编辑** 按钮。 ## 详情 [#details] 每个批量操作均提供以下附加信息: **描述** 批量操作描述。 *** **日志消息** 指定已执行批量操作结果的日志消息。 *** **系统日志** 批量操作执行期间所进行操作的日志。 **另请参阅** [如何创建批量操作](../../how-to-articles/manage-system-settings/how-to-create-a-bulk-action) 在此页面上,您可以查看和管理为所有客户预先定义的、具有任意嵌套深度的文件夹树。在此页面配置的文件夹将显示在客户详情的[文件选项卡](../clients/general/files-tab)中。在此页面重命名文件夹时,客户详情的“文件”选项卡中的文件夹也会自动重命名。 管理员用户可以在特定客户的[文件选项卡](../clients/general/files-tab)中创建自定义文件夹,但预先定义的文件夹无法编辑或删除。 如果创建的系统文件夹与某个客户现有自定义文件夹同名,则会在该自定义文件夹的名称后添加 `_Custom` 后缀,并在其旁边创建同名的系统文件夹。 **有关权限的要点** * 您可以为文件夹分配访问权限,以指定哪些用户组可以在[文件选项卡](../clients/general/files-tab)中查看和编辑该文件夹。 * 默认情况下,嵌套文件夹会继承父文件夹的访问权限。其访问权限不能超过父文件夹的权限范围。 * 当撤销某个用户组对父文件夹的访问权限时,这些用户对所有嵌套文件夹的访问也会自动受到限制。 * 向某个用户组授予父文件夹的访问权限后,该用户组不会自动获得嵌套文件夹的访问权限。 在文件夹列表中,您可以查看已创建的顶级文件夹列表: **名称** 文件夹名称。 *** **创建时间** 创建文件夹的日期和时间。 *** **更新时间** 文件夹最后修改的日期和时间。 要查看文件夹详情,请点击 **编辑** 按钮。每个文件夹都包含以下选项卡: 在此选项卡中,您可以查看文件夹路径。 在此选项卡中,您可以查看父文件夹中嵌套文件夹的列表。嵌套深度不受限制,每个文件夹也可以拥有自己的子目录。 页面顶部会显示面包屑导航,以便您轻松导航。 在此选项卡中,您可以查看可用的 Back Office 用户组列表及开关。这些开关显示该用户组中的用户是否可以在客户详情的[文件选项卡](../clients/general/files-tab)中查看文件夹及其内容。 请注意,您可以使用 **全部开启** 和 **全部关闭** 按钮,快速授予或限制对文件夹的访问权限。 在此页面上,您可以查看系统中可用的客户标签并管理自己的标签。 标签是附加到客户的标记。它们会以彩色芯片形式显示在[客户列表](../clients)和客户档案中,您可以通过它们筛选客户列表。 标签分为两种: **系统** 由 B2CORE 自动维护。系统标签会随着客户情况的变化自动添加和移除,无法重命名、更改颜色、删除或手动分配。 *** **自定义** 由管理员创建,用于您自己的客户细分。您可以选择名称和颜色,并决定哪些客户带有这些标签。 ## 系统标签 [#system-labels] | 标签 | 附加条件 | | ------- | --------- | | **已入金** | 客户完成首次入金。 | **已入金**记录的是已经发生的事件,因此一旦客户获得该标签,它就会保留在客户身上 — 即使客户不再继续入金,也不会被移除。 该标签仅会在入金完成后附加。内部转账、奖金发放和兑换充值不视为入金,也不会附加此标签。 介绍经纪商标签(**IB Partner**、**IB Client**)已在计划中,但不属于此版本。 ## 本页信息 [#information-on-this-page] **ID** 标签的标识符。 *** **名称** 显示在芯片上的标签名称。 *** **代码** 标签的机器名称。集成应根据代码而非名称进行匹配。 *** **类型** 可以是 **系统** 或 **自定义**。 *** **颜色** 芯片颜色,以十六进制值表示。 ## 创建自定义标签 [#creating-a-custom-label] 1. 点击 **创建**。 2. 输入**名称**。这是芯片显示的内容,且必须唯一。 3. 从调色板中选择**颜色**。 4. 点击 **保存**。 **代码**根据名称生成,并在标签创建后显示。它之后永远不会改变,因此当您重命名标签时,根据代码进行匹配的集成仍可正常工作。 颜色调色板是固定的。芯片使用白色文字绘制,因此限定的颜色集合可确保它们在所有显示位置都清晰易读。 ## 编辑和删除自定义标签 [#editing-and-deleting-a-custom-label] 使用行第一列中的按钮: * **铅笔** — 更改名称和颜色。代码保持不变。 * **垃圾桶** — 删除标签。该标签会从所有带有它的客户中移除,因此芯片会从客户列表、客户档案和标签筛选器中消失。 系统标签没有按钮:它们由 B2CORE 维护,无法更改或移除。 ## 为客户分配标签 [#assigning-labels-to-clients] 您只能分配自定义标签。系统标签会自动附加和移除,因此下次规则运行时,对它们的手动更改将被撤销。 ### 一次分配一个客户 [#one-client-at-a-time] 1. 打开客户档案。 2. 在**自定义标签**中,选择客户应带有的标签,或移除不应带有的标签。 3. 保存客户档案。 如果**自定义标签**显示的是芯片而非选择器,说明您的组可以分配标签但不能编辑客户 — 请按如下说明改用客户列表。 旁边的**客户标签**字段列出了客户带有的系统标签。该字段为只读。 ### 一次分配多个客户 [#several-clients-at-once] 1. 在[客户列表](../clients)中,开启选择模式并勾选客户。 2. 打开**编辑已选择的客户**,然后选择**分配客户标签**。 3. 选择要应用的标签。 4. 保持**替换现有自定义标签而不是添加到其中**未勾选,以将标签添加到客户已有的标签中;或勾选该选项,以将客户的自定义标签替换为您所选择的准确标签集。 5. 点击 **保存**。 勾选**替换现有自定义标签而不是添加到其中**且未选择任何标签时,所选客户的所有自定义标签都会被移除。系统标签不受影响。 ## 按标签筛选客户 [#filtering-clients-by-label] 客户列表提供两个相互独立的标签筛选器: * **拥有所有标签** — 保留带有您选择的每个标签的客户。选择更多标签会缩小结果范围。 * **不拥有任何标签** — 保留不带有您选择的任何标签的客户。带有其中任意一个标签即可排除该客户。 您可以在一次搜索中组合使用它们。例如,在**拥有所有标签**中选择**已入金**和 **VIP** 标签,并在**不拥有任何标签**中选择**观察名单**标签,将返回既已入金又被标记为 VIP 的客户,同时排除观察名单中的所有客户。 ## 访问权限 [#access-rights] 该功能的每个部分都有自己的权限,可在[组](users/groups)中按组设置: | 权限 | 允许操作 | | ---------------- | ------------------------ | | **查看客户标签** | 查看此页面、标签芯片以及客户列表上的标签筛选器。 | | **创建自定义客户标签** | 向列表中添加标签。 | | **更新自定义客户标签** | 重命名标签和更改标签颜色。 | | **删除自定义客户标签** | 移除标签及其所有分配。 | | **向客户分配自定义客户标签** | 在客户列表中附加和移除标签。 | 支持和客户经理组默认可以查看标签并进行分配。除非您授予相应权限,否则管理标签列表本身仅限管理员。 客户档案上的选择器属于客户表单的一部分,因此还需要编辑客户的权限(**更新客户**或**编辑标签**)。可以分配标签但不能编辑客户的用户会在那里看到只读标签芯片,并应改从客户列表中分配标签。在默认组中,这适用于 **B2B Account Manager** 和 **B2B L1 Support**。 **客户标签和客户标记** 客户标签将取代[客户标记](users/client-tags)。目前两者都可用,并且会作为独立列显示在客户列表中,但客户标记将在未来版本中移除。 请使用客户标签对客户进行细分和筛选。仅当您依赖标记来[限制 Back Office 用户可查看的客户](../../how-to-articles/manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients)时,才继续使用客户标记 — 标签不控制可见性。 **另请参阅** [客户](../clients) [客户标签](users/client-tags) 在此页面上,您可以创建和编辑权限级别,以指定客户在 B2CORE UI 中允许执行哪些操作。 权限级别与[验证级别](../verification/levels)相关联。当客户获得特定验证级别后,系统将授予其与该验证级别关联的权限。 若要向客户授予特定权限,请前往客户详情页面的 [设置选项卡](../clients/general/settings-tab),然后在 **Rights** 部分选择所需权限。 ## 常规信息 [#general-information] 每个权限级别提供以下信息: **名称** 权限级别的描述。 *** **创建时间** 创建该级别的日期和时间。 *** **更新时间** 更新该级别的日期和时间。 *** **默认(Y/N)** 如果为 `Y`,则此权限级别为默认级别,并会分配给所有已获得初始[验证级别](../verification/levels)的客户。 要查看权限级别详情,请点击 **Edit** 按钮。 ## 详情 [#details] 在详情页面上,您可以查看以下附加信息,并选择要在此级别授予客户的权限: **名称** 级别的名称。 *** **说明** 级别的描述。 *** **父级角色** 客户在获得此级别之前必须先获得的上一个权限级别。此字段不适用于默认权限级别。 以下权限选项可用: * **验证**\ 如果选中,客户可以在 B2CORE UI 中获得更高的[验证级别](../verification/levels)。 * **兑换**\ 如果选中,客户可以在 B2CORE UI 中兑换资金。 * **入金**\ 如果选中,客户可以在 B2CORE UI 中存入资金。 * **出金**\ 如果选中,客户可以在 B2CORE UI 中提取资金。 * **内部转账**\ 如果选中,可以在同一 B2CORE 系统内将资金从一位客户转账给另一位客户。 在此页面上,您可以查看客户注册 B2CORE UI 时可选择的国家列表(如果他们在注册期间需要选择国家)。 如果某个国家在 **Enabled** 列中显示的开关处于\_启用\_状态,则该国家会显示在注册表单中。如果开关处于\_停用\_状态,则该国家会隐藏在注册表单中。 您无法添加新国家或编辑国家相关数据,只能设置此页面所列国家的可见性。 **Enabled** 开关全局生效:此页面上的国家列表在整个 B2CORE 中共享,因此禁用某个国家会在所有位置隐藏该国家,而不仅仅是在注册表单中。 若要从单个注册表单中隐藏某个国家,同时使其在其他位置仍可用,请改用 **System** > **Registration** 中相关注册配置文件的 **Countries Blacklist** 部分——请参阅[如何迁移到新的注册设置](../../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings)。 以下是每个国家提供的信息: **ID** 系统中的国家标识符。 *** **Name** 国家名称(例如,`Mexico`)。 *** **Full name** 国家的官方名称(例如,`the United Mexican States`)。 *** **Country code** 系统中分配给国家的代码。 *** **ISO 3166-2** 分配给国家的地理代码(根据 ISO 3166-2)。 *** **ISO 3166-3** 分配给国家的地理代码(根据 ISO 3166-3)。 *** **Capital** 国家的首都。 *** **Currency** 本国货币的名称。 *** **Currency symbol** 本国货币的图形表示(例如,`$`)。 *** **Currency code** 本国货币的字母代码。 *** **Currency sub unit** 主货币单位的分数单位名称(例如,`cent`)。 *** **Region code** 分配给国家的地区代码(根据 UN M49)。 *** **Sub region code** 分配给国家的地区子代码(根据 UN M49)。 *** **Enabled** 如果开关处于\_启用\_状态,您的客户可以在注册 B2CORE UI 时选择此国家。 您可以将国家列表以 CSV 或 XLSX 文件形式下载到计算机。为此,请点击页面右上角的 **CSV** 或 **Excel** 按钮。 自定义字段让您能够收集标准资料字段以外的额外客户信息。您只需定义一次字段并将其整理到分组中。随后,您可以将其添加到注册表单,客户会在注册时填写该字段,管理员也可以随时在客户资料中填写或编辑其值。 您可以在 **System** > **Custom Fields** 菜单中管理自定义字段,其中包含两个页面: * **Groups** — 用于整理相关字段的分区。 * **Fields** — 各个独立字段,每个字段均属于一个分组。 自定义字段的访问权限由以下权限控制,您可以在 **System** > **Users** > **Groups** 中将其授予后台用户组。 | 权限 | 授予以下能力 | | ------------------------------- | ------------------------------ | | View Custom Fields | 查看 **Groups** 和 **Fields** 页面。 | | Create Custom Fields | 创建分组、字段和选项。 | | Update Custom Fields | 编辑分组、字段和选项。 | | Archive Custom Fields | 归档分组、字段和选项。 | | View client custom field values | 查看客户资料中的自定义字段值。 | | Edit client custom field values | 编辑客户资料中的自定义字段值。 | ## 分组 [#groups] 分组是包含相关字段的带标签分区。在客户资料和注册表单中,字段会显示在其所属分组下。 **Groups** 页面会列出现有分组及以下信息。 **标签(英文)** 向客户和管理员显示的分组名称。您可以通过 B2TRANSLATE 本地化此标签(请参阅[翻译](custom-fields#translations))。 *** **机器名称** 用于翻译键和 API 的唯一标识符。您在创建分组时设置机器名称,之后无法更改。 *** **排序顺序** 分组相对于其他分组的位置。排序顺序较低的分组会优先显示。 *** **已归档** 表示该分组是否已归档。 创建分组: 前往 **System** > **Custom Fields** > **Groups**。 点击 **Create**。 指定**标签(英文)**、**机器名称**和**排序顺序**。 点击 **Save**。 要编辑分组,请点击 **Edit** 按钮。您可以更改**标签**和**排序顺序**;**机器名称**为固定值。 要归档分组,请点击 **Archive** 按钮。已归档的分组不会显示在新的注册表单中,但在已存储值的客户资料中仍然可见,因此停用分组不会隐藏已收集的数据。 ## 字段 [#fields] 字段是单个输入项,例如文本框、下拉列表或日期选择器。每个字段均属于一个分组。 **Fields** 页面会列出现有字段及其**标签(英文)**、**机器名称**、**类型**、**分组**和**已归档**状态。 ### 字段类型 [#field-types] 支持以下字段类型。 | 类型 | 描述 | | ----- | --------------- | | 文本 | 单行文本输入。 | | 多行文本 | 多行文本区域。 | | 电子邮件 | 验证为电子邮件地址的文本输入。 | | URL | 验证为 URL 的文本输入。 | | 电话 | 电话号码输入。 | | 整数 | 整数。 | | 小数 | 带有小数部分的数字。 | | 布尔值 | 是/否值。 | | 单选 | 允许选择一个选项的下拉列表。 | | 多选 | 允许选择多个选项的下拉列表。 | | 日期 | 日历日期。 | | 日期和时间 | 带时间的日历日期。 | ### 创建字段 [#create-a-field] 创建字段: 前往 **System** > **Custom Fields** > **Fields**。 点击 **Create**。 指定**标签(英文)**、**机器名称**、**类型**和**分组**。 在 **Required / validation** 部分中,配置验证规则(请参阅[验证规则](custom-fields#validation-rules))。 点击 **Save**。 编辑字段时,您可以更改其**标签**、**分组**和验证规则。**机器名称**和**类型**会在创建时设定,之后无法更改。 要归档字段,请点击 **Archive** 按钮。与分组一样,已归档字段会继续显示在具有已存储值的客户资料中。 ### 验证规则 [#validation-rules] **Required / validation** 部分仅显示适用于所选字段类型的规则。 | 规则 | 适用于 | 描述 | | ------- | ---------------- | ------------ | | 必填 | 所有类型 | 必须填写该字段。 | | 最小长度 | 文本、多行文本 | 最少字符数。 | | 最大长度 | 文本、多行文本、电子邮件、URL | 最大字符数。 | | 正则表达式模式 | 文本、多行文本 | 值必须匹配的正则表达式。 | | 最小值 | 整数、小数 | 允许的最小值。 | | 最大值 | 整数、小数 | 允许的最大值。 | | 最早日期 | 日期、日期和时间 | 允许的最早日期。 | | 最晚日期 | 日期、日期和时间 | 允许的最晚日期。 | | 最少选项数 | 多选 | 最少选中的选项数量。 | | 最多选项数 | 多选 | 最多选中的选项数量。 | **Required** 适用于客户注册表单,客户必须填写该字段才能继续。在客户资料中,即使必填字段为空,管理员也可以保存不完整的数据;但对于输入的任何值,格式和选项规则仍然适用。 ## 单选和多选字段的选项 [#options-for-select-and-multiselect-fields] **Select** 和 **Multiselect** 类型的字段需要选项列表。创建此类字段后,请打开其编辑页面,在页面底部管理选项。 每个选项都具有以下参数。 **值** 选择该选项时存储的值。该值在字段内必须唯一。 *** **标签(英文)** 向客户显示的文本。您可以通过 B2TRANSLATE 本地化此标签(请参阅[翻译](custom-fields#translations))。 *** **机器名称** 用于翻译键的标识符。 要添加选项,请在选项行中填写字段并点击 **Add option**。要归档选项,请点击其旁边的 **Archive** 按钮。 ## 在注册期间显示自定义字段 [#show-custom-fields-during-registration] 您可以在 **System** > **Registration** 中的注册配置编辑页面上,选择要在注册表单中显示的自定义字段。 自定义字段只能添加到在 **System** > **Registration** 中配置的新注册流程。它们无法用于旧版[向导](wizards),旧版向导中的注册字段通过[注册向导配置](wizards#registration-wizard)进行设置,并显示在客户的[高级选项卡](../clients/general/advanced-tab)中。 **Wizards** 及其 **Advanced** 步骤被视为旧版功能。完成向 **System** > **Registration** 设置迁移后,它们将被移除。 打开您要编辑的注册配置。 在 **Custom Fields** 部分中,选择要在注册表单中显示的字段。 点击 **Save**。 标记为 **Required** 的字段必须由客户填写后,客户才能完成注册。 如果尚不存在自定义字段,该部分会提供指向 **Custom Fields** 页面的链接,您可以在那里创建字段。 ## 在客户资料中编辑自定义字段值 [#edit-custom-field-values-on-a-client-profile] 打开客户资料并前往 **Custom Fields** 选项卡,以查看和编辑为该客户收集的值。字段的分组方式与注册表单中相同。 查看值需要 **View client custom field values** 权限,编辑值需要 **Edit client custom field values** 权限。 只要客户拥有这些已归档字段和分组的存储值,它们就会继续显示在该选项卡中,因此停用字段不会隐藏先前收集的数据。 ## 翻译 [#translations] 分组、字段和选项的标签以英文输入,并可通过 B2TRANSLATE 本地化。注册表单使用以下翻译键模式: * 字段 — `Common.Registration.Form.Fields..Label` * 选项 — `Common.Registration.Form.Options..Label` 为加快本地化速度,注册配置编辑页面提供 **Copy B2TRANSLATE keys JSON** 按钮。该按钮会复制一个 JSON 对象,将翻译键映射到当前在表单中选定的自定义字段、其单选和多选选项以及条款和条件项目的英文值。请将该 JSON 粘贴到 B2TRANSLATE 中的 **Common** 选项卡。 在此子部分中,您可以设置和管理支持的入金方式。 ## 入金方式 [#deposit-methods] 在此页面上,您可以查看已配置的入金方式列表并创建新的方式。 ### 常规信息 [#general-information] 系统会提供有关每种入金方式的以下信息: **ID** 系统中该方式的标识符。 *** **优先级** 分配给入金方式的优先级索引。 入金方式在 B2CORE UI 中向客户显示的顺序取决于分配给各方式的优先级索引。索引越低,优先级越高。例如,索引为 `1` 的方式将显示在 B2CORE UI 列表的顶部。 可以在方式详情的[设置选项卡](deposit-system#settings-tab)中更改优先级索引。 *** **名称** 在 Back Office 中分配给该方式的名称,该名称也会在 B2CORE UI 中向客户显示。 *** **名称标识** 该方式的唯一名称。只能包含拉丁字母、数字、连字符和下划线。 *** **分组** 该方式所属的一个或多个[分组](deposit-system#deposit-groups),例如 **Crypto**、**Fiat** 或其他分组。 *** **提供商** 支付系统的名称。 对于通过 [PSS 连接](../../integrations/payment-systems#payment-system-service-pss)的支付系统,可能会显示以下提供商: * **PaymentSystemsDeposit** — 表示通过 PSS 连接的入金方式。 * **PaymentSystemsStaticDeposit** — 表示通过 PSS 连接且支持静态支付详情的入金方式。在此类方式中,之前发放的支付信息(例如加密货币地址或银行详情)会为客户保存,以便其随时将这些信息重复用于不同金额的入金。目前,可将 **B2BINPAY v3** 和 **Coinsbuy v3** 支付系统配置为使用静态支付详情。 *** **驱动程序**\ *仅适用于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的支付系统* 用于连接支付系统的驱动程序。它反映支付系统的名称,在某些情况下还反映支持的支付方式。 *** **货币** 该方式支持的一种或多种货币。该方式将适用于以所选货币计价的账户。 *** **已启用** 方式状态: * **否** — 该方式未激活,无法用于入金。 * **是** — 该方式已激活,可用于入金。 *** **状态** 感叹号图标 — 表示需要配置某些方式设置。将鼠标悬停在图标上会显示所需设置的列表,您可以在方式详情中进行调整。 如果该列为空,则表示已指定该方式的所有必需设置。 要查看入金方式详情,请点击 **编辑** 按钮。 ### 详情 [#details] 详情页面分为以下选项卡: * [设置选项卡](deposit-system#settings-tab) * [TR 货币选项卡](deposit-system#tr-currencies-tab) * [PS 货币选项卡](deposit-system#ps-currencies-tab) * [佣金选项卡](deposit-system#commissions-tab) * [限制选项卡](deposit-system#restrictions-tab) 显示的选项卡集合可能因入金方式驱动程序而异。例如,对于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的方式,可能会显示额外的 **Webhooks** 和 **Test configuration** 选项卡。 #### 设置选项卡 [#settings-tab] 在此选项卡中,您可以查看或修改入金方式的常规设置以及支付提供商的连接设置。 **名称标识** 该方式的唯一名称。只能包含拉丁字母、数字、连字符和下划线。 *** **已启用** 方式状态: * **否** — 该方式未激活,无法用于入金。 * **是** — 该方式已激活,可用于入金。 *** **分组** 该方式所属的一个或多个[分组](deposit-system#deposit-groups),例如 **Crypto**、**Fiat** 或其他分组。 *** **名称** 在 Back Office 中分配给该方式的名称,该名称也会在 B2CORE UI 中向客户显示。 *** **提供商** 支付系统的名称。 *** **结果 URL** 用于接收入金状态更新通知回调的 URL。 *** **入账时间** 在 B2CORE UI 中向客户显示的提示文本,用于说明入金的预计处理时间。提供以下两个标准选项: * `Depending on the Blockchain` * `From 3 to 5 Days` 可以在 **System** > **Key storage** > **Key storage values** 中修改标准选项的提示文本或添加新选项。使用 `method_time` 标签查找相关键并更新文本。 提示文本可以使用 HTML 格式指定,但使用不同格式可能会导致在不同设备上显示提示时出现问题。 例如,虽然 HTML 格式可在 B2CORE UI 中正确呈现,但在移动应用中可能无法正常显示。 *** **预计算** 此字段已弃用且不再使用。可以忽略。 *** **图标** 在 B2CORE UI 中向客户显示的方式图标,用于快速识别该方式。 您可以使用预定义图标或指定自定义图像的 URL。 有关预定义图标及其名称的列表,请参阅[支付系统](../../integrations/payment-systems)和[支持的加密货币支付方式](../references/supported-cryptocurrency-payment-methods)。要为该方式使用预定义图标,请在 **Icon** 字段中输入其名称。 如果您希望使用自定义图标,请指定要显示为方式图标的图像 URL。 *** **优先级** 分配给入金方式的优先级索引。 入金方式在 B2CORE UI 中向客户显示的顺序取决于分配给各方式的优先级索引。索引越低,优先级越高。例如,索引为 `1` 的方式将显示在 B2CORE UI 列表的顶部。 *** **IP 白名单** 允许进行入金操作的 IP 地址列表。 *** **汇率提供商** 在[货币 > 汇率](../currencies/rates)页面上配置的汇率提供商名称。 此字段为可选项。 如果已指定,使用该入金方式时,系统将优先从此提供商请求汇率。 *** **配置**\ *适用于 PSS 方式* 入金方式配置表单。其结构和可用字段取决于所选的 **Driver**。 **external connection** 包含连接特定支付系统所需的技术集成数据,而 **configuration** 则定义入金流程的运作方式。因此,您可以配置两种或更多具有不同配置、但全部使用同一外部连接的入金方式。 如果所选驱动程序没有可用配置,将显示以下消息:`Configuration form is empty`。 *** **提供商设置**\ *适用于非 PSS 方式* 连接支付提供商所需的设置。 连接设置的集合因支付提供商而异。 指定连接设置后,可以检查用于访问支付提供商的凭据是否有效。为此,请点击 **Check connection** 按钮。 目前,**Check connection** 按钮仅适用于 B2BINPAY 和 BridgerPay 支付提供商。 * 如果凭据有效,按钮下方将显示 `Success` 状态。 * 如果凭据无效,将显示 `Fail` 状态及说明消息。在这种情况下,请联系支持团队。 **自定义字段** 仅适用于 **Constructor** 提供商。 配置字段列表,客户在 B2CORE UI 中使用 **Constructor** 方式进行入金时应填写这些字段(详情请参阅[如何为 Constructor 入金或出金方式添加自定义字段](../../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method))。 #### TR 货币选项卡 [#tr-currencies-tab] 在此选项卡中,您可以查看和管理已添加到入金方式的交易货币列表。该方式将适用于以这些货币计价的账户。 系统会提供有关每种货币的以下信息: **ID** 分配给添加至该方式的货币的标识符。 *** **货币** 分配给该货币的名称。 #### PS 货币选项卡 [#ps-currencies-tab] 在此选项卡中,您可以查看和管理支付提供商支持用于处理入金的货币列表。要使该方式能够处理特定货币的入金,请确保该货币已添加到此列表。 系统会提供有关每种货币的以下信息: **ID** 分配给添加至该方式的货币的标识符。 *** **货币** 分配给该货币的名称。 *** **受 PS 支持** `Supported` 状态表示添加的货币受支付提供商支持,可用于入金。 添加状态无法保证与支付提供商兼容的货币时,会显示 `Support is unknown` 消息。在这种情况下,仍可将该货币添加到选项卡并保存配置。但是,该货币可能并不完全受入金方式支持,因此应谨慎使用。 添加不受支持的货币时,会显示 `Not supported` 消息。在这种情况下,无法将该货币添加到选项卡,也不允许保存配置。 #### 佣金选项卡 [#commissions-tab] 在此选项卡中,您可以查看和管理为入金方式配置的佣金列表。 系统会提供有关每项佣金的以下信息: **ID** Back Office 中的佣金标识符。 *** **货币** 一种或多种佣金货币。 *** **佣金** 遵循以下公式的佣金费率: `Minimum commission amount <= Fixed rate + Percentage rate % <= Maximum commission amount` 详情请参阅[如何为入金和出金方式配置佣金](../../how-to-articles/manage-payment-methods/how-to-configure-commissions-for-deposit-and-withdrawal-methods)。 *** **类型** 佣金类型: * **TR**(供应商佣金)— 根据支付提供商成功处理入金后记入客户账户的货币和金额计算的佣金。 如果配置了此佣金类型,客户通过支付提供商存入一个金额,但由于扣除了计算得出的佣金,记入其账户的金额会较少。 * **PSP**(提供商佣金)— 仅用于财务报表计算的佣金,不会影响客户入金时记入其账户的金额。 如果配置了此佣金类型,它仅适用于已完成入金的报表计算,并显示在[财务 > 入金](../finance/deposits)中的 **Provider commission** 列。 #### 限制选项卡 [#restrictions-tab] 在此选项卡中,您可以按国家/地区、客户类型、验证级别、司法管辖区、IB 父级 ID 或 IB 计划类型限制入金方式的使用。该选项卡列出每项限制及其状态、类型和已配置规则(详情请参阅[如何限制入金和出金方式的使用](../../how-to-articles/manage-payment-methods/how-to-restrict-the-use-of-deposit-and-withdrawal-methods))。 ## 入金分组 [#deposit-groups] 分组用于将入金方式整理为类别,例如加密货币和法币方式,以便于管理。 **优先级** 分配给该分组的优先级索引。 *** **名称标识** 分组名称。 *** **名称** 分组描述。 *** **已启用** 分组状态: * **否** — 该分组未激活,无法用于包含入金方式。 * **是** — 该分组已激活,可以包含入金方式。 在此页面上,您可以设置通过 Slack、Telegram、电子邮件或短信发送的事件通知,也可以查看已配置通知的列表。 系统会为每个已配置的事件通知提供以下信息: **ID** 通知标识符。 *** **事件** 触发通知的[事件](../references/event-types-for-triggering-event-notifications-for-back-office-users)。 *** **描述** 通知描述。 *** **用户** 添加为通知接收人的 Back Office 用户的电子邮件地址。 *** **渠道** 发送通知的渠道列表: * 电子邮件 * 短信 * Slack(请参阅[如何设置 Slack 机器人](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-slack-bot)) * Telegram(请参阅[如何设置 Telegram 机器人](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-telegram-bot)) *** **已启用** 如果为**已启用**,则在所选事件发生后发送通知;否则为**已禁用**。 要修改现有通知,请点击相应通知行中的**编辑**按钮。 **另请参阅** [如何设置事件通知](../../how-to-articles/manage-system-settings/how-to-set-up-event-notifications) 在此页面中,您可以配置事件处理程序以监控特定系统事件,并定义这些事件发生时自动运行的工作流。 ## 常规信息 [#general-information] 每个事件处理程序均提供以下信息: **ID** 事件处理程序的标识符。 *** **简短描述** 事件处理程序的简要描述。 *** **事件** 事件类型。支持以下事件类型: * [收到账户余额](#account-balance-received) * [转账事件](#transfer-event) * [已创建账户](#account-created) * [成功操作](#successful-operation) *** **事件处理程序工作流** 事件触发时将执行的工作流或操作,例如发送电子邮件通知或将数据发送到外部端点。 *** **已启用** 如果为**已启用**,则事件处理程序处于活动状态,并将处理满足已配置条件的事件。 要查看或编辑事件处理程序详情,请选择一个处理程序并点击**编辑**按钮。 ## 详情 [#details] 在详情页面中,您可以启用或禁用所选事件处理程序,并调整其参数。 以下是支持的事件处理程序列表,您可以调整其特定参数: ### 收到账户余额 [#account-balance-received] 当 B2CORE 从连接到 Back Office 的外部服务提供商(例如 **Twilio**)收到更新后的余额时,将触发此事件处理程序。如果收到的余额达到已配置的阈值,系统会向指定的电子邮件地址发送通知。 **账户余额小于或等于时发送通知** 触发通知的余额阈值。 *** **可用工作流** `SendNotificationWorkflow` — 当外部服务余额低于或等于已配置阈值时,向指定的电子邮件地址发送通知。 *** **电子邮件** 将接收通知的一个或多个电子邮件地址。 *** **模板** 用于发送通知的电子邮件模板,例如 `balanceWarning`。可从**系统** > **模板** > **电子邮件** > **模板**中的可用电子邮件模板列表选择模板。 ### 转账事件 [#transfer-event] 当发生符合所选平台和金额条件的转账时,将触发此事件处理程序。发生此事件时,系统会向指定的电子邮件地址发送通知。 **可用处理程序** `Filter by platforms and amount` — 根据选定的来源和目标平台以及最低转账金额筛选转账事件。仅当转账满足指定条件时,处理程序才会触发。 *** **目标平台 ID** 进行转账的目标平台标识符。这是必填参数。 *** **来源平台 ID** 进行转账的来源平台标识符。这是可选参数。 *** **最低金额** 触发事件所需的最低转账金额。此参数为可选参数。 *** **可用工作流** `SendNotificationWorkflow` — 当发生符合已配置条件的转账时,向指定的电子邮件地址发送通知。 *** **电子邮件** 将接收通知的一个或多个电子邮件地址。 *** **模板** 用于发送通知的电子邮件模板,例如 `TransferEvent`。可从**系统** > **模板** > **电子邮件** > **模板**中的可用电子邮件模板列表选择模板。 ### 已创建账户 [#account-created] 当为客户创建账户或钱包时,将触发此事件处理程序。发生此事件时,系统会向指定的外部 URL 发送 POST 请求。根据所选内容类型,请求正文包含格式化为 JSON 或 URL 编码表单数据的账户详情。 以下示例展示了每种支持的内容类型的 POST 请求正文格式: ```json title="JSON" { "client": { "id": 3651, "email": "client@example.com" }, "product": { "name": "ewallet", "group_type": "Default", "platform": { "id": 1, "name": "eWallet", "caption": "eWallet" } }, "account_number": "80759" } ``` ```bash title="URL-encoded form data" client%5Bid%5D=3650&client%5Bemail%5D=client%40example.com&product%5Bname%5D=ewallet&product%5Bgroup_type%5D=Default&product%5Bplatform%5D%5Bid%5D=1&product%5Bplatform%5D%5Bname%5D=eWallet&product%5Bplatform%5D%5Bcaption%5D=eWallet&account_number=80735 ``` *** **可用工作流** `SendToEndpoint` — 向指定的外部端点发送包含已创建账户或钱包详情的 POST 请求。事件触发后会立即发送请求。 *** **外部端点** 将接收 POST 请求的外部 URL。此参数为必填参数。 *** **内容类型** 请求正文的格式。支持以下值: * `application/x-www-form-urlencoded` * `application/json` ### 成功操作 [#successful-operation] 当入金、出金、转账或兑换成功完成时,将触发此事件处理程序。发生此事件时,系统会向指定的外部 URL 发送 POST 请求。根据所选内容类型,请求正文包含格式化为 JSON 或 URL 编码表单数据的交易详情。 **操作** 一个或多个交易类型。此参数为必填参数。 可选择以下交易类型: * `payment` — 入金 * `payout` — 出金 * `transfer` — 转账 * `exchange` — 兑换 *** **可用工作流** `SendToEndpoint` — 向指定的外部端点发送包含成功交易详情的 POST 请求。事件触发后会立即发送请求。 *** **外部端点** 将接收 POST 请求的外部 URL。此参数为必填参数。 *** **内容类型** 请求正文的格式。支持以下值: * `application/x-www-form-urlencoded` * `application/json` 在此页面上,您可以查看与 B2CORE 集成的外部系统和服务提供商的连接列表、管理这些连接以及创建新连接。 ## 常规信息 [#general-information] 每个连接提供以下信息: **ID** 连接标识符。 *** **标题** 连接标题。 *** **名称** 连接的技术名称。 *** **类型** 集成系统的类型,例如: * **支付系统** — 表示与支付系统的连接。 * **邮件系统** — 表示与邮件服务的连接。 * **平台** — 表示与交易平台和枢纽的连接。 * **其他** — 表示与其他类型集成系统的连接,例如客户支持平台、分析工具等。 *** **提供商** 建立连接的外部系统名称。 *** **驱动程序**\ *仅适用于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的支付系统* 用于连接支付系统的驱动程序。它反映支付系统的名称,在某些情况下还反映所支持的支付方式。 *** **已启用** 表示连接是否已启用:**是** 或 **否**。 *** **创建时间** 创建连接的日期和时间。 *** **更新时间** 上次更新连接的日期和时间。 要查看连接详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 在详细信息中,您可以启用或禁用连接。 此页面包含与建立连接的外部系统相关的特定设置。每个外部系统都有自己的一组连接设置,例如服务 URL、凭据和其他配置参数。 在此页面上,您可以查看已导入 Back Office 的数据记录,也可以导入新数据。 您可以使用 CSV 或 TSV 文件将有关客户、其账户或 [IB 计划](../introducing-brokers)的数据从第三方系统导入 B2CORE。 您的 CSV 或 TSV 文件必须满足以下数据导入要求: * 文件大小不得超过 5MB。 * 文件中的最大行数为 1,000 行,不包括标题行。如果行数超过 1,000 行,必须将文件拆分为两个或更多文件,以确保正确导入。 * 可以使用 `Comma`、`semicolon` 或 `tab` 作为分隔文件中数据的分隔符。 * 文件必须具有正确的结构,并包含与导入数据类型对应的必填字段(有关详细信息,请参阅[如何导入客户相关数据](../../how-to-articles/manage-system-settings/how-to-import-client-related-data))。 * IB 相关数据只能从 CSV 文件导入。 ## 常规信息 [#general-information] 系统会为每项数据导入操作提供以下信息: **标题** 为数据导入操作指定的名称。 *** **操作** 已导入的数据类型。可解析以下数据类型: * `import-users` — 用于从 CSV 或 TSV 文件导入以下客户相关数据: * 电子邮箱 `必填` * 姓氏 `必填` * 名字 `必填` * 中间名 * 出生日期 * 国家/地区 * 电话号码 * 地址 * 城市 * 邮政编码 * 验证级别 导入的数据将显示在 **客户** > **常规** 页面上。 * `import-accounts` — 用于从 CSV 或 TSV 文件导入以下客户账户数据: * 电子邮箱 `必填` * 账号 `必填` * 产品 ID `必填` * 产品货币 `必填` 账户数据只能为 **客户** > **常规** 页面中列出的现有客户导入。 导入的数据将显示在 **客户** > **账户** 页面以及客户详情中的[账户选项卡](../clients/general/accounts-tab)上。 * `import-ibs` — 用于导入以下与 IB 计划相关的数据(这些数据只能从 CSV 文件导入): * IB 电子邮箱 `必填` — 已加入 IB 计划的合作伙伴的电子邮箱地址 * 客户电子邮箱 `必填` — 由合作伙伴引荐的客户的电子邮箱地址 * IB 类型 ID `必填` — IB 计划的标识符 IB 数据只能为 **客户** > **常规** 页面中列出的现有客户导入。 导入的数据将显示在 **介绍经纪商** > **计划** > **介绍经纪商** 和 **介绍经纪商** > **计划** > **客户** 页面上。 *** **创建时间** 启动导入操作的日期和时间。 *** **用户** 启动导入操作的 Back Office 用户的电子邮箱地址。 *** **状态** 导入操作状态: * `New` — 已启动导入操作,但尚未运行。 * `Awaiting confirmation` — 在验证 CSV 或 TSV 文件中的数据时,检测到部分无效记录。无效记录会显示在导入操作详情的 **日志消息** 字段中。您可以选择继续导入并排除无效记录,或取消导入。 * `In Progress` — 导入操作正在运行。 * `Success` — 导入操作已完全完成。 * `Success with errors` — 导入操作已完成,但导入期间至少发生了一个错误。 * `Failed` — 导入操作因严重错误而失败。 要查看所选数据导入操作的详细信息,请点击 **编辑** 按钮。 ## 详情 [#details] 在详情页面上,您可以找到以下字段: **日志消息** 列出 CSV 或 TSV 文件中包含无效导入数据的记录及其对应行号。 您可以点击 **继续导入**,在排除包含无效数据的记录后继续导入所有有效记录;也可以取消导入,或点击 **取消导入**。 导入完成后,此字段会显示 CSV 或 TSV 文件中每条记录的导入结果。 **错误消息** 列出发生错误并导致导入操作失败的记录及其对应行号。 **另请参阅** [如何导入客户相关数据](../../how-to-articles/manage-system-settings/how-to-import-client-related-data) [如何导入与 Back Office 用户组相关的数据](../../how-to-articles/manage-system-settings/how-to-import-data-related-to-back-office-user-groups) 在此页面上,您可以为 [Templates](templates/email) 中使用的参数设置值,例如颜色、图像等。 ## 键存储值 [#key-storage-values] 在此页面上,您可以查看和管理系统中存储的所有键值对。 **ID** 键值对的标识符。 *** **类型** 值类型:string、html、mail 或 url。 *** **键** 键名称,用于 [Templates](templates/email)。 *** **标签** 键值对所属的组。 *** **值** 分配给键的值。 *** **状态** 如果为 `Enabled`,则该键值对可在模板中使用。 ## 键存储标签 [#key-storage-tags] 在此页面上,您可以查看和管理用于对键值对进行语义分组的标签。 **ID** 标签标识符。 *** **标题** 标签描述。 *** **状态** 标签状态:已启用或已禁用。 在此页面上,您可以查看支持的语言列表以及为每种语言指定的格式设置。 支持本地化的 Back Office 字段可以翻译为支持的语言。 ## 常规信息 [#general-information] 每种语言均提供以下信息: **ID** 系统中的语言标识符。 *** **标题** 语言名称。 *** **回退语言** 如果未找到指定语言的翻译,则使用的回退语言。 *** **优先级** 分配给语言的优先级索引。优先级表示已启用语言在 B2CORE UI 的语言列表中的显示顺序。 *** **已启用** 如果为 `Yes`,则该语言已启用,客户可以在 B2CORE UI 中显示的语言列表中选择该语言。 默认情况下,英语是所有已启用语言的回退语言。这意味着,如果未找到特定语言的翻译或模板,将使用英语版本作为备用,以确保不同语言之间获得无缝的用户体验。 要查看语言详细信息,请选择一种语言并点击 **编辑** 按钮。 ## 详细信息 [#details] 每种语言均提供以下附加信息: **标题** 语言名称。 *** **区域设置** 区域设置标识符(例如 `en_US`)。 *** **语言代码** 语言代码(例如 `en`)。 *** **已启用** 如果为 `Yes`,则该语言已启用,客户可以在 B2CORE UI 中显示的语言列表中选择该语言。 *** **默认** 如果为 `Yes`,则该语言默认应用于 B2CORE UI。默认语言无法禁用。 *** **从右到左** 如果为 `Yes`,则指定语言的文本字符串将以从右到左的方向显示。 *** **优先级** 分配给语言的优先级索引。优先级表示已启用语言在 B2CORE UI 的语言列表中的显示顺序。 *** **格式** 为该语言指定的格式设置,例如日期和时间格式等。 **另请参阅** [如何添加或移除语言](../../how-to-articles/manage-system-settings/how-to-add-or-remove-a-language) 在此页面上,您可以查看列出 [Back Office 用户](users/users)所执行操作的日志。 每项已记录操作均提供以下信息: **操作人组** 包含执行操作的 Back Office 用户的[用户组](users/groups)名称。 *** **操作人** 执行操作的 Back Office 用户的电子邮件地址。 *** **事件类别** 操作的范围。可能的值: * **client** — 客户相关数据受到影响 * **operation** — 交易数据受到影响 *** **事件操作** 操作类型。可能的值: * `ADD` * `UPDATE` * `DELETE` *** **事件名称** 系统会跟踪以下客户相关操作: * `Client Created` — 已注册新的客户资料 * `Client Updated` — 已修改客户详情页面中[客户选项卡](../clients/general/client-tab)上显示的数据 * `Client Info Updated` — 已修改客户详情页面中[高级选项卡](../clients/general/advanced-tab)上显示的数据 * `Client Phone Created` — 已在客户详情页面的[联系方式选项卡](../clients/general/contacts-tab)上为客户指定新的电话号码 * `Client Phone Deleted` — 已从[联系方式选项卡](../clients/general/contacts-tab)中移除电话号码 * `Client Address Created` — 已在客户详情页面的[联系方式选项卡](../clients/general/contacts-tab)上为客户指定新地址 * `Client Address Updated` — 已在[联系方式选项卡](../clients/general/contacts-tab)上修改地址 * `Client Address Deleted` — 已从[联系方式选项卡](../clients/general/contacts-tab)中移除地址 系统会跟踪以下交易相关操作: * `Operation Created` — 已执行入金、出金、转账或兑换交易。交易标识符和类型显示在**详细信息**列中。 *** **详细信息** 有关已执行操作的详细信息。 *** **创建时间** 执行操作的日期和时间。 在此页面上,您可以查看支持的操作类型列表。 ### 常规信息 [#general-information] 每种操作类型均提供以下信息: **ID** 操作类型标识符。 *** **标题** 操作类型说明。 *** **名称** 操作类型名称: * `deposit` — 用于入金 * `payout` — 用于出金 * `transfer` — 用于转账(当资金在同一客户的账户和钱包之间转移时) * `internal_transfer` — 用于内部转账(当资金在同一 B2CORE 系统内从一个客户转移到另一个客户时) * `exchange` — 用于兑换 * `partners` — 用于向 IB 合作伙伴支付奖励 *** **类别** 操作类型类别。 *** **状态** 操作类型状态:`Enabled` 或 `Disabled`。 当某个操作类型被禁用时,客户无法在 B2CORE UI 中创建相应的交易。 要查看操作类型详情,请选择一种操作类型并点击 **编辑** 按钮。 ## 详情 [#details] 在详情页面上,您可以启用或禁用所选操作类型,并查看和调整其其他设置(如适用)。 以下是可调整附加设置的操作类型列表: ### `deposit` 操作类型 [#the-deposit-operation-type] **允许的操作状态** 可分配给入金交易的状态列表。这些状态也会在 B2CORE UI 中显示给客户。 ### `payout` 操作类型 [#the-payout-operation-type] **自动出金** 如果为 **已启用**,客户可以在 B2CORE UI 中进行无需管理员审批的自动出金;否则为 **已禁用**。 此外,您还可以限制客户可自动出金的最高金额(详情请参阅[如何按验证级别设置入金、出金和转账限额](../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels))。 *** **自动处理规则** 选择 **加密货币** 或 **法币**,或同时选择两者。 *** **允许的操作状态** 可分配给出金交易的状态列表。这些状态也会在 B2CORE UI 中显示给客户。 ### `transfer` 和 `internal_transfer` 操作类型 [#the-transfer-and-internal_transfer-operation-types] 可为 `transfer` 和 `internal_transfer` 操作类型调整的设置相同,包括以下选项: **允许的状态** 可分配给转账或内部转账的状态列表。这些状态也会在 B2CORE UI 中显示给客户。 *** **操作限制** 禁止进行转账或内部转账的转账方向列表。 例如,对于 `internal_transfer` 类型,选择 **交易账户至钱包** 选项后,您可以禁止从交易账户向客户钱包进行内部转账。 ### `exchange` 操作类型 [#the-exchange-operation-type] **允许的状态** 可分配给兑换交易的状态列表。这些状态也会在 B2CORE UI 中显示给客户。 *** **已启用对冲** 如果为 **是**,则兑换操作会进行对冲;否则为 **否**。 *** **对冲失败** * 选择 **允许兑换** 时,如果对冲失败,兑换仍会被处理。 * 选择 **拒绝兑换** 时,如果对冲失败,兑换不会被处理。 在此子章节中,您可以设置和管理支持的出金方式。 ## 出金方式 [#payout-methods] 在此页面上,您可以查看已配置的出金方式列表并创建新的方式。 ### 基本信息 [#general-information] 每种出金方式均提供以下信息: **ID** 该方式在系统中的标识符。 *** **优先级** 分配给出金方式的优先级索引。 在 B2CORE UI 中向客户显示出金方式的顺序取决于分配给方式的优先级索引。索引越小,优先级越高。例如,索引为 `1` 的方式将显示在 B2CORE UI 列表的顶部。 可在方式详情的[设置选项卡](payout-system#settings-tab)中更改优先级索引。 *** **标题** 在 Back Office 中为该方式分配的名称,该名称也会在 B2CORE UI 中向客户显示。 *** **名称** 该方式的唯一名称。只能包含拉丁字母、数字、连字符和下划线。 *** **分组** 该方式所属的一个或多个[分组](payout-system#payout-groups),例如 **Crypto**、**Fiat** 或其他分组。 *** **提供商** 支付系统的名称。 对于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的支付系统,**PaymentSystemsWithdrawal** 会显示为提供商。 *** **驱动程序**\ *仅适用于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的支付系统* 用于连接支付系统的驱动程序。它反映支付系统的名称,在某些情况下还反映支持的支付方式。 *** **货币** 该方式支持的一种或多种货币。该方式将适用于以所选货币计价的账户。 *** **已启用** 方式状态: * **否** — 该方式未激活,无法用于出金。 * **是** — 该方式已激活,可用于出金。 *** **状态** 感叹号图标 — 表示需要配置某些方式设置。将鼠标悬停在该图标上会显示所需设置的列表,可在方式详情中进行调整。 如果该列为空,则表示已指定该方式的所有必需设置。 要查看出金方式详情,请点击 **编辑** 按钮。 ### 详情 [#details] 详情页面分为以下选项卡: * [设置选项卡](payout-system#settings-tab) * [TR 货币选项卡](payout-system#tr-currencies-tab) * [PS 货币选项卡](payout-system#ps-currencies-tab) * [佣金选项卡](payout-system#commissions-tab) * [限制选项卡](payout-system#restrictions-tab) 显示的选项卡集可能因出金方式驱动程序而异。例如,对于通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接的方式,可能会显示额外的 **Webhooks** 和 **Test configuration** 选项卡。 #### 设置选项卡 [#settings-tab] 在此选项卡中,您可以查看或修改出金方式的常规设置,以及支付提供商的连接设置。 **名称** 该方式的唯一名称。只能包含拉丁字母、数字、连字符和下划线。 *** **已启用** 方式状态: * **否** — 该方式未激活,无法用于出金。 * **是** — 该方式已激活,可用于出金。 *** **分组** 该方式所属的一个或多个[分组](payout-system#payout-groups),例如 **Crypto**、**Fiat** 或其他分组。 *** **标题** 在 Back Office 中为该方式分配的名称,该名称也会在 B2CORE UI 中向客户显示。 *** **提供商** 支付系统的名称。 *** **结果 URL** 接收出金状态更新通知回调的 URL。 *** **到账时间** 在 B2CORE UI 中向客户显示的提示文本,用于说明预计的出金处理时间。提供两个标准选项: * `Depending on the Blockchain` * `From 3 to 5 Days` 可以在 **System** > **Key storage** > **Key storage values** 中修改标准选项的提示文本或添加新选项。使用 `method_time` 标签查找相关键并更新文本。 提示文本可以采用 HTML 格式指定,但使用不同格式可能会导致在不同设备上显示提示时出现困难。 例如,HTML 格式虽然能在 B2CORE UI 中正确呈现,但在移动应用中可能无法正常显示。 *** **图标** 在 B2CORE UI 中向客户显示的方式图标,用于快速识别该方式。 您可以使用预定义图标,或为自定义图像指定 URL。 有关预定义图标及其名称的列表,请参阅[支付系统](../../integrations/payment-systems)和[支持的加密货币支付方式](../references/supported-cryptocurrency-payment-methods)。要为该方式使用预定义图标,请在 **图标** 字段中输入其名称。 如果您倾向于使用自定义图标,请指定要显示为方式图标的图像 URL。 *** **优先级** 分配给出金方式的优先级索引。 在 B2CORE UI 中向客户显示出金方式的顺序取决于分配给方式的优先级索引。索引越小,优先级越高。例如,索引为 `1` 的方式将显示在 B2CORE UI 列表的顶部。 *** **IP 白名单** 允许进行出金操作的 IP 地址列表。 *** **汇率提供商** 在[货币 > 汇率](../currencies/rates)页面上配置的汇率提供商名称。 此字段为可选项。 如果指定该字段,系统将在使用出金方式时优先从此提供商请求汇率。 *** **已启用自动出金** * **是** — 客户可以使用此方式进行自动出金,无需管理员批准。 * **否** — 自动出金已禁用。在这种情况下,每个出金请求都必须由管理员在 Back Office 中批准。 此选项的使用取决于在 [System > Operation types](operation-types#the-payout-operation-type) 中为 `payout` 操作类型配置的设置。 在以下情况下,无法为该方式启用自动出金: * 如果 `payout` 操作类型的 **Auto withdrawal** 选项被禁用,则表示已全局禁用自动出金。 * 如果与该方式关联的[分组](#payout-groups)未列在 **Auto processing rules** 字段中,则表示该分组及其包含的所有出金方式均禁止自动出金。 *** **配置**\ *适用于 PSS 方式* 出金方式配置表单。其结构和可用字段取决于所选的 **Driver**。 **external connection** 包含连接到特定支付系统所需的技术集成数据,而 **configuration** 定义出金流程的运作方式。因此,您可以配置两个或多个使用相同外部连接、但配置不同的出金方式。 如果所选驱动程序没有可用配置,则会显示以下消息:`Configuration form is empty`。 *** **提供商设置**\ *适用于非 PSS 方式* 连接支付提供商所需的设置。 连接设置集因支付提供商而异。 指定连接设置后,可以检查用于访问支付提供商的凭据是否有效。为此,请点击 **Check connection** 按钮。 目前,**Check connection** 按钮仅适用于 B2BINPAY 支付提供商。 * 如果指定的凭据有效,按钮下方会显示 `Success` 状态。 * 如果凭据无效,则会显示 `Fail` 状态,后面附有说明消息。在这种情况下,请联系支持团队。 *** **自定义字段** 仅适用于 **Constructor** 提供商。 配置客户在 B2CORE UI 中使用 **Constructor** 方式出金时应填写的字段列表(详情请参阅[如何为 Constructor 入金或出金方式添加自定义字段](../../how-to-articles/manage-payment-methods/how-to-add-the-constructor-deposit-or-withdrawal-method#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method))。 #### TR 货币选项卡 [#tr-currencies-tab] 在此选项卡中,您可以查看和管理已添加到出金方式的交易货币列表。该方式将适用于以这些货币计价的账户。 每种货币均提供以下信息: **ID** 分配给添加至该方式的货币的标识符。 *** **货币** 分配给该货币的标题。 #### PS 货币选项卡 [#ps-currencies-tab] 在此选项卡中,您可以查看和管理支付提供商支持用于处理出金的货币列表。要使该方式能够处理特定货币的出金,请确保该货币已添加到此列表中。 每种货币均提供以下信息: **ID** 分配给添加至该方式的货币的标识符。 *** **货币** 分配给该货币的标题。 *** **PS 支持情况** `Supported` 状态表示所添加的货币受支付提供商支持,可用于出金。 添加状态无法保证与支付提供商兼容的货币时,会显示 `Support is unknown` 消息。在这种情况下,仍可将该货币添加至该选项卡并保存配置。但是,该货币可能无法被出金方式完全支持,因此应谨慎使用。 添加不受支持的货币时,会显示 `Not supported` 消息。在这种情况下,无法将该货币添加至该选项卡,也不允许保存配置。 #### 佣金选项卡 [#commissions-tab] 在此选项卡中,您可以查看和管理为出金方式配置的佣金列表。 每项佣金均提供以下信息: **ID** Back Office 中的佣金标识符。 *** **货币** 一种或多种佣金货币。 *** **佣金** 遵循以下公式的佣金费率: `Minimum commission amount <= Fixed rate + Percentage rate % <= Maximum commission amount` 详情请参阅[如何配置入金和出金方式的佣金](../../how-to-articles/manage-payment-methods/how-to-configure-commissions-for-deposit-and-withdrawal-methods)。 *** **类型** 佣金类型: * **TR**(供应商佣金)— 根据客户指定的出金币种和金额计算的佣金。 如果配置了此佣金类型,客户指定出金金额后,该金额将减去计算出的佣金。 * **PSP**(提供商佣金)— 仅为财务报告计算的佣金,不会影响客户从其账户中提取的金额。 如果配置了此佣金类型,它仅适用于已完成出金的报告计算,并显示在[财务 > 出金](../finance/payouts)的 **Provider commission** 列中。 #### 限制选项卡 [#restrictions-tab] 在此选项卡中,您可以按国家/地区、客户类型、验证级别、司法管辖区、IB 父级 ID 或 IB 计划类型限制出金方式的使用。该选项卡列出每项限制及其状态、类型和配置规则(详情请参阅[如何限制入金和出金方式的使用](../../how-to-articles/manage-payment-methods/how-to-restrict-the-use-of-deposit-and-withdrawal-methods))。 ## 出金分组 [#payout-groups] 分组用于将出金方式组织为类别,例如加密货币和法币方式,以便于管理。 **优先级** 分配给分组的优先级索引。 *** **名称** 分组名称。 *** **标题** 分组描述。 *** **已启用** 分组状态: * **否** — 该分组未激活,不能用于包含出金方式。 * **是** — 该分组已激活,可以包含出金方式。 在此页面上,您可以查看和管理用于定义 B2CORE UI 中客户注册流程的注册配置文件。 新的注册设置将取代[注册向导](wizards),并与[自定义字段](custom-fields)配合使用,让您能够根据需求构建注册流程——从仅包含电子邮件地址和密码的简单表单,到包含自定义字段的多步骤流程。 启用注册配置文件后,注册向导将自动禁用。 每个注册配置文件提供以下信息: **类型** 注册配置文件适用的客户类型:`Individual` 或 `Corporate`。 *** **标题** 注册配置文件的名称。 *** **已启用** 指示注册配置文件是否已启用。 要创建新的注册配置文件,请点击 **Create** 按钮。 ## 使用链接预填注册字段 [#pre-filling-registration-fields-with-a-link] 您可以分享一个注册链接,该链接会打开已预填部分字段的注册表单——例如您已知的客户电子邮件地址和国家/地区。每个预填值均可编辑,因此客户可以在提交前进行更正。 预填功能仅适用于**简化注册流程**——即 B2CORE UI 中基于本页所述注册配置文件构建的新注册流程。它不会影响旧版[注册向导](wizards)的表单。 ### 创建链接 [#build-the-link] 查找要预填的每个字段的机器名称。 对于自定义字段,机器名称位于 **System** > **Custom Fields** > **Fields** 页面中的 **Machine name**(参见[自定义字段](custom-fields))。标准字段使用其自身名称,例如 `email`。 获取 B2CORE UI 的注册链接 URL,并添加要打开的注册流程 ID,然后为每个字段添加一个 `init[]=` 参数: ``` https://example.com/auth/register/01936f7a-4b21-70c8-9d5e-6a1f2c3b4d5e?init[email]=john.doe@example.com&init[country]=196 ``` 将 `https://example.com` 替换为您的 B2CORE UI 地址,将 `01936f7a-…` 替换为您的注册流程 ID,并对值进行 URL 编码。 该 ID 会使链接打开一个特定的注册表单,因此客户无需先选择客户类型。您可以在本页的注册配置文件列表中找到它,路径为 **System** > **Registration**。 不带 ID 的链接同样有效: ``` https://example.com/auth/register?init[email]=john.doe@example.com&init[country]=196 ``` 客户会先选择客户类型,参数会保留并传递到表单。 ### 按字段类型划分的值 [#values-by-field-type] | 字段类型 | 链接可传递的内容 | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | 文本、多行文本、电子邮件、URL、电话、整数、小数、日期、日期和时间 | 一个值。如果参数重复出现,则使用第一个值。 | | 下拉选择 | 一个与该字段配置选项匹配的值。不匹配任何选项的值将被忽略。 | | 多选 | 多个匹配的选项值,可作为重复参数传递(`init[hobbies]=chess&init[hobbies]=golf`)、以数组形式传递(`init[hobbies][]=chess&init[hobbies][]=golf`),或作为逗号分隔列表传递(`init[hobbies]=chess,golf`)。 | | 布尔值 | 只有 `true` 会选中该字段。任何其他值都会使字段保持原样。 | 对于**下拉选择**和**多选**字段,链接必须传递选项的值,而不是客户看到的标签。对于带有引用列表的字段,例如国家/地区字段,选项值为其数字 ID——例如 `init[country]=196`。 密码字段以及任何其他包含敏感值的字段均不会被预填——链接中的值将被忽略。只读字段和表单中不存在的名称同样会被忽略。 ### 注意事项 [#good-to-know] * 预填值会立即进行验证,因此未通过字段验证的值会在表单打开时立即高亮显示。 * 在多步骤注册表单中,值会同时应用于所有步骤;来回切换步骤不会覆盖客户已输入的内容。 * 参数会保留在地址栏中:如果客户重新加载页面,链接中的值会再次应用,所有编辑内容都会丢失。 * 值限制为 1,000 个字符;超出部分将被截断。 * 包含逗号的值仅会预填到逗号之前,因为逗号用于分隔多个值。 **另请参阅** [如何迁移到新的注册设置](../../how-to-articles/manage-system-settings/how-to-migrate-to-new-registration-settings) 在此子部分中,您可以为[客户请求](../clients/requests)定义拒绝原因。 ## 处理结果 [#resolutions] 如果您拒绝客户的请求,请选择一个**处理结果**,即拒绝的原因。在此页面上,您可以查看可用处理结果的列表。 **ID** 处理结果标识符。 *** **名称** 处理结果描述。 *** **已启用** 处理结果状态。 *** **类型** [处理结果类型](requests#resolution-types)。 **另请参阅** [如何创建请求解决方案](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution) ## 处理结果类型 [#resolution-types] **处理结果类型**用于对不同的处理结果进行分类和分组。在此页面上,您可以查看可用处理结果类型的列表。 **ID** 处理结果类型标识符。 *** **名称** 处理结果类型描述。 *** **已启用** 处理结果类型状态。 **另请参阅** [如何创建请求解决类型](../../how-to-articles/manage-system-settings/how-to-create-a-request-resolution-type) ## 信息显示 [#information-showing] 使用以下设置可在 B2CORE UI 中为客户启用或禁用特定选项: **历史记录 ID** 如果为 `Enabled`,客户可以在 B2CORE UI 中查看其交易历史中的交易标识符。 *** **资料 ID** 如果为 `Enabled`,客户可以在 B2CORE UI 中查看分配给其资料的标识符。 *** **更改昵称** 如果为 `Enabled`,客户可以在 B2CORE UI 中添加和更改其昵称。 *** **更改头像** 如果为 `Enabled`,客户可以在 B2CORE UI 中添加和更改其个人资料图片。 如果您希望在添加或更改个人资料图片时创建请求,请在[客户设置](settings#client-settings)中为 **头像需要请求** 选项选择 `Yes`。在这种情况下,个人资料图片仅会在管理员批准这些请求后更新。 *** **显示电子邮件** 如果为 `Enabled`,客户用于登录的电子邮件地址会显示在 B2CORE UI 的客户资料中。 *** **显示昵称** 如果为 `Enabled`,**昵称** 字段会显示在 B2CORE UI 的客户资料中。仅当客户使用 [B2COPY](https://docs.b2copy.b2broker.com/) 时才需要昵称。客户昵称会显示在排行榜中,便于轻松识别和区分账户。 ## 客户设置 [#client-settings] **唯一电话号码** 如果为 `Enabled`,新客户必须在注册时指定唯一的电话号码(如果您的注册流程要求提供电话号码),且不能使用已被其他客户使用过的电话号码进行注册。 *** **头像需要请求** * 如果为 `Yes`,当客户在 B2CORE UI 中添加或更改个人资料图片时会创建请求。在这种情况下,个人资料图片仅会在管理员批准这些请求后更新。 * 如果为 `No`,客户无需管理员批准即可添加或更改其个人资料图片。 这两个选项均与[信息显示](settings#information-showing)中的 **更改头像** 选项相关。如果禁用 **更改头像**,客户将无法添加或更改其个人资料图片。 ## 客户资料 [#client-profile] **地址更新** 指示客户是否可以在 B2CORE UI 的 **资料** 菜单中更改其国家/地区和地址。 地址更新仅适用于 `individual` 客户,且仅适用于**住宅地址**。 * **Disabled** — 客户不能更改其国家/地区和地址。 * **KYC validation** — 客户可以更改其国家/地区和地址,但会被告知其当前验证级别将被重置。他们必须再次完成 KYC 流程,并提交确认新地址所需的文件以恢复其级别。如果您的 KYC 流程包含地址验证,请选择此选项。 * **Request validation** — 客户可以更改其国家/地区和地址,并且必须上传确认更改的文件。随后将创建 **地址** 请求,管理员必须在 Back Office 的 **客户** > **请求** 中审核并批准该请求。当您的 KYC 流程不包含地址验证时,请选择此选项。 *** ## Weblate [#weblate] **项目 ID** 指定用于维护 B2CORE UI 支持语言翻译的 B2TRANSLATE 项目(原 WEBLATE)标识符。 有关 B2TRANSLATE 的更多信息,请参阅[产品文档](https://docs.b2translate.b2broker.com/)。 ## 兑换 [#exchange] **报价有效期(分钟)** 指定收到的报价汇率在 B2CORE UI 中用于兑换的有效时间间隔(分钟)。 ## Slack 机器人 [#slack-bot] **机器人令牌** 指定用于管理您的 Slack 机器人的令牌(详情请参阅[如何设置 Slack 机器人](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-slack-bot))。 ## Telegram 机器人 [#telegram-bot] **机器人 API 令牌** 指定用于管理您的 Telegram 机器人的令牌(详情请参阅[如何设置 Telegram 机器人](../../how-to-articles/manage-communication-platforms/how-to-set-up-a-telegram-bot))。 ## 奖金 [#bonuses] 使用以下选项配置自动向客户交易账户入金后发放奖金的流程。奖金支持为在 MetaTrader 4/5 和 cTrader 上开立的交易账户发放。 **从入金自动创建** * 如果为 `Enabled`,客户向其交易账户入金后,奖金将自动记入客户账户(详情请参阅[如何在客户入金后自动向其发放奖金](../../how-to-articles/manage-bonuses/how-to-automatically-credit-bonuses-to-clients-upon-deposits))。 若要启用入金后自动发放奖金,请为需要此功能的每个平台创建一个奖金预设。给定平台上索引**最低**的预设将用于自动发放奖金(详情请参阅[如何创建奖金预设](../../how-to-articles/manage-bonuses/how-to-create-a-bonus-preset))。 * 如果为 `Disabled`,则不会为交易账户入金自动发放奖金。 *** **自动创建奖金百分比** 入金金额中作为奖金记入客户交易账户的百分比。 *** **自动奖金上限** 客户交易账户因入金可自动获得的最高奖金金额。如果计算出的奖金金额超过指定限额,则仅向账户记入允许的最高金额。 *** **自动奖金最低额** 客户必须向其交易账户存入的最低金额,以触发自动奖金发放。该金额适用于向账户进行的每次入金和转账操作,与客户入金总额无关。 *** **启用“当净值 \< 信用额时销毁”**\ *仅适用于 MT4/5* 选择您希望启用此选项的平台。此选项可为 MT4/5 启用,且不支持 cTrader。 在所选平台上,如果账户净值低于已记入的奖金金额,则记入客户交易账户的奖金将被销毁。 *** **出金时销毁** * 如果为 `Enabled`,当客户从其交易账户出金时,记入该账户的奖金将被销毁。 * 如果为 `Disabled`,出金不会影响已记入的奖金。 ## 用户注册设置 [#user-registration-settings] **启用用户注册** * 如果为 `Enabled`,新客户可以在 B2CORE UI 中注册。 * 如果为 `Disabled`,则无法注册新客户。 ## 双重身份验证 [#two-factor-authentication] **已启用的双重身份验证提供商** 选择将在 B2CORE UI 中向客户显示并可供其使用的 2FA 方法。您可以同时启用 Google Authenticator 和 SMS 确认,也可以只启用其中一种。 **服务名称** 输入显示在 Google Authenticator 应用中的名称,该名称代表生成 2FA 代码的 B2CORE UI。 ## 移动端 [#mobile] 如果您已部署移动应用,本节中的选项适用(详情请参阅 [B2CORE Mobile](../../b2core-mobile/deploying-your-ios-app))。 客户可以使用已登录的移动应用扫描 **登录** 页面上显示的二维码,以登录 B2CORE UI。这样,他们无需重新输入凭据即可登录。 **二维码有效期(分钟)** * 若要限制二维码有效期,请指定二维码的有效分钟数。默认限制为 2 分钟。 * 若要从 **登录** 页面隐藏二维码,请指定 **0** 或将此字段留空。 *** **移动应用** 选择您希望显示移动应用下载按钮的平台。该按钮将显示在 B2CORE UI 的 **登录** 页面上,以及客户登录后 **仪表板** 顶部(详情请参阅[如何配置移动应用下载设置](../../how-to-articles/manage-system-settings/how-to-configure-settings-for-mobile-app-downloads))。 — 默认情况下,此字段为空。可用选项: * **iOS** — 选择此选项可提供从 Apple Store 下载您的 iOS 应用的链接。 * **Android** — 选择此选项可提供从 Google Play 下载您的 Android 应用的链接。 * **Android APK Registry** — 选择此选项可提供下载 Android APK 的链接。 *** **iOS URL** 如果您选择了 **iOS**,请指定从 Apple Store 下载 iOS 应用的 URL。 *** **Android URL** 如果您选择了 **Android**,请指定从 Google Play 下载 Android 应用的 URL。 *** **Android APK Registry ID** 如果您选择了 **Android APK Registry**,请指定 Android APK 的通用唯一标识符(UUID)。此 UUID 用于生成 Android APK 的下载链接。 *** ## Metatrader 4 和 Metatrader 5 [#metatrader-4-and-metatrader-5] **启用合作伙伴计划** 如果为 `Enabled`,相应平台上将提供 IB 计划。 ## 其他设置 [#other-settings] **确认电话号码代码有效期** 指定发送至客户电话号码的验证码有效时间(秒)。 *** **每个收件人的短信限制** 指定客户每天可请求的验证码消息最大数量。 *** **用户-管理员会话时长 1 – 120(分钟)** 指定 [Back Office 用户](users/)的会话时限(分钟)。默认限制为 24 分钟。达到指定时限后,用户将自动退出 Back Office。 在此页面上,您可以查看已连接 SMS 提供商的列表。 **名称** 分配给 SMS 提供商配置的名称。 *** **标题** SMS 提供商的名称,用于 Back Office。 *** **提供商** SMS 提供商的名称。 *** **已启用** 如果为 **是**,则 SMS 提供商已启用并用于向您的客户发送 SMS;否则为 **否**。 要查看 SMS 提供商的配置设置,请点击 **编辑**。 **另请参阅** [如何配置 Twilio](../../how-to-articles/manage-communication-platforms/how-to-configure-twilio) **状态检查**页面可让您一目了然地查看 B2CORE 实例重要部分的健康状况。每项检查都会按计划自动运行并记录结果,因此您无需离开 Back Office 即可发现问题,例如无法访问的交易平台或不完整的设置。 要打开此页面,请在主菜单中前往 **系统** > **状态检查**。 ## 检查失败指示器 [#failed-checks-indicator] 当一项或多项检查失败时,顶栏中通知铃铛旁会显示一个警告图标,并带有显示失败检查数量的徽章。 点击该图标可打开当前失败检查的下拉列表。每个项目显示: * 检查名称。 * 问题的简短描述。 * 表示该检查上次运行时间的标签,例如 **5 分钟前**。 在列表中选择一项检查,即可打开**状态检查**页面并跳转到该检查。 只有状态为**失败**或**错误**的检查会显示在指示器中。状态为**正常**、**待处理**或**未知**的检查不会被计入。 ## 状态时间线 [#status-timeline] 该页面列出每项已注册的检查。对于每项检查,水平时间线会显示其状态随时间的变化,同一状态的连续运行会归组为一个彩色时间段。 时间线最多涵盖一个月。对于最近部署的实例,时间线将从首次记录的运行开始,以确保时间窗口保持有意义。 每项检查还显示: * 当前状态的徽章。 * 上次运行的时间;如果尚未记录任何运行,则显示**从未运行**。 * 最近一次运行的渲染详情,例如无法访问的平台列表。 ## 状态 [#statuses] 一次检查运行可以具有以下状态之一。 *** **正常** 检查已通过。监控区域运行正常。 *** **失败** 检查发现了问题,例如交易平台无法访问或缺少必需的设置。 *** **错误** 由于意外错误,检查无法完成。记录的详情中包含错误消息。 *** **待处理** 检查运行已开始,正在等待结果。 *** **未知** 无法确定状态,例如某次运行未完成或检查已重置。未知结果不会被视为失败。 *** **无数据** 时间线的该部分未记录任何检查运行。 ## 可用检查 [#available-checks] 默认提供以下检查。 *** **真实账户平台连接性** 验证每个已启用的真实账户交易平台是否可访问。 *** **模拟账户平台连接性** 验证每个已启用的模拟账户交易平台是否可访问。 *** **视觉自定义** 验证是否已在[视觉自定义](visual-customization)页面上配置基础资源(例如徽标、网站图标和背景)以及配色方案。 *** **新注册设置** 验证是否已在**系统** > **注册**页面启用客户注册,并且至少启用了一项注册配置。 使用本节中的选项来自定义 B2CORE UI 的外观,以体现您品牌的独特风格。 ## 要点 [#key-points] 可用选项使您能够: * 选择为 B2CORE UI 启用浅色主题、深色主题或两者,并选择其中哪一个应设为默认主题。 * 为 B2CORE UI 的两种主题上传自定义徽标。 * 调整浅色和深色主题中各种 UI 元素的颜色。 * 为 B2CORE UI 的**登录**和**注册**页面设置及更新背景图片。 * 添加自定义脚本,例如用于聊天机器人集成和分析跟踪。 ## 资源 [#resources] 在此页面上,您可以上传或修改 B2CORE UI 中显示的徽标,以及**注册**和**登录**页面的背景图片(如有需要)。 **浅色主题徽标** 启用浅色主题时,B2CORE UI 中显示的主徽标。 要求格式:带透明背景的 SVG,文件大小最大为 10 MB。 *** **浅色主题简短徽标** 在浅色主题下主菜单折叠时显示的紧凑版徽标。 要求格式:带透明背景的 SVG,文件大小最大为 10 MB。 *** **深色主题徽标** 启用深色主题时,B2CORE UI 中显示的主徽标。 要求格式:带透明背景的 SVG,文件大小最大为 10 MB。 *** **深色主题简短徽标** 在深色主题下主菜单折叠时显示的紧凑版徽标。 要求格式:带透明背景的 SVG,文件大小最大为 10 MB。 *** **网站图标 (.ico)** 浏览器标签页中显示的小图标。 要求格式:ICO,文件大小最大为 10 MB。 *** **网站图标 (.svg)** 供支持 SVG 的浏览器使用的网站图标矢量版本。 要求格式:SVG,文件大小最大为 10 MB。将用作可缩放图标。 *** **Apple 触控图标** 在 Apple 设备上将 B2CORE UI 页面添加到主屏幕时显示的图标。 要求格式:PNG,180×180 像素,文件大小最大为 10 MB。 *** **浅色主题背景** 启用浅色主题时应用于**注册**和**登录**页面的背景图片。添加背景图片为可选操作。 推荐格式:SVG、JPG 或 PNG,文件大小最大为 10 MB。 *** **深色主题背景** 启用深色主题时应用于**注册**和**登录**页面的背景图片。添加背景图片为可选操作。 推荐格式:SVG、JPG 或 PNG,文件大小最大为 10 MB。 ### 管理面板图片 [#admin-panel-images] 在本节中,您可以上传 Back Office 中显示的图片(推荐格式:JPG、PNG 或 SVG,文件大小最大为 10 MB): * **菜单徽标** — 在 Back Office 主菜单中显示的徽标 * **登录页面徽标** — 在 Back Office 登录页面中显示的徽标 * **登录页面背景** — 应用于 Back Office 登录页面的背景图片 ## 配色方案 [#color-scheme] 在此页面上,自定义 B2CORE UI 浅色和深色主题的颜色设置。 在**品牌配置**部分,您可以通过指定**品牌颜色**并启用**着色背景**选项来快速设置品牌标识,该选项会将品牌颜色的浅色调应用于界面背景。 下文所述各个界面元素的颜色设置可在**高级颜色设置**部分中找到。 **已启用浅色主题** 选中复选框以启用 B2CORE UI 的浅色主题。 如果两种主题均已启用,请启用**默认**选项以将浅色主题设为默认主题。 *** **已启用深色主题** 选中复选框以启用 B2CORE UI 的深色主题。 如果两种主题均已启用,请启用**默认**选项以将深色主题设为默认主题。 如果未选中任何主题复选框,您的 B2CORE UI 将使用 B2BDemo 设计中预定义的浅色和深色主题,并且下方列出的所有自定义颜色设置将被忽略。 如果选中两个主题复选框,两个主题都将向 B2CORE UI 中的客户提供,并应用自定义颜色设置。 视觉自定义 — 配色方案 高级颜色设置分为**语义令牌 V1(浅色 / 深色)**和**语义令牌 V2(浅色 / 深色)**部分,允许您分别为浅色和深色主题自定义每个颜色令牌。若要将颜色令牌重置为从您的品牌颜色派生的值,请点击**从品牌重置颜色**按钮。 仅支持 6 或 8 个字符的十六进制颜色代码。 \*\*语义令牌 V1(浅色 / 深色)\*\*部分包含以下令牌组: * **强调色** — `accent`, `accentHover`, `accent40`, `accent10`, `demo` * **状态** — `positive`, `positive20`, `medium`, `medium20`, `negative`, `negative20` * **表面** — `background`, `background96`, `card`, `field`, `disabled`, `overlay`, `tooltip`, `divider` * **文本** — `textMain`, `textSecondary`, `textSecondary40`, `textContrast` \*\*语义令牌 V2(浅色 / 深色)\*\*部分包含以下令牌组: * **强调色** — `brand`, `brandSubtle`, `brandMuted`, `alternative`, `alternativeSubtle`, `alternativeMuted`, `positive`, `positiveSubtle`, `positiveMuted`, `medium`, `mediumSubtle`, `mediumMuted`, `negative`, `negativeSubtle`, `negativeMuted`, `neutral`, `overlay`, `overlaySubtle`, `overlayMuted` * **字符** — `onSurface`, `onSurfaceSecondary`, `onSurfaceInverse`, `onBrand`, `onAlternative`, `onPositive`, `onMedium`, `onNegative`, `onNeutral`, `onOverlay`, `onSurfaceBrand`, `onSurfaceAlternative`, `onSurfacePositive`, `onSurfaceMedium`, `onSurfaceNegative`, `onSurfaceOverlay` * **表面** — `surfaceLow`, `surface`, `surfaceHigh`, `surfaceHighest`, `surfaceInverse`, `backdrop` * **轮廓** — `outline`, `outlineStrong` * **状态** — `stateHovered`, `statePressed`, `stateHoveredInverse`, `statePressedInverse`, `stateDarken`, `stateDarkenStrong` **其他浅色/深色主题变量 (json)** 使用此字段指定包含额外变量的 JSON 对象,例如定义背景图片在相应主题中行为的变量: ```json { "optional-external-bg-position": "0 0", "optional-external-bg-size": "cover", "optional-external-bg-repeat": "no-repeat", "optional-external-bg-attachment": "fixed" } ``` `"optional-external-bg-position": "0 0"` 将背景图片定位在**左上角**。 *** `"optional-external-bg-size": "cover"` 缩放背景图片以覆盖整个页面。 *** `"optional-external-bg-repeat": "no-repeat"` 防止背景图片向任何方向重复(平铺)。 *** `"optional-external-bg-attachment": "fixed"` 在滚动页面时保持背景图片固定不动。它不会随内容移动。 *** ## 字段 [#fields] 在此页面上,您可以指定其他自定义字段。 **项目名称** 您的项目名称,将显示在 B2CORE UI 中。 *** **脚本 (js-script)** 在此处添加您的 JavaScript (JS) 脚本。当客户打开**注册**或**登录**页面时,这些脚本将自动执行。 在此页面上,您可以查看已添加和配置的向导列表。 **向导**是用于配置和修改在 B2CORE UI 中运行的特定流程的工具,例如客户注册、授权、密码恢复等。 您可以为每个流程配置多个向导。在这种情况下,您应选择用于在 B2CORE UI 中运行流程的默认向导。非默认向导可概述外部系统通过 API 执行特定操作时使用的流程。 ## 常规信息 [#general-information] 每个向导均提供以下信息: **ID** 向导标识符。 *** **名称** 向导名称。 *** **类型** 指示向导所概述工作流程对应流程的类型。 *** **已启用** 如果为 `Yes`,则该向导已启用并用于运行流程;否则为 `No`。 *** **默认** 如果为 `Yes`,则当为同一流程配置了多个向导时,默认使用该向导;否则为 `No`。 要查看向导详细信息,请点击 **编辑** 按钮。 ## 详细信息 [#details] 详细信息页面分为以下选项卡: * **向导**选项卡 — 显示向导的主要参数 * **工作流程**选项卡 — 列出流程工作流程中包含的必需步骤和附加步骤 必需步骤无法从流程工作流程中移除。 要在工作流程中添加附加步骤,请点击 **添加** 按钮,并从所选向导支持的附加步骤列表中选择一个步骤。 必需步骤和附加步骤都会自动分配指定的优先级索引,该索引定义了在 B2CORE UI 中运行流程时步骤的执行顺序。步骤无法重新排序。 以下列出了一些支持的向导,以及构成流程工作流程的完整必需步骤和附加步骤列表。必需步骤标记为 `必需`。可根据需要将附加步骤添加到流程工作流程中或从中移除。步骤顺序无法更改。 ### 注册向导 [#registration-wizard] 该向导概述了在 B2CORE UI 中注册新客户的流程。 **另请参阅** [如何添加和配置注册向导](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard) [如何为“基本信息”步骤设置字段](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-set-up-fields-for-the-basic-information-step) [基本信息步骤支持的字段](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/fields-supported-in-the-basic-information-step) [如何为高级步骤设置字段](../../how-to-articles/manage-system-settings/how-to-set-up-the-registration-wazard/how-to-set-up-fields-for-the-advanced-step) [如何按国家/地区阻止注册](../../how-to-articles/manage-system-settings/how-to-block-registration-for-a-country) ### 授权向导 [#authorization-wizard] 该向导概述了登录 B2CORE UI 的流程。 ### 密码恢复向导 [#password-recovery-wizard] 该向导概述了恢复用于访问 B2CORE UI 的客户密码的流程。 ### 密码更改向导 [#password-change-wizard] 该向导概述了更改用于访问 B2CORE UI 的客户密码的流程。 ### 地址更改向导 [#address-change-wizard] 该向导概述了更改客户地址的流程。 ### 白名单创建向导 [#whitelist-creation-wizard] 该向导概述了创建出金白名单并向该列表添加钱包地址的流程。 ### 白名单删除向导 [#whitelist-delete-wizard] 该向导概述了从客户之前创建的出金白名单中删除钱包地址的流程。 ### 白名单更改向导 [#whitelist-change-wizard] 该向导概述了禁用客户之前创建的出金白名单的流程。 ### 出金向导 [#withdrawal-wizard] 该向导概述了在 B2CORE UI 中进行出金的流程。 **另请参阅** [如何更改向导工作流](../../how-to-articles/manage-system-settings/how-to-change-the-wizard-workflow) 您的客户在 B2CORE UI 中执行的某些操作需要进行处理(批准或拒绝)。 要快速查看待处理请求,请点击顶部栏中的**铃铛**图标,然后点击所需请求以进入请求详情。或者,您也可以在 **Clients** > **Requests** 页面查看待处理请求列表。 要处理客户请求: 前往 **Clients** > **Requests**。 选择请求。 您可以按客户电子邮件、请求类型或其他条件筛选请求列表,以快速找到所需请求。 点击 **Edit** 按钮以查看请求详情。请注意,对于某些提供商,还可以直接在请求中编辑入金或出金金额。 如有需要,请**添加评论**。此评论仅会显示在 Back Office 中。您的客户不会收到相关通知。 使用 **Options** 按钮设置请求在列表中的颜色。 点击 **Audit** 以检查交易。系统将汇总账户上的所有入账交易,并在余额存在重大差异时显示通知。 此步骤需要 `Update requests` 权限。 点击 **Approve** 或 **Reject** 以处理请求。 如果**拒绝**: 选择 **Resolution type** 和 **Resolution**。该类型和处理结果必须已在系统中创建(详情请参阅[如何创建请求处理类型](../manage-system-settings/how-to-create-a-request-resolution-type)和[如何创建请求处理结果](../manage-system-settings/how-to-create-a-request-resolution))。 通过解决一个简单的数学题来**确认**拒绝,并在 **Verification code** 字段中提供答案。 点击 **OK** 以保存更改。 之后,系统将向客户发送有关请求处理结果的电子邮件通知。 使用客户标签可在 Back Office 中整理和筛选客户数据。通过为客户分配标签,您可以让 Back Office 用户(例如管理员或经理)只能查看带有特定标签的客户,同时隐藏其他客户。 您可以手动为客户分配标签(详情请参阅以下说明:[为单个客户分配标签](#assign-tags-to-a-single-client) 和 [为多个客户分配标签](#assign-tags-to-multiple-clients))。 如果您使用[司法管辖区](../../back-office-guide/clients/jurisdictions),与司法管辖区关联的标签将在注册后根据所选国家/地区自动与该司法管辖区一起分配给客户(详情请参阅[如何创建司法管辖区](how-to-create-a-jurisdiction))。 ## 为单个客户分配标签 [#assign-tags-to-a-single-client] 要为客户分配标签: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 在 **Client Tags** 下拉列表中,选择要分配给该客户的一个或多个标签。在下拉列表中选择每个标签后,按 **Enter**。 要查看可用客户标签列表或添加新标签,请导航至 **System** > **Users** > **Client Tags**。 点击 **Save** 以应用更改。 分配给该客户的标签会显示在 **General** 页面上的 **Tags** 列中。 ## 为多个客户分配标签 [#assign-tags-to-multiple-clients] 要一次为多个客户分配标签: 导航至 **Clients** > **General**。 点击页面右上角的 **Select** 按钮,然后通过点击客户行选择要分配标签的客户。 * 要选择所有客户,请点击 **Select All**。 * 要取消选择某个客户,请再次点击相应的客户行。 * 要一次取消选择所有客户,请点击 **Deselect**。 展开页面右上角的 **Edit selected clients** 下拉列表,然后选择 **Assign Tags**。 在 **Client Tags** 下拉列表中,选择要分配给所选客户的一个或多个标签。在下拉列表中选择每个客户后,按 **Enter**。 如要使用新标签替换现有客户标签,请启用 **Overwrite current values** 选项;否则,新标签将添加到现有标签中。 点击 **Save** 以应用更改。 分配给客户的标签会显示在 **General** 页面上的 **Tags** 列中。 **另请参阅** [如何让管理员用户仅查看特定客户](../manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) 要更改客户的密码: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 在 **View client** 页面中,点击页面右上角的 **Actions** 按钮,然后选择 **Change password**。 在 **Change password** 弹窗中: * 在 **Password** 字段中输入新密码。 或者,您可以点击 **Password** 字段右侧的 **Generate** 按钮来生成安全密码。 * 在 **Send mail** 下拉列表中,选择 **Yes** 以通过电子邮件将新密码发送给客户。 点击 **Save** 以更改密码。 要创建司法管辖区: 前往 **Clients** > **Jurisdictions**。 点击页面右上角的 **+Create**。 在 **Create a jurisdiction** 页面中,填写以下字段: * 在 **Caption** 字段中,输入要应用于该司法管辖区的名称,例如:`Latin America`。 * 在 **Countries** 下拉列表中,选择属于该司法管辖区的国家。 下拉列表中仅显示在 [System > Countries](../../back-office-guide/system/countries) 页面中已启用的国家。 * 在 **Client types** 下拉列表中,选择要与该司法管辖区关联的客户类型。 下拉列表中仅显示在 [Clients > Types](../../back-office-guide/clients/types) 页面中已启用的客户类型。 * 在 **Tags** 下拉列表中,可选择一个或多个[tag](../../back-office-guide/system/users/client-tags),这些标签将与司法管辖区一同自动分配给客户。 * 在 **Description** 字段中,输入该司法管辖区的描述或补充信息。 * 选择 **Apply changes to all existing clients** 复选框,以便将该司法管辖区应用于所有国家和客户类型与该司法管辖区中添加的组合相匹配的现有客户。 保持该复选框未选中,以便仅将该司法管辖区应用于创建后注册的客户。现有客户不会受到影响。 点击 **Save** 以创建司法管辖区。 客户完成注册流程后,可根据其国家和客户类型自动分配至该司法管辖区。分配的司法管辖区会显示在客户详情的 **Additional Info** 部分中,您也可以在那里手动更改。 ## 如何编辑司法管辖区 [#how-to-edit-a-jurisdiction] 要编辑司法管辖区: 前往 **Clients** > **Jurisdictions**。 选择要修改的司法管辖区,然后点击 **Edit** 按钮。 在 **Update jurisdiction** 页面中,您可以进行以下更改: * 在 **Countries** 下拉列表中,添加或删除与该司法管辖区关联的国家。 * 在 **Client types** 下拉列表中,添加或删除关联的类型。 * 在 **Tags** 下拉列表中,添加或删除将分配给属于该司法管辖区客户的标签。 * 要将更新后的设置应用于现有客户,请选择 **Apply changes to all existing clients** 复选框。 保持该复选框未选中,以便仅将更改应用于在保存更改后注册的新客户。现有客户不会受到影响。 点击 **Save** 以将更新应用于司法管辖区设置。 更改是否生效取决于 **Apply changes to all existing clients** 复选框是已选中还是未选中。 如果您对产品、入金和出金方式或验证级别应用了任何基于司法管辖区的限制,这些限制将根据更新后的司法管辖区设置对客户生效。 ## 示例 1 [#example-1] 假设配置了两个拥有相同国家但客户类型设置不同的司法管辖区: * **Seychelles (SC)** 司法管辖区: * **Countries**:阿联酋和阿曼 * **Client type**:个人 * **Mauritius (MU)** 司法管辖区: * **Countries**:阿联酋和阿曼 * **Client type**:企业 当新客户注册时: * 来自 **UAE** 且类型为 **Personal** 的客户会自动分配至 **SC** 司法管辖区。 * 来自 **UAE** 且类型为 **Corporate** 的客户会自动分配至 **MU** 司法管辖区。 * 来自 **Oman** 且类型为 **Personal** 的客户会分配至 **SC** 司法管辖区。 * 来自 **Oman** 且类型为 **Corporate** 的客户会分配至 **MU** 司法管辖区。 * 来自未列于任一司法管辖区的国家,或客户类型不符合司法管辖区设置的客户,不会被分配任何司法管辖区。 ## 示例 2 [#example-2] 假设上述示例中的 **Seychelles (SC)** 司法管辖区已更新:移除了 **Oman** 并添加了 **Saudi Arabia**: **Seychelles (SC)** 司法管辖区: * **Countries**:阿联酋和沙特阿拉伯 * **Client type**:个人 如果 **Apply changes to all existing clients** 复选框已*选中*: * 将从国家为 **Oman** 且客户类型为 **Personal** 的现有客户中移除 **SC** 司法管辖区。他们不会被分配任何司法管辖区。 * 来自 **Saudi Arabia** 且类型为 **Personal** 的现有客户会被分配至 **SC** 司法管辖区。 * 来自 **UAE** 的现有客户保持不变。 * 更新后的 **SC** 司法管辖区也会根据更新后的国家列表分配给新注册的客户。 如果 **Apply changes to all existing clients** 复选框未*选中*: * 现有客户保持不变。例如,来自 **Oman** 且类型为 **Personal** 的客户仍保留 **SC** 司法管辖区,即使已移除 **Oman**。 * 更新后的 **SC** 司法管辖区仅适用于在保存更改后注册的客户,并以更新后的国家列表为准。 **另请参阅** [如何让管理员用户仅查看特定客户](../manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) 要为客户禁用双重身份验证(2FA): 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 在 **View client** 页面中,前往 **Settings** 选项卡。 在 **2FA** 部分中,根据要关闭的 2FA 方法,在 **google** 或 **sms** 的下拉列表中选择 `Disabled`,也可以同时关闭两者。 点击 **Save** 以应用更改。 要为客户启用内部转账: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 在 **View client** 页面中,前往 **Settings** 标签页。 在 **Rights** 部分,启用 **Internal Transfers** 复选框。 点击 **Save** 以应用更改。 要查找批准或拒绝特定客户请求的 Back Office 用户: 导航至 **Clients** > **Requests**。 找到所需的请求。 默认情况下,列表会按 `Pending` 状态筛选。清除 **Status** 筛选条件以查看所有请求。 要缩小搜索范围,请应用其他筛选条件,例如 **Client name**、**Client email**、**Country**、请求的 **Type**、**Status**(`Approved` 或 `Rejected`)或日期范围。 查看 **Processed by** 列,以查看处理该请求的 Back Office 用户的电子邮件地址。 相同的 **Processed by** 信息也会显示在请求详情页面的右上角。 要注册新客户并创建其档案: 前往 **Clients** > **General**。 点击页面右上角的 **+Create**。 在显示的 **Create client** 弹窗中,输入客户的电子邮箱、名字和姓氏。必填字段可能因 [Registration wizard](../../back-office-guide/system/wizards#registration-wizard) 的配置而异。 点击 **Save** 创建客户档案。 注册成功后,客户将收到一封确认注册的电子邮件通知。 新注册的客户会被添加到 **General** 页面显示的客户列表中。您可以点击 **Edit** 按钮访问客户详情,并使用更多信息更新其档案。 默认情况下,创建的客户档案不包含密码。客户首次登录 B2CORE UI 时需要重置密码。 或者,您可以为客户[设置密码](how-to-change-a-client-password),并通过电子邮件发送给他们。 要将一个或多个文件上传到客户资料: 导航至 **客户** > **常规**。 选择客户并点击 **编辑** 按钮。 在 **查看客户** 页面中,转到 **文件** 选项卡。 点击 **+添加文件** 以添加单个文件,或点击 **+上传多个文件** 以一次添加多个文件。 要将一个或多个文件上传到文件夹,请点击 **+添加目录**,并在 **标题** 字段中指定文件夹名称。 进入新创建的文件夹,然后点击 **+添加文件** 或 **+上传多个文件**。 为文件设置 **标题**。此标题将显示在文件列表中。上传多个文件时,标题会自动显示文件名列表。 选择要上传的文件。请注意,上传的文件必须符合以下要求: * 支持的格式:DOC、DOCX、XLSX、CSV、PDF、JPG、PNG、PAGES、NUMBERS、ZIP、7-Zip 和 RAR * 文件大小:最大 3 MB 点击 **保存** 以上传文件。 要查看客户的入金和出金钱包地址: 导航至 **客户** > **常规**。 选择客户并点击 **编辑** 按钮。 在 **查看客户** 页面上,点击 **财务** 选项卡,然后在下拉列表中选择 **出金钱包** 或 **入金钱包**。 在所选页面中,找到 **地址** 列中的地址,该列显示为客户生成的入金或出金地址对应的字母数字字符串。 为您的客户启用从 B2CORE UI 以及 Android 和 iOS 移动应用直接一键访问交易平台网页终端,打造流畅的交易体验。 要让客户能够从 B2CORE UI 和移动应用打开网页交易终端: 在 Back Office 中,导航至 **产品** > **平台**。 选择平台,然后点击 **编辑** 按钮。 在 **编辑平台** 页面中,在 **网页终端 URL** 字段内指定所选平台的网页交易终端 URL。 点击 **保存** 以应用更改。 对于所选平台,**交易** 按钮将显示在 B2CORE UI 和移动应用的账户卡片上,使客户能够一键打开网页终端。 对于 **cTrader**,终端将直接打开点击 **交易** 按钮时所使用的账户,无需客户搜索所需账户。 本说明介绍如何创建通过 B2CORE Back Office 启用 B2TRADER 功能所需的平台、产品组和产品。 在开始在 Back Office 中配置 B2TRADER 平台和产品之前,请确保您的客户经理已设置与 B2TRADER 的连接。该客户经理应具有管理外部连接的权限。 ## 如何为 B2TRADER 创建平台 [#how-to-create-a-platform-for-b2trader] 要为 B2TRADER 创建平台: 导航至 **Products** > **Platforms**。 点击页面右上角的 **Create**,然后在下拉列表中选择 **B2TraderBrokeragePlatform**。 在 **Create platform** 弹出窗口中,填写以下字段: * 在 **Name** 字段中,输入要用于该平台的名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该平台的标题。 * 在 **Available connection providers** 下拉列表中,选择 **B2TraderBrokeragePlatform**。 * 在 **Connection** 下拉列表中,选择之前配置的 B2TRADER 连接。 点击 **Save** 以继续。 在 **Edit platform** 页面上,指定以下设置: * 在 **Short caption** 字段中,您可以选择性地指定平台简称。 * 确保在 **Demo** 下拉列表中选择 **No**。 * 在 **Status** 下拉列表中,选择 **Enabled**。 点击 **Test connection** 以验证连接设置。 **Test connection** 按钮上显示的勾选标记表示连接已正确配置。 成功验证连接设置后,点击 **Save**。 ## 如何为 B2TRADER 创建产品组 [#how-to-create-a-product-group-for-b2trader] 要为 B2TRADER 创建产品组: 导航至 **Products** > **Groups**。 点击页面右上角的 **+Create**。 在 **Create group** 页面上,填写以下字段: * 在 **Caption** 字段中,输入要用于该组的标题。此标题将分配给 Back Office 中的产品组,并会在 B2CORE UI 中向客户显示。 * 在 **Description** 字段中,输入组描述。 * 在 **Type** 下拉列表中,选择 **Default**。 点击 **Save** 以创建产品组。 ## 如何为 B2TRADER 创建产品 [#how-to-create-a-product-for-b2trader] 要管理真实账户和模拟账户,以及 **Hedging** 和 **Netting** 类型,必须在 B2CORE Back Office 中为 B2TRADER 创建单独的产品。 要为 B2TRADER 创建产品: 导航至 **Products** > **Products**。 点击页面右上角的 **Create**,然后在下拉列表中选择之前配置的 [B2TRADER 平台](#how-to-create-a-platform-for-b2trader)所分配的标题。 在 **Create product** 弹出窗口中,填写以下字段: * 在 **Platform group** 下拉列表中,选择 B2TRADER 平台上现有的相应组。 * 在 **Currency** 下拉列表中,选择产品的货币。B2CORE 中可用的货币选项取决于所选平台组的设置。 * 在 **Account type** 下拉列表中,选择 **Hedging** 或 **Netting**。 * 在 **Name** 字段中,输入产品的唯一名称。 * 在 **Group** 下拉列表中,选择之前创建的[产品组](#how-to-create-a-product-group-for-b2trader),以将该产品添加到该组中。 * 在 **Type** 下拉列表中,选择: * **Trade** — 如果您创建用于管理真实账户的产品 * **Demo** — 如果您创建用于管理模拟账户的产品 点击 **Save** 以继续。 在 **Edit product** 页面上,指定以下产品设置: * 在 **Name** 字段中,您可以修改产品名称。该名称必须唯一。 * 在 **Caption** 字段中,输入产品标题。此标题将分配给 Back Office 中的产品,并会在 B2CORE UI 中向客户显示。 * 在 **Default** 杠杆字段中,输入默认杠杆比例。当触发 **Auto creation on login** 选项时,此比例将分配给自动创建的账户。 * 在 **Leverage** 字段中,输入一个或多个杠杆比例,客户可在通过 B2CORE UI 创建账户时进行选择。 * 在 **Rights** 和 **Default account rights** 下拉列表中,选择将应用于产品的所需权限(例如 `Enabled`、`Deposit`、`Withdraw`、`Visible`、`Transfer deposit`、`Transfer withdraw` 和 `Exchange`)。 * 在 **Max accounts** 字段中,输入整数值以定义客户使用此产品时可创建的最大账户数量。 * 要不限制账户数量,请指定 **-1**。 * 要禁止客户创建账户,请指定 **0**。 * 在 **Mail** 下拉列表中,选择: * **Send** 或 **Default** — 在创建新账户时自动向客户发送电子邮件通知,并向其提供开始交易所需的详细信息。 * **Don't send** — 禁用有关新账户的电子邮件通知。 * 在 **Mail template** 下拉列表中,选择用于发送新账户通知的电子邮件模板 `accountCreated`。 * 在 **Start amount** 字段中,指定创建 *模拟* 账户时将自动存入的金额。 * 在 **Auto creation on login** 下拉列表中,选择: * **Yes** – 当客户首次登录 B2CORE UI 时,根据产品设置自动创建账户。 * **No** – 手动基于此产品创建账户。 * 在 **Agreement link** 字段中,指定客户必须同意的文档链接,客户同意后才能通过 B2CORE UI 开立账户。 * 在 **Link info** 字段中,指定包含其他产品信息的资源链接,客户可在通过 B2CORE UI 创建账户时访问该链接。 * 在 **Currencies** 选项卡中,您可以查看与产品关联的货币,并在必要时添加更多货币。可用货币选项受 B2TRADER 平台上配置的平台组设置限制。 * 配置产品设置后,在 **Status** 下拉列表中选择 **Enabled** 以激活该产品。 点击 **Save** 以创建产品。 现在可以通过 Back Office 或 B2CORE UI 基于该产品创建 B2TRADER 账户。对产品设置所做的任何更改都会直接影响该产品在 B2CORE UI 中向客户显示和运行的方式。 本说明介绍如何创建通过 Back Office 启用 DXtrade 所需的平台、产品组和产品。 要管理真实和模拟交易账户,您必须配置两个独立的平台和产品。但是,如果您的基础架构中真实和模拟账户位于同一个 DXtrade 平台上,仅通过组进行区分,则无需创建两个平台。在这种情况下,请在 B2CORE Back Office 中创建一个平台和两个产品——一个用于真实账户,另一个用于模拟账户。 在开始在 Back Office 中配置 DXtrade 平台和产品之前,请确保您的客户经理已设置与 DXtrade 的连接。该客户经理必须拥有管理外部连接的权限。 ## 如何为 DXtrade 创建平台 [#how-to-create-a-platform-for-dxtrade] 如果您的基础架构中真实和模拟账户位于同一个 DXtrade 平台上,请在 B2CORE Back Office 中创建一个平台。如果它们位于不同的平台上,请为 DXtrade 创建两个独立的平台。 要为 DXtrade 创建平台: 导航至 **Products** > **Platforms**。 点击页面右上角的 **Create**,然后在下拉列表中选择 **DXtrade**。 * 在 **Name** 字段中,输入您希望用于该平台的名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该平台的标题(例如 **DXtrade Live** 或 **DXtrade Demo**)。 * 在 **Available connection providers** 下拉列表中,选择 **DXtrade**。 * 在 **Connection** 下拉列表中,选择 **DXtrade**。 点击 **Save** 以继续。 在 **Edit platform** 页面上,指定以下设置: * 在 **Short caption** 字段中,您可以选择性地指定平台简称。 * 如果您为 DXtrade 配置模拟平台,请在 **Demo** 下拉列表中选择 **Yes**;否则,请确保已选择 **No**。 * 在 **Status** 下拉列表中,选择 **Enabled**。 * 在 **Web Terminal URL** 中,可以选择性地指定 DXtrade Web 交易终端的 URL。指定后,B2CORE UI 中的账户卡片将显示 **Trade** 按钮,客户可通过点击该按钮打开 Web 终端。 点击 **Test connection** 以验证连接设置。 **Test connection** 按钮上显示的勾选标记表示连接已正确配置。 成功验证连接设置后,点击 **Save**。 ## 如何为 DXtrade 创建产品组 [#how-to-create-a-product-group-for-dxtrade] 要为 DXtrade 创建产品组: 导航至 **Products** > **Groups**。 点击页面右上角的 **+Create**。 在 **Create group** 页面上,填写以下字段: * 在 **Caption** 字段中,输入您希望用于该组的标题。 * 在 **Description** 字段中,输入组描述。 * 在 **Type** 下拉列表中,选择 **Default**。 点击 **Save** 以创建产品组。 ## 如何为 DXtrade 创建产品 [#how-to-create-a-product-for-dxtrade] 为区分真实和模拟账户,必须在 B2CORE Back Office 中创建两个产品——一个用于真实账户,另一个用于模拟账户。 要为 DXtrade 创建产品: 导航至 **Products** > **Products**。 点击页面右上角的 **Create**,然后在下拉列表中选择之前创建的 [DXtrade 平台](#how-to-create-a-platform-for-dxtrade)。 在 **Create product** 弹出窗口中,填写以下字段: * 在 **Platform Group** 下拉列表中,选择 **Default**。 * 在 **Currency** 下拉列表中,选择您希望为该产品启用的一种或多种货币。 * 在 **Account number prefix** 字段中,输入要添加到 DXtrade 账号的前缀。这有助于区分,例如真实和模拟账户,或同一 DXtrade 基础架构中属于不同品牌的账户。前缀最大长度为 14 个字符。 此前缀仅应用于新创建的账户。现有账户保持不变。 * 设置以下 DXtrade 专属设置:**Auto Execution**、**Commissions**、**Financing**、**Limits**、**Margining**、**Spreads** 和 **Trading**,用于自定义 DXtrade 平台上的交易条件。 创建产品后,无法修改 DXtrade 专属设置。 * 在 **Name** 字段中,输入您希望用于该产品的名称。 * 在 **Group** 下拉列表中,选择之前创建的[产品组](#how-to-create-a-product-group-for-dxtrade)。 * 在 **Type** 下拉列表中,选择: * **Trade** — 如果您创建用于管理真实账户的产品 * **Demo** — 如果您创建用于管理模拟账户的产品 点击 **Save** 以继续。 在 **Edit product** 页面上,指定以下产品设置: * 在 **Rights** 和 **Default account rights** 下拉列表中,选择将应用于该产品的所需权限(例如 `Enabled`、`Visible`、`Trade enabled`、`Transfer deposit` 和 `Transfer withdraw`)。 * 在 **Max accounts** 字段中,输入整数值以定义客户使用该产品时可创建的最大账户数量。 * 要不限制账户数量,请指定 **-1**。 * 要禁止客户创建账户,请指定 **0**。 * 在 **Mail** 下拉列表中,必须选择 **Don't send**。创建第一个账户时,客户会收到一封包含交易终端凭据的电子邮件。创建后续账户时不会发送电子邮件。 * 在 **Start amount** 字段中,指定模拟交易账户开立时将自动存入的金额。 * 在 **Auto creation on login** 下拉列表中,选择以下两个值之一: * **Yes** — 在所有客户首次登录 B2CORE UI 时,根据产品设置自动创建交易账户。 * **No** — 手动创建交易账户。 * 在 **Status** 下拉列表中,选择 **Enabled**。 * 如果您希望为该产品启用其他货币,请在 **Currencies** 选项卡中添加它们。 您可能还需要配置 **Edit product** 页面上提供的其他产品设置。 点击 **Save** 以创建产品。 在 **Edit product** 页面上进行的所有设置更改都会直接影响产品在面向客户的 B2CORE UI 中的显示方式和功能。 本说明介绍如何创建通过 Back Office 启用 Match-Trader 所需的平台和产品,以及如何为您的客户创建 Match-Trader 交易账户。 如需管理真实和模拟交易账户,必须配置两个独立的平台和产品。 在开始于 Back Office 中配置 Match-Trader 平台和产品之前,请确保您的客户经理已设置与 Match-Trader 的连接。该客户经理必须拥有管理外部连接的权限。 ## 如何创建 Match-Trader 平台 [#how-to-create-a-platform-for-match-trader] 要创建 Match-Trader 平台: 导航至 **产品** > **平台**。 点击页面右上角的 **创建**,然后在下拉列表中选择 **MatchTrader**。 在 **创建平台** 弹窗中,填写以下字段: * 在 **名称** 字段中,输入您要用于该平台的名称。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该平台的标题(例如 **MatchTrader** 或 **MatchTrader Demo**)。 * 在 **可用连接提供商** 下拉列表中,选择 **MatchTrader**。 * 在 **连接** 下拉列表中,选择 **MatchTrader**。 点击 **保存** 以继续。 在 **编辑平台** 页面上,指定以下设置: * 您可以选择在 **短标题** 字段中指定简短的平台名称。 * 如果您要为 Match-Trader 配置模拟平台,请在 **模拟** 下拉列表中选择 **是**;否则,请确保已选择 **否**。 * 在 **状态** 下拉列表中,选择 **已启用**。 点击 **测试连接** 以验证连接设置。 **测试连接** 按钮上显示的勾选标记表示连接已正确配置。 成功验证连接设置后,点击 **保存**。 ## 如何创建 Match-Trader 产品 [#how-to-create-a-product-for-match-trader] 要创建 Match-Trader 产品: 导航至 **产品** > **产品**。 点击页面右上角的 **创建**,然后选择: * **MatchTrader** — 如果您要创建用于管理真实账户的产品 * **MatchTrader Demo** — 如果您要创建用于管理模拟账户的产品 在 **创建产品** 弹窗中,填写以下字段: * 在 **平台组** 下拉列表中,选择 **Fiat**。 * 在 **货币** 下拉列表中,选择要为该产品启用的一种或多种货币。 * 在 **名称** 字段中,输入您要用于该产品的名称。 * 在 **组** 下拉列表中,选择之前已在 **产品** > **组** 中配置的相应组。 * 在 **类型** 下拉列表中,选择: * **交易** — 如果您要创建用于管理真实账户的产品 * **模拟** — 如果您要创建用于管理模拟账户的产品 点击 **保存** 以继续。 在 **编辑产品** 页面上,指定以下产品设置: * 在 **权限** 和 **默认账户权限** 下拉列表中,选择将应用于该产品的所需权限(例如 `Enabled`、`Visible`、`Trade enabled`、`Transfer deposit` 和 `Transfer withdraw`)。 * 在 **最大账户数** 字段中,输入一个整数值,以定义客户使用此产品时可以创建的最大账户数量。 * 要不限制账户数量,请指定 **-1**。 * 要禁止客户创建账户,请指定 **0**。 * 在 **起始金额** 字段中,指定模拟交易账户开户时将自动存入的金额。 * 在 **登录时自动创建** 下拉列表中,选择以下两个值之一: * **是** — 在所有客户首次登录 B2CORE UI 时,根据产品设置自动为其创建交易账户。 * **否** — 手动创建交易账户。 * 在 **状态** 下拉列表中,选择 **已启用**。 * 如果您想为该产品启用其他货币,请在 **货币** 选项卡中添加。 您可能还需要配置 **编辑产品** 页面中提供的其他产品设置。 点击 **保存** 以创建产品。 在 **编辑产品** 页面上所做的所有设置更改,都会直接影响该产品在客户 B2CORE UI 中的显示方式和功能。 ## 如何为客户创建 Match-Trader 账户 [#how-to-create-match-trader-accounts-for-clients] 要通过 Back Office 为客户创建 Match-Trade 交易账户: 导航至 **客户** > **账户**。 点击页面右上角的 **+创建**,然后选择您要为其创建账户的客户。 在 **创建账户** 页面上,指定以下设置: * 在 **产品组** 下拉列表中,选择 **Fiat**。 * 在 **产品** 下拉列表中,选择: * **MatchTrader** — 创建真实交易账户。 * **MatchTrader Demo** — 创建模拟账户。 * 在 **货币** 下拉列表中,选择账户计价所使用的货币。 * 在 **杠杆** 下拉列表中,选择要分配给该账户的杠杆比例。 如需使用 Match-Trade 平台上已存在的交易账户在 B2CORE 中创建账户,请选择 **创建已存在于外部平台的账户** 选项,然后在 **外部账户号码** 字段中指定现有的 Match-Trader 账户号码。 点击 **保存** 以创建账户。 创建的 Match-Trader 账户可供客户在 B2CORE UI 中导航至 **平台** > **MatchTrader** 后使用。 要开始在 Match-Trader 平台交易,请向新创建的 Match-Trader 账户入金或转入资金。管理员可通过 Back Office 完成此操作(有关详细信息,请参阅[如何创建入金](../manage-finances/how-to-create-a-deposit)、[如何创建转账](../manage-finances/how-to-create-a-transfer)和[如何创建出金](../manage-finances/how-to-create-a-payout)),客户也可通过 B2CORE UI 完成此操作。 ## 如何归档 Match-Trader 账户 [#how-to-archive-match-trader-accounts] Match-Trader 交易账户可通过 Back Office 归档。 只有余额为零的账户可以归档。 如果交易账户中有可用资金,请将其转账至另一个与待归档账户使用相同货币计价的客户账户。 要归档 Match-Trader 账户: 导航至 **客户** > **账户**。 选择要归档的 Match-Trader 账户,然后点击该账户行中的 **编辑** 按钮。 在 **编辑账户** 页面上,点击 **操作** 按钮,然后选择 **归档**。 点击 **保存** 以应用更改。 该账户将标记为 **A**,表示其已归档并在 B2CORE UI 中对客户隐藏。已归档账户无法用于交易和入金。 已归档账户可以恢复,以便客户再次使用。为此,请点击 **操作** 按钮,然后选择 **取消归档**。 本指南介绍如何配置通过 Back Office 启用 OneZero 和 PrimeXM 所需的平台和产品,以及如何为客户创建 OneZero 和 PrimeXM 账户。 在开始在 Back Office 中配置 OneZero 或 PrimeXM 平台和产品之前,请确保负责管理外部连接权限的客户经理已完成与这些平台的连接设置。 ## 如何为 OneZero 创建平台 [#how-to-create-a-platform-for-onezero] 要为 OneZero 创建平台: 导航至 **产品** > **平台**。 点击页面右上角的 **创建**,然后在下拉列表中选择 **OneZero**。 在 **创建平台** 弹窗中,填写以下字段: * 在 **名称** 字段中,输入要用于该平台的名称。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该平台的标题。 点击 **保存** 以继续。 在 **编辑连接** 页面上,指定以下设置: * 在 **服务位置** 字段中,指定 `https://onezero.b2broker.net/api/rest/`。 * 在 **令牌端点** 字段中,指定 `https://onezero.b2broker.net/api/token`。 * 在 **服务用户** 和 **服务密码** 字段中,输入用于服务连接的登录名和密码。 * 在 **REST Api 版本** 字段中,指定 **1.01**。 点击 **测试连接** 以验证连接设置。 显示在 **测试连接** 按钮上的勾选标记表示连接已正确配置。 在 **状态** 下拉列表中,选择 **已启用**。 点击 **保存** 以创建平台。 ## 如何为 PrimeXM 创建平台 [#how-to-create-a-platform-for-primexm] 要为 PrimeXM 创建平台: 导航至 **产品** > **平台**。 点击页面右上角的 **创建**,然后在下拉列表中选择 **PrimeXM**。 在 **创建平台** 窗口中,填写以下字段: * 在 **名称** 字段中,输入要用于该平台的名称。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该平台的标题。 点击 **保存** 以继续。 在 **编辑连接** 页面上,指定以下设置: * 在 **Pxm 用户名** 和 **Pxm 密码** 字段中,指定用于连接 PrimeXM 服务器的登录名和密码。 * 在 **Rabbitmq 主机** 字段中,指定 `xcore-api-ld4.primexm.com`。 * 在 **Rabbitmq 端口** 字段中,指定 **5673**。 * 在 **Rabbitmq 用户** 和 **Rabbitmq 密码** 字段中,指定用于连接 RabbitMQ 的登录名和密码。 * 在 **Rabbitmq vhost** 字段中,指定 `/primebrokerage_uk`。 * 在 **Rabbitmq exchange** 字段中,指定 `XServerAPI`。 点击 **测试连接** 以验证连接设置。 显示在 **测试连接** 按钮上的勾选标记表示连接已正确配置。 在 **状态** 下拉列表中,选择 **已启用**。 点击 **保存** 以创建平台。 ## 如何为 OneZero 和 PrimeXM 创建产品 [#how-to-create-products-for-onezero-and-primexm] 要为 OneZero 和 PrimeXM 创建产品: 导航至 **产品** > **产品**。 点击页面右上角的 **创建**,然后在下拉列表中选择 **OneZero** 或 **PrimeXM**。 在 **创建产品** 弹窗中,填写以下字段: * 在 **平台组** 下拉列表中,选择 **组**。 * 在 **货币** 下拉列表中,选择要为该产品启用的一种或多种货币。 * 在 **名称** 字段中,输入要用于该产品的名称。 * 在 **组** 下拉列表中,选择之前已在 **产品** > **组** 中配置的相应组。 * 在 **类型** 下拉列表中,选择 **外部**。 点击 **保存** 以继续。 在 **编辑产品** 页面上,为产品指定适当的设置: * 在 **权限** 和 **默认账户权限** 下拉列表中,选择要应用于该产品的所需权限(例如 `Enabled`、`Deposit`、`Withdraw`、`Visible`、`Transfer deposit`、`Transfer withdraw` 和 `Exchange`)。 * 在 **状态** 下拉列表中,选择 **已启用**。 * 如果要为产品启用其他货币,请在 **货币** 选项卡中添加。 您还可以配置 **编辑产品** 页面上提供的其他产品设置。 点击 **保存** 以创建产品。 在 **编辑产品** 页面上进行的所有设置更改,都会直接影响产品在面向客户的 B2CORE UI 中的显示和功能。 ## 如何为客户创建 OneZero 和 PrimeXM 账户 [#how-to-create-onezero-and-primexm-accounts-for-clients] B2CORE 中的 OneZero 和 PrimeXM 账户基于已在相应外部平台上注册的账户创建。 要通过 Back Office 为客户创建 OneZero 或 PrimeXM 账户: 导航至 **客户** > **常规**。 从客户列表中选择要为其创建 OneZero 或 PrimeXM 账户的客户,然后点击 **编辑**。 转到 **账户** 选项卡,然后点击页面右上角的 **+创建**。 在 **创建账户** 页面上,填写以下字段: * 在 **产品组** 下拉列表中,选择 **外部**。 * 在 **产品** 下拉列表中,选择之前为 OneZero 或 PrimeXM 创建的产品。 * 在 **货币** 下拉列表中,选择相应的货币。 * 在 **杠杆** 下拉列表中,选择杠杆比例。 * 启用 **创建存在于外部平台上的账户** 选项。 * 在 **外部账户编号** 字段中,指定已在相应外部平台上注册的账户 ID。 点击 **保存** 以创建账户。 创建账户后,客户可通过 B2CORE UI 导航至 **平台** > **OZ/PXM** 来使用该账户。 本说明介绍如何创建连接、平台和产品,这些是通过 B2CORE Back Office 启用 TradeLocker 功能所必需的。 若要管理真实和模拟交易账户,您需要创建一个到 TradeLocker 的连接,但需配置两个独立的平台和产品。 在 TradeLocker 中创建用户组后,这些用户组不会自动在集成了 TradeLocker 的系统中可用。如需使其可见,请联系 TradeLocker 支持团队并提交相应请求。 ## 如何配置到 TradeLocker 的连接 [#how-to-configure-a-connection-to-tradelocker] 要在 B2CORE Back Office 中配置到 TradeLocker 的连接: 导航至 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面上,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **提供商** 下拉列表中,选择 **TradeLocker**。 点击 **保存** 以创建连接。 **TradeLocker** 连接将显示在外部连接列表中。 点击 **编辑** 以输入连接详细信息,并完成以下字段: * 在 **API Base URL** 字段中,指定 `https://api.tradelocker.com`。 * 在 **API Key** 字段中,指定由 TradeLocker 提供的 API 密钥。该密钥用于验证对 API 的请求。 * **交易终端** 部分显示 TradeLocker 真实和模拟终端的 URL。在 B2CORE UI 中,当客户点击账户卡上的 **交易** 按钮时,会被重定向到相应终端,从而一键开始交易。 检查连接状态。 如果连接未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活它。 点击 **保存** 以应用更改。 ## 如何为 TradeLocker 创建平台 [#how-to-create-a-platform-for-tradelocker] 若要管理真实和模拟交易账户,请在 B2CORE Back Office 中为 TradeLocker 创建两个独立的平台。 要为 TradeLocker 创建平台: 导航至 **产品** > **平台**。 点击页面右上角的 **创建**,然后在下拉列表中选择 **TradeLocker**。 在 **创建平台** 弹出窗口中,填写以下字段: * 在 **名称** 字段中,输入您希望用于该平台的名称。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该平台的标题(例如 **TradeLocker** 或 **TradeLocker Demo**)。 * 在 **可用连接提供商** 下拉列表中,选择 **TradeLocker**。 * 在 **连接** 下拉列表中,选择之前配置的 [TradeLocker 连接](#how-to-configure-a-connection-to-tradelocker)。 点击 **保存** 以继续。 在 **编辑平台** 页面上,指定以下设置: * 在 **短标题** 字段中,您可以选择性地指定简短的平台名称。 * 如果您要为 TradeLocker 配置模拟平台,请在 **Demo** 下拉列表中选择 **Yes**;否则,请确保选择 **No**。 * 在 **状态** 下拉列表中,选择 **Enabled**。 * 在 **设置** 部分的 **Trading Server name** 字段中,指定您的 TradeLocker 服务器名称。 点击 **测试连接** 以验证连接设置。 **测试连接** 按钮上显示的勾选标记表示连接已正确配置。 成功验证连接设置后,点击 **保存**。 ## 如何为 TradeLocker 创建产品组 [#how-to-create-a-product-group-for-tradelocker] 要在 B2CORE Back Office 中为 TradeLocker 创建产品组: 导航至 **产品** > **组**。 点击页面右上角的 **+创建**。 在 **创建组** 页面上,填写以下字段: * 在 **标题** 字段中,输入产品组标题。该标题将分配给 Back Office 中的产品组,并将对 B2CORE UI 中的客户可见。 * 在 **描述** 字段中,输入组描述。 * 在 **类型** 下拉列表中,选择 **Default**。 点击 **保存** 以创建产品组。 ## 如何为 TradeLocker 创建产品 [#how-to-create-a-product-for-tradelocker] 若要管理真实和模拟交易账户,请在 B2CORE Back Office 中为 TradeLocker 创建两个独立的产品。 要为 TradeLocker 创建产品: 导航至 **产品** > **产品**。 点击页面右上角的 **创建**,然后选择: * **TradeLocker** — 如果您要创建用于管理真实账户的产品 * **TradeLocker Demo** — 如果您要创建用于管理模拟账户的产品 在 **创建产品** 弹出窗口中,填写以下字段: * 在 **平台组** 下拉列表中,选择 TradeLocker 服务器上现有的相应组。通过 B2CORE 基于此产品创建的 TradeLocker 账户将被分配到该组。 * 在 **货币** 下拉列表中,选择您希望为产品启用的一种或多种货币。 * 在 **名称** 字段中,输入您希望用于该产品的名称。 * 在 **组** 下拉列表中,选择之前配置的 [TradeLocker 产品组](#how-to-create-a-product-group-for-tradelocker)。 * 在 **类型** 下拉列表中,选择: * **Trade** — 如果您要创建用于管理真实账户的产品 * **Demo** — 如果您要创建用于管理模拟账户的产品 点击 **保存** 以继续。 在 **编辑产品** 页面上,指定以下产品设置: * 在 **名称** 字段中,您可以修改产品名称。该名称必须唯一。 * 在 **标题** 字段中,输入产品标题。该标题将分配给 Back Office 中的产品,并将对 B2CORE UI 中的客户可见。 * 将 **杠杆** 和 **默认杠杆** 字段留空。杠杆参数不会直接应用于 TradeLocker 平台上的账户,而是在平台内按交易品种配置杠杆。 * 在 **权限** 和 **默认账户权限** 下拉列表中,选择将应用于该产品的所需权限(例如 `Enabled`、`Visible`、`Trade enabled`、`Transfer deposit` 和 `Transfer withdraw`)。 当触发 **登录时自动创建** 选项时,默认权限将被分配给自动创建的 TradeLocker 账户。 有关可用权限的列表,请参阅[产品权限](../../back-office-guide/references/product-permissions)。 * 在 **最大账户数** 字段中,输入整数值,以定义客户可为添加到产品的每种货币创建的 TradeLocker 账户最大数量。 例如,如果将 `USD` 和 `EUR` 作为货币添加到产品中,且 **最大账户数** 选项设置为 `1`,客户可以基于该产品创建一个 `USD` 账户和一个 `EUR` 账户。 * 若要不限制账户数量,请指定 **-1**。 * 若要禁止客户创建账户,请指定 **0**。 * 在 **邮件** 下拉列表中,选择 **Don't send**。此选项是确保 B2CORE 中的电子邮件通知使用指定的 `TradeLockerUserCreated` 电子邮件模板正常工作的必要条件。 * 在 **起始金额** 字段中,指定在创建时将自动存入 *模拟* TradeLocker 账户的金额。 * 在 **最低入金金额 (USD)** 字段中,您可以选择性地指定创建基于此产品的 TradeLocker 账户所需的最低入金金额(以 USD 计)。 * 在 **登录时自动创建** 下拉列表中,选择: * **Yes** — 当客户首次登录 B2CORE UI 时,根据产品设置自动创建 TradeLocker 账户。 * **No** — 手动创建基于此产品的 TradeLocker 账户。 * 在 **协议链接** 字段中,指定客户必须同意的文档链接,客户同意后才能通过 B2CORE UI 开立 TradeLocker 账户。 * 在 **链接信息** 字段中,指定包含其他产品信息的资源链接,客户在通过 B2CORE UI 创建 TradeLocker 账户时可访问该链接。 * 在 **货币** 选项卡上,您可以查看与产品关联的货币,并在必要时添加更多货币。 * 配置产品设置后,在 **状态** 下拉列表中选择 **Enabled** 以激活产品。 点击 **保存** 以创建产品。 现在可以通过 Back Office 或 B2CORE UI 基于该产品创建 TradeLocker 账户。对产品设置的任何更改都将直接影响该产品在 B2CORE UI 中向客户显示和运行的方式。 本说明介绍如何创建通过 B2CORE Back Office 启用 MT4 和 MT5 功能所需的平台、产品组和产品。 如需在 MT4 和 MT5 上管理真实和模拟交易账户,必须在 Back Office 中分别为每种账户配置独立的平台、产品组和产品。 MT 平台无需外部连接。与这些平台的连接通过内部 WEBAPI 服务在 B2CORE 中建立。连接相应 MT 平台所需的全部凭据均在 **Products** > **Platforms** 中配置。 ## 如何为 MT 创建平台 [#how-to-create-a-platform-for-mt] 如需为 MT 创建平台: 前往 **Products** > **Platforms**。 点击页面右上角的 **Create**,然后在下拉列表中选择 **MetaTrader 4** 或 **MetaTrader 5**。 在 **Create platform** 弹窗中,填写以下字段: * 在 **Name** 字段中,输入平台的唯一名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该平台的标题。 * 在 **Income transfer request** 下拉列表中,选择: * **Yes** — 要求管理员批准,并通过 B2CORE UI 创建转入 MT 账户的请求。 * **No** — 通过 B2CORE UI 处理转入 MT 账户的转账,无需创建请求。 * 在 **Outcome transfer request** 下拉列表中,选择: * **Yes** — 要求管理员批准,并通过 B2CORE UI 创建从 MT 账户转出的请求。 * **No** — 通过 B2CORE UI 处理从 MT 账户转出的转账,无需创建请求。 点击 **Save** 继续。 在 **Edit platform** 页面中,指定以下设置: * 在 **Short caption** 字段中,您可以选择性地指定平台的简短标题。 * 如果您为 MT 配置模拟平台,请在 **Demo** 下拉列表中选择 **Yes**;否则,请确保选择 **No**。 * 在 **Status** 下拉列表中,选择 **Enabled**。 在 **Settings** 部分中,指定以下连接设置: ### MetaTrader 连接 [#metatrader-connection] * 在 **Host** 字段中,指定用于访问 MT 服务器的 IP 地址和端口号。 * 在 **Login** 字段中,输入用于访问 MT Manager 的登录名。 * 在 **Password** 字段中,输入用于访问 MT Manager 的密码。 ### WEBAPI 连接 [#webapi-connection] WEBAPI 连接设置由您的客户经理提供。 * 在 **Host** 字段中,指定用于访问 WEBAPI 的域名和端口号。 * 在 **Access token** 字段中,指定用于访问 WEBAPI 的令牌。 ### 设置 [#settings] 在本部分中,指定其他设置: * 在 **Max inactivity days** 字段中,输入未检测到活动时 MT 账户将被归档前的天数。 * 在 **Web Terminal URL** 字段中,指定网页交易终端的 URL。指定后,B2CORE UI 和移动应用中相应平台的账户卡片上将显示 **Trade** 按钮,客户可通过点击进入交易。 * 在 **Use reporting on the platform** 下拉列表中,选择: * **Enabled** — 为通过 B2CORE 创建的 MT 账户启用 **Send reports** 选项。 * **Disabled** — 使通过 B2CORE 创建的 MT 账户的 **Send reports** 选项保持禁用。 点击 **Test connection** 以验证连接设置。 **Test connection** 按钮上显示的勾选标记表示连接已正确配置。 成功验证连接设置后,点击 **Save**。 ## 如何为 MT 创建产品组 [#how-to-create-a-product-group-for-mt] 如需为 MT 创建产品组: 前往 **Products** > **Groups**。 点击页面右上角的 **+Create**。 在 **Create group** 页面中,填写以下字段: * 在 **Caption** 字段中,输入产品组的标题。此标题将分配给 Back Office 中的产品组,并将在 B2CORE UI 中对客户可见。 * 在 **Description** 字段中,输入组描述。 * 在 **Type** 下拉列表中,选择 **Default**。 点击 **Save** 以创建产品组。 ## 如何为 MT 创建产品 [#how-to-create-a-product-for-mt] 如需为 MT 创建产品: 前往 **Products** > **Products**。 点击页面右上角的 **Create**,然后选择: * **MetaTrader 5 Live** — 为管理 MT5 真实账户创建产品 * **MetaTrader 5 Demo** — 为管理 MT5 模拟账户创建产品 * **MetaTrader 4 Live** — 为管理 MT4 真实账户创建产品 * **MetaTrader 4 Demo** — 为管理 MT4 模拟账户创建产品 在 **Create product** 弹窗中,填写以下字段: * 在 **Platform Group** 下拉列表中,选择 MT manager 中现有的相应组。通过 B2CORE 基于此产品创建的 MT 账户将被分配到该组。 * 在 **Currency** 下拉列表中,选择产品的货币。B2CORE 中可用的货币选项取决于所选平台组的设置。例如,如果 MT manager 中的平台组配置为 `USD`,则 `USD` 将成为通过 B2CORE 使用此产品创建的 MT 账户的默认货币选项。 * 在 **Name** 字段中,输入产品的唯一名称。 * 在 **Group** 下拉列表中,选择先前创建的[产品组](#how-to-create-a-product-group-for-mt),以将产品添加到该组中。 * 在 **Factory** 下拉列表中,选择 `100`,以便将使用此产品创建的 MT 账户以货币子单位(例如分)计价;否则,保留 `1`。 * 在 **Type** 下拉列表中,选择: * **Trade** — 如果您创建的是用于管理真实账户的产品 * **Demo** — 如果您创建的是用于管理模拟账户的产品 点击 **Save** 继续。 在 **Edit product** 页面中,指定以下产品设置: * 在 **Name** 字段中,您可以修改产品名称。该名称必须唯一。 * 在 **Caption** 字段中,输入产品的标题。此标题将分配给 Back Office 中的产品,并将在 B2CORE UI 中对客户可见。 * 在 **Default leverage** 字段中,输入当触发 **Auto creation on login** 选项时,自动创建的 MT 账户将被分配的默认杠杆比例。 * 在 **Leverage** 字段中,输入一个或多个杠杆比例,客户可在通过 B2CORE UI 创建 MT 账户时选择这些比例。 * 在 **Rights** 和 **Default account rights** 下拉列表中,选择将应用于产品的所需权限(例如 `Enabled`、`Visible`、`Trade enabled`、`Transfer deposit` 和 `Transfer withdraw`)。 当触发 **Auto creation on login** 选项时,默认权限将分配给自动创建的 MT 账户。 有关可用权限的列表,请参阅[产品权限](../../back-office-guide/references/product-permissions)。 * 在 **Max accounts** 字段中,输入整数值,以定义客户可为添加到产品中的每种货币创建的 MT 账户最大数量。 例如,如果 `USD` 和 `EUR` 被添加为产品货币,且 **Max accounts** 选项设为 `1`,客户可以基于此产品创建一个 `USD` 账户和一个 `EUR` 账户。 * 如需不限制账户数量,请指定 **-1**。 * 如需禁止客户创建账户,请指定 **0**。 * 在 **Mail** 下拉列表中,选择: * **Send** 或 **Default** — 在创建新的 MT 账户时自动向客户发送电子邮件通知,为其提供开始交易所需的详细信息。 * **Don't send** — 禁用有关新 MT 账户的电子邮件通知。 * 在 **Mail template** 下拉列表中,选择将用于发送新 MT 账户通知的电子邮件模板。 * 在 **Start amount** 字段中,指定模拟 MT 账户创建时将自动存入的金额。 * 在 **Min deposit amount (USD)** 字段中,您可以选择性地指定基于此产品创建 MT 账户所需的最低入金金额(以 USD 计)。 * 在 **Auto creation on login** 下拉列表中,选择: * **Yes** — 当客户首次登录 B2CORE UI 时,根据产品设置自动创建 MT 账户。 * **No** — 手动基于此产品创建 MT 账户。 * **First transfer activation** 选项仅适用于 MT5。在下拉列表中,选择: * **Yes** — 创建不具有 `Trade enabled` 权限的 MT5 账户。客户首次成功转账后,该权限将分配给账户。 * **No** — 创建具有 `Trade enabled` 权限的 MT5 账户,账户将立即可用于交易。 * 在 **Agreement link** 字段中,指定客户必须同意的文档链接,客户同意后方可通过 B2CORE UI 开立 MT 账户。 * 在 **Link info** 字段中,指定包含更多产品信息的资源链接,客户可在通过 B2CORE UI 创建 MT 账户时访问该链接。 * 在 **Currencies** 选项卡中,您可以查看与产品关联的货币,并在必要时添加更多货币。可用的货币选项受 MT manager 中配置的平台组设置限制。 * 配置产品设置后,在 **Status** 下拉列表中选择 **Enabled** 以启用产品。 点击 **Save** 以创建产品。 现在,可以通过 Back Office 或 B2CORE UI 基于该产品创建与相应平台关联的 MT 账户。对产品设置所做的任何更改都将直接影响该产品在 B2CORE UI 中向客户显示和运作的方式。 如果同时需要 MT4 和 MT5 平台,请按照相同说明配置另一个平台。 要创建钱包: 前往 **Products** > **Products**。 点击 +**Create**,然后在下拉列表中选择 **eWallet**。 填写表单: * **Platform** 字段会显示 **eWallet**。 * 在 **Platform Group** 下拉列表中,选择 **eWallet**。 * 在 **Currency** 下拉列表中,选择要为钱包启用的一种或多种货币。 * 在 **Name** 字段中,输入将显示在 [产品](../../back-office-guide/products/products) 页面上的钱包名称。 * 在 **Group** 下拉列表中,选择一个[组](../../back-office-guide/products/groups)。该钱包将显示在 B2CORE UI 中所选的组内。 * 在 **Factory** 下拉列表中,选择 `1`,因为钱包不能以货币子单位计价。钱包仅允许使用标准货币面额。 * 在 **Type** 下拉列表中,选择 **Personal**。 点击 **Save**。 填写详情: * 设置将显示在 B2CORE UI 中的 **Caption**。如有需要,请设置本地化内容。 * 将 **Status** 设置为 **Enabled**。 * 将 **Group rights** 设置为 **eWallet**,或者如果未配置组权限,请选择 **Rights**。 * 将 **Max accounts** 设置为 **1**。 * 设置一个外部 **Link**,以显示可用货币或其他信息。此链接将在 B2CORE UI 中显示为 `i` 图标。 * 将 **Autocreation on login** 设置为 **Yes**,以便每位客户首次登录 B2CORE UI 时均可使用此钱包。 点击 **Save** 以应用更改。 您可以限制对产品的访问,使其只能由已达到特定验证级别的客户使用(例如,为满足监管要求)。 验证级别必须已创建并配置(详情请参阅[管理验证选项](../manage-verification-options/))。 导航至 **Products** > **Products**。 选择要限制使用的产品,然后点击该产品行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后在下拉菜单中选择 **Verification level restrictions**。 在显示的 **Restrictions** 弹出窗口中,填写以下信息: * 在 **Enabled** 下拉菜单中,选择 **Yes**。 * 在 **Type** 下拉菜单中,从以下两个选项中选择一个: * **Deny only** — 此选项禁止所选验证级别使用该产品。 * **Allow only** — 此选项仅允许所选验证级别使用该产品。 * 在 **Rules** 下拉菜单中,选择一个或多个验证级别。 点击 **Save** 以应用更改。 要查看向所有客户支付的全部利息,请前往 [Finance > Transactions](../../back-office-guide/finance/transactions),并按 **Savings Payment** 筛选 **Type** 列。状态为 **Done** 的支付会列在 **Transactions** 中。 要查看客户在特定储蓄计划中的利息支付详情: 导航至 **Savings** > **Plans**。 点击要查看其利息支付详情的计划旁显示的 view-button 在计划详情中,前往 **Payments** 部分: * 对于 `Fixed` 策略,支付列表包括计划支付以及已支付到客户钱包的款项。您可以通过此列表计算客户将在该计划中获得的利息总额。 * 对于 `Flexible` 策略,列表仅显示已向客户支付的款项。您可以通过此列表计算已支付的利息总额。 对于每笔支付,您可以查看: * **Amount** – 支付金额。 * **Due date** – 对于 `Fixed` 策略,显示计划支付的日期和时间。对于 `Flexible` 策略,不显示计划支付。 * **Status** — 支付状态: * `Scheduled` — 表示支付已安排,但尚未完成。 * `Paid` — 表示已向客户支付款项。 * `Cancelled` — 表示该支付已取消,因为客户决定在计划期限结束前提取投资金额(对于 `Fixed` 策略),或在罚金期限结束前提取投资金额(对于 `Flexible` 策略)。 * `Paid date` – 向客户支付利息的日期和时间。 Payment details in a Fixed savings planFixed 储蓄计划中的支付详情 您可以要求客户通过认证测试,作为验证流程的一部分。 要允许特定用户组(通常是“Admins”组)创建客户认证测试,必须为该用户组分配与 **Client Tests**、**Client Tests Answers** 和 **Client Tests Questions** 相关的所有权限。这些权限位于 **Verification** 权限组下(详情请参阅[如何添加用户组并授予权限](../manage-system-settings/how-to-add-a-user-group-and-grant-permissions))。 要创建客户认证测试,请执行以下操作: 导航至 **Verification** > **Client tests**,然后点击页面右上角的 **+Create**。 在 **Create client test** 窗口中,填写以下字段: * 在 **Caption** 字段中,为您的测试指定标题。该标题将显示在 B2CORE UI 中。 * 在 **Details** 字段中,指定测试说明或客户在开始参加测试前应了解的其他有用信息。这些信息将显示在 B2CORE UI 中测试标题的下方。 * 在 **Visible** 下拉列表中,选择 **Yes** 或 **No** 以在 B2CORE UI 中显示或隐藏此测试。建议您在此步骤中选择 **No**,并在完成向测试添加问题和答案后,将测试可见性设置切换为 **Yes**。 点击 **Save** 以创建测试。 要向测试添加问题和答案选项,请点击测试行中的 **Edit** 按钮。 在 **Edit client test** 页面上,切换到 **Questions** 选项卡,然后点击页面右上角的 **+Create**。 在显示的 **Create client test questions** 窗口中,填写以下字段: * 在 **Question** 字段中,输入问题文本。 * 在 **Type** 下拉列表中,选择问题类型。以下问题类型可供选择: * **open** — 开放式问题,可自由作答。 * **close** — 封闭式问题,可从给定选项列表中选择一个或多个正确答案进行作答。 * **questionnaire** — 多项选择题,可从给定选项列表中选择一个或多个答案进行作答。 * **poll** — 单项选择题,可从给定选项列表中选择一个答案进行作答。 * 在 **Visible** 下拉列表中,选择 **Yes** 或 **No** 以显示或隐藏此问题。 * 点击 **Save**。 重复此流程的第 5 步和第 6 步,根据测试需要添加任意数量的问题。 对于 **closed**、**questionnaire,** 和 **poll** 类型的问题,点击问题行中的 Add answer options 以添加答案选项。 在显示的 **Edit client test answer** 窗口中,填写以下字段: * 在 **Text** 字段中,输入问题的答案。 * 在 **Correct** 下拉列表中,选择 **Yes** 或 **No**,将此答案选项标记为正确或错误。只有 **close** 类型的问题必须指定正确答案选项。您可以为一个问题添加一个或多个正确答案。 * 在 **Visible** 下拉列表中,选择 **Yes** 或 **No** 以显示或隐藏此答案选项。 * 点击 **Save** 以添加答案选项。 重复此流程的第 8 步和第 9 步,为测试中的每个问题添加所需数量的答案选项。 完成向测试添加问题和答案后,在 **Clients test** 页面上将测试可见性设置切换为 **Yes**。 客户现在可通过 B2CORE UI 使用该客户认证测试。 此外,您可以要求客户在提交用于获得特定验证级别的文件之前通过此测试(详情请参阅[如何创建验证级别](how-to-use-the-kyc-constructor#how-to-create-verification-levels))。 本文提供有关如何配置 B2CORE 以使用 KYC 提供商 [ShuftiPro](https://shuftipro.com/) 的说明。借助 ShuftiPro,您可以进行文档和人脸验证以验证 *个人* 客户的身份,也可以进行地址和位置验证。 除文档验证外,您还可以启用 ShuftiPro 反洗钱 (AML) 检查,以便根据多个 AML 数据源筛查您的客户,帮助保护您的公司免受潜在洗钱活动的影响。 在继续以下说明之前,您必须已注册 ShuftiPro 并拥有有效账户。 ## 如何配置到 ShuftiPro 的连接 [#how-to-configure-a-connection-to-shuftipro] 只有被分配管理外部连接权限的管理员才能设置到 ShuftiPro 的连接。 要设置连接: 在 B2CORE Back Office 中,导航至 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面上,填写以下字段: * 在 **名称** 字段中,指定要用于该连接的名称。 * 在 **标题** 字段中,指定将在 Back Office 中应用于该连接的标题。 * 在 **提供商** 下拉列表中,选择 **ShuftiPro**。 点击 **保存** 以创建连接。 在连接列表中,找到您创建的 ShuftiPro 连接,然后点击 **编辑** 以输入连接详细信息。 在 **编辑连接** 页面上,指定以下设置: * 在 **API 主机** 字段中,指定 `https://api.shuftipro.com`。 * 在 **客户端 ID** 和 **密钥** 字段中,指定用于访问 ShuftiPro 的客户端 ID 和密钥值。 * 在 **新签名(适用于 2023 年 3 月后创建的密钥)** 字段中,选择以下任一项: * **No** — 适用于在 2023 年 3 月 15 日之前注册 ShuftiPro 的客户。 * **Yes** — 适用于在 2023 年 3 月 15 日之后注册 ShuftiPro 或更新其密钥的客户。这是验证 ShuftiPro API 响应中返回的密钥签名所必需的(有关详细信息,请参阅 ShuftiPro 文档中的 [响应签名](https://developers.shuftipro.com/docs/verification_endpoints/responses#response-signature))。 * 在 **允许文档截图** 下拉列表中,选择 **Enabled**,以允许客户上传文档截图进行验证,而非仅要求实时拍摄的图像。 默认情况下,此选项处于禁用状态。 * 在 **检查 AML** 下拉列表中,选择 **Enabled** 以使用 ShuftiPro 反洗钱 (AML) 检查。在这种情况下,当客户提交文档以升级其验证等级时,还会根据 ShuftiPro AML 数据源对其进行筛查,包括多个全球观察名单、FATF 名单、PEP 名单和制裁名单,以防范洗钱风险。 默认情况下,此选项处于禁用状态。 启用 AML 检查后,客户必须满足两个条件才能获得更高的验证等级:提交的文档必须通过验证,且 AML 检查必须成功。如果任一条件未满足,验证等级升级将被拒绝。 * 在 **显示 OCR 表单** 中,选择: * **Enabled** — 在验证期间显示 OCR 表单,使客户能够查看并确认从其提交文档中提取的信息。 * **Disabled** — 隐藏表单并跳过确认步骤。 默认情况下,表单处于启用状态。 在 **Enabled** 下拉列表中,选择 **Yes**。 点击 **保存** 以应用设置。 ## 如何为 ShuftiPro 验证创建文档组 [#how-to-create-document-groups-for-shuftipro-verification] 对于**文档验证**,创建名为 `passport`、`id_card` 和 `driving_license` 的三个文档组。这些组使您能够要求客户提交护照、国民身份证和驾驶执照进行身份验证。 对于**地址验证**,支持 [ShuftiPro 用于地址验证](https://developers.shuftipro.com/docs/coverage/documents#address-verification--validation) 的多种文档,包括名为 `any` 的文档类型。因此,请使用与 ShuftiPro 文档类型匹配的名称创建必要的文档组,例如 `rent_agreement`、`bank_letter_receipt`、`employer_letter`、`utility_bill`、`tax_bill`、`any` 或其他名称。这些组使您能够要求客户提交相应文档,以确认其地址和位置详细信息,例如城市或国家。 文档类型 `any` 使客户能够提交任何包含其姓名和地址的文档以进行地址验证。它不绑定于任何特定文档类型,从而在确认地址时为客户提供更大的灵活性和便利性。 对于**人脸验证**,创建名为 `selfie` 的文档组。 要创建文档组: 在 B2CORE Back Office 中,导航至 **验证** > **文档组**。 点击页面右上角的 **+创建**。 在 **创建文档组** 页面上,填写以下字段: * 在 **名称** 字段中,指定文档组的名称。 请确保完全按照上文提供的名称指定文档组名称,并使用小写字母。例如:`passport`、`id_card`、`driving_license`、`selfie` 等。 对于地址验证,请确保完全按照[支持的 ShuftiPro 文档类型](https://developers.shuftipro.com/docs/coverage/documents#address-verification--validation)中列出的名称指定文档组名称。例如:`rent_agreement`、`bank_letter_receipt`、`employer_letter`、`utility_bill`、`tax_bill`、`any` 或其他名称。 名为 `any` 的文档组允许客户提交任何包含其姓名和地址的文档,而非特定类型的文档。这使客户在验证地址时拥有更大的灵活性。 确保在 **Enabled** 下拉列表中选择 **Yes**。 点击 **保存** 以创建文档组。 ## 如何为 ShuftiPro 验证创建文档类型 [#how-to-create-document-types-for-shuftipro-verification] 对于您创建的每个文档组,创建一个文档类型。 要创建文档类型: 在 B2CORE Back Office 中,导航至 **验证** > **文档类型**。 点击页面右上角的 **+创建**。 在 **创建文档类型** 页面上,填写以下字段: * 在 **名称** 字段中,指定文档类型的名称。 文档类型名称必须与之前创建的文档组名称相同。例如:`passport`、`id_card`、`selfie`、`rent_agreement`、`bank_letter_receipt`、`employer_letter`、`utility_bill`、`tax_bill`、`any` 或其他名称。 在 **状态** 下拉列表中,选择 **Enabled**。 点击 **保存** 以创建文档类型。 ## 如何为 ShuftiPro 创建验证等级 [#how-to-create-verification-levels-for-shuftipro] 您可以创建验证等级或修改现有等级,以使用 ShuftiPro 进行文档、地址和人脸验证。 要创建验证等级: 在 B2CORE Back Office 中,导航至 **验证** > **等级**。 点击页面右上角的 **+创建**。 在 **创建验证等级** 页面上,填写以下字段: * 在 **索引** 字段中,指定非零整数值。 索引零 (`0`) 始终分配给默认验证等级。对于其他验证等级,索引必须大于零,例如,等级 1 使用 `1`,等级 2 使用 `2`,依此类推。 * 在 **向导** 下拉列表中,选择 `ShuftiProSDK`。 ShuftiPro 弹出窗口将在 B2CORE UI 中打开,使客户能够按照验证说明提交所需文档。 * 在 **标题** 字段中,指定将显示在 B2CORE UI 和移动应用中的等级名称,例如 `Level 1`。如有需要,请点击字段右侧的按钮为该字段指定本地化属性。 * 在 **桌面端描述** 字段中,指定将在 B2CORE UI 中显示的等级描述。该描述可以包括客户获得此等级后被授予的权限。 B2CORE UI 的描述可以采用 HTML 格式指定。如有需要,请为该字段指定本地化属性。 * 在 **移动端描述** 字段中,指定将在移动应用中显示的等级描述。 移动应用的描述可以采用 JSON 格式指定。如有需要,请为该字段指定本地化属性。 * 在 **可见** 下拉列表中,选择 **Yes**。 * 在 **默认** 下拉列表中,选择 **No**。(`Level 0` 始终是默认验证等级。) * 在 **已分配的客户权限** 下拉列表中,选择一个权限等级,该等级定义您希望在客户获得此验证等级后授予他们的权限集(有关详细信息,请参阅[客户权限](../../back-office-guide/system/client-rights))。 * 在 **文档组** 下拉列表中,选择一个或多个必需的文档组。例如,如果您希望客户提交护照并通过人脸验证以获得此等级,可以选择 `passport` 和 `selfie`。 * 在 **客户测试** 下拉列表中,如果您希望强制客户在提交文档进行验证前通过这些测试,请选择一个或多个认证测试。可用测试列表包括所有可见性设置为 **Yes** 的测试,这些测试显示在[客户测试](../../back-office-guide/verification/client-tests)页面上。 点击 **保存** 以创建等级。 ## 如何在 ShuftiPro 中添加回调域名 [#how-to-add-the-domain-for-callbacks-in-shuftipro] 为确保成功接收来自 ShuftiPro 的回调以及 B2CORE 中的验证更新,您必须在 ShuftiPro 账户设置中添加回调 URL 的域名部分。 要添加域名: 登录您的 ShuftiPro 账户。 前往 **设置** > **API 密钥** > **回调/重定向 URL**。 添加回调 URL 的域名部分。您的回调 URL 域名与 B2CORE Back Office 的域名相同。 例如,如果您的 Back Office URL 是 `https://{your-Back-Office-URL}`,则仅输入 `{your-Back-Office-URL}` — 不要输入 `https://`。 请务必将 `{your-Back-Office-URL}` 替换为您的 B2CORE Back Office 的实际域名。 在 ShuftiPro 中添加回调域名 保存您的更改。 本文介绍如何配置 B2CORE 以使用 KYC 和 KYT 提供商 [SumSub](https://sumsub.com/)。 在按照说明继续操作之前,您必须已注册 SumSub 并拥有一个有效账户。对于 KYT 检查,还必须启用并正确配置 **SumSub Fraud Prevention**。 ## 如何配置与 SumSub 的连接 [#how-to-configure-a-connection-to-sumsub] 只有被授予管理外部连接权限的管理员才能设置与 SumSub 的连接。 要设置连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入要用于该连接的名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **SumSubstance**。 点击 **Save** 以创建连接。 在连接列表中,找到您创建的 SumSub 连接,然后点击 **Edit** 以输入连接详细信息。 在 **Edit connection** 页面中,指定以下设置: * 在 **Service Location** 字段中,指定 `https://api.sumsub.com/`。 * 在 **Client ID** 字段中,指定您的 SumSub 账户名称。要查看账户名称,请在 SumSub 界面中转到 **Settings** > **Account Details**。 * 在 **Webhook Secret Key** 字段中,指定 Webhook 密钥。您应在 SumSub 界面中生成 Webhook。为此,请在 SumSub 界面中转到 **Dev space** > **Webhooks**(有关所需的 Webhook 配置,请参阅 [SumSub webhook 配置](how-to-use-sumsubstance#sumsub-webhook-configuration))。 * 将 **Login** 和 **Password** 字段留空。 * 在 **Token** 和 **Token Secret** 字段中,指定在 SumSub 界面中生成的令牌和密钥值。要生成它们,请在 SumSub 界面中转到 **Dev space** > **App Tokens**。 * 若要为 *个人* 和 *企业* 客户应用不同的验证流程,请在 **Client Resetting Mode** 下拉列表中选择 **Enabled**。 启用 **Client Resetting Mode** 选项后,类型从 *个人* 更改为 *企业*,或反之亦然的客户需要重复进行验证。更改类型后,将发生以下情况: * 在 B2CORE Back Office 中,客户的验证级别将重置为 `Level 0`,即默认验证级别。 * 所有待处理的用于获取更高验证级别的[客户请求](../../back-office-guide/clients/requests)将被自动拒绝。 * 在 SumSub 系统中,申请人将被重置回初始级别,并且此前为该申请人上传的所有文档都会失效。 此前在 B2CORE Back Office 中为该客户上传的所有文件和文档仍然可用。 在 **Transaction monitoring** 部分中,使用 **SumSub Fraud Prevention** 配置 KYT 检查设置。目前,这些检查支持法币和加密货币的入金与出金。 * 在 **Enabled** 下拉列表中,选择: * **Yes** — 启用通过 **SumSub** 进行的交易监控,并在 B2CORE 中接收结果。 * **No** — 禁用通过 **SumSub** 进行的交易监控。 * 在 **Currency Filter** 下拉列表中: * 选择一种或多种货币,仅监控所选货币的交易。 * 将列表留空,以监控所有货币的交易。 点击 **Save** 以应用设置。 ## 如何为 SumSub 验证创建文档组 [#how-to-create-document-groups-for-sumsub-verification] 创建文档组以允许客户提交 SumSub 支持的各种文档进行验证。对于希望提供用于验证的每种文档(例如身份证、护照、驾照等),请创建一个具有相应名称的单独文档组。 要创建文档组: 在 B2CORE Back Office 中,转到 **Verification** > **Document groups**。 点击页面右上角的 **+Create**。 在 **Create document group** 页面中,填写以下字段: * 在 **Name** 字段中,指定文档组的名称。 请确保文档组名称与 [SumSub 支持的文档类型](https://docs.sumsub.com/reference/add-id-documents#supported-document-types)名称完全一致,例如 `ID_CARD`、`PASSPORT`、`DRIVERS`、`RESIDENCE_PERMIT` 等。 例如,如果您希望客户提交身份证进行文档验证,请创建一个名称为 `ID_CARD` 的文档组。 * 在 **Caption** 字段中,指定将在 B2CORE UI 中显示的文档组标题。 * 在 **Type** 下拉列表中,选择 **One**。 * 在 **Description** 字段中,指定用于 Back Office 的文档组描述。 确保在 **Enabled** 下拉列表中选择 **Yes**。 点击 **Save** 以创建文档组。 ## 如何为 SumSub 验证创建文档类型 [#how-to-create-document-types-for-sumsub-verification] 对于您创建的每个文档组,请创建一个文档类型。 要创建文档类型: 在 B2CORE Back Office 中,转到 **Verification** > **Document types**。 点击页面右上角的 **+Create**。 在 **Create document type** 页面中,填写以下字段: * 在 **Name** 字段中,指定文档类型的名称。 文档类型名称必须与此前创建的文档组名称相同。例如:`ID_CARD`、`PASSPORT`、`DRIVERS`、`RESIDENCE_PERMIT` 等。 * 在 **Caption** 字段中,指定将在 B2CORE UI 中显示的文档类型标题。 * 在 **Description** 字段中,指定将在 B2CORE UI 中显示的文档类型描述。 * 在 **Group** 下拉列表中,选择必须与此文档类型关联的文档组。 * 在 **Max files** 字段中,指定客户可为此文档类型上传的最大文件数量。 在 **Status** 下拉列表中,选择 **Enabled**。 点击 **Save** 以创建文档类型。 ## 如何在 B2CORE Back Office 中为 SumSub 创建验证级别 [#how-to-create-verification-levels-for-sumsub-in-the-b2core-back-office] 您可以创建验证级别,或修改现有级别以使用 SumSub 进行验证。 要创建验证级别: 在 B2CORE Back Office 中,转到 **Verification** > **Levels**。 点击页面右上角的 **+Create**。 在 **Create verification level** 页面中,填写以下字段: * 在 **Index** 字段中,指定一个非零整数值。 零(`0`)索引始终分配给默认验证级别。对于其他验证级别,索引必须大于零,例如 `1` 代表 Level 1,`2` 代表 Level 2,依此类推。 * 在 **Wizard** 下拉列表中,选择 `SnsWizardSDK`。 * 在 **Caption** 字段中,指定将在 B2CORE UI 和移动应用中显示的级别名称,例如 `Level 1`。如有需要,可点击字段右侧的按钮为该字段指定本地化属性。 * 在 **Desktop Description** 字段中,指定将在 B2CORE UI 中显示的级别描述。此描述可以包含客户获得该级别后被授予的权限。 B2CORE UI 的描述可以采用 HTML 格式指定。如有需要,可为该字段指定本地化属性。 * 在 **Mobile Description** 字段中,指定将在移动应用中显示的级别描述。 移动应用的描述可以采用 JSON 格式指定。如有需要,可为该字段指定本地化属性。 * 在 **Visible** 下拉列表中,选择 **Yes**。 * 在 **Default** 下拉列表中,选择 **No**。(`Level 0` 始终是默认验证级别。) * 在 **Assigned Client Right** 下拉列表中,选择一个权限级别,以定义客户获得此验证级别后要授予他们的权限集(有关详细信息,请参阅[客户权限](../../back-office-guide/system/client-rights))。 * 在 **Document groups** 下拉列表中,选择一个或多个必需的文档组。例如,如果您希望客户提交身份证和居留许可证进行验证以获得此级别,可以选择 `ID_CARD` 和 `RESIDENCE_PERMIT`。 * 在 **Client tests** 下拉列表中,如果您希望强制客户在提交文档进行验证前通过这些测试,可选择一个或多个认证测试。可用测试列表包括所有可见性设置为 **Yes** 的测试,这些测试显示在[客户测试](../../back-office-guide/verification/client-tests)页面中。 点击 **Save** 以创建级别。 ## 如何在 SumSub 界面中创建级别和流程 [#how-to-create-levels-and-flows-in-the-sumsub-interface] B2CORE Back Office 支持两种类型的客户:*个人* 和 *企业*。SumSub 系统允许为每种类型设置单独的验证流程。要使用此选项,请确保您在[配置与 SumSub 的连接](how-to-use-sumsubstance#how-to-configure-a-connection-to-sumsub)时已启用 **Client Resetting Mode**。 要添加新级别: 在 SumSub 界面中,转到 **Integrations** > **Applicant Levels**。 点击 **Add new level**。 选择所需步骤。 级别名称必须采用以下格式: * 对于 *个人* 客户:`level1`、`level2` 等。 * 对于 *企业* 客户:`level3corporate`、`level4corporate` 等。 这些格式可确保 SumSub 和 B2CORE 中的级别正确映射。映射基于 B2CORE 中分配给每个验证级别的 **Index**。您可以在 B2CORE Back Office 的 [Verification > Levels](../../back-office-guide/verification/levels) 页面相应列中找到索引,并在 SumSub 的级别名称中使用它们。例如: * SumSub 中的 `level1` 映射到 B2CORE 中 **Index** = 1 的级别。 * SumSub 中的 `level2` 映射到 B2CORE 中 **Index** = 2 的级别。 * SumSub 中的 `level3corporate` 映射到 B2CORE 中 **Index** = 3 的级别。 * SumSub 中的 `level4corporate` 映射到 B2CORE 中 **Index** = 4 的级别,依此类推。 要添加新流程: 在 SumSub 界面中,转到 **Integrations** > **Verification Flow**。 点击 **Add new**。 选择所需选项。对于每个流程,请选择兼容的级别。 ## SumSub webhook 配置 [#sumsub-webhook-configuration] **已审核** * 名称:`REVIEWED` * 接收方:`HTTP Endpoint` * 目标:`https://{your-Back-Office-URL}/api/v1/verification-sns/handle` * 类型:`Applicant reviewed (applicantReviewed)` * 密钥:在 SumSub 中生成的密钥 请务必将 `{your-Back-Office-URL}` 替换为您的 B2CORE Back Office 域名,*而不是* B2CORE UI 的域名。例如,Webhook 的目标可能如下所示:`https://example.com/api/v1/verification-sns/handle`。 在开始配置自定义 KYC(了解你的客户)流程之前,请考虑以下事项: * 客户可获得的验证等级数量(您可以使用内置 KYC 提供商或某个[受支持的第三方 KYC 提供商](../../integrations/kyc-providers),在每个等级运行验证流程) * 客户在获得各验证等级后被授予的权限,以及可应用于特定权限的可能限制 * 客户获得各验证等级所需提交的文件。 此外,还可以为不同类型的客户配置单独的 KYC 流程,例如个人客户和企业客户。您还可以在不同类型的客户注册 B2CORE UI 后,为其授予不同的初始验证等级(有关详细信息,请参阅[如何添加和配置注册向导](../manage-system-settings/how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard),特别是有关[如何配置用户注册步骤](../manage-system-settings/how-to-set-up-the-registration-wazard/how-to-configure-the-user-registration-step)的文章)。 请按照以下步骤创建和设置验证等级,定义客户必须在每个等级提交的文件,并配置验证等级及其说明在 B2CORE UI 中向客户显示的方式。 ## 如何创建文件组 [#how-to-create-document-groups] 在此步骤中,创建文件组,例如“身份证明”、“居住证明”等。文件组用于对验证所需的文件进行分类。 要创建文件组: 导航至 **验证** > **文件组**,然后单击页面右上角的 **+创建**。 在 **创建文件组** 页面上,填写表单: * 设置组的 **名称**,该名称仅显示在 Back Office 中。 * 将 **类型** 设置为 **One**。 * 设置 **标题** — 文件组在 B2CORE UI 中显示的名称。如有需要,请设置本地化。 * 设置 **说明** — 您可以在此处向客户提供有关验证流程的提示。此信息可以采用 HTML 格式呈现。如有需要,请设置本地化。 * 将 **已启用** 设置为 **Yes**。 单击 **保存** 以创建文件组。 ## 如何创建文件类型 [#how-to-create-document-types] KYC 文件是身份证、护照、驾驶执照或银行对账单等正式文件,可用于验证客户的身份和地址。在此步骤中,定义客户为在各等级获得验证而应提供的文件。 要定义文件: 导航至 **验证** > **文件类型**,然后单击页面右上角的 **+创建**。 在 **创建文件类型** 页面上,填写表单: * 设置文件的 **名称**,该名称仅显示在 Back Office 中。 * 设置 **标题**,以指定在 B2CORE UI 中显示的文件名称。如有需要,请设置本地化。 * 设置 **说明** — 说明可以采用 HTML 格式指定。如有需要,请设置本地化。 * 将 **状态** 设置为 **Enabled**。 * 设置文件的 **组** — 应为上一步创建的组之一。 * 设置 **最大文件数**,以指明您的客户可以上传多少份此类型的文件。 单击 **保存** 以定义文件类型。 ## 如何创建验证等级 [#how-to-create-verification-levels] 在此步骤中,创建所需的验证等级。对于每个 B2CORE 实例,`Level 0` 已设置完成,并用作默认等级。 要创建新的验证等级: 导航至 **验证** > **等级**,然后单击页面右上角的 **+创建**。 在 **创建验证等级** 页面上,填写表单: * 设置等级 **索引**,该值必须大于 0。 * 设置 **向导** — 选择 `DocumentsWizard` 以使用内置 KYC 提供商,并在 B2CORE UI 中显示用于根据指定文件类型上传所需文件的表单。 * 设置 **标题** — 在 B2CORE UI 和移动应用中向客户显示的等级名称。如有需要,请单击字段右侧的按钮,为此字段指定本地化属性。 * 设置 **下一等级** — 选择客户在被授予当前配置的等级后可获得的下一验证等级。 将此字段留空,以允许不同类型的客户(例如个人客户和企业客户)获得不同的验证等级。 根据已应用的客户类型限制,系统会在 B2CORE UI 中向客户建议索引值更高的下一等级(有关详细信息,请参阅[如何按客户类型限制验证等级的使用](how-to-use-the-kyc-constructor#how-to-restrict-the-use-of-verification-levels-by-client-type))。 * 设置 **桌面端说明** — 在 B2CORE UI 中向客户显示的等级说明。对于等级说明,您可以列出客户获得该等级后被授予的权限。 B2CORE UI 的说明可以采用 HTML 格式指定(请参阅下面的[示例](how-to-use-the-kyc-constructor#example))。如有需要,请为此字段指定本地化属性。 * 设置 **移动端说明** — 在移动应用中向客户显示的等级说明。 移动应用的说明可以采用 JSON 格式指定。如有需要,请为此字段指定本地化属性。 * 将 **可见** 设置为: * **Yes** — 创建将在 B2CORE UI 的 KYC 流程中向客户显示的等级。 * **No** — 创建隐藏等级(例如具有特定交易限额的等级),该等级只能通过 Back Office 手动分配给客户。 * 将 **默认** 设置为 **No**(因为默认等级始终为 Level 0)。 * 在 **已分配客户权限** 下拉列表中,选择一个权限等级,以定义您希望在客户获得此验证等级后授予他们的一组权限(要了解更多信息,请参阅[如何创建权限等级](how-to-use-the-kyc-constructor#how-to-create-permission-levels))。 * 如果您希望强制客户在提交获得此验证等级所需的文件之前通过所选测试,请在 **客户测试** 下拉列表中选择客户认证测试。可用客户测试列表包括所有可见性设置为 **Yes** 且显示在[客户测试](../../back-office-guide/verification/client-tests)页面上的测试。 * 从[步骤 1](how-to-use-the-kyc-constructor#how-to-create-document-groups)中创建的文件组中选择 **文件组**,以指定向客户授予此验证等级所需的文件。可以选择多个组。 单击 **保存** 以创建验证等级。 ### 示例 [#example] 以下 HTML 代码示例说明如何为 B2CORE UI 指定等级说明: ```html

Verification Level 0


To obtain Verification Level 1, submit the following documents:

  • A list of documents that a client must submit or other requirements that must be met for receiving Level 1.
```
要将某项操作标记为对此验证等级已启用,请在 HTML 代码中将 `glyphicon glyphicon-error` 更改为 `glyphicon glyphicon-success`。 等级说明将在 B2CORE UI 中按如下方式显示: B2CORE UI 中的等级说明 ## 如何按客户类型限制验证等级的使用 [#how-to-restrict-the-use-of-verification-levels-by-client-type] 要配置单独的验证流程,例如针对个人客户和企业客户的流程,请指定只能由特定类型客户获得的等级。 要对验证等级应用客户类型限制: 导航至 **验证** > **等级**。 选择验证等级,然后单击 **编辑**。 在 **更新验证等级** 页面上,单击 **操作** 按钮,然后选择 **客户类型限制**。 在 **限制** 弹出窗口中,填写以下字段: * 在 **已启用** 下拉列表中,选择 **Yes**。 * 在 **类型** 下拉列表中,选择以下两个选项之一: * **Allow only** — 仅允许特定客户类型使用该验证等级。 * **Deny only** — 禁止特定客户类型使用该验证等级。 * 在 **规则** 下拉列表中,选择您要应用所选规则的客户类型。 单击 **保存** 以应用更改。 ### 示例 [#example-1] 假设 *个人* 和 *企业* 客户在注册 B2CORE UI 后均被分配默认的 `Level 0`。 应配置以下等级,以根据**客户类型**支持客户的单独验证流程: * 个人客户:`Level 0` → `Level 1` → `Level 2` 客户类型限制:**Allow only** = `individual` * 企业客户:`Level 0` → `Level 3` → `Level 4` 客户类型限制:**Allow only** = `corporate` 客户允许获得的下一等级,是根据已应用的客户类型限制确定的具有更高下一索引的等级。 当您希望使用不同的 [KYC 提供商](../../integrations/kyc-providers)为个人客户和企业客户运行验证流程时,此功能可能会很有用。 ## 如何按司法管辖区或国家/地区限制验证等级的使用 [#how-to-restrict-the-use-of-verification-levels-by-jurisdiction-or-country] 要配置更具体的验证流程,您可以根据客户的司法管辖区或国家/地区限制验证等级的使用。 要对验证等级应用此类限制: 导航至 **验证** > **等级**。 选择验证等级,然后单击 **编辑**。 在 **更新验证等级** 页面上,单击 **操作** 按钮,然后选择: * **司法管辖区限制** — 根据客户的司法管辖区应用限制。 * **国家/地区限制** — 根据客户的国家/地区应用限制。 在 **限制** 弹出窗口中,填写以下字段: * 在 **已启用** 下拉列表中,选择 **Yes**。 * 在 **类型** 下拉列表中,选择以下两个选项之一: * **Allow only** — 仅允许所选司法管辖区或国家/地区使用该验证等级。 * **Deny only** — 禁止所选司法管辖区或国家/地区使用该验证等级。 * 在 **规则** 下拉列表中,选择要应用该规则的一个或多个司法管辖区或国家/地区。 单击 **保存** 以应用更改。 ### 示例 [#example-2] 假设 *个人* 和 *企业* 客户在注册 B2CORE UI 后,最初均被分配默认的 `Level 0`。 应配置以下等级,以根据**客户类型**和**司法管辖区**支持客户的单独验证流程: * **EU** 中的个人客户:`Level 0` → `Level 1` → `Level 2` 客户类型限制:**Allow only** = `individual`,司法管辖区限制:**Allow only** = `EU` 这些等级仅供来自 **EU** 司法管辖区的个人客户访问。 * **CY**(塞浦路斯)中的个人客户:`Level 0` → `Level 3` → `Level 4` 客户类型限制:**Allow only** = `individual`,司法管辖区限制:**Allow only** = `CY` 这些等级仅供来自 **CY** 司法管辖区的个人客户访问。 * **EU** 中的企业客户:`Level 0` → `Level 5` → `Level 6` 这些等级仅供来自 **EU** 司法管辖区的企业客户访问。 客户类型限制:**Allow only** = `corporate`,司法管辖区限制:**Allow only** = `EU` * **CY**(塞浦路斯)中的企业客户:`Level 0` → `Level 7` → `Level 8` 客户类型限制:**Allow only** = `corporate`,司法管辖区限制:**Allow only** = `CY` 这些等级仅供来自 **CY** 司法管辖区的企业客户访问。 客户允许获得的下一等级,是根据已应用的客户类型和司法管辖区限制确定的具有更高下一索引的等级。 ## 如何创建权限等级 [#how-to-create-permission-levels] 权限等级是一组客户可在 B2CORE UI 中执行的操作。权限等级与验证等级关联。当客户获得特定验证等级时,他们将被授予与该验证等级关联的权限。 要创建权限等级: 导航至 **系统** > **客户权限**,然后单击页面右上角的 **+创建**。 在显示的 **创建角色** 窗口中,填写以下字段: * **名称** — 指定验证等级的名称,其中不应包含任何大写字母。 * **标题** — 指定权限等级说明。 单击 **保存** 以创建权限等级。 单击权限等级行中的 **编辑** 按钮。 在 **父角色** 下拉列表中,选择客户必须先获得才能获得此等级的上一个权限等级。此字段不适用于默认权限等级。 选择您希望在此等级授予客户的权限: * **验证** — 如果选中,客户可在 B2CORE UI 中获得更高的验证等级。 * **兑换器** — 如果选中,客户可在 B2CORE UI 中兑换资金。 * **入金** — 如果选中,客户可在 B2CORE UI 中存入资金。 * **出金** — 如果选中,客户可在 B2CORE UI 中提取资金。 * **内部转账** — 如果选中,可以在同一 B2CORE 系统内将资金从一位客户转移给另一位客户。 单击 **保存** 以应用更改。 ## 如何按验证等级设置入金、出金和转账限额 [#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels] 对于每个验证等级,您可以限制被授予该等级的客户可存入、提取和转账的金额。 所有限额值均以 USD 计算。 要为特定等级设置限额: 导航至 **验证** > **等级**。 选择您要设置限额的验证等级,然后单击等级行中的 **编辑** 按钮。 在 **更新验证等级** 页面上,填写 **限额** 部分下显示的字段: * 要限制客户每天可存入的金额,请在 **每日入金** 字段中指定允许的最大值。 * 要限制客户每天和每月可提取的金额,请在 **每日出金** 和 **每月出金** 字段中指定允许的最大值。 * 要设置客户可以从其钱包转账到交易账户的最低金额,请指定 **转账最低金额** 字段。不允许转账低于设定限额的金额。 * 要允许客户无需获得审批即可提取特定金额,请在 **自动出金** 字段中指定允许的最大金额。不超过设定限额的金额可由客户自动提取(无需管理员批准)。 * 要设置每日内部转账操作允许的最大金额,请指定 **每日内部转账** 字段。如果客户在达到指定限额后希望进行内部转账,将创建内部转账请求,并且必须由管理员批准。 如果客户向 MT 账户转账或从 MT 账户转出资金,MT 平台设置将覆盖 **每日内部转账** 选项。 如果 MT 平台已启用 **转出需要请求** 和 **转入需要请求** 选项,则会忽略 **每日内部转账** 选项,并且始终会创建内部转账请求,且必须由管理员批准。 要不应用限额,请在上述相应字段中输入 **-1**。要禁止客户进行特定交易,请在上述相应字段中输入 **0**。 单击 **保存** 以应用更改。 **另请参阅** [如何使用 SumSub](how-to-use-sumsubstance) [如何使用 ShuftiPro](how-to-use-shuftipro) ## 问题 [#problem] [后台用户](../../back-office-guide/system/users/users)在尝试批准或拒绝客户请求时遇到 `403 Access Denied` 错误。 ## 可能原因 [#possible-reasons] 如果用户缺少所需权限,就会出现此问题。必须授予多个类别中的权限。 ## 解决方案 [#solution] 要验证并更新权限: 在后台中,导航至 **System** > **Users** > **Groups**。 找到包含该后台用户的用户组。 **Administrators** 组中的用户将获得所有可用权限。该组无法删除,且其权限无法修改。 点击 **Edit** 按钮以打开用户组详细信息。 在 **Right** 部分中,确保已启用以下类别中的权限: * **Clients** > **Client's request** — 启用与所需请求类型相关的权限,例如: * `View client's requests with type Deposit` * `Update client's requests with type Deposit` * 以及其他权限。 * **Finance** — 启用与所需操作相关的权限。 * **System** > **Requests** — 启用以下权限: * `View request resolutions` * `View request resolutions types` 或者,也可以将用户重新分配到已具备管理客户请求所需全部权限的用户组。 点击 **Save** 以应用更改。 该用户组中的所有后台用户现在都将拥有这些权限。启用这些权限后,用户将能够批准和拒绝客户请求,而不会遇到 `403 Access Denied` 错误。 后台用户必须退出后台并重新登录,权限才会生效。 ## 问题 [#problem] 客户已在 B2CORE UI 的 **Security** 部分启用 **Google Authenticator** 或 **SMS confirmation**,但无法接收双重身份验证代码。 ## 可能原因 [#possible-reasons] **Google Authenticator**: * 客户无法访问该应用或安装该应用的设备。 * 由于设备时间同步不正确,该应用未生成有效代码。 **SMS confirmation**: * Back Office 中的短信服务提供商配置不完整或不正确。 * 您的短信服务提供商账户余额不足。 * 短信服务提供商服务暂时不可用。 * 客户的移动运营商拦截或延迟了短信。 ## 解决方案 [#solution] 若要解决双重身份验证问题: ### 验证客户双重身份验证设置 [#verify-client-2fa-settings] * 在 Back Office 中,前往 **Clients** > **General**。 * 在列表中找到客户,然后点击 **Edit** 按钮。 * 在客户详情中,转到 **Settings** 选项卡。 * 在 **2FA** 部分中,检查是否已为客户启用其中一个双重身份验证选项。如果未启用,客户必须在 B2CORE UI 的 **Security** 部分启用双重身份验证。 客户详情中的双重身份验证部分 ### 排查 Google Authenticator 问题 [#troubleshoot-google-authenticator] 如果客户无法生成有效代码,或无法访问应用或设备: * 您可以在 Back Office 的客户详情 **Settings** 选项卡中禁用该选项。 * 请客户在 B2CORE UI 的 **Security** 部分重新启用 Google Authenticator 双重身份验证。 禁用双重身份验证会移除额外的保护层。此操作仅应在客户明确请求的情况下执行,且由客户自行承担全部责任。 ### 排查短信确认问题 [#troubleshoot-sms-confirmation] * 在 Back Office 中,前往 **System** > **SMS providers**。 * 在服务提供商列表中,点击相关服务提供商(例如 **Twilio**)的 **Edit** 按钮,以打开其配置详情。 * 在 **Provider settings** 部分中: * 验证凭据是否正确。 * 确保配置已启用。 * 确认您的短信服务提供商账户有足够余额用于发送消息。 Twilio 服务提供商设置 如果配置正确但问题仍然存在,请联系短信服务提供商,检查是否存在服务中断或向客户号码发送短信的问题。 ## 问题 [#problem] 客户未收到来自 B2CORE 的各种电子邮件,例如账户创建确认、入金通知或其他系统消息。 ## 可能原因 [#possible-reasons] 此问题可能由以下一个或多个原因导致: * 电子邮件被客户的电子邮件服务提供商标记为垃圾邮件。 * B2CORE Back Office 中的 SMTP 设置不正确或配置错误。 * 电子邮件卡在队列中。 * 缺少电子邮件模板或模板配置错误。 * 电子邮件服务提供商存在问题,例如额度用尽、服务延迟或宕机。 ## 解决方案 [#solution] 若要解决电子邮件投递问题: ### 检查垃圾邮件文件夹 [#check-spam-and-junk-folders] 请客户检查其垃圾邮件文件夹,尤其是在 B2CORE Back Office 的 **Mailing** > **System** > **Logs** 中电子邮件状态显示为成功时。 ### 验证 B2CORE Back Office 中的 SMTP 设置 [#verify-smtp-settings-in-the-b2core-back-office] 如果多位客户遇到投递问题,请验证您的 [SMTP 配置设置](../../how-to-articles/manage-mailing-options/how-to-configure-smtp): * 导航至 **Mailing** > **System** > **Providers**。 * 点击相关 SMTP 配置的 **Edit** 按钮以打开其详细信息。 * 点击 **Test connection** 按钮以验证 SMTP 设置。 * **Test connection** 按钮上的勾选标记表示设置已正确配置。 * 红色的 **Test connection** 按钮表示设置中存在错误,系统将列出这些错误。 * 更正设置并再次测试,直至 SMTP 配置成功。 * 确保该配置已启用。 有关详细信息,请参阅[如何配置 SMTP](../../how-to-articles/manage-mailing-options/how-to-configure-smtp)。 ### 在电子邮件日志中跟踪电子邮件投递 [#track-an-email-delivery-in-the-email-log] * 导航至 **Mailing** > **System** > **Log**。 * 找到所需的电子邮件并检查其投递状态:IN PROGRESS、FAIL 或 SUCCESS。 * 对于投递失败的电子邮件,请查看 **Reason** 列以确定问题。 ### 检查 B2CORE Back Office 中的电子邮件模板 [#check-email-templates-in-the-b2core-back-office] * 导航至 **System** > **Templates** > **Email** > **Templates**。 * 确保相关通知的模板存在且已正确配置(有关详细信息,请参阅[如何配置电子邮件模板](../../how-to-articles/manage-system-settings/how-to-configure-email-templates))。 * 确保电子邮件模板已启用。 ### 检查电子邮件服务提供商的运行状态 [#check-the-email-provider-operation] 如果电子邮件延迟,请确认您的电子邮件服务提供商正常运行,并且您的账户拥有足够的额度或有效订阅。 ## 问题 [#problem] 客户无法在 B2CORE UI 的 **交易历史** 或 **资金** 菜单的相应部分中看到其发起的交易,例如入金、出金、转账、内部转账或兑换。 ## 可能原因 [#possible-reasons] 此问题可能是由于 B2CORE Back Office 中[操作类型](../../back-office-guide/system/operation-types)的配置不正确导致的。 ## 解决方案 [#solution] 要检查操作类型配置: 在 Back Office 中,前往 **系统** > **操作类型**。 找到所需的操作类型,例如用于控制出金交易的 `payouts`。 确保此操作类型已启用;否则,客户将无法在 B2CORE UI 中执行此类型的交易。 点击 **编辑** 按钮以打开操作类型详情。 检查 **允许的操作状态** 列表。 如果未选择一个或多个状态,客户将无法在 B2CORE UI 中看到处于这些状态的交易。 例如,如果仅为 `payouts` 操作类型启用了 **已完成** 状态,客户将只能看到处于 **已完成** 状态的出金,而无法看到处于其他状态的出金。 payouts 操作类型的允许状态 将所有相关状态添加到 **允许的操作状态** 列表中。 点击 **保存** 以应用更改。 ## 问题 [#problem] 客户在 B2CORE UI 中尝试将一种货币兑换为另一种货币时,遇到以下错误:`Exchange Rate error: the rate for this pair cannot be found, please try another pair`。 ## 可能原因 [#possible-reasons] 此问题可能由以下一个或多个原因导致: * B2CORE Back Office 中未添加一种或两种货币。 * 所选货币对未在 B2CORE Back Office 中配置,或已被禁用。 * 汇率提供商配置不完整或不正确。 ### 解决方案 [#solution] 若要解决兑换问题: ### 验证 B2CORE Back Office 中是否存在货币 [#verify-that-currencies-exist-in-the-b2core-back-office] * 导航至 **Currencies** > **Currencies**。 * 确保已添加兑换涉及的两种货币。若未添加,请添加缺失的货币(详情请参阅[如何添加货币](../../how-to-articles/manage-currencies/how-to-add-a-currency))。 ### 验证 B2CORE Back Office 中是否已配置货币对 [#verify-that-the-currency-pair-is-configured-in-the-b2core-back-office] * 导航至 **Currencies** > **Currency pairs**。 * 确认所需货币对已配置并启用。若未配置或未启用,请添加或启用该货币对(详情请参阅[如何添加兑换货币对](../../how-to-articles/manage-currencies/how-to-add-an-exchange-currency-pair))。 ### 检查 B2CORE Back Office 中的汇率提供商是否已正确配置 [#check-that-the-exchange-rate-provider-is-properly-configured-in-the-b2core-back-office] * 导航至 **Currencies** > **Rates**。 * 找到用于为所需货币对提供汇率的提供商,例如 B2BINPAY,然后点击 **Edit** 按钮以打开其详细信息。 * 验证其配置和凭据(详情请参阅[如何配置货币兑换汇率](../../how-to-articles/manage-currencies/how-to-configure-currency-exchange-rates))。 确认货币、货币对和提供商设置均已正确配置后,兑换应可正常进行且不会出现错误。 ## 问题 [#problem] 您已在 Back Office 的 **System** > **Localization** 中启用新语言,但 B2CORE UI 中该语言的翻译显示为空白。 ## 可能原因 [#possible-reasons] 出现此问题的原因可能是,新启用的语言尚未添加到 B2TRANSLATE。B2TRANSLATE 是用于管理 B2CORE UI 所支持所有语言翻译的工具。 有关 B2TRANSLATE 的更多信息,请参阅[产品文档](https://docs.b2translate.b2broker.com/)。 要完成以下步骤,您必须已注册 B2TRANSLATE,并且有权访问与您的 B2CORE 关联的项目。 ## 解决方案 [#solution] 要检查 B2TRANSLATE 中的语言配置: 在 B2CORE Back Office 中,前往 **System** > **Settings**,找到与您的 B2CORE 关联的 B2TRANSLATE 项目的 UUID 并将其复制。 登录 B2TRANSLATE。 前往 **Languages**,并确认新启用的语言是否可用于您的 B2TRANSLATE 项目。 前往 **Projects**,然后通过从 B2CORE Back Office 复制的 UUID 查找相关项目。 点击 **pencil** 图标以编辑项目。 在弹出窗口中,检查 **Languages** 下拉列表。如果缺少所需语言,请将其添加。 在 B2TRANSLATE 中编辑项目 点击 **Save** 以应用更改。 为添加的语言配置翻译(详情请参阅 [B2TRANSLATE 文档](https://docs.b2translate.b2broker.com/)中的[管理翻译](https://docs.b2translate.b2broker.com/user-guide/manage-translations))。 ## 问题 [#problem] 您已为 B2TRANSLATE 中的某个键分配翻译,但 B2CORE UI 中显示的该键翻译却不同。 有关 B2TRANSLATE 的更多信息,请参阅[产品文档](https://docs.b2translate.b2broker.com/)。 ## 可能原因 [#possible-reasons] 此问题可能由以下原因之一导致: * **B2TRANSLATE 更新延迟**:B2TRANSLATE 中的更新可能需要几分钟才会显示,因此 B2CORE UI 可能会暂时显示旧翻译。 * **B2CORE Back Office 中覆盖的翻译**:B2CORE Back Office 中可能为该元素分配了其他翻译,并且该处提供本地化选项。 如果某个字段支持在 B2CORE Back Office 中进行本地化,其右侧会显示本地化按钮。点击此按钮会打开可用语言列表,您可以在其中指定翻译。 ## 解决方案 [#solution] 要检查并删除覆盖的翻译: 在 B2CORE Back Office 中,前往相应菜单。例如,**Products** > **Groups**。 点击相关组的 **Edit** 按钮以打开其详细信息。 **Caption** 和 **Description** 字段支持本地化。点击字段右侧的按钮,查看是否已为这些字段应用任何翻译,并删除可能覆盖 B2TRANSLATE 翻译的内容。 字段的本地化选项 在通过后台创建手动入金之前,请确保已创建并启用 **manual** 入金方式。为此,请依次前往 **System** > **Deposit system** > **Deposit methods**。如果 **Deposit methods** 页面未显示 **manual** 入金方式,请按照[如何添加手动入金或出金方式](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method)中的说明创建该方式。 创建并启用 **manual** 入金方式后,请按照以下步骤创建入金。 前往 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 您可以使用按姓名或电子邮件进行的[筛选](../../back-office-guide/get-started#filtering-and-sorting)来快速搜索。 前往 **Transactions** 选项卡,然后选择 **Deposit**。 点击 **+Create**。 选择要入金的客户账户,然后点击 **Select**。 填写表单: * 确保 **Method** 设置为 **manual**。检查账户号码和币种。 * 输入入金金额。 * 设置 **commissions**。 * 如果您不想通知客户入金操作,请启用 **Don’t send email** 选项。 * 通过解决一道简单的数学题确认操作,并在 **Verification code** 字段中输入结果。 * 如有需要,添加 **Internal comment**。该评论仅会显示在后台中。 点击 **Save** 以创建入金。 在通过后台创建手动出金之前,请确保已创建并启用 **manual** 出金方式。为此,请前往 **System** > **Payout system** > **Payout methods**。如果 **Payout methods** 页面未显示 **manual** 出金方式,请按照[如何添加手动入金或出金方式](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method)中的说明创建该方式。 创建并启用 **manual** 出金方式后,请按照以下步骤创建出金。 前往 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 您可以使用按姓名或电子邮件筛选的[筛选器](../../back-office-guide/get-started#filtering-and-sorting)进行快速搜索。 转到 **Transactions** 选项卡,然后选择 **Payout**。 点击 **+Create**。 选择要从中创建出金的客户账户,然后点击 **Select**。 填写表单: * 确保 **Method** 设置为 **manual**。检查账户号码和币种。 * 输入出金金额。 * 设置 **commissions**。 * 如果不想通知客户出金操作,请启用 **Don’t send email** 选项。 * 通过解决一道简单的数学题确认操作,并在 **Verification code** 字段中输入结果。 * 如有需要,添加 **Internal comment**。该评论仅会显示在后台中。 点击 **Save** 以创建出金。 要创建和配置报告: 导航至 **Finance** > **Reports**。 点击页面右上角的 **+Create**。 在 **Create report** 页面上,填写以下字段: * 在 **Interval** 下拉菜单中,设置报告发送计划: * **Daily** — 每天运行并发送报告 * **Weekly** — 每周运行并发送一次报告 * **Monthly** — 每月运行并发送一次报告 * 在 **Data slice** 下拉菜单中,根据 Back Office 服务器时间选择报告中包含数据的时间段: * **Day** — 前一天,从 00:00 到 23:59 * **Week** — 前一周,从周一 00:00 到周日 23:59 * **Month** — 前一个月,从当月第一天 00:00 到最后一天 23:59 * **Curweek** — 前 7 天,从第一天 00:00 到昨天 23:59 * **Overall** — 从历史记录开始到昨天 23:59 * **Curmonth** — 从当前月份第一天 00:00 到昨天 23:59 * 在 **File format** 下拉菜单中,选择 **HTML**、**XLSX** 或 **CSV**。 * 在 **Active** 下拉菜单中,选择报告状态: * **Active** — 按计划运行并发送报告 * **Inactive** — 禁用报告 * 在 **Name** 字段中,输入报告名称。 * 在 **Class** 下拉菜单中,选择要生成的一种或多种报告类型: * **Client Finance Report** — 显示每位客户在指定时间段内的入金、出金和净入金金额(总入金与总出金之间的差额),以相应币种及换算为 USD 的形式呈现。报告包含以下字段:**Email**、**Verification Level**、**Currency**、**Deposit**、**Withdraw**、**(D - W)**、**(Deposit, USD)**、**(Withdraw, USD)** 和 **(Deposit - Withdrawal, USD)**。 * **Transaction Finance Report** — 包含指定时间段内执行的所有交易的详细信息。报告包含多个字段,例如 **ID**、**Account ID**、**Operation ID**、**Email**、**Transaction Type**、**Method**、**Source Currency**、**Source Amount**、**Type Commission**、**Final Amount**、**Target Amount**、**Target Currency**、**Transaction Exchange Rate**、**% Markup**、**Profit Markup**、**Markup Currency** 等。 * **Method Finance Report** — 包含指定时间段内用于执行入金和出金操作的方法的详细信息。数据按币种分组(例如法币和加密货币),并包含有关每项操作的佣金和收益信息。报告包含多个字段,例如 **Method**、**Currency**、**Deposit**、**Withdraw**、**Source Commission**、**Final Deposit amount**、**Final Withdrawal amount**、**Profit Markup**、**Counterparty Commission**、**Profit (Counterparty commission)** 等。 * **Currency Finance Report** — 显示指定时间段内以特定币种计的入金、出金和净入金金额(总入金与总出金之间的差额),以及换算为 USD 的金额。报告包含以下字段:**Currency**、**Deposit**、**Withdraw**、**(D - W)**、**(Deposit, USD)**、**(Withdraw, USD)** 和 **(Deposit - Withdrawal, USD)**。 * **Balances Report** — 显示指定时间段内客户账户的余额变化。数据按各币种分组,还包括所有客户账户余额变化换算为 USD 后的总额。报告包含以下字段:**ID**、**Email**、**Client Name**、**Internal Client Type**、**Verification Level**、**Company Name**、**Currency**、**Balance**、**Hold**、**Rate**、**(Balance, USD)**、**Previous Balance** 和 **(Previous Balance, USD)**。 * **User In Out** — 此报告与 **Client Finance Report** 类似,但还包含额外字段,例如 **Transfers (D-W)** 和 **Manual (D-W)**。 * **IB Balances Report** — 显示 IB 合作伙伴在指定时间段内获得的奖励金额,以及换算为 USD 后的奖励总额。报告包含以下字段:**ID**(分配给 IB 合作伙伴的标识符)、**Email**、**Client Name**、**Internal Client Type**、**Verification Level**、**Company Name**、**Currency**、**Balance**、**Rate** 和 **(Balance, USD)**。 * **Balances Simplified Report** — 显示客户账户中各币种的余额,以及所有客户账户余额换算为 USD 后的总额。报告包含以下字段:**Email**、**Internal Client Type**、**Currency** 和 **Balance**。 * **LegalEntityBalancesReport** — 显示由特定法人实体提供服务的客户所有真实账户的余额。 * 在 **Mail to** 字段中,输入用于接收报告下载链接的电子邮件地址。 * 在 **Start hour** 字段中,根据 Back Office 服务器时间,输入要运行报告并将其发送至指定电子邮件地址的小时。该值必须在 0 — 23 范围内。 * 在 **GMT offset** 下拉菜单中,选择您本地时区的 GMT 偏移量,以便在本地时区的指定小时发送报告。 Back Office 服务器时间可能与您本地时区的时间不同。当前服务器日期和时间显示在顶部栏中。 点击 **Save** 以创建报告。 要通过 Back Office 在同一客户的账户之间转移资金: 前往 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 您可以使用按姓名或电子邮件进行的[筛选器](../../back-office-guide/get-started#filtering-and-sorting)快速搜索。 转到 **Transactions** 选项卡,然后选择 **Transfer**。 点击 +**Create**。 填写表单: * 在 **From account** 下拉列表中选择扣款账户。 * 在 **To account** 下拉列表中选择目标账户。 * 输入转账金额。 * 通过解答简单的数学题确认操作,并在 **Verification code** 字段中输入结果。 点击 **Save** 以创建转账。 要通过 Back Office 为客户兑换资金: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 您可以使用按姓名或电子邮件进行的[筛选器](../../back-office-guide/get-started#filtering-and-sorting)快速搜索。 前往 **Transactions** 选项卡,然后选择 **Exchange**。 点击 +**Create**。 填写表单: * 在 **From account** 下拉列表中选择扣款账户。 * 在 **To account** 下拉列表中选择目标账户。 * 选择 **Exchange type**: * **Source & Rate (Sell)** — 出售货币时,无法设置目标金额 * **Destination & Rate (Buy)** — 购买货币时,无法设置源金额 * **Source & Destination (Direct)** — 进行直接转账时,无法设置汇率 * 根据所选的兑换操作类型设置兑换金额和汇率。 * 通过解答一道简单的数学题确认操作,并在 **Verification code** 字段中输入结果。 点击 **Save** 以兑换资金。 要获取特定客户钱包和账户上的交易数据: 导航至 **Clients** > **General**。 选择客户并点击 **Edit** 按钮。 在客户详情页面,前往 **Transactions** 选项卡,然后从下拉菜单中选择 **Deposit**、**Payout**、**Transfer**、**Exchange** 或 **Balance change operations**,以查看相应的交易。 在每个页面中,点击右上角的 **Export** 按钮以导出数据。 如果已应用筛选条件,某些交易可能会被排除。请清除所有筛选条件,以确保您看到完整的交易列表。 检查 **Status** 列的筛选条件也可能很重要。例如,筛选以仅显示状态为 **Done** 的交易,并排除状态为 **Pending** 或 **Failed** 的交易。 在显示的弹出窗口中: * 选择文件格式:XLSX 或 CSV。 * 选择 **Send to email** 以通过电子邮件接收文件,或选择 **Download** 将其保存到您的计算机。 * 点击 **Export**。 随后,您可以使用导出的文件来计算和分析客户账户和钱包上进行的交易。 您可以通过从后台相关页面导出数据,获取所有客户的入金或出金总额。 要获取入金或出金数据: 前往 **Finance** > **Deposits** 查看所有客户入金交易,或前往 **Finance** > **Payouts** 查看所有出金交易。 要仅显示所需信息,请使用 **Column visibility** 选项隐藏或添加列。 如果对 **Deposits** 或 **Payouts** 页面应用了筛选条件,某些交易可能会被排除。请清除所有筛选条件,以确保您看到完整的交易列表。 检查 **Status** 列的筛选条件也可能很重要。例如,您可以筛选仅显示状态为 **Done** 的交易,并排除状态为 **Pending** 或 **Failed** 的交易。 点击页面右上角的 **Export** 按钮。 在显示的弹窗中: * 选择文件格式:XLSX 或 CSV。 * 选择 **Send to email** 以通过电子邮件接收文件,或选择 **Download** 将其保存到您的计算机。 * 点击 **Export**。 随后,您可以使用导出的文件查找客户钱包的入金或出金总额。 当相应的入金和出金获得 `Assistance` 状态时,系统会在 **Clients** > **Requests** 中自动创建 **PaymentSystem Deposit Assistance** 和 **PaymentSystem Withdrawal Assistance** 类型的请求。此状态表示无法自动确定交易状态,管理员必须决定是继续将交易状态与外部支付系统同步,还是将交易标记为失败。 ## 注意两者的区别 [#note-the-difference] 入金和出金交易可能会被分配 `Assistance` 状态,而 **Clients** > **Requests** 中对应的请求则会相应地获得 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 类型。这些请求包含有关交易的所有可用详细信息,以帮助管理员决定如何处理。 ## 创建 PaymentSystem Assistance 请求的逻辑 [#logic-for-creating-paymentsystem-assistance-requests] * 对于**入金**,如果由于**同步截止时间**错误而分配 `Assistance` 状态,即入金与支付系统的同步时间已过期,则不会创建 **PaymentSystem Deposit Assistance** 请求。此类入金必须直接在 **Finance** > **Deposits** 的入金详情中处理。有关详细信息,请参阅[如何处理具有 Assistance 状态的入金](how-to-process-transactions-with-the-assistance-status#how-to-process-deposits-with-the-assistance-status)。 * 除**同步截止时间**以外的任何原因,都会为该入金创建 **PaymentSystem Deposit Assistance** 请求,并且必须在相应请求中处理。 * 对于**出金**,分配 `Assistance` 状态时始终会创建 **PaymentSystem Withdrawal Assistance** 请求。这些出金必须在各自的请求中处理。 要处理 PaymentSystem Assistance 请求: 导航至 **Clients** > **Requests**。 找到与具有 `Assistance` 状态的入金或出金交易相关的请求。 要筛选列表,请在 **Type** 列中选择 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance**,并在 **Status** 列中选择 **Pending**。 单击 **Edit** 按钮以打开请求并查看交易支付详情。有关概述,请参阅[支付详情结构](how-to-process-transactions-with-the-assistance-status#payment-details-structure)。 这些支付详情与 **Finance** > **Deposits** 和 **Finance** > **Payouts** 下入金或出金详情中 **Payment system** 选项卡上显示的内容相同。 根据请求中提供的信息,采取适当操作以更新交易状态。 更新交易状态前,请务必在外部支付系统中核查相关交易详情,以做出正确决定。 根据交易的当前状态,可能提供以下状态转换选项: * [移至 In progress](move-to-in-progress) 或 [移至 Failed](move-to-failed)。 * [移至 Success](move-to-success) 或 [移至 Failed](move-to-failed)。 **另请参阅** [移至 Success](move-to-success) [移至 In progress](move-to-in-progress) [移至 Failed](move-to-failed) 通过[PSS 连接](../../integrations/payment-systems#payment-system-service-pss)方式发起的入金和出金在处理期间可能会收到 `Assistance` 状态。此状态表示在与外部支付系统同步时无法自动确定交易状态,因此交易处理需要手动操作。 ## 如何处理状态为 Assistance 的入金 [#how-to-process-deposits-with-the-assistance-status] 入金可能因以下原因收到 `Assistance` 状态: * 与支付系统的同步时间已过期,即已达到**同步截止时间**。在这种情况下,必须直接在 **Finance** > **Deposits** 的入金详情中处理入金。 * **同步截止时间**以外的任何原因。在这种情况下,系统会在 **Clients** > **Requests** 中自动创建 **PaymentSystem Deposit Assistance** 请求,必须在该请求中处理入金。 直接在入金详情中处理同步截止时间错误的目的,是为了避免产生过多的 **PaymentSystem Deposit Assistance** 请求并简化请求处理。 要确定入金为何具有 `Assistance` 状态并进行处理: 导航至 **Finance** > **Deposits**。 找到需要处理的、状态为 `Assistance` 的入金。 要筛选列表,请在 **Status** 列中选择 `Assistance`,以便仅显示具有此状态的入金。 选择该入金并点击 **Edit** 按钮以打开其详情。 在入金详情中,转到 **Payment system** 选项卡。 该选项卡显示详细的入金信息。有关概览,请参阅[支付详情结构](#payment-details-structure)。 确定入金收到 `Assistance` 状态的原因。 在 **Timeline** 部分中,查看状态详情: * 如果状态为 **Unexpected**,且 **Error code** 字段显示 `service.sync_deadline`,则表示入金与支付系统的同步时间已过期。在这种情况下,请直接在 **Payment system** 选项卡上继续处理入金。 * 如果显示任何其他错误代码,请在 **Clients** > **Requests** 中自动创建的对应 **PaymentSystem Deposit Assistance** 请求内处理入金。有关详情,请参阅[如何处理入金和出金的 PaymentSystem Assistance 请求](how-to-process-ps-deposit-assistance-and-ps-withdrawal-assitance-requests)。 要处理错误代码为 `service.sync_deadline` 的入金,请在 **Payment system** 选项卡上采取相应操作以更新入金状态。 可用选项如下: * **Move to In progress** — 恢复将入金状态与外部支付系统同步。 * **Move to Failed** — 停止与外部支付系统同步,并将入金标记为失败。 有关详情,请参阅[移至 In progress](move-to-in-progress)和[移至 Failed](move-to-failed)。请注意,对于 `service.sync_deadline` 情况,必须直接在入金详情的 **Payment system** 选项卡中执行这些操作。 根据所选选项,入金状态将更新为 **In progress**,之后可能达到某个最终状态,或立即更新为 **Failed**。 ## 如何处理状态为 Assistance 的出金 [#how-to-process-withdrawals-with-the-assistance-status] 当出金收到 `Assistance` 状态时,系统始终会在 **Clients** > **Requests** 中自动创建 **PaymentSystem Withdrawal Assistance** 请求。此类出金必须在这些请求中处理。出金详情中不提供任何用于处理出金的手动操作。 要处理状态为 `Assistance` 的出金: 导航至 **Finance** > **Payouts**。 找到需要处理的、状态为 `Assistance` 的出金。 要筛选列表,请在 **Status** 列中选择 `Assistance`,以便仅显示具有此状态的出金。 选择该出金并点击 **Edit** 按钮以打开其详情。 在出金详情中,转到 **Payment system** 选项卡。 该选项卡显示详细的出金信息。有关概览,请参阅[支付详情结构](#payment-details-structure)。 在 **Timeline** 部分中,查看导致出金收到 `Assistance` 状态的状态和错误代码。 与入金不同,状态为 `Assistance` 的出金始终会在 **Clients** > **Requests** 中创建 **PaymentSystem Withdrawal Assistance** 请求。这些出金必须在各自的请求中手动处理。有关详情,请参阅[如何处理入金和出金的 PaymentSystem Assistance 请求](how-to-process-ps-deposit-assistance-and-ps-withdrawal-assitance-requests)。 ## 支付详情结构 [#payment-details-structure] 在 **Finance** > **Deposits** 和 **Finance** > **Payouts** 中列出的入金和出金详情的 **Payment system** 选项卡上,以及在 **Clients** > **Requests** 中列出的相应 **PaymentSystem Deposit Assistance** 和 **PaymentSystem Withdrawal Assistance** 请求中,均可查看以下信息。这些信息可帮助管理员决定如何处理特定交易,并包含以下部分: ### 入金/出金信息 [#depositwithdrawal-information] Withdrawal information 交易的主要信息: **Identifier** B2CORE Payment Systems Service (PSS) 中的交易标识符。您可以点击它以导航至 **Finance** > **Deposits** 或 **Finance** > **Payouts** 中的交易详情。 *** **Payment provider identifier** 外部支付系统中的交易标识符,可能具有以下两种状态: * `Verified` — 支付系统中存在具有此标识符的交易。 * `Unverified` — 支付系统中找不到具有此标识符的交易。 *** **Status** B2CORE PSS 中的交易状态: * **Created** — 已创建交易。 * **In Progress** — 正在处理交易。 * **Success** — 交易已成功完成。这是最终状态。 * **Failed** — 交易未能完成。这是最终状态。 * **Unexpected** — 交易处于未知状态。管理员必须将此状态作为协助流程的一部分进行处理。 * **Unprocessable** — 交易处于需要手动操作的状态,因为无法再自动执行任何操作。管理员必须将此状态作为协助流程的一部分进行处理。 *** **Initial amount** 发起交易时的金额。 *** **Initial currency** 发起交易时使用的币种。 *** **Creation date** 创建交易的日期和时间。 *** **Last updating date** 上次更新交易的日期和时间。 ### 支付输入快照 [#payment-input-snapshot] 客户在发起入金或出金时于支付表单中填写的信息。客户必须填写的字段取决于所选的入金或出金方式。此信息显示为字段名称和客户提供的值。 对于某些方式,客户无需提供任何信息。在这种情况下,将显示消息 `The payment input snapshot is empty`。 Payment input snapshot ### 外部详情 [#external-details] 有关交易的附加信息,包括来自支付系统的有用数据。信息集取决于具体的支付系统。在交易处理期间,此部分中没有详情。 ### 时间线 [#timeline] 有关 B2CORE PSS 内交易状态的信息。数据按时间顺序展示,并包含每个状态的有用详情。 Timeline ### 轮询任务 [#polling-job] 在 B2CORE PSS 中创建交易后,服务会定期向外部支付系统发起请求,以检查交易的当前状态。这种定期状态检查称为 **Polling job** 流程。每次轮询任务尝试均包含请求日期、状态以及任何错误的附加详情(如适用)。 Polling job 交易成功完成后,请求所有部分中的信息都会相应更新。 当交易(例如入金、转账,或钱包与交易账户之间的兑换)处于 `Partial` 状态时,表示由于技术问题导致处理未完成。这些交易应手动处理。 要处理 `Partial` 状态的交易: 导航至 **Finance** > **Transactions**。 在 **Transactions** 页面上,在 **Status** 列下显示的筛选字段中选择 `Partial`,以列出所有具有该状态的交易。 选择要处理的交易。 点击交易行左侧显示的 magnifying glass icon。系统将自动尝试确定交易的最终状态。 * 如果成功,交易状态将相应更新。 * 如果未找到最终状态,将显示以下错误消息:`Operation was not found`,并出现两个按钮: * process transaction button — **Process transaction** 按钮 * set done status button — **Set Done status** 按钮 下一步取决于该交易是否存在于相应的交易平台上,例如 MT4、MT5 或 cTrader。因此,请前往该平台并检查资金是否已到账至相关交易账户。在采取任何进一步操作之前,务必确认资金所在位置。 如果在平台上找到了该交易、已在该平台完成处理且资金已到达目标位置,请点击 set done status button。 由于该交易已在相应平台上处理完成,但状态未回传至 B2CORE,此操作会为 B2CORE 中的交易分配 `Done` 状态。 如果在平台上未找到该交易,且资金尚未到达目标位置或尚未从源钱包中扣除,请点击 process transaction button,然后在显示的弹窗中确认操作。 这将再次启动交易执行,完成后该交易将被分配最终状态。 您可以使用 **更新余额** 选项,一次性向客户的钱包和交易账户存入不同金额。 如需继续,请准备一个包含以下信息的 CSV 文件:已注册客户的电子邮箱地址、需入金的账户 ID 以及入金金额。 下载 `template_update_balances.csv` 文件,以确保您的 CSV 文件包含正确的标题(例如 `Email,AccountID,Amount`)以及可用于更新余额的正确结构化数据。 请注意以下事项: * CSV 文件中的行数不得超过 800 行。 * 请使用逗号( , )分隔 CSV 文件中的数据项。不接受其他分隔符。 * 请使用点( . )作为小数分隔符来指定入金的小数金额。 * 如果某个客户账户在 CSV 文件中多次出现,其余额将根据出现次数进行更新。 * **更新余额** 选项会更新模拟账户和已归档账户的余额。为防止向已归档账户入金,请确保您的 CSV 文件不包含已归档账户的 ID。 在不同平台之间迁移客户账户时,请勿使用 **更新余额** 选项入金。此选项禁止用于此类交易。 要更新客户余额: 导航至 **客户** > **账户**。 点击页面右上角的 **+更新余额**。 在 **更新余额** 弹出窗口中,点击 **上传 csv 文件**,然后选择一个包含更新客户账户余额所需信息的 CSV 文件。 要执行操作,请点击 **保存**。 资金将通过 **手动** 方法存入客户账户(详情请参阅[如何添加手动入金或出金方法](../manage-payment-methods/how-to-add-the-manual-deposit-or-withdrawal-method))。 若要停止将入金或出金状态与外部支付系统同步,请在 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中将其移至 **Failed**。 将交易移至 **Failed**: 在相关的 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中,点击 **Move to failed**。 在显示的弹窗中,填写以下字段: * 在 **Error code** 下拉列表中,选择以下失败原因之一: * **Operation not found** — 表示无法在外部支付系统中找到该交易。 * **Operation failed** — 表示该交易在外部支付系统中失败。 * **Other error** — 表示上述选项未涵盖的其他任何原因。 * 在 **Error description** 字段中,可选填将交易标记为失败的原因。 * 若要确认操作,请解答一道简单的数学题,并在 **Verification code** 字段中输入结果。 将交易移至失败 点击 **OK** 以更改交易状态。 交易状态设为 **Failed** 后,该请求将被标记为 **Rejected**。 ## 将交易移至 In progress [#move-a-transaction-to-in-progress] 要继续将入金或出金状态与外部支付系统同步,请在 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中将其移至 **In progress**。这将恢复该交易的 [Polling job](how-to-process-transactions-with-the-assistance-status#polling-job) 流程。 要将交易移至 **In progress**: 在相关的 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中,点击 **Move to in progress**。 请根据 [Deposit/Withdrawal information](how-to-process-transactions-with-the-assistance-status#depositwithdrawal-information) 中显示的 **Payment provider identifier** 状态继续操作。 如果 **Payment provider identifier** 标记为 `Verified`,将显示以下弹窗: 将已验证的交易移至 in progress 要确认操作,请解决一个简单的数学题,并在 **Verification code** 字段中输入结果。 如果 **Payment provider identifier** 标记为 `Unverified`,您必须前往外部支付系统,确认相关交易存在并复制其标识符。 将未验证的交易移至 in progress 在显示的弹窗中,填写以下字段: * 在 **Identifier** 字段中,指定外部支付系统中的交易标识符。 * 要确认操作,请解决一个简单的数学题,并在 **Verification code** 字段中输入结果。 点击 **OK** 以更改交易状态。 交易状态设置为 **In Progress** 后,该请求将标记为 **Approved**。此请求状态并不表示交易已成功完成,而是表示与外部支付系统的同步已恢复。 如果交易在重复同步期间再次被分配为 **Unexpected** 状态,系统将在 [Clients > Requests](../../back-office-guide/clients/requests) 中自动创建一个新的状态为 **Pending** 的 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求,该请求将再次需要手动处理。 仅当 [Polling job](how-to-process-transactions-with-the-assistance-status#polling-job) 流程的最新尝试状态为 **Unprocessable**(表示必须手动完成)时,才可以在 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中将入金或出金移至 **Success**。 在将交易移至 **Success** 前,您必须在外部支付系统中验证相应交易存在且已成功执行;否则,该交易可能会被错误地标记为成功,从而导致客户余额出现差异。 要将交易移至 **Success**: 在相关的 **PaymentSystem Deposit Assistance** 或 **PaymentSystem Withdrawal Assistance** 请求中,点击 **Move to success**。 在显示的弹窗中,填写以下字段: * 在 **Final amount** 字段中,输入要存入或从客户钱包中提取的金额。该金额必须使用发起交易时所用的货币。 如果客户以一种货币发起交易,但以另一种货币完成付款,您必须手动换算金额,并输入其在发起交易时所用货币中的等值金额。该金额将存入或从客户钱包中扣除。 * 要确认操作,请解答一个简单的数学题,并在 **Verification code** 字段中输入结果。 将入金移至成功 点击 **OK** 以更改交易状态。 交易状态设置为 **Success** 后,该请求将被标记为 **Approved**。 ## 问题 [#problem] 登录 B2CORE UI 并完成 2FA(如已启用)后,客户遇到 `404 Not Found` 错误并看到空白页面。 ## 可能原因 [#possible-reasons] 如果客户因基于**验证级别**或**客户类型**的限制而无权查看主菜单,则可能会发生此问题。 ## 解决方案 [#solution] 要检查并更新主菜单可见性设置: 在 Back Office 中,导航至 **Promotion** > **Menu**。 确保 **General** 行的 **Visible** 列中的开关已启用。如果该开关处于禁用状态,客户输入凭据后将一直停留在 **Sign In** 页面。 主菜单可见性选项 点击 **General** 行中的 **Edit** 按钮以打开详细信息。 检查 **Verification level allowance** 和 **Client type allowance** 列表。确保客户的验证级别和客户类型包含在这些列表中;否则,该客户将无法看到主菜单。 主菜单的验证级别和客户类型限制 点击 **Save** 以应用更改。 点击 **General** 行中的**眼睛**图标以查看菜单树。 菜单树 确认您希望在主菜单中显示的所有菜单项均已启用 **Visible** 开关。 对于每个菜单项,点击 **Edit** 按钮并检查 **Verification level allowance** 和 **Client type allowance** 列表。如有必要,请进行调整。 必须为 **General** 行和所有必需菜单项启用 **Visible** 开关。此外,必须正确配置 **General** 行和菜单项的 **Verification level allowance** 及 **Client type allowance** 列表,以确保具有相应验证级别和客户类型的客户可以访问菜单。 ## 问题 [#problem] 客户在 **iOS** 或 **Android** 上使用移动应用时,可能会遇到各种登录问题,例如: * **登录** 按钮无响应 * 登录后会话立即关闭 * 有效凭据未被接受 * 生物识别选项(Face ID 或指纹)无法使用 ## 可能原因 [#possible-reasons] * 后台进程干扰应用 * 会话数据已过期或损坏 * 应用版本过旧或安装已损坏 * 设备操作系统未更新 * 与缓存相关的问题(仅限 Android) ## 解决方案 [#solution] 要解决大多数登录问题: ### 强制关闭并重新打开应用 [#force-close-and-reopen-the-app] 有时后台进程会导致意外问题。请从最近使用的应用中完全关闭该应用,然后重新打开。 ### 退出应用后重新登录 [#sign-out-of-the-app-and-sign-in-again] 如果会话很快过期,请手动退出应用(如可以),然后重新登录。 ### 重新安装应用 [#reinstall-the-app] * 卸载应用。 * 从 **App Store**(iOS)或通过 APK 文件(Android)下载并重新安装。 ### 更新应用 [#update-the-app] * 在 **App Store**(iOS)或通过 APK 文件(Android)检查最新版本。 * 安装更新以确保兼容性并修复错误。 ### 检查操作系统更新 [#check-for-os-updates] * 在 iOS 上,前往 **设置** > **通用** > **软件更新**。 * 在 Android 上,前往 **设置** > **关于手机** > **系统更新**(或 **软件更新**,具体取决于您的设备)。 * 安装所有可用更新,因为过时的操作系统版本可能导致兼容性问题。 ### 清除应用缓存(仅限 Android) [#clear-app-cache-for-android-only] 前往 **设置** > **应用** > **\{App name}** > **存储** > **清除缓存**。 ## 问题 [#problem] 客户无法在 B2CORE UI 中提交验证请求,并遇到错误。 ## 可能原因 [#possible-reasons] 此问题可能由以下一个或多个原因导致: * 客户无法使用所需的验证级别。 * KYC 提供商连接未在 B2CORE Back Office 中正确配置或已被禁用。 * 您的 KYC 提供商订阅或套餐无效、未激活或未付款。 ## 解决方案 [#solution] 要解决验证问题: ### 检查验证级别的可用性 [#check-the-availability-of-verification-levels] * 在 Back Office 中,导航至 **验证** > **级别**。 * 在 **级别** 页面上,检查 **可见** 列,并确保相关级别已标记为可见,以便客户可以获得该级别。 * 要使该级别可见,请点击 **编辑** 按钮以打开级别详情,并在 **可见** 下拉列表中选择 **是**。 * 点击 **保存** 以应用更改。 ### 检查 KYC 提供商连接设置 [#check-the-kyc-provider-connection-settings] * 在 Back Office 中,导航至 **系统** > **外部连接**。 * 找到用于验证的提供商连接,例如 **SumSub**、**ShuftiPro** 或其他提供商。 * 点击相关连接的 **编辑** 按钮以打开其详情。 * 查看连接设置,并在必要时进行调整。 * 确保该连接已启用。 有关详情,请参阅: * [如何使用 SumSub](../../how-to-articles/manage-verification-options/how-to-use-sumsubstance) * [如何使用 ShuftiPro](../../how-to-articles/manage-verification-options/how-to-use-shuftipro) ### 验证您的 KYC 提供商订阅或套餐是否有效、已付款且处于活跃状态 [#verify-that-your-kyc-provider-subscription-or-plan-is-valid-paid-and-active] 如果订阅已过期或未激活,客户将无法通过 KYC 提供商提交验证请求。 {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} 本文介绍当交易涉及货币转换时,B2CORE UI 中 **Pay** 和 **Receive** 字段的金额计算方式。 对于此类交易,最终金额取决于以下因素: * 应用于 **Pay** 和 **Receive** 字段金额的**舍入规则**。 * 已配置的**货币精度**,其定义了交易中涉及的源货币和目标货币所支持的小数位数。 ## 舍入规则 [#rounding-rules] 在 B2CORE 中,**Pay** 和 **Receive** 字段采用不同的舍入规则: * **Pay** 字段:金额始终**向上取整**。这可确保经纪商不会因舍入差异而损失利润。 * **Receive** 字段:金额始终根据目标货币的精度**向下取整**。 ## 货币精度 [#currency-scales] B2CORE 中用于交易的所有货币均已配置**精度**,用于定义允许的小数位数。该精度决定了涉及该货币的任何交易的舍入精确度。 您可以通过前往 **Currencies** > **Currencies**、打开货币详情,并在 **Precision** 字段中设置所需值,为每种货币配置精度。 例如: * **THB**(泰铢):精度 `0`(无小数位) * **USD**(美元):精度 `2 `(两位小数) ## 示例 [#example] 假设客户发起向 **USD** 钱包入金,并使用 **THB**(泰铢)支付。 * 当 **THB** 的精度为 `0`(无小数位)时: * 在 **Receive** 字段中输入 **245 USD** → **Pay** 字段显示 **7,968 THB**。 * 在 **Pay** 字段中输入 **7,968 THB** → **Receive** 字段显示 **245.01 USD**。 精度为 0 的 THB * 当 **THB** 的精度为 `1`(一位小数)时: * 在 **Receive** 字段中输入 **245 USD** → **Pay** 字段显示 **7,967.4 THB**。 * 在 **Pay** 字段中输入 **7,967.4 THB** → **Receive** 字段显示 **245 USD**。 精度为 1 的 THB 出现不匹配是因为精度 `0` 无法保留小数值,而精度为 `1` 或更高时允许使用小数金额,从而实现更精确的货币转换。 本说明介绍如何添加使用可通过 PSS 连接到 B2CORE 的支付系统的入金和出金方式。支付系统服务(Payment System Service,PSS)是一项新的 B2CORE 服务,可提供与外部支付服务商和收银台系统的增强连接。 在 [Integration > Payment systems](../../integrations/payment-systems) 中,**PSS-supported** 列标记为 `Yes` 的支付系统可通过 PSS 连接。 ## 常规流程 [#general-procedure] 在 B2CORE 中添加入金和出金方式之前,请确保您已注册所选支付系统,并在该系统中拥有有效账户。 为支持通过 PSS 连接的支付系统添加入金或出金方式的流程包括两个步骤: 在 **System** > **External connections** 中配置与支付系统的连接。 如果该支付系统同时支持入金和出金,并且您计划将其用于这两种操作,则必须创建两个独立连接:一个用于入金,另一个用于出金。 详情请参阅[步骤 1:如何配置与 PSS 支持的支付系统的连接](#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system)。 添加将使用所选支付系统的入金或出金方式。 * 要添加入金方式,请导航至 **System** > **Deposit system** > **Deposit methods**。 * 要添加出金方式,请导航至 **System** > **Payout system** > **Payout methods**。 详情请参阅[步骤 2:如何添加入金或出金方式](#step-2-how-to-add-a-deposit-or-withdrawal-method)。 ## 步骤 1:如何配置与 PSS 支持的支付系统的连接 [#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system] 如果支付系统同时支持入金和出金,并且您打算将其用于这两种操作,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置与支付系统的连接: 导航至 **System** > **External connection**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 配置将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 配置将用于出金方式的连接。 在出现的 **Driver** 下拉列表中,选择要用于入金或出金方式的支付系统。 在出现的 **Credentials** 部分中,填写所选支付系统所需的特定连接设置。 点击 **Save** 创建连接。 该连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 应用更改。 现在,该连接已可用于添加入金或出金方式。 ## 步骤 2:如何添加入金或出金方式 [#step-2-how-to-add-a-deposit-or-withdrawal-method] 配置与支付系统所需的连接后,继续添加并设置入金或出金方式: 导航至 **System** > **Deposit system** > **Deposit methods** 或 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加入金方式。 * **PaymentSystemWithdrawal** — 添加出金方式。 选择服务商后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。该方式只能应用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择将用于此方式的支付系统。 * 在 **Connection** 下拉列表中,选择之前配置的与支付系统的[连接](#step-1-how-to-configure-a-connection-to-a-pss-supported-payment-system)。 指定连接后,将显示 **Configuration** 部分,您可能需要在其中配置该方式的其他设置。 如果显示消息 `Configuration form is empty`,则无需进行其他设置。 点击 **Save** 创建方式。 该方式将显示在入金方式列表中。 点击 **Edit** 按钮进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,选择将包含该方式的一个或多个组,例如 **Crypto**、**Fiat** 或两者。 * 在 **Icon** 字段中,指定可在 [支付系统](../../integrations/payment-systems) 中找到的图标名称,以便在 B2CORE UI 中显示该方式的图标。要使用自定义图标,请指定要显示图片的 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡中添加所需货币(有关该选项卡的说明,请参阅 [Deposit methods](../../back-office-guide/system/deposit-system#details) 或 [Payout methods](../../back-office-guide/system/payout-system#details))。 * 如有需要,请在 **Commissions** 选项卡中为方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 点击 **Save** 应用更改。 现已在 B2CORE Back Office 中配置使用所选支付系统的入金或出金方式。 ## 步骤 3:如何测试方式配置 [#step-3-how-to-test-a-method-configuration] 要验证入金或出金方式的配置和连接设置,并确保该方式可正常运行,请使用 **configuration testing**,该功能可在以下情况下使用: * 创建方式期间 * 编辑方式配置期间 * 方式使用期间进行后台测试 ### 如何手动测试方式配置 [#how-to-manually-test-a-method-configuration] 在创建方式或编辑其配置时,请使用手动配置测试,以验证方式连接和配置设置是否正确,然后再保存更改。 要测试方式配置: 导航至 **System** > **Deposit system** > **Deposit methods** 或 **System** > **Payout system** > **Payout methods**。 选择该方式并点击 **Edit** 以打开方式详情。 点击 **Configuration** 表单下方的 **Test configuration** 按钮,以验证方式连接和配置设置。 测试使用两个数据源执行:在 **Configuration** 表单中输入的信息,以及为该方式所选外部连接中指定的 **Credentials**。 测试结果将显示在页面上,并且可能是[方式配置测试结果](#method-configuration-test-results)中列出的结果之一。 ### 如何查看后台方式配置测试结果 [#how-to-view-background-method-configuration-test-results] 成功创建入金或出金方式后,**后台测试流程**将自动启动。系统会按设定的时间间隔验证两个数据源:在 **Configuration** 表单中输入的信息,以及为该方式所选外部连接提供的 **Credentials**。这些检查可能产生[方式配置测试结果](#method-configuration-test-results)中列出的结果之一。 与使用 **Test configuration** 按钮执行的手动测试不同,后台测试可以检测在创建或编辑方式时不存在、但之后因支付系统行为变化而出现的问题。 要查看后台测试结果: 导航至 **System** > **Deposit system** > **Deposit methods** 或 **System** > **Payout system** > **Payout methods**。 选择该方式并点击 **Edit** 以打开方式详情。 转到 **Test configuration** 选项卡以查看后台测试结果。 使用 **Test configuration** 按钮执行的手动配置测试不会影响后台测试结果,也不会显示在此选项卡中。 后台测试结果显示如下。 首次创建方式且完成 **Configuration** 表单(如适用)后,以及创建包含 **Credentials** 的外部连接时,**Configuration** 和 **Credentials** 记录都将被分配 **version 1**。当前版本会显示在选项卡的右下角。 New method configuration testing 每当更新 **Configuration** 或方式所使用外部连接中的关联 **Credentials** 时,系统都会自动增加相应的版本号。创建新版本后,将自动启动该版本的后台测试。因此,测试结果可能与之前的结果不同。 Updated method configuration testing 更新 **Configuration** 或 **Credentials** 后: * 相应版本会增加。 * 新版本的后台测试将启动,且可能需要一些时间。 * 之前测试的结果将变为过期: * 它们将被移至 **Previous** tests 部分。 * 其 **Relevance** 值将变为 `Old`。 新版本的后台测试完成后: * 最新测试结果将成为当前结果。 * **Relevance** 值将变为 `Actual`,表明结果对应于当前配置版本。 即使未更新 **Configuration** 或相应外部连接中的 **Credentials** 版本,后台测试结果也可能发生变化。出现这种情况的原因可能包括外部支付系统暂时不可用、外部服务 API 发生变化或测试过程中出现错误。在此类情况下,选项卡中也会显示新的后台测试结果。 ### 方式配置测试结果 [#method-configuration-test-results] 配置测试可能返回以下结果之一,表示入金或出金方式的当前状态: * **Authorized** — 已成功通过支付系统认证。支付系统账户拥有执行金融操作所需的足够权限。 Successful — Authorized * **Available** — 已成功通过支付系统认证。此状态不保证账户拥有创建入金或出金操作的权限。 Successful — Available * **Failed** — 配置测试失败。此状态包含错误代码和说明。 Failed * **Unexpected** — 出现意外的配置测试结果。此状态包含错误代码和说明。 Unexpected * **Not implemented** — 此支付驱动程序尚未实现配置测试。 Not implemented **另请参阅** [如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods) [如何限制入金和出金方式的使用](how-to-restrict-the-use-of-deposit-and-withdrawal-methods) [如何处理状态为 Assistance 的交易](../manage-finances/how-to-process-transactions-with-the-assistance-status) 本说明介绍如何使用非 PSS 连接,为尚未迁移到新版 [B2CORE 支付系统服务 (PSS)](../../integrations/payment-systems#payment-system-service-pss) 的支付系统添加入金和出金方式。 非 PSS 系统在 [集成 > 支付系统](../../integrations/payment-systems) 的 **PSS-supported** 列中标记为 `No`。 在 B2CORE 中添加入金和出金方式之前,请确保您已注册所选支付系统,并在该系统中拥有有效账户。 要添加并设置入金或出金方式: 在 B2CORE Back Office 中,前往 **系统** > **入金系统** > **入金方式**,或\ 前往 **系统** > **出金系统** > **出金方式**。 点击页面右上角的 **+创建**。 在显示的页面中,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。该标题将分配给 Back Office 中的方式,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉列表中,选择要用于入金或出金的支付系统。 * 在显示的 **货币** 下拉列表中,选择用于入金或出金的货币。创建方式后,您可以在 **TR Currencies** 选项卡中为其添加多种货币。 * 将 **连接** 字段留空。 点击 **保存** 以创建该方式。创建的方式默认已启用。 在列表中找到新创建的方式,然后点击该方式行中的 **编辑** 按钮。 在 **设置** 选项卡中,选择应包含该方式的一个或多个组,例如 **法币**、**加密货币** 或两者。 在 **图标** 字段中,指定可在 [支付系统](../../integrations/payment-systems) 中找到的图标名称,以便在 B2CORE UI 中显示该方式的图标。若要使用自定义图标,请指定要显示的图片 URL。 根据您选择作为提供商的支付系统,您可能需要在 **提供商设置** 部分配置提供商特有的其他选项。 查看 **TR Currencies** 和 **PS Currencies** 选项卡中添加的货币,并在必要时添加更多货币(有关选项卡说明,请参阅[入金方式](../../back-office-guide/system/deposit-system#details)或[出金方式](../../back-office-guide/system/payout-system#details))。 如有需要,请在 **佣金** 选项卡中为这些方式配置佣金(有关详细信息,请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 点击 **保存** 以应用更改。 点击 **测试连接** 以验证连接设置。 现在,使用所选支付系统的入金或出金方式已在 B2CORE Back Office 中配置完成。 **另请参阅** [如何添加手动入金或出金方式](how-to-add-the-manual-deposit-or-withdrawal-method) [如何添加 Constructor 入金或出金方式](how-to-add-the-constructor-deposit-or-withdrawal-method) [如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods) [如何限制入金和出金方式的使用](how-to-restrict-the-use-of-deposit-and-withdrawal-methods) 当需要进行自定义以满足特定需求时,您可以使用 **Constructor** 方式进行入金或出金。 使用 **Constructor** 方式,您可以添加和配置客户在 B2CORE UI 中进行入金或出金时必须填写的字段。当客户必须提供额外信息(例如银行信息、付款参考信息或所需文件)时,此灵活性非常有用。 通过确保收集所有必要信息,这些方式有助于简化入金和出金处理流程。 要添加用于入金或出金的 **Constructor** 方式: 导航至 **System** > **Deposit system** > **Deposit methods**,或\ 导航至 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称,例如 `Constructor`。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的方式,并会在 B2CORE UI 中向客户显示。 * 在 **Provider** 下拉列表中,选择 **Constructor**。 * 在显示的 **Currency** 下拉列表中,选择用于入金或出金的货币。创建方式后,您可以在 **TR Currencies** 选项卡中为其添加多种货币。 * 将 **Connection** 下拉列表留空。 点击 **Save** 以创建方式。 **Constructor** 方式将显示在方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段设置: * 在 **Settings** 选项卡中,选择应包含该方式的一个或多个组,例如 **Fiat**、**Crypto** 或两者。 * 查看在 **TR Currencies** 和 **PS Currencies** 选项卡中添加的货币,并在必要时添加更多货币(有关选项卡说明,请参阅 [Deposit methods](../../back-office-guide/system/deposit-system#details) 或 [Payout methods](../../back-office-guide/system/payout-system#details))。 * 检查方式状态。 在完全完成方式配置之前,请保持方式处于未激活状态(**Enabled** 字段中显示 **No**),其中包括添加[自定义字段](#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method)。完成后,激活该方式。 点击 **Save** 以应用更改。 **Constructor** 方式的初始设置已完成。接下来,继续添加所需的自定义字段。 ## 如何为 Constructor 入金或出金方式添加自定义字段 [#how-to-add-custom-fields-for-the-constructor-deposit-or-withdrawal-method] 您可以为使用 **Constructor** 提供商的入金和出金方式添加并设置自定义字段。 要添加自定义字段: 导航至 **System** > **Deposit system** > **Deposit methods**,或\ 导航至 **System** > **Payout system** > **Payout methods**。 选择使用 **Constructor** 提供商的入金或出金方式。 点击 **Edit** 进入方式详情。 在 **Settings** 选项卡中,导航至 **Custom fields** 部分,然后点击 **Add field**。 在 **Add field** 弹出窗口中,填写以下字段: * 在 **Caption** 字段中,输入字段名称。该名称将显示在 B2CORE UI 中。 您还可以通过点击 **Caption** 字段右侧的按钮,并为所需语言提供翻译,来为字段名称添加本地化内容。在 B2CORE UI 中切换语言时,字段名称将根据所选语言显示。 * 在 **Type** 下拉列表中,选择字段类型。可用类型如下: * **Text** — 添加文本字段。 * **Select with autocomplete** — 添加具有预定义选项的字段。当客户开始在此字段中输入内容时,将显示与输入字符匹配的选项,使客户能够选择所需选项。 * **File** — 添加用于附加入金或出金所需文件的字段。 点击 **Save** 以添加自定义字段。 要配置新添加字段的属性,请点击字段行中的 **Edit** 按钮: * 在显示的 **Main field settings** 部分中,您可以通过在 **Rules** 字段中选择 `required` 将字段设为必填。 * 对于 **Select with autocomplete** 类型的字段,添加预定义选项列表。选项可以手动添加,也可以通过连接到适当的 API 资源自动上传(有关详情,请参阅[如何上传自定义字段的预定义选项列表](#how-to-upload-a-list-of-predefined-options-for-a-custom-field)) * 对于 **File** 类型的字段,在 **Document type** 下拉列表中,选择客户应附加的文件类型。可用文件类型列表包含在 **Verification** > **Document types** 页面上配置的所有类型。 客户可以附加 JPEG、PNG 或 PDF 格式的文件,文件大小最大为 3 MB。 完成方式配置后,在 **Enabled** 下拉列表中选择 **Yes** 以激活该方式。 点击 **Save** 以应用更改。 当客户使用 **Constructor** 方式进行入金或出金时,系统会按照字段在 Back Office 的 **Custom fields** 部分中列出的顺序向他们显示所添加的自定义字段。 ## 如何上传自定义字段的预定义选项列表 [#how-to-upload-a-list-of-predefined-options-for-a-custom-field] 对于每个 **Select with autocomplete** 类型的自定义字段,您可以自动上传预定义选项,供客户在 B2CORE UI 中进行入金或出金时选择。 例如,您无需手动为“Bank name”字段添加银行名称作为预定义选项,而是可以从为应用程序 API 定义的适当资源中获取这些选项。 要上传自定义字段的预定义选项列表: 导航至使用 **Constructor** 提供商的入金或出金方式详情。 在 **Settings** 选项卡中,导航至 **Custom fields** 部分。 选择要上传预定义选项列表的 **Select with autocomplete** 类型字段(例如“Bank name”),然后点击 **Edit**。 导航至显示在 **Custom fields** 列表下方的 **Field dynamic options** 部分,并指定以下字段: * 在 **Endpoint** 字段中,指定包含要用作所选自定义字段预定义选项的字段值的特定 API 资源 URL(例如以下示例端点:`https://[host]/api/banks`)。 指定 API 资源的结构显示在 **Endpoint result preview** 字段中。以下示例说明了一种可能的资源结构: ```json [ { "bankId": 1, "bankName": "Bank name 1", "countryCode": "AE", "countryName": "UAE" }, { "bankId": 2, "bankName": "Bank name 2", "countryCode": "AE", "countryName": "UAE" }, { "bankId": 3, "bankName": "Bank name 3", "countryCode": "GE", "countryName": "Georgia" }, { "bankId": 4, "bankName": "Bank name 4", "countryCode": "GE", "countryName": "Georgia" }, { "bankId": 5, "bankName": "Bank name 5", "countryCode": "MZ", "countryName": "Mozambique" } ] ``` * 在 **Options from key** 下拉列表中,选择指定 API 资源的根元素(例如 `root`)。 * 在 **Option value from key** 下拉列表中,选择指定要为自定义字段显示的预定义选项值的资源字段(例如 `bankId`)。 * 在 **Option caption from key** 下拉列表中,选择指定预定义选项标题的资源字段(例如 `bankName`)。 点击 **Save** 以应用更改。 在 B2CORE UI 中,“Bank name”自定义字段的预定义选项列表将包含从示例 API 资源的 `bankName` 字段中获取的所有值。 ## 如何为自定义字段动态生成预定义选项列表 [#how-to-dynamically-form-a-list-of-predefined-options-for-a-custom-field] 自定义字段的预定义选项列表可以动态生成,可用选项会根据关联字段中的选择而变化。 例如,“Bank name”字段的预定义选项列表可以取决于在“Country”字段中选择的国家。 要生成动态预定义选项列表,两个关联的自定义字段都必须填充从同一 API 资源中获取的选项(有关详情,请参阅[如何上传自定义字段的预定义选项列表](#how-to-upload-a-list-of-predefined-options-for-a-custom-field))。 要为自定义字段动态生成预定义选项列表: 导航至使用 **Constructor** 提供商的入金或出金方式详情。 在 **Settings** 选项卡中,导航至 **Custom fields** 部分。 选择要为其生成动态预定义选项列表的 **Select with autocomplete** 类型字段(例如“Bank name”),然后点击 **Edit**。 导航至显示在 **Custom fields** 列表下方的 **Field dynamic options** 部分,并指定以下字段设置: * 在 **Depends on field** 下拉列表中,选择要与“Bank name”字段关联的另一个自定义字段(例如“Country”)。 * 在 **Depends on field by key** 下拉列表中,选择将用于筛选“Bank name”字段选项的资源字段(例如 `countryCode`)。 自定义字段的动态选项 点击 **Save** 以应用更改。 在 B2CORE UI 中,为“Bank name”字段显示的银行名称列表将根据客户在“Country”字段中选择的国家进行筛选。 您可以使用**手动**入金和出金方式,在 Back Office 中为客户进行入金和出金操作。 要使**手动**方式正常运行,您必须在 **Currencies** > **Rates** 中为计划使用此方式的所有货币配置汇率。这些汇率用于计算验证级别设置中指定的入金和出金**每日**及**每月限额**(详情请参阅[如何按验证级别设置入金、出金和转账限额](../manage-verification-options/how-to-use-the-kyc-constructor#how-to-set-up-deposit-withdrawal-and-transfer-limits-by-verification-levels))。由于限额以 `USD` 计算,因此必须为添加到**手动**方式的每种货币配置兑换为 `USD` 的汇率。 例如,如果您使用**手动**方式将 `EUR` 资金存入以 `EUR` 计价的客户钱包,仍需要 `EURUSD` 汇率来计算客户的每日和每月入金限额;否则,处理入金时将发生错误。 若要添加用于入金和出金的手动方式: 前往 **System** > **Deposit system** > **Deposit methods**,或\ 前往 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称,例如 `manual`。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该方式的标题,例如 `Manual Deposit` 或 `Manual Withdrawal`。 * 在 **Provider** 下拉列表中,选择 **manual**。 * 在显示的 **Currency** 下拉列表中,选择用于入金或出金的货币。创建方式后,您可以在 **TR Currencies** 标签页中为其添加多种货币。 * 将 **Connection** 下拉列表留空。 点击 **Save** 以创建该方式。 手动方式将显示在方式列表中,并且默认已启用。 若要为使用此方式的入金或出金添加更多货币,请点击 **Edit** 以打开方式详情。 在 **TR Currencies** 标签页中,添加所需货币。 点击 **Save** 以应用更改。 现在,**手动**方式已准备就绪,可通过 Back Office 使用所选货币进行入金或出金。 **另请参阅** [如何创建入金](../manage-finances/how-to-create-a-deposit) [如何创建出金](../manage-finances/how-to-create-a-payout) 对于入金和出金方式,您可以配置佣金。当客户在 B2CORE UI 中进行入金或出金时,将从其款项中扣除该佣金。 要配置佣金: 导航至 **System** > **Deposit system** > **Deposit methods** 或\ **System** > **Payout system** > **Payout methods**。 选择该方式,然后点击该方式行中的 **Edit** 按钮。 在 **Edit method** 页面中,转到 **Commissions** 选项卡并点击 **+Add**。 在 **Create commission** 弹窗中,填写以下字段: * 在 **Currency** 下拉列表中,选择佣金币种。 * 在 **Type** 下拉列表中,选择佣金类型 **TR** 或 **PSP**(详情请参阅[入金方式](../../back-office-guide/system/deposit-system#commissions-tab)和[出金方式](../../back-office-guide/system/payout-system#commissions-tab))。 * 在下图所示的相应字段中输入佣金费率。 配置佣金的字段 这些字段的使用遵循以下公式: `最低佣金金额 (1) <= 固定费率 (2) + 百分比费率 % (3) <= 最高佣金金额 (4)` 您可以设置固定佣金费率、百分比佣金费率,或两者的组合。 * 要设置固定佣金费率,请在字段 `2` 中输入佣金金额。无论交易金额是多少,每笔入金或出金交易均会收取指定的佣金金额。 对于固定佣金费率,请将其他字段留空。 * 要设置百分比佣金费率,请在字段 `3` 中输入百分比值。入金或出金金额的指定百分比将作为佣金收取。 对于百分比佣金费率,建议您在字段 `1` 中设置最低佣金金额,并在字段 `4` 中设置最高佣金金额。佣金不能低于最低金额或超过最高金额。 * 如果同时在字段 `2` 中输入固定费率,并在字段 `3` 中输入百分比费率,则佣金将计算为固定金额与入金或出金金额的指定百分比之和。 对于组合佣金,同样建议您设置最低和最高佣金金额。 点击 **Save**,将佣金设置应用于所选方式。 ## 示例 [#example] 假设 `USD` 入金的佣金费率配置如下: `15 ≤ 10 + 5% ≤ 50` 在此情况下: * 佣金金额计算为入金金额的 5%,加上 10 USD 的固定费率。 * 佣金金额不得低于 15 USD,也不得超过 50 USD。 如果支付提供商成功处理入金后,客户账户中入账 100 USD,则佣金计算如下: `10 + (100 * 0.05) = 15 USD` 如果客户账户中入账 1,000 USD,则佣金计算如下: `10 + (1,000 * 0.05) = 60 USD`,这超过了最高佣金限额。因此,佣金将限制为 `50 USD`。 [1-2-Pay](https://1-2-pay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE。它支持通过二维码入金以及向银行账户出金,并以 `THB` 处理。 请按照以下说明配置 1-2-Pay 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与为 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)相对应,但包含 1-2-Pay 特有的详细信息。 在继续以下说明之前,您必须已注册 1-2-Pay 并拥有有效账户。 配置 1-2-Pay 连接所需的所有信息,包括 **API start base URL**、**API sync base URL** 及其他凭据,均须向 1-2-Pay 支持团队获取。 ## 配置 1-2-Pay 连接 [#configure-connections-to-1-2-pay] 如果您计划将 1-2-Pay 同时用于入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置至 1-2-Pay 的连接: 在 B2CORE Back Office 中,前往 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面中,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_1-2-Pay` 或 `Withdrawals_1-2-Pay`)。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **提供商** 下拉菜单中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在出现的 **驱动程序** 下拉菜单中,选择 **1-2-PAY**。 在出现的 **凭据** 部分中,配置 1-2-Pay 专用设置: * 在 **Sandbox** 下拉菜单中,选择: * **Yes** — 用于沙盒测试环境。 * **No** — 用于生产环境。 * 在 **API start base URL** 字段中,指定由 1-2-Pay 提供的、用于创建付款请求的基础 URL。 * 在 **API sync base URL** 字段中,指定 B2CORE 用于接收和验证回调的基础 URL,该 URL 同样由 1-2-Pay 提供。 ### 关于 URL 的要点 [#key-points-about-urls] * **API start base URL** 和 **API sync base URL** 是不同的端点,必须直接向 1-2-Pay 获取。 * 请确保始终使用 HTTPS,例如: * API start base URL:`https://api.example.com/` * API sync base URL:`https://inquiry.example.com/` * 1-2-Pay 为每个环境提供特定的 URL。沙盒 URL 与生产环境 URL 不同,因此请务必获取两组 URL,并在配置中使用相应的 URL。 * 在 **Channel** 字段中,输入 1-2-Pay 为您的集成分配的渠道。 * 在 **Partner code** 字段中,输入 1-2-Pay 为您的公司分配的合作伙伴代码。 * 在 **Auth key** 字段中,输入由 1-2-Pay 提供的、用于签署请求的 API 密钥。 点击 **保存** 以创建连接。 **1-2-Pay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**已启用** 列显示 **No**),请点击 **编辑** 按钮打开连接详情,并将 **已启用** 下拉菜单设置为 **Yes**。 点击 **保存** 以应用更改。 如果您需要通过 1-2-Pay 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 1-2-Pay 添加入金方式 [#add-a-deposit-method-through-1-2-pay] 要添加并设置通过 1-2-Pay 入金的方式: 在 B2CORE Back Office 中,前往 **系统** > **入金系统** > **入金方式**。 点击页面右上角的 **+创建**。 在 **创建入金方式** 页面中,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。该标题将分配给 Back Office 中的方式,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉菜单中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **可用账户货币** 下拉菜单中,选择一种或多种货币。通过 1-2-Pay 入金将适用于以所选货币计价的账户。必须为这些货币配置 `THB` 的兑换汇率。 * 在 **驱动程序** 下拉菜单中,选择 **1-2-PAY**。 * 在 **连接** 下拉菜单中,选择先前配置的 [1-2-Pay 连接](#configure-connections-to-1-2-pay)。 跳过 **配置** 部分,因为 1-2-Pay 入金方式无需任何设置。 点击 **保存** 以创建入金方式。 **1-2-Pay** 入金方式将显示在入金方式列表中。 点击 **编辑** 以进入方式详情,并完成以下字段: * 在 **设置** 选项卡中,使用 **组** 下拉菜单选择应包含该方式的一个或多个组。 * 在 **图标** 字段中,指定 `paymethod-12pay`,以在 B2CORE UI 中显示 1-2-Pay 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图片 URL。 * 检查方式状态。 如果方式未启用(**已启用** 字段显示 **No**),请将 **已启用** 下拉菜单设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡中,添加 `THB`。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 1-2-Pay deposit method — Settings tab 点击 **测试配置** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **1-2-Pay** 入金方式。 ## 通过 1-2-Pay 添加出金方式 [#add-a-withdrawal-method-through-1-2-pay] 要添加并设置通过 1-2-Pay 出金的方式: 在 B2CORE Back Office 中,前往 **系统** > **出金系统** > **出金方式**。 点击页面右上角的 **+创建**。 在 **创建出金方式** 页面中,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。该标题将分配给 Back Office 中的方式,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉菜单中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **可用账户货币** 下拉菜单中,选择一种或多种货币。通过 1-2-Pay 出金将适用于以所选货币计价的账户。必须为这些货币配置 `THB` 的兑换汇率。 * 在 **驱动程序** 下拉菜单中,选择 **1-2-PAY**。 * 在 **连接** 下拉菜单中,选择先前配置的[用于出金的 1-2-Pay 连接](#configure-connections-to-1-2-pay)。 跳过 **配置** 部分,因为 1-2-Pay 出金方式无需任何设置。 点击 **保存** 以创建出金方式。 **1-2-Pay** 出金方式将显示在出金方式列表中。 点击 **编辑** 以进入方式详情,并完成以下字段: * 在 **设置** 选项卡中,使用 **组** 下拉菜单选择应包含该方式的一个或多个组。 * 在 **图标** 字段中,指定 `paymethod-12pay`,以在 B2CORE UI 中显示 1-2-Pay 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图片 URL。 * 检查方式状态。 如果方式未启用(**已启用** 字段显示 **No**),请将 **已启用** 下拉菜单设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡中,添加 `THB`。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 1-2-Pay withdrawal method — Settings tab 点击 **测试配置** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **1-2-Pay** 出金方式。 ## 在 1-2-Pay 中设置 Webhook [#set-up-webhooks-in-1-2-pay] 要在 B2CORE 中接收入金和出金的状态更新,必须在 1-2-Pay 端设置通知 Webhook。 ### 从 B2CORE Back Office 复制 Webhook URL [#copy-webhook-urls-from-the-b2core-back-office] 您需要为入金和出金方式分别设置独立的 Webhook URL。 在 B2CORE Back Office 中,前往: * **系统** > **入金系统** > **入金方式** * **系统** > **出金系统** > **出金方式** 找到已配置的 1-2-Pay 入金或出金方式,然后点击 **编辑** 以打开其详情。 前往 **Webhook** 选项卡。 复制 **通知 URL** 字段中显示的 URL。 ### 向 1-2-Pay 提供 URL [#provide-urls-to-1-2-pay] 将复制的 Webhook URL(包括入金和出金的 URL)发送给 1-2-Pay 支持团队,以便其在自身一端进行配置。 [B2BINPAY](https://b2binpay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,支持使用[静态支付详情](#deposits-with-static-payment-details-via-b2binpay)进行入金以及出金。 由于用于连接 B2BIТPAY 的相应驱动程序尚不支持 **Travel Rule** 要求,因此此集成目前不支持 **Travel Rule**。 请按照以下说明配置 B2BINPAY 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 B2BINPAY 的特定详细信息。 在继续执行以下说明之前,您必须已注册 B2BINPAY 并拥有一个活跃钱包。 ## 支持的货币 [#supported-currencies] 有关通过 B2BINPAY 进行入金和出金时支持的货币列表,请参阅 B2BINPAY 文档中的[货币代码](https://docs.b2binpay.com/references/currency-codes)。 ## 配置 B2BINPAY 连接 [#configure-connections-to-b2binpay] 如果您计划将 B2BINPAY 同时用于入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置与 B2BINPAY 的连接: 在 B2CORE Back Office 中,导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_B2BINPAY` 或 `Withdrawals_B2BINPAY`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的显示名称。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemStaticDeposit** — 添加将用于支持**静态支付详情**的入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择 **B2BINPAY V3**。 在显示的 **Credentials** 部分中,配置 B2BINPAY 专用设置: * 在 **API base URL** 字段中,指定 B2BINPAY 为您的集成环境提供的基础 URL。 * 在 **Client ID** 字段中,输入 B2BINPAY 提供的客户端标识符。 * 在 **Client secret** 字段中,输入与您的客户端 ID 关联的密钥。 * 在 **Callback secret** 字段中,输入用于验证来自 B2BINPAY 的回调通知的密钥。 有关详细信息,请参阅 B2BINPAY 文档中的[如何访问 API](https://docs.b2binpay.com/how-tos/manage-your-profile-and-system/how-to-access-api)。 点击 **Save** 以创建连接。 B2BINPAY 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 B2BINPAY 同时支持入金和出金,请按照相同说明为另一项操作创建新的连接。 ## 通过 B2BINPAY 添加入金方式 [#add-a-deposit-method-through-b2binpay] 要添加和设置支持**静态支付详情**的 B2BINPAY 入金方式: 在 B2CORE Back Office 中,导航至 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。该显示名称将分配给 Back Office 中的方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemStaticDeposit**。 选择 **PaymentSystemStaticDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。该方式将可用于向 B2CORE 中以此选项卡添加的货币计价的客户钱包入金。 * 在 **Driver** 下拉列表中,选择 **B2BINPAY V3**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于入金的 B2BINPAY 连接](#configure-connections-to-b2binpay)。 选择连接后,将显示 **Configuration** 表单。您可能会看到消息 `Configuration form is temporarily unavailable.`。请稍候,直至表单可用。 在 **Configuration** 部分中,填写以下字段: * 在 **Wallet** 下拉列表中,选择将用于处理交易的 B2BINPAY 钱包。列表中每个钱包都会显示 B2BINPAY 分配的标识符、钱包类型(**Merchant** 或 **Enterprise**)、钱包货币以及标签(如已在 B2BINPAY 中指定)。 有关详细信息,请参阅[Merchant 和 Enterprise 钱包的区块链选择](#blockchain-selection-for-merchant-and-enterprise-wallets)。 * **Collect personal data** 字段显示 **No**,且无法更改,因为此 B2BINPAY 集成目前不支持 **Travel rule**。 点击 **Save** 以创建入金方式。 B2BINPAY 入金方式将显示在入金方式列表中。 点击 **Edit** 打开方式详情,并填写以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-b2binpay`,以便在 B2CORE UI 中显示该方式的[预定义图标](../../integrations/payment-systems)。若要使用自定义图标,请指定要显示的图像 URL。 * 在 **Rates provider** 下拉列表中,选择 B2BINPAY 作为处理涉及货币兑换的入金时的首选汇率提供商。为此,必须先在 **Currencies** > **Rates** 下将 B2BINPAY 添加为汇率提供商(有关详细信息,请参阅[如何配置货币汇率](../manage-currencies/how-to-configure-currency-exchange-rates))。 * 检查方式状态。 如果方式未启用(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡上,添加可处理入金的货币。这些货币应为在 **Configuration** 部分中选择的 B2BINPAY 钱包所支持的货币。 要通过此方式启用特定货币的入金,请确保该货币已添加到 **PS Currencies** 选项卡中。 B2BINPAY 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,已在 Back Office 中配置支持**静态支付详情**的 B2BINPAY 入金方式,并且该方式可供 B2CORE UI 中的客户使用。 ## 通过 B2BINPAY 添加出金方式 [#add-a-withdrawal-method-through-b2binpay] 要添加和设置通过 B2BINPAY 进行出金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。该显示名称将分配给 Back Office 中的方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。该方式将可用于从 B2CORE 中以此选项卡添加的货币计价的客户钱包出金。 * 在 **Driver** 下拉列表中,选择 **B2BINPAY V3**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于出金的 B2BINPAY 连接](#configure-connections-to-b2binpay)。 选择连接后,将显示 **Configuration** 表单。您可能会看到消息 `Configuration form is temporarily unavailable.`。请稍候,直至表单可用。 在 **Configuration** 部分中,填写以下字段: * 在 **Wallet** 下拉列表中,选择将用于处理交易的 B2BINPAY 钱包。列表中每个钱包都会显示 B2BINPAY 分配的标识符、钱包类型(**Merchant** 或 **Enterprise**)、钱包货币以及标签(如已在 B2BINPAY 中指定)。 有关详细信息,请参阅[Merchant 和 Enterprise 钱包的区块链选择](#blockchain-selection-for-merchant-and-enterprise-wallets)。 * 在 **Blockchain fee level** 下拉列表中,选择 **Low**、**Medium** 或 **High**。 * 在 **Force blockchain** 下拉列表中(仅适用于 **Merchant** 钱包),选择: * **Yes** — 仅使用[链上交易](https://docs.b2binpay.com/references/key-terms?q=fee+level#on-chain-transaction)。 * **No** — 在可能的情况下允许使用[链下交易](https://docs.b2binpay.com/references/key-terms#off-chain-transaction)。 涉及 **Enterprise** 钱包的所有交易始终在区块链上处理。 * **Collect personal data** 字段显示 **No**,且无法更改,因为此 B2BINPAY 集成目前不支持 **Travel rule**。 点击 **Save** 以创建出金方式。 B2BINPAY 出金方式将显示在出金方式列表中。 点击 **Edit** 以进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-b2binpay`,以便在 B2CORE UI 中显示该方式的[预定义图标](../../integrations/payment-systems)。若要使用自定义图标,请指定要显示的图像 URL。 * 在 **Rates provider** 下拉列表中,选择 B2BINPAY 作为处理涉及货币兑换的出金时的首选汇率提供商。为此,必须先在 **Currencies** > **Rates** 下将 B2BINPAY 添加为汇率提供商(有关详细信息,请参阅[如何配置货币汇率](../manage-currencies/how-to-configure-currency-exchange-rates))。 * 检查方式状态。 如果方式未启用(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡上,添加可处理出金的货币。这些货币应为在 **Configuration** 部分中选择的 B2BINPAY 钱包所支持的货币。 要通过此方式启用特定货币的出金,请确保该货币已添加到 **PS Currencies** 选项卡中。 B2BINPAY 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,已在 B2CORE Back Office 中配置 **B2BINPAY** 出金方式。 ## Merchant 和 Enterprise 钱包的区块链选择 [#blockchain-selection-for-merchant-and-enterprise-wallets] 在入金或出金方式的 **Configuration** 部分中,您必须选择用于处理交易的钱包。钱包类型决定如何定义用于处理交易的区块链。 * 使用 **Merchant** 钱包时,客户可根据所选的入金或出金货币,为其交易选择区块链。 例如,如果入金货币为 USDT,则可能会显示 **Ethereum** (ETH)、**Tron** (TRX) 或 **BNB Smart Chain** (BSC) 等可用的区块链选项,具体取决于您在 B2BINPAY 中的 **Merchant** 钱包配置。 * 使用 **Enterprise** 钱包时,处理交易的区块链由钱包货币预先定义。 例如,如果您的 **Enterprise** 钱包持有 **USDT on Ethereum** (ETH),则入金将始终在 **Ethereum** (ETH) 区块链上处理。 ## 通过 B2BINPAY 使用静态支付详情入金 [#deposits-with-static-payment-details-via-b2binpay] 通过 B2BINPAY 使用静态支付详情入金,可让客户在 B2CORE UI 中生成一个或多个特定区块链的入金地址。这些地址会被保存以供将来使用,并可重复用于后续入金。 以下示例展示了 B2CORE UI 中支持**静态支付详情**的 B2BINPAY 入金方式的支付表单。在该表单中,客户可以生成用于在 **Ethereum** (ETH) 或 **Tron** (TRX) 区块链上入金 USDT 的支付详情。生成的地址会被保存,并可重复用于日后的入金。客户可以复制并使用这些地址,而无需在 B2CORE UI 中打开 **Deposit** 页面。 使用静态支付详情的 B2BINPAY 入金方式 请按照以下说明,在 B2CORE Back Office 中配置连接并通过 [B2BINPAY](https://b2binpay.com/) 设置入金和出金方式。 本说明介绍支持 **Travel Rule** 的**非 PSS** B2BINPAY 集成。 ## B2BINPAY 与 Notabene 的集成 [#b2binpay-integration-with-notabene] B2BINPAY 已与 **Notabene** 集成,以确保符合 **Travel Rule** 要求。该规则要求收集加密货币交易(包括入金和出金)的客户数据。**Notabene** 会评估传入的客户数据是否合规,并发出指令以阻止或批准加密货币交易。 在 B2CORE Back Office 中通过 B2BINPAY 设置入金和出金方式时,您可以选择收集并将客户数据传输至 B2BINPAY,以便进一步转发至 **Notabene**,或者使用下文所述的 **Collect personal info option** 禁用数据收集。 继续以下说明前,您必须已注册 B2BINPAY 并拥有一个活跃钱包。 ## 配置与 B2BINPAY 的连接 [#configure-connections-to-b2binpay] 非 PSS B2BINPAY 集成允许您使用单个连接同时配置入金和出金方式。 要配置与 B2BINPAY 的连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`B2BINPAY`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **B2BINPAY**。 点击 **Save** 创建连接。 B2BINPAY 连接将显示在外部连接列表中。 点击 **Edit** 打开连接详情,并填写以下字段: * 在 **Service location** 字段中,输入 B2BINPAY API 的 URL。 * 在 **Login** 和 **Password** 字段中,输入您在 B2BINPAY 中生成的 API 凭据。 有关详细信息,请参阅 B2BINPAY 文档中的 [How to access the API](https://docs.b2binpay.com/how-tos/manage-your-profile-and-system/how-to-access-api)。 检查连接状态。 如果连接未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用连接。 点击 **Save** 应用更改。 配置连接后,您可以使用它通过 B2BINPAY 创建和设置入金及出金方式。 ## 通过 B2BINPAY 添加入金方式 [#add-a-deposit-method-through-b2binpay] 要通过 B2BINPAY 添加和设置入金方式: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`B2BINPAY_Deposits`)。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **B2BINPAY**。 * 在显示的 **Currency** 下拉列表中,选择该方式的币种。创建该方式后,您可以在 **TR Currencies** 选项卡中为其添加多个币种。 * 在 **Connection** 下拉列表中,选择之前配置的 [B2BINPAY 连接](#configure-connections-to-b2binpay)。 点击 **Save** 创建该方式。 B2BINPAY 方式将显示在方式列表中。 点击 **Edit** 打开方式详情,并填写以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-b2binpay`,以便在 B2CORE UI 中显示该方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 * 在 **Rates provider** 下拉列表中,选择 B2BINPAY 作为处理带转换入金时的首选汇率提供商。为此,必须先在 **Currencies** > **Rates** 下将 B2BINPAY 添加为汇率提供商(有关详细信息,请参阅[如何配置货币汇率](../manage-currencies/how-to-configure-currency-exchange-rates))。 在 **Provider settings** 部分中,配置以下 B2BINPAY 专属设置: * 在 **Wallet ID** 下拉列表中,选择将用于处理交易的 B2BINPAY 钱包。 * 在 **Payment page** 下拉列表中,选择 **Local**。 * **Local URL** 字段显示支付页面 URL,例如: `https://{your-Front-Office-URL}/`\ `conversion/payment/qrcode/{address}/{currency}/{message}` * 在 **Client type** 下拉列表中,根据您的钱包类型选择 **Enterprise** 或 **Merchant**。 * 在 **Collect personal info** 下拉列表中,选择: * **No** — 禁用客户个人数据收集。 * **Yes** — 启用客户个人数据收集。数据将发送至 B2BINPAY,然后转发至 **Notabene** 以验证加密货币交易。 在 **TR Currencies** 选项卡中,检查已添加的币种,并根据需要添加更多币种。该入金方式将可用于向 B2CORE 中以此选项卡添加的币种计价的客户钱包入金。 在 **PS Currencies** 选项卡中,添加可处理入金的币种。这些是 B2BINPAY 支持的币种。有关详细信息,请参阅 B2BINPAY 文档中的 [Currency codes](https://docs.b2binpay.com/references/currency-codes)。 要通过此方式启用特定币种的入金,请确保该币种已添加到 **PS Currencies** 选项卡中。 有关详细信息,请参阅[在 PS Currencies 选项卡中添加币种](#add-currencies-on-the-ps-currencies-tab)。 点击 **Test connection** 按钮以验证连接设置。 绿色按钮表示连接已正确配置。 红色按钮表示部分连接设置无效。按钮下方显示的错误会说明需要解决的连接问题。 检查方式状态。 如果该方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活该方式。 点击 **Save** 应用更改。 B2BINPAY 入金方式现已在 Back Office 中配置完成,并可供 B2CORE UI 中的客户使用。 ## 通过 B2BINPAY 添加出金方式 [#add-a-withdrawal-method-through-b2binpay] 要通过 B2BINPAY 添加和设置出金方式: 在 B2CORE Back Office 中,前往 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`B2BINPAY_Withdrawals`)。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **B2BINPAY**。 * 在显示的 **Currency** 下拉列表中,选择该方式的币种。创建该方式后,您可以在 **TR Currencies** 选项卡中为其添加多个币种。 * 在 **Connection** 字段中,选择之前配置的 [B2BINPAY 连接](#configure-connections-to-b2binpay)。 点击 **Save** 创建该方式。 B2BINPAY 方式将显示在方式列表中。 点击 **Edit** 打开方式详情,并填写以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-b2binpay`,以便在 B2CORE UI 中显示该方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 * 在 **Rates provider** 下拉列表中,选择 B2BINPAY 作为处理带转换出金时的首选汇率提供商。为此,必须先在 **Currencies** > **Rates** 下将 B2BINPAY 添加为汇率提供商(有关详细信息,请参阅[如何配置货币汇率](../manage-currencies/how-to-configure-currency-exchange-rates))。 在 **Provider settings** 部分中,配置以下 B2BINPAY 专属设置: * 在 **Fee level** 下拉列表中,选择 **Low**、**Medium** 或 **High**。 * 在 **Wallet ID** 下拉列表中,选择将用于处理交易的 B2BINPAY 钱包。 * 在 **WithdrawDone Notification** 下拉列表中,选择 **No**。 * 在 **Client type** 下拉列表中,根据您的钱包类型选择 **Enterprise** 或 **Merchant**。 * 在 **Destination tag** 下拉列表中,选择: * **Yes** — 如果出金时需要目标标签。 * **No** — 如果出金时不需要目标标签。 这取决于处理出金所使用的区块链。 * 在 **Tag type** 下拉列表中,选择目标标签类型,即 **Numeric** 或 **String**。如果您将 **Destination tag** 下拉列表设置为 **No**,请选择 **Not set**。 * 在 **Off-chain transactions** 下拉列表中,选择: * **Enabled** — 在可能的情况下允许[链下交易](https://docs.b2binpay.com/references/key-terms#off-chain-transaction)。 * **Disabled** — 仅使用[链上交易](https://docs.b2binpay.com/references/key-terms?q=fee+level#on-chain-transaction)。 * 在 **Collect personal info** 下拉列表中,选择: * **No** — 禁用客户个人数据收集。 * **Yes** — 启用客户个人数据收集。数据将发送至 B2BINPAY,然后转发至 **Notabene** 以验证加密货币交易。 在 **TR Currencies** 选项卡中,检查已添加的币种,并根据需要添加更多币种。该方式将可用于从 B2CORE 中以此选项卡添加的币种计价的客户钱包出金。 在 **PS Currencies** 选项卡中,添加可处理出金的币种。这些是 B2BINPAY 支持的币种。有关详细信息,请参阅 B2BINPAY 文档中的 [Currency codes](https://docs.b2binpay.com/references/currency-codes)。 要通过此方式启用特定币种的出金,请确保该币种已添加到 **PS Currencies** 选项卡中。 有关详细信息,请参阅[在 PS Currencies 选项卡中添加币种](#add-currencies-on-the-ps-currencies-tab)。 点击 **Test connection** 按钮以验证连接设置。 绿色按钮表示连接已正确配置。 红色按钮表示部分连接设置无效。按钮下方显示的错误会说明需要解决的连接问题。 检查方式状态。 如果该方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活该方式。 点击 **Save** 应用更改。 B2BINPAY 出金方式现已在 Back Office 中配置完成,并可供 B2CORE UI 中的客户使用。 ## 在 PS Currencies 选项卡中添加币种 [#add-currencies-on-the-ps-currencies-tab] 要添加币种: 点击 **+Add**,然后在下拉列表中选择币种。 为所选币种指定以下参数: * **Block explorer** — 用于跟踪交易的区块链浏览器 URL 模板。 * **Blockchain code** — 用于处理交易的区块链数字标识符。这可确保入金在正确的网络上处理。 这些代码必须取自 B2BINPAY 文档:[Currency codes](https://docs.b2binpay.com/references/currency-codes) 和 [Block explorer list](https://docs.b2binpay.com/references/block-explorer-list)。 ### 示例 [#example] 例如,`USDT` 入金可根据代币标准在不同区块链上处理: 对于 **Tron (TRC20)**,请指定: * **Block explorer**:—`https://tronscan.org/#/transaction/{address}` * **Blockchain code** — 2145 对于 **Ethereum (ERC20)**,请指定: * **Block explorer**:—`https://etherscan.io/tx/{address}` * **Blockchain code** — 2015 对于 **Binance Smart Chain (BSC/BEP20)**,请指定: * **Block explorer**:— `https://bscscan.com/tx/{address}` * **Blockchain code** — 2065 在 **Min** 和 **Max** 字段中,指定最小和最大交易金额。 在 PS Currencies 选项卡中添加币种 点击 **Save** 将币种添加到选项卡中。 根据您的入金和出金方式需要,添加任意数量的币种。 [BridgerPay](https://bridgerpay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,仅支持入金。 请按照以下说明配置 BridgerPay 连接,并在 B2CORE Back Office 中设置入金方法。这些说明与通过 PSS 添加受支持支付系统方法的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 BridgerPay 特有的详细信息。 在继续以下说明之前,您必须已注册 BridgerPay 并拥有有效账户。 ## 在 BridgerPay 账户中创建支付链接 [#create-a-payment-link-in-your-bridgerpay-account] 要在 BridgerPay 中创建支付链接,您需要创建一个支付链接类型的结账页面: 登录您的 BridgerPay 账户。 在主菜单中,前往 **Checkouts**。 点击 **plus** 图标以添加新的结账页面,然后填写以下字段: * 在 **Title** 字段中,输入结账页面的标题。 * 在 **Type** 下拉列表中,选择 **Payment link**。 在 BridgerPay 中创建支付链接 点击 **Create**。 成功创建支付链接类型的结账页面后,用于在 B2CORE Back Office 中配置入金方法的所需凭据将可用。 ## 配置与 BridgerPay 的连接 [#configure-a-connection-to-bridgerpay] 要配置用于入金的 BridgerPay 连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_BridgerPay`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 在出现的 **Driver** 下拉列表中,选择 **BridgerPay**。 在出现的 **Credentials** 部分中,配置 BridgerPay 专用设置: * 在 **API base URL** 字段中,指定 `https://api.bridgerpay.com`。 * 在 **API user name** 和 **API password** 字段中,输入用于访问 BridgerPay API 的凭据。 * 在 **API key** 字段中,输入在您的 BridgerPay 账户中生成的 API 密钥。 点击 **Save** 以创建连接。 **BridgerPay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮以打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 ## 通过 BridgerPay 添加入金方法 [#add-a-deposit-method-through-bridgerpay] 要添加并设置通过 BridgerPay 入金的方法: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方法名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方法标题。此标题将分配给 Back Office 中的方法,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将出现以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 BridgerPay 入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **BridgerPay**。 * 在 **Connection** 下拉列表中,选择之前配置的 [BridgerPay 连接](#configure-a-connection-to-bridgerpay)。 在出现的 **Configuration** 部分中,完成以下设置: * 在 **Cashier key** 字段中,指定 BridgerPay 提供的唯一标识符。 创建 BridgerPay 入金方法 点击 **Save** 以创建入金方法。 **BridgerPay** 入金方法将显示在入金方法列表中。 点击 **Edit** 以进入方法详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方法的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-bridgerpay`,以便在 B2CORE UI 中显示 BridgerPay 入金方法的[预定义图标](../../integrations/payment-systems)。要使用自定义图标,请指定要显示的图像 URL。 * 检查方法状态。 如果方法未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活该方法。 * 在 **PS Currencies** 选项卡上添加所需货币。要使该方法能够处理特定货币的入金,请确保已在此选项卡中添加该货币(有关选项卡说明,请参阅[入金方法](../../back-office-guide/system/deposit-system#details))。 * 如有需要,请在 **Commissions** 选项卡上配置该方法的佣金(有关详细信息,请参阅[如何为入金和出金方法配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 BridgerPay 入金方法 — Settings 选项卡 点击 **Test configuration** 以验证入金方法的连接设置。测试将根据方法表单中指定的设置以及所选外部连接中提供的数据执行。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **BridgerPay** 入金方法。 ## 在 BridgerPay 账户中设置 Webhook [#set-up-webhooks-in-your-bridgerpay-account] 要在 B2CORE 中接收已发起入金的状态更新,您需要在 BridgerPay 中为 PSP 设置通知 Webhook。 ### 从 B2CORE Back Office 复制 Webhook URL [#copy-the-webhook-url-from-the-b2core-back-office] 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 找到已配置的 **BridgerPay** 入金方法,然后点击 **Edit** 以进入方法详情。 前往 **Webhooks** 选项卡。 复制 **Notification URL** 字段中显示的 URL。 BridgerPay 入金方法 — Webhooks 选项卡 ### 将 Webhook URL 添加到 BridgerPay 中的 PSP [#add-the-webhook-url-to-psps-in-bridgerpay] 登录您的 BridgerPay 账户。 在主菜单中,前往 **Checkouts**。 选择已添加的 PSP 并点击它以打开其详情。 在详情中,点击 **Settings**。 BridgerPay 中的 PSP Settings 前往 **URLs** 选项卡。 将从 B2CORE Back Office 复制的 Webhook URL 粘贴到 **Webhook Notification URL** 字段中。 将 Webhook URL 添加到 BridgerPay 中的 PSP 保存更改。 请对 BridgerPay 账户中添加并配置的每个 PSP 重复这些步骤。 ## 为 BridgerPay 中的 PSP 指定重定向 URL [#specify-redirect-urls-for-psps-in-bridgerpay] 为确保在入金完成、失败或取消后正确重定向,请为 BridgerPay 中的 PSP 设置相应的重定向 URL。 要设置重定向 URL: 在您的 BridgerPay 账户中,前往主菜单中的 **Checkouts**。 选择已添加的 PSP 并点击它以打开其详情。 在详情中,点击 **Settings**。 前往 **URLs** 选项卡。 指定以下 URL: * 在 **Success Redirect URL** 中,指定 `https://{your-Front-Office-URL}/en/payment/success`。 * 在 **Failure Redirect URL** 和 **Cancel Redirect URL** 字段中,指定 `https://{your-Front-Office-URL}/en/payment/failed`。 请务必将 `{your-Front-Office-URL}` 替换为您的 B2CORE UI 域名。 为 BridgerPay 中的 PSP 添加重定向 URL 保存更改。 请对 BridgerPay 账户中添加并配置的每个 PSP 重复这些步骤。 ## 为 BridgerPay 中的 PSP 启用“Notify with original amount”选项 [#enable-the-notify-with-original-amount-option-for-psps-in-bridgerpay] BridgerPay 中 PSP 的 **Notify with original amount** 选项可确保付款通知包含原始入金金额,不进行任何修改或附加收费。 要启用此选项: 在您的 BridgerPay 账户中,前往主菜单中的 **Checkouts**。 选择已添加的 PSP 并点击它以打开其详情。 在详情中,点击 **Settings**。 在名为 **PSP Specific Settings** 的部分中,启用 **Notify with original amount** 选项。 保存更改。 请对 BridgerPay 账户中添加并配置的每个 PSP 重复这些步骤。 现在,**BridgerPay** 入金方法已完成配置,客户可在 B2CORE UI 中入金时使用该方法。 **Canonical** 驱动可让您通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 将您选择的支付服务提供商 (PSP) 连接到 B2CORE,即使 B2CORE 尚未为该提供商提供专用驱动。 ## 为什么使用 Canonical 驱动 [#why-use-the-canonical-driver] B2CORE 中的大多数支付系统都依赖于专门为某个提供商构建的专用驱动。Canonical 驱动采用不同的方法:它定义了一个统一的标准 API 合约——Canonical Deposit API,任何提供商都可以实现该合约。无论合约背后使用的是哪个提供商,B2CORE 都会以统一的方式处理身份验证、入金启动流程、轮询、webhook 和状态生命周期。 当您希望进行以下操作时,Canonical 驱动非常有用: * 连接没有 B2CORE 专用驱动的首选或内部 PSP,而无需等待定制开发。 * 让您的提供商实现一份已文档化且稳定的合约,而非定制集成,以缩短上市时间。 * 在 B2CORE 管理其端入金工作流的同时,完全掌控提供商端。 Canonical 驱动目前支持入金流程。若要通过您的提供商提供入金服务,该提供商必须实现下方 [OpenAPI 规范](#openapi-specification)中描述的 Canonical Deposit API,并遵循本页面中的行为要求。 ## OpenAPI 规范 [#openapi-specification] Canonical Deposit API 定义于以下 OpenAPI 规范中,其中涵盖身份验证、请求和响应架构、端点及状态码。请下载该文件,以查看您的提供商必须实现的完整合约: 本页面的其余部分说明了该规范无法表达的行为要求、B2CORE 端配置和设计决策。请结合阅读两者,以全面了解集成方式。 ## B2CORE 驱动凭据 [#b2core-driver-credentials] 以下字段配置于 **B2CORE 端**(Back Office),用于向 PSP API 进行身份验证。有关完整的 JWT 令牌生成和验证详情,请参阅 [OpenAPI 规范](#openapi-specification)。 | 字段 | 描述 | | ---------- | --------------------------------------------------------------------------- | | API 基础 URL | PSP API 的 HTTPS 基础 URL。 | | App ID | 唯一商户标识符。在 JWT 中用作 `sub` 声明。 | | App secret | 用于 HMAC-SHA256 签名的密钥。采用 Base64 URL 编码,长度为 32 字节(43 个字符)。绝不会在请求中发送——仅用于签署令牌。 | ## B2CORE 驱动配置字段 [#b2core-driver-configuration-fields] 以下字段配置于 **B2CORE 端**(Back Office),用于控制驱动行为。它们不属于面向 PSP 的 API。 ### 全局参数(`globalParam1`、`globalParam2`、`globalParam3`) [#global-parameters-globalparam1-globalparam2-globalparam3] 三个配置级字符串字段,会随 **每个已认证请求** 发送到 PSP。 * 对于 `POST` 端点,它们包含在 JSON 请求正文中。 * 对于 `GET` 端点,它们作为查询参数包含在请求中。 这些字段表示 PSP 特定的值,例如商户 ID、渠道或项目 ID。其确切语义取决于 PSP 的实现。B2CORE 管理员会在配置设置期间填写这些字段。 ### 必填字段(只读) [#required-fields-read-only] **类型:** 多选 选择哪些用户信息字段会在支付表单中显示为 **只读**(不可编辑)。 所选字段**必须**已在用户的 B2CORE 资料中配置并保存。如果资料中缺少任一所选字段,支付表单生成将因缺少字段错误而失败——用户必须先在其 B2CORE 资料中填写数据才能继续。 所选字段以及“必填字段(可编辑)”中的字段共同决定了在 `POST /api/v1/deposits` 请求中发送到 PSP 的 `startDepositUserInfo` 对象内哪些用户数据会被有效填充。未在任一列表中选择的字段会在表单中隐藏,并且可能以空值发送。 ### 必填字段(可编辑) [#required-fields-editable] **类型:** 多选 选择哪些用户信息字段会在支付表单中显示为 **可编辑**。用户可以直接在支付表单中填写或修改这些字段。与“必填字段(只读)”不同,这些字段无需预先配置在用户的 B2CORE 资料中。 **优先级规则:** 如果某字段同时在“必填字段(只读)”和“必填字段(可编辑)”中被选中,则它将显示为 **只读**。只读设置始终具有更高优先级。 **电子邮件行为:** 无论电子邮件是否在任一列表中被选中,它始终会显示在支付表单中,并始终在 `startDepositUserInfo` 中发送。配置仅控制其显示方式: | 电子邮件选中位置 | 行为 | | --------- | ---------------------- | | 两个列表均未选中 | 显示为可编辑字段 | | 必填字段(可编辑) | 显示为可编辑字段 | | 必填字段(只读) | 显示为只读字段(值来自 B2CORE 资料) | | 两个列表均选中 | 显示为只读字段(只读优先) | ### 默认同步截止时间 [#default-sync-deadline] **类型:** 选择\ **默认值:** `4h` 入金创建后,B2CORE 轮询入金状态的最长持续时间。超过此截止时间后: * `StatusSyncInProgress` → 入金将移至 `unexpected`。 * `StatusSyncUnexpected` → 入金将移至 `unexpected`。 `unexpected` 状态需要管理员通过 LifecycleService 进行手动调查。 ### 启动时可安全失败 [#safe-to-fail-at-start] **类型:** 布尔值(当前硬编码为 `yes`,无可选项) 确定当启动请求遇到意外错误时,是否可以安全地将入金标记为 `failed`(终态)。 * `yes` — 如果 PSP 在入金启动期间返回错误,并且 B2CORE 确信该入金未在 PSP 端创建(例如,B2CORE 从未收到重定向 URL),则可以安全地将入金移至 `failed`。客户没有损失任何资金。 * `no` — 即使发生错误,入金也会以未经验证的外部 ID 移至 `in_progress` 并进行轮询,因为 PSP 可能已在发生错误的情况下创建了入金。 **目前始终为 `yes`。** 典型情况是:如果没有重定向 URL,客户无法完成 PSP 支付页面上的操作,因此入金无法成功。 ### 轮询前等待 webhook [#wait-for-webhook-before-polling] **类型:** 布尔值(当前硬编码为 `yes`,无可选项) 控制 B2CORE 在开始轮询 `GET /api/v1/deposits/{externalID}` 前是否等待 webhook 通知。 | 值 | 行为 | | ----- | --------------------------------------------------------------------------------- | | `yes` | 入金启动后,B2CORE 会在开始轮询前**最多等待 5 分钟**接收 webhook。如果 5 分钟内未收到 webhook,B2CORE 将继续进行标准轮询。 | | `no` | B2CORE 会根据标准退避计划立即开始轮询。 | **原因:** 许多 PSP 会在入金状态变更时快速发送 webhook 通知。在轮询前等待 webhook 可减少不必要的 API 调用数量,从而有助于遵守速率限制。5 分钟超时可确保即使 webhook 延迟或丢失,流程仍会继续。 ## 测试配置流程 [#test-configuration-flow] 当管理员在 B2CORE 中点击 **测试配置** 时: ``` 1. B2CORE generates a one-time JWT signed with appSecret 2. B2CORE → POST /api/v1/configuration/test (with Bearer JWT + globalParams) 3. If response status = "available" → test result: "available" 4. If response status = "failed" → test result: "failed" (with error from PSP) 5. If unexpected error (5xx, timeout, and similar) → test result: "unexpected" ``` 测试配置方法是唯一一个预期任何凭据问题返回的并非 `401 Unauthorized`,而是带有响应正文的 `200 OK` 的方法。 `code` 和 `description` 会显示给 B2CORE 管理员,因此请返回清晰且不包含敏感信息的数据。 ## Webhook 系统设计 [#webhook-system-design] ### 两个 webhook 渠道 [#two-webhook-channels] B2CORE 支持每笔入金使用 **两个 webhook 渠道**: | 渠道 | 注册方式 | 描述 | | ---------- | ------------------------------------------------- | ----------------------------------------------------------- | | **自动** | 通过 `POST /api/v1/deposits` 请求中的 `notificationURL` | 始终启用。B2CORE 生成该 URL 并将其传递给 PSP。 | | **管理员可配置** | 由管理员在 B2CORE Back Office 中设置 | 可选。管理员可以配置一个独立的 webhook URL,供 PSP 向其发送通知(例如,在 PSP 管理面板中注册)。 | 两个渠道均会进入相同的 B2CORE webhook 处理程序 → `driver_transit` 存储 → 轮询器优化管道。 ### Webhook 作为轮询优化 [#webhook-as-polling-optimization] webhook **不是**事实来源。它是一种用于减少不必要轮询请求的**优化机制**。 ``` PSP → B2CORE webhook handler → driver_transit (key-value store) → poller ``` 其工作方式如下: 1. 当 webhook 到达时,B2CORE 会在 `driver_transit` 中存储一个以 `externalID` 为键的标记。 2. 轮询器会在发出 API 调用前检查 `driver_transit`: * 如果存在对应 `externalID` 的 webhook 标记,B2CORE 会立即调用 `GET /api/v1/deposits/{externalID}`。 * 如果不存在标记且经过时间少于 5 分钟,B2CORE 会等待(参阅[轮询前等待 webhook](#wait-for-webhook-before-polling))。 * 如果不存在标记且已超过 5 分钟,B2CORE 会继续执行标准轮询。 3. 当入金达到终态(成功或失败)时,`driver_transit` 条目会被删除。 ### Webhook 负载 [#webhook-payload] webhook 负载极简(请参阅 [OpenAPI 规范](#openapi-specification)中 `POST /api/v1/deposits` 下的 webhook 回调): ```json { "externalID": "550e8400-e29b-41d4-a716-446655440000", "status": "success" } ``` 负载包含以下字段: * `externalID` — 与 `POST /api/v1/deposits` 请求中的 UUID 相匹配。 * `status` — `"success"`、`"failed"` 或 `"unprocessable"` 之一。 仅当入金转换至**终态**时,才应发送 webhook。 ## 入金启动流程 [#deposit-start-flow] ### 启动请求 [#start-request] B2CORE 通过调用 `POST /api/v1/deposits` 发起入金。 请求包含 `returnURL` 字段——这是一个 B2CORE 前端页面 URL,用于在用户完成 PSP 页面交互后将其重定向回 B2CORE。这**不是 webhook**——它仅用于浏览器重定向。 有关所有其他详细信息,请参阅 [OpenAPI 规范](#openapi-specification)。 ### 启动结果映射 [#start-result-mapping] PSP 响应会按如下方式映射为 B2CORE 操作: | PSP 响应 | B2CORE 操作 | | ---------------------------- | ---------------- | | PSP 返回重定向 URL | 移至 `in_progress` | | 具有规范违规的 2xx 响应(例如,没有重定向 URL) | 移至 `failed` | | HTTP 4xx / 5xx / 超时 / 网络错误 | 移至 `failed` | 所有失败场景都会产生 `failed`(而非 `unexpected`),因为“启动时可安全失败”为 `yes`(参阅[启动时可安全失败](#safe-to-fail-at-start)):如果没有有效的重定向 URL,最终用户无法与 PSP 支付页面交互,因此不会损失资金。 ### 重定向流程 [#redirect-flow] 启动成功后,B2CORE 会收到重定向 URL,并将最终用户发送至 PSP 支付页面: * `returnURL` 会将用户带回 B2CORE 前端页面,该页面会指示入金正在处理中。 * 启动后,B2CORE 会开始轮询和 webhook 流程(参阅[轮询和状态同步](#polling-and-status-sync))。 * 当前,`"redirect"` 是唯一受支持的操作类型。 ## 轮询和状态同步 [#polling-and-status-sync] ### 轮询退避计划 [#polling-backoff-schedule] B2CORE 使用**渐进式退避**轮询 `GET /api/v1/deposits/{externalID}`: | 自入金启动后的时间 | 轮询间隔 | | --------- | --------- | | 0–15 分钟 | 每 1 分钟一次 | | 15–60 分钟 | 每 3 分钟一次 | | 1–3 小时 | 每 5 分钟一次 | | 3–5 小时 | 每 10 分钟一次 | | 5 小时以上 | 每 15 分钟一次 | ### 截止时间处理 [#deadline-handling] 默认截止时间:入金创建后 **4 小时**(可配置,参阅[默认同步截止时间](#default-sync-deadline))。 超过截止时间后,中间状态将按如下方式处理: | 最后一次轮询结果 | B2CORE 操作 | | -------------- | --------------- | | `inProgress` | 移至 `unexpected` | | 网络错误、5xx、解析错误等 | 移至 `unexpected` | `unexpected` 状态会停止自动轮询,并要求管理员通过 B2CORE 的 LifecycleService 进行手动操作。 ### Webhook 等待逻辑 [#webhook-wait-logic] 当“轮询前等待 webhook”为 `yes`(当前默认值,参阅[轮询前等待 webhook](#wait-for-webhook-before-polling))时: ### 轮询结果映射 [#polling-result-mapping] 来自 `GET /api/v1/deposits/{externalID}` 的每个轮询结果都会映射为 B2CORE 内部操作: | PSP 响应状态 | B2CORE 操作 | | -------------------------------------------- | --------------------------------------------------------------------------------- | | `"inProgress"` + 未超过截止时间 | 继续轮询(重试) | | `"inProgress"` + 已超过截止时间 | 移至 `unexpected` | | `"success"` | 移至 `success`,停止轮询。保存 `finalAmount` 和 `finalCurrencyCode` | | `"failed"` | 移至 `failed`,停止轮询。保存 `reason` | | `"unprocessable"` | 移至 `unexpected`,停止轮询。保存 `reason`。需要管理员调查 | | HTTP 5xx / 超时 / 解析错误 | 将其视为一次 `unexpected` 轮询尝试。如果尚未超过截止时间,则继续轮询 | | 带有 `X-Safe-To-Fail-After-Seconds` 的 HTTP 404 | 继续轮询。在指定时间加上安全边际(5 分钟)后,如果仍为 404,则以原因“deposit redirect URL is expired”移至 `failed` | | 不带该请求头的 HTTP 404 | 继续轮询。等待入金出现在 PSP 端,或等待超过同步截止时间 | ## 入金状态生命周期 [#deposit-status-lifecycle] 本节说明 B2CORE 入金状态。有关 PSP 响应状态到 B2CORE 状态的映射,请参阅[启动结果映射](#start-result-mapping)和[轮询结果映射](#polling-result-mapping)。 ### 完整状态图 [#full-status-diagram] ### 从 `unexpected` 状态恢复 [#recovery-from-the-unexpected-status] 管理员可以通过 LifecycleService 执行以下手动转换: | 转换 | 使用时机 | | ---------------------------- | ------------------------------------- | | `unexpected` → `in_progress` | 重试轮询(例如,在 PSP 中断问题解决后) | | `unexpected` → `success` | 仅当最后一次轮询尝试为 `unprocessable` 且管理员确认成功时 | | `unexpected` → `failed` | 管理员确认入金失败 | ### 入金状态定义 [#deposit-status-definitions] 下表定义了每种 B2CORE 入金状态: | 状态 | 业务含义 | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `in_progress` | 入金正在处理中。涵盖所有中间状态:待处理的银行转账、正在进行的 3DS 验证、等待 PSP 端人工审核、客户与 PSP 支付页面交互等。这是非终态——B2CORE 会继续轮询。 | | `success` | 经纪商已收到客户资金。PSP 已确认资金已入账。`finalAmount` 和 `finalCurrencyCode` 字段反映实际收到的金额和币种,可能因费用或兑换而与初始请求不同。 | | `failed` | 入金未完成。客户**未**损失任何资金,经纪商也**未**收到任何资金。示例包括:银行卡被拒绝、银行转账被拒绝、用户在 PSP 页面取消或重定向链接已过期。 | | `unexpected` | 无法自动解决该入金,需要通过 B2CORE 由管理员手动操作(参阅[从 `unexpected` 状态恢复](#recovery-from-the-unexpected-status));自动轮询已停止。当 `in_progress` 状态下截止时间超时,或 PSP 报告 `unprocessable` 时会进入该状态。 | ### 入金创建时机 [#deposit-creation-timing] PSP 会遵循两种入金创建模式之一: | 模式 | 行为 | 对轮询的影响 | | -------- | -------------------------------------- | ---------------------------------------------------------------- | | **立即创建** | PSP 在 `POST /api/v1/deposits` 时创建入金记录。 | `GET /api/v1/deposits/{externalID}` 会在启动后立即返回结果。 | | **延迟创建** | PSP 仅在最终用户完成 PSP 支付页面后创建入金记录。 | 在用户完成页面前,`GET /api/v1/deposits/{externalID}` 返回 `404 Not Found`。 | 对于延迟创建,PSP **应当**在 404 响应中返回 `X-Safe-To-Fail-After-Seconds` 请求头。该请求头会告知 B2CORE 重定向链接的有效时长。在 `redirect_time + header_value + safety_margin` 后,如果入金仍返回 404,B2CORE 会将其标记为 `failed`,原因为 **"deposit redirect URL is expired"**。 如果该请求头不存在,B2CORE 会继续轮询,直至入金出现或超过同步截止时间(默认 4 小时);此时入金将移至 `unexpected`。 ## 行为要求 [#behavioral-requirements] ### 分布式追踪 [#distributed-tracing] B2CORE 向 PSP 发出的所有 HTTP 请求均包含符合 [W3C Trace Context](https://www.w3.org/TR/trace-context/) 规范的标准追踪请求头: * `traceparent` — 包含追踪 ID、父跨度 ID 和追踪标志。 * `tracestate` — 供应商特定的追踪数据。 PSP 实现应将这些请求头传播至其下游服务,以实现端到端可观测性。 ### PSP 支付页面币种锁定 [#psp-payment-page-currency-lock] 当入金启动响应包含重定向至 PSP 支付页面时: * PSP 页面**不得**允许最终用户将 `currencyCode` 更改为任何类似、等值或替代币种。 * PSP 页面上显示的币种必须与入金启动请求中发送的币种完全一致。 * 如果 PSP 页面允许选择币种,则该币种必须预先选定并锁定。 ### IP 白名单建议 [#ip-whitelisting-recommendation] 尽管 API 规范中并未要求,仍**强烈建议** PSP 实现在其端配置 IP 白名单。这可在 JWT 身份验证之外提供额外的安全层,将 API 访问限制为已知的 B2CORE IP 地址。 如需在您的环境中启用 Canonical 驱动,请联系您的客户经理。请具体说明您计划如何使用 Canonical 驱动以及使用目的,以便我们相应地安排访问权限。 [ChipPay](https://www.chippay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,支持入金和出金。 ChipPay 使用 `CNY` 处理付款,该货币是其结算货币;而 B2CORE PPS 则以 `USDT` 向 ChipPay 发送和接收金额。因此,必须在 B2CORE 中配置的入金和出金方式内将 `USDT` 添加为 PS 货币。 请按照以下说明在 B2CORE Back Office 中配置 ChipPay 连接并设置入金和出金方式。这些说明与通过 PSS 为支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)相对应,但包含 ChipPay 特有的详细信息。 在继续执行说明之前,您必须已注册 ChipPay 并拥有有效账户。如有任何疑问,请查阅官方 [ChipPay 帮助中心](https://chippayhelp.zendesk.com/hc/en-gb)或联系其支持团队。 ## 配置 ChipPay 连接 [#configure-connections-to-chippay] 如果您计划同时使用 ChipPay 进行入金和出金,则必须配置独立的连接,每个连接专用于特定的入金或出金方式。 每个连接都必须使用相应的驱动程序进行配置,以确保对应入金或出金方式能够正确运行。 要配置与 ChipPay 的连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_ChipPay` 或 `Withdrawals_ChipPay`)。 * 在 **Caption** 字段中,输入将应用于 Back Office 中该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择: * **ChipPay P2P buying order** — 用于通过 ChipPay 支付订单处理的入金。客户可使用您 ChipPay 商户账户中配置的可用方式之一付款,例如银行卡、**AliPay** 或 **WeChat Pay**(若已启用这些选项)。 * **ChipPay express buying order** — 用于通过银行卡付款进行的入金。 * **ChipPay** — 用于通过银行卡付款进行的出金。 在显示的 **Credentials** 部分中,配置 ChipPay 专属设置: * 在 **API base URL** 字段中,指定 `https://open-v2.chippay.com/`。 * 在 **Merchant ID** 字段中,输入您的 ChipPay Merchant ID。 * 使用安全工具(如 **OpenSSL** 或其他可信方法)生成一对 4096 位 RSA *私钥* 和 *公钥*。 出于安全考虑,不建议使用在线工具生成密钥。 * 在 **Private key** 字段中指定\_私钥\_,并确保在您的 ChipPay 账户中指定对应的\_公钥\_。 点击 **Save** 以创建连接。 用于入金或出金的 **ChipPay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设为 **Yes**。 点击 **Save** 以应用更改。 如果您需要用于其他付款方式的额外 ChipPay 连接,请遵循相同说明,使用不同的驱动程序创建新连接。 下图显示了三个已配置的 ChipPay 连接:一个用于出金方式,两个用于入金方式。 与 ChipPay 的外部连接 ## 通过 ChipPay 添加入金方式 [#add-a-deposit-method-through-chippay] 要添加并设置通过 ChipPay 进行入金的方式: 在 B2CORE Back Office 中,转到 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并会在 B2CORE UI 中向客户显示。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 ChipPay 入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **ChipPay P2P buying order** 或 **ChipPay express buying order**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于入金的 ChipPay 连接](#configure-connections-to-chippay)。 如果您选择了 **ChipPay P2P buying order** 驱动程序,请跳过 **Configuration** 部分,因为此入金方式无需任何设置。 如果您选择了 **ChipPay express buying order** 驱动程序,请在显示的 **Configuration** 部分中填写以下字段: * 在 **Exchange rate adjustment** 下拉列表中,选择: * **Yes** — 在将入金资金兑换为 `CNY` 时调整 ChipPay 提供的汇率,`CNY` 是 ChipPay 用于处理付款的结算货币。 * **No** — 使用 ChipPay 提供的默认汇率。 * 如果您选择 **Yes**,请在 **Adjustment value** 字段中指定调整值(百分比)。汇率仅可在 ±3% 范围内调整。例如,输入 `3` 会将汇率提高 3%,而输入 `-3` 会将汇率降低 3%。 调整后的汇率将显示在为处理该入金而创建的 ChipPay P2P 购买订单详情中。 点击 **Save** 以创建入金方式。 **ChipPay** 入金方式将显示在入金方式列表中。 点击 **Edit** 以进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-chippay`,以在 B2CORE UI 中显示 ChipPay 入金方式的[预定义图标](../../integrations/payment-systems)。如要使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果该方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡上,添加 `USDT`。 * 如有需要,请在 **Commissions** 选项卡上配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 ChipPay 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。测试将基于方式表单中指定的设置以及所选外部连接中提供的数据执行。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **ChipPay** 入金方式。 如果您希望支持 ChipPay 提供的两种入金方式,请添加并设置另一个使用不同驱动程序和连接的入金方式。 ## 通过 ChipPay 添加出金方式 [#add-a-withdrawal-method-through-chippay] 要添加并设置通过 ChipPay 进行出金的方式: 在 B2CORE Back Office 中,转到 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并会在 B2CORE UI 中向客户显示。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 ChipPay 出金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **ChipPay**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于出金的 ChipPay 连接](#configure-connections-to-chippay)。 跳过 **Configuration** 部分,因为 ChipPay 出金无需任何设置。 点击 **Save** 以创建出金方式。 **ChipPay** 出金方式将显示在出金方式列表中。 点击 **Edit** 以进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-chippay`,以在 B2CORE UI 中显示 ChipPay 出金方式的[预定义图标](../../integrations/payment-systems)。如要使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果该方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡上,添加 `USDT`。 * 如有需要,请在 **Commissions** 选项卡上配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 ChipPay 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。测试将基于方式表单中指定的设置以及所选外部连接中提供的数据执行。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **ChipPay** 出金方式。 [Jetapay](https://jetapay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,支持入金和银行账户出金。Jetapay 仅处理 `USD` 交易,最低金额为 10 USD,最高金额为 5,000 USD。 请按照以下说明配置 Jetapay 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 添加受支持支付系统方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 Jetapay 特有的详细信息。 在继续以下说明之前,您必须已注册 Jetapay 并拥有有效账户。 ## 配置与 Jetapay 的连接 [#configure-connections-to-jetapay] 如果您计划将 Jetapay 同时用于入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置与 Jetapay 的连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面上,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_Jetapay` 或 `Withdrawals_Jetapay`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的显示名称。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在出现的 **Driver** 下拉列表中,选择 **Jetapay**。 在出现的 **Credentials** 部分中,配置 Jetapay 专用设置: * 在 **API base URL** 字段中,指定 `https://api.jetapay.com`。 * 在 **Token** 字段中,输入在您的 Jetapay 账户中生成的令牌,该令牌将用于验证发送至 Jetapay API 的请求。 点击 **Save** 以创建连接。 **Jetapay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 Jetapay 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 Jetapay 添加入金方式 [#add-a-deposit-method-through-jetapay] 要添加并设置通过 Jetapay 入金的方式: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。此显示名称将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择 `USD`。 * 在 **Driver** 下拉列表中,选择 **Jetapay**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 Jetapay 连接](#configure-connections-to-jetapay)。 跳过 **Configuration** 部分,因为 Jetapay 入金方式无需任何设置。 点击 **Save** 以创建入金方式。 **Jetapay** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定图片 URL,该图片将作为 B2CORE UI 中入金方式的图标显示。 * 检查方式状态。 如果方式未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活该方式。 * 在 **PS Currencies** 选项卡中,添加 `USD`。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Jetapay deposit method — Settings tab 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Jetapay** 入金方式。 ## 通过 Jetapay 添加出金方式 [#add-a-withdrawal-method-through-jetapay] 要添加并设置通过 Jetapay 出金的方式: 在 B2CORE Back Office 中,前往 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。此显示名称将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择 `USD`。 * 在 **Driver** 下拉列表中,选择 **Jetapay**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 Jetapay 连接](#configure-connections-to-jetapay)。 跳过 **Configuration** 部分,因为 Jetapay 出金方式无需任何设置。 点击 **Save** 以创建出金方式。 **Jetapay** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定图片 URL,该图片将作为 B2CORE UI 中出金方式的图标显示。 * 检查方式状态。 如果方式未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活该方式。 * 在 **PS Currencies** 选项卡中,添加 `USD`。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Jetapay withdrawal method — Settings tab 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Jetapay** 出金方式。 [KoraPay](https://www.korahq.com/payin) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,支持入金、银行账户出金,以及通过移动支付向移动钱包出金。 请按照以下说明配置 KoraPay 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 为支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 KoraPay 特有的详细信息。 在继续以下说明之前,您必须已注册 KoraPay 并拥有有效账户。如有任何疑问,您可以查阅官方 [KoraPay 文档](https://developers.korapay.com/)或联系其支持团队。 ## 支持的币种 [#supported-currencies] 下表列出了通过 KoraPay 入金和出金时支持的币种: 对于 `XAF` 和 `XOF` 币种,金额会按照 KoraPay 的要求向下舍入到最接近的 5 的倍数。例如,如果客户输入 2,573 `XAF`,交易金额将向下舍入为 2,570。 ## 配置 KoraPay 连接 [#configure-connections-to-korapay] 如果您计划将 KoraPay 同时用于入金和出金,则必须配置单独的连接,每个连接专用于特定的入金或出金方式。 每个连接都必须使用相应的驱动程序进行配置,以确保对应的入金或出金方式能够正常运行。 要配置 KoraPay 连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面上,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_KoraPay` 或 `Withdrawals_KoraPay`)。 * 在 **Caption** 字段中,输入将应用于 Back Office 中该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择: * **KoraPay** — 用于入金。 * **KoraPay bank account** — 用于向银行账户出金。 * **KoraPay mobile money** — 用于通过移动支付向移动钱包出金。 在显示的 **Credentials** 部分中,配置 KoraPay 特定设置: * 在 **API base URL** 字段中,指定 `https://api.korapay.com`。 * 在 **Secret key** 字段中,输入您的 KoraPay 账户中的密钥。 * 在 **Public key** 字段中,输入您的 KoraPay 账户中的公钥。 要查找您的密钥和公钥,请登录 KoraPay 账户,转到 **Settings**,然后打开 **API Configuration** 选项卡。 KoraPay 中的 API 密钥 点击 **Save** 以创建连接。 **KoraPay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详细信息,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 如果您需要为其他支付方式添加 KoraPay 连接,请按照相同说明使用不同的驱动程序创建新连接。 ## 通过 KoraPay 添加入金方式 [#add-a-deposit-method-through-korapay] 要添加并设置通过 KoraPay 入金的方式: 在 B2CORE Back Office 中,转到 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种支持入金的币种,例如 `NGN`、`GHS`、`KES`、`XAF` 和 `XOF`。通过 KoraPay 入金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择 **KoraPay**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 KoraPay 连接](#configure-connections-to-korapay)。 在 **Configuration** 部分中,将 **Merchant bears cost** 选项设置为: * **Yes** — 经纪商(商户)支付交易手续费。 * **No** — 交易者(客户)支付交易手续费。 点击 **Save** 以创建入金方式。 **KoraPay** 入金方式将显示在入金方式列表中。 点击 **Edit** 以进入方式详细信息,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-korapay`,以便在 B2CORE UI 中显示 KoraPay 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请通过将 **Enabled** 下拉列表设置为 **Yes** 来启用它。 * 在 **PS Currencies** 选项卡上,添加所需币种。要使该方式能够处理特定币种的入金,请确保已在此选项卡中添加该币种。 * 如有需要,可在 **Commissions** 选项卡上配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 KoraPay 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,已在 B2CORE Back Office 中配置 **KoraPay** 入金方式。 ## 通过 KoraPay 添加出金方式 [#add-a-withdrawal-method-through-korapay] 要添加并设置通过 KoraPay 出金的方式: 在 B2CORE Back Office 中,转到 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 KoraPay 出金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择: * **KoraPay bank account** — 用于向银行账户出金。 仅支持向尼日利亚银行账户出金。 * **KoraPay mobile money** — 用于通过移动支付向移动钱包出金。 支持向肯尼亚 (`KES`)、加纳 (`GHS`)、科特迪瓦 (`XOF`) 和喀麦隆 (`XAF`) 的移动支付账户出金。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 KoraPay 连接](#configure-connections-to-korapay)。 在 **Configuration** 部分中,完成以下设置: 对于 **KoraPay bank account** 驱动程序: * 在 **Merchant bears cost** 下拉列表中,选择: * **Yes** — 经纪商(商户)支付交易手续费。 * **No** — 交易者(客户)支付交易手续费。 对于 **KoraPay mobile money** 驱动程序: * 按照上述说明配置 **Merchant bears cost** 选项。 * 在 **Country** 下拉列表中,选择该出金方式适用的国家,例如肯尼亚、加纳、科特迪瓦或喀麦隆。 点击 **Save** 以创建出金方式。 **KoraPay** 出金方式将显示在出金方式列表中。 点击 **Edit** 以进入方式详细信息,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-korapay`,以便在 B2CORE UI 中显示 KoraPay 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 如果方式未启用(**Enabled** 字段中显示 **No**),请通过将 **Enabled** 下拉列表设置为 **Yes** 来启用它。 * 在 **PS Currencies** 选项卡上,添加所需币种。要使该方式能够处理特定币种的出金,请确保已在此选项卡中添加该币种。 * 如有需要,可在 **Commissions** 选项卡上配置该方式的佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 KoraPay 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,已在 B2CORE Back Office 中配置 **KoraPay** 出金方式。如需使用不同的驱动程序通过 KoraPay 添加另一种出金方式,请按照相同说明操作并选择另一个驱动程序。 [LuqaPay](https://luqapay.com/) 可通过 PSS 连接到 B2CORE,支持通过银行转账以 `TRY` 进行取款。 请按照以下说明配置 LuqaPay 连接,并在 B2CORE Back Office 中设置取款方式。这些说明与通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)相对应,但包含 LuqaPay 特有的详细信息。 在继续以下说明之前,您必须已注册 LuqaPay 并拥有一个有效账户。 ## 配置与 LuqaPay 的连接 [#configure-a-connection-to-luqapay] 要配置用于取款的 LuqaPay 连接: 在 B2CORE Back Office 中,前往 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面上,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Withdrawals_LuqaPay`)。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemWithdrawal**。 在出现的 **驱动程序** 下拉列表中,选择 **LuqaPay**。 在出现的 **凭据** 部分中,配置 LuqaPay 专属设置: * 在 **API 基础 URL** 字段中,指定: * `https://wallet.luqapay.com` — 用于生产环境 * `https://sandbox-wallet.luqapay.com` — 用于沙盒测试环境 * 在 **API 密钥** 字段中,输入在您的 LuqaPay 账户中生成的 API 密钥。 * 在 **API 密钥 Secret** 字段中,输入在您的 LuqaPay 账户中生成的 API Secret。 点击 **保存** 以创建连接。 **LuqaPay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**已启用** 列中显示 **否**),请点击 **编辑** 按钮以打开连接详情,并将 **已启用** 下拉列表设置为 **是**。 点击 **保存** 以应用更改。 ## 通过 LuqaPay 添加取款方式 [#add-a-withdrawal-method-through-luqapay] 要添加并设置通过 LuqaPay 进行取款的方式: 在 B2CORE Back Office 中,前往 **系统** > **出款系统** > **出款方式**。 点击页面右上角的 **+创建**。 在 **创建出款方式** 页面上,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **可用账户货币** 下拉列表中,选择一种或多种货币。可从以所选货币计价的账户通过 LuqaPay 进行取款。 * 在 **驱动程序** 下拉列表中,选择 **LuqaPay**。 * 在 **连接** 下拉列表中,选择之前配置的[LuqaPay 连接](#configure-a-connection-to-luqapay)。 在 **配置** 部分的 **国家/地区** 下拉列表中,选择 **Türkiye**。这是此集成唯一支持的国家/地区。 点击 **保存** 以创建取款方式。 **LuqaPay** 取款方式将显示在取款方式列表中。 点击 **编辑** 以进入方式详情,并完成以下字段: * 在 **设置** 选项卡上,使用 **组** 下拉列表选择应包含该方式的一个或多个组。 * 在 **图标** 字段中,指定将在 B2CORE UI 中显示为取款方式图标的图片 URL。 * 检查方式状态。 如果该方式未激活(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设置为 **是** 以激活它。 * 在 **PS 货币** 选项卡上,添加 `TRY`。这是此集成唯一支持用于处理取款的货币。 * 如有需要,请在 **佣金** 选项卡上配置该方式的佣金(有关详细信息,请参阅[如何为入金和取款方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 LuqaPay 取款方式 — 设置选项卡 点击 **保存** 以应用更改。 现已在 B2CORE Back Office 中配置 **LuqaPay** 取款方式。 ## 在 LuqaPay 中设置 Webhook [#set-up-a-webhook-in-luqapay] 要在 B2CORE 中接收取款状态更新,必须在 LuqaPay 端设置通知 Webhook。 ### 从 B2CORE Back Office 复制 Webhook URL [#copy-the-webhook-url-from-the-b2core-back-office] 在 B2CORE Back Office 中,前往 **系统** > **出款系统** > **出款方式**。 找到已配置的 **LuqaPay** 取款方式,然后点击 **编辑** 以打开方式详情。 前往 **Webhooks** 选项卡。 复制 **通知 URL** 字段中显示的 URL。 ### 向 LuqaPay 提供 Webhook URL [#provide-the-webhook-url-to-luqapay] 将复制的 Webhook URL 发送给 LuqaPay 支持团队,以便他们在其端进行配置。 [PayPaymentAsia](https://www.paymentasia.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,并支持入金和出金。 请按照以下说明配置 PaymentAsia 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明对应于通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss),但包含 PaymentAsia 特有的详细信息。 在继续操作前,您必须已注册 PaymentAsia 并拥有一个有效账户。 ## 支持的币种 [#supported-currencies] 下表列出了通过 PaymentAsia 支持入金和出金的币种: ## 配置 PaymentAsia 连接 [#configure-connections-to-paymentasia] 如果您计划使用 PaymentAsia 进行入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置 PaymentAsia 连接: 在 B2CORE Back Office 中,导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_PaymentAsia` 或 `Withdrawals_PaymentAsia`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在出现的 **Driver** 下拉列表中,选择 **PaymentAsia**。 在出现的 **Credentials** 部分中,配置 PaymentAsia 专属设置: ## 入金: [#for-deposits] * 在 **Payment base URL** 字段中,指定 `https://payment.pa-sys.com`。 * 在 **Gateway base URL** 字段中,指定 `https://gateway.pa-sys.com`。 * 在 **Merchant token** 字段中,输入在您的 PaymentAsia 账户中生成的令牌。 * 在 **Secret code** 字段中,输入在您的 PaymentAsia 账户中生成的密钥代码。 您可以在 PaymentAsia 账户的 **Merchants** > **Info** 下找到 **Merchant token** 和 **Secret code**。 ## 出金: [#for-withdrawals] 按照上述说明指定 **Gateway base URL**、**Merchant token** 和 **Secret code** 字段。 点击 **Save** 以创建连接。 **PaymentAsia** 连接将显示在外部连接列表中。 检查连接状态。 如果连接处于非活动状态(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 PaymentAsia 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 PaymentAsia 添加入金方式 [#add-a-deposit-method-through-paymentasia] 要添加并设置通过 PaymentAsia 进行入金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 PaymentAsia 入金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择 **PaymentAsia**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 PaymentAsia 连接](#configure-connections-to-paymentasia)。 跳过 **Configuration** 部分,因为 PaymentAsia 入金方式无需任何设置。 点击 **Save** 以创建入金方式。 **PaymentAsia** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-asia`,以便在 B2CORE UI 中显示 PaymentAsia 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式处于非活动状态(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需币种。要使该方式能够处理特定币种的入金,请确保已在此选项卡中添加该币种。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PaymentAsia deposit method — Settings tab 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 **PaymentAsia** 入金方式现已在 B2CORE Back Office 中配置完成。 ## 通过 PaymentAsia 添加出金方式 [#add-a-withdrawal-method-through-paymentasia] 要添加并设置通过 PaymentAsia 进行出金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 PaymentAsia 出金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择 **PaymentAsia**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 PaymentAsia 连接](#configure-connections-to-paymentasia)。 在 **Configuration** 部分中,在 **Available banks** 下拉列表中选择一个或多个银行,客户可在 B2CORE UI 中出金时进行选择。 银行列表必须与[可用于出金的币种](#supported-currencies)相对应。创建出金方式后,应在 **PS Currencies** 选项卡中添加这些币种。 如果某个币种在 **Available banks** 下拉列表中未选择相应银行,则该币种的出金将不可用。 点击 **Save** 以创建出金方式。 **PaymentAsia** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-asia`,以便在 B2CORE UI 中显示 PaymentAsia 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式处于非活动状态(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需币种。要使该方式能够处理特定币种的出金,请确保已在此选项卡中添加该币种。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PaymentAsia withdrawal method — Settings tab 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 **PaymentAsia** 出金方式现已在 B2CORE Back Office 中配置完成。 [PayPal](https://www.paypal.com) **只能**通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,并支持入金和出金。 请按照以下说明配置 PayPal 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 添加受支持支付系统方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 PayPal 特有的详细信息。 在按照说明操作前,您必须已注册 PayPal 并拥有一个有效账户。 ## 配置 PayPal 连接 [#configure-connections-to-paypal] 如果您计划将 PayPal 同时用于入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置 PayPal 连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面上,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_PayPal` 或 `Withdrawals_PayPal`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的显示名称。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择 **PayPal**。 在显示的 **Credentials** 部分中,配置 PayPal 特定设置: * 在 **API base URL** 字段中,指定 `https://api-m.paypal.com`。 * 在 **Client ID** 字段中,输入您在 PayPal 账户中创建的 REST API 应用 ID。 * 在 **Client secret** 字段中,输入与该应用关联的客户端密钥。 要查找客户端 ID 和密钥,请登录 PayPal 账户并在主菜单中转到 **My Apps & Credentials**。在 **Live** 选项卡上,选择您的应用以查看并复制凭据。 点击 **Save** 以创建连接。 用于入金或出金的 **PayPal** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 PayPal 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 PayPal 添加入金方式 [#add-a-deposit-method-through-paypal] 要添加并设置通过 PayPal 入金的方式: 在 B2CORE Back Office 中,转到 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。此显示名称将分配给 Back Office 中的该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 PayPal 入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **PayPal**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 PayPal 连接](#configure-connections-to-paypal)。 在显示的 **Configuration** 部分中,配置以下参数: * 在 **Amount type** 下拉列表中,选择最终入金金额的计算方式: * **Net amount**(默认选项)— 扣除 PayPal 交易手续费后经纪商收到的金额。如果未在 B2CORE 中为该方式设置佣金,则此净额将存入客户账户。如果设置了佣金,则佣金将从净额中扣除,客户收到的金额会更少。在这两种情况下,经纪商均不会承担任何损失。 * **Gross amount** — 扣除 PayPal 交易手续费前的完整入金金额。如果未在 B2CORE 中为该方式设置佣金,经纪商因 PayPal 手续费收到的金额将少于总额,并且必须承担差额,从而产生损失。 有关设置佣金的更多详细信息,请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods)。 点击 **Save** 以创建入金方式。 **PayPal** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-paypal`,以便在 B2CORE UI 中显示 PayPal 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡中添加所需货币。要使该方式能够处理特定货币的入金,请确保已在此选项卡中添加该货币(有关选项卡说明,请参阅[Deposit methods](../../back-office-guide/system/deposit-system#details))。 * 如有需要,请在 **Commissions** 选项卡上为该方式配置佣金(有关详细信息,请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PayPal 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **PayPal** 入金方式。 ## 通过 PayPal 添加出金方式 [#add-a-withdrawal-method-through-paypal] 要添加并设置通过 PayPal 出金的方式: 在 B2CORE Back Office 中,转到 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面上,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式的显示名称。此显示名称将分配给 Back Office 中的该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 PayPal 出金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **PayPal**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 PayPal 连接](#configure-connections-to-paypal)。 跳过 **Configuration** 部分,因为 PayPal 出金方式无需任何设置。 点击 **Save** 以创建出金方式。 **PayPal** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-paypal`,以便在 B2CORE UI 中显示 PayPal 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以启用它。 * 在 **PS Currencies** 选项卡中添加所需货币。要使该方式能够处理特定货币的出金,请确保已在此选项卡中添加该货币(有关选项卡说明,请参阅[Payout methods](../../back-office-guide/system/payout-system#details))。 * 如有需要,请在 **Commissions** 选项卡上为该方式配置佣金(有关详细信息,请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PayPal 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **PayPal** 出金方式。 [PayRetailers](https://payretailers.com/en/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,并支持入金和出金。 请按照以下说明配置 PayRetailers 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明对应于通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss),但包含 PayRetailers 的特定详细信息。 在继续执行说明之前,您必须已注册 PayRetailers 并拥有有效账户。如有任何疑问,您可以查阅官方 [PayRetailers 文档](https://payretailers.dev/docs/welcome)或联系其支持团队。 ## 支持的货币 [#supported-currencies] 下表列出了通过 PayRetailers 进行入金和出金时支持的货币: ## 配置 PayRetailers 连接 [#configure-connections-to-payretailers] 如果您计划将 PayRetailers 同时用于入金和出金,则必须配置两个独立的连接:一个用于入金,另一个用于出金。 要配置 PayRetailers 连接: 在 B2CORE Back Office 中,导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_PayRetailers` 或 `Withdrawals_PayRetailers`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在出现的 **Driver** 下拉列表中,选择 **PayRetailers**。 在出现的 **Credentials** 部分中,配置 PayRetailers 专属设置: * 在 **API base URL** 字段中,指定: * `https://api.payretailers.com` — 用于生产环境 * `https://api-sandbox.payretailers.com` — 用于沙盒测试环境 * 在 **Shop ID** 字段中,输入 PayRetailers 分配给您账户的标识符。 * 在 **Secret key** 字段中,指定您的 PayRetailers 账户中的密钥。 * 在 **Subscription key** 字段中,指定您的 PayRetailers 账户中的订阅密钥。 所有这些详细信息均由 PayRetailers 在入驻过程中提供,也可以在您的 PayRetailers 账户的 **Shops** 部分中找到。 PayRetailers — Shops 菜单 点击 **Save** 以创建连接。 **PayRetailers** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮以打开连接详细信息,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 PayRetailers 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 PayRetailers 添加入金方式 [#add-a-deposit-method-through-payretailers] 要添加并设置通过 PayRetailers 进行入金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将在 Back Office 中分配给该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过此方式入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **PayRetailers**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 PayRetailers 连接](#configure-connections-to-payretailers)。 在出现的 **Configuration** 部分中,填写以下字段: * 在 **Channel** 下拉列表中,选择支付渠道: * **Online** — 用于在线支付 * **Wallet** — 用于通过电子钱包支付 * **Credit card** — 用于使用银行卡进行入金 * **Cash** — 用于通过银行进行现金支付 * 在 **Country** 下拉列表中,选择处理支付的国家/地区。 点击 **Save** 以创建入金方式。 **PayRetailers** 入金方式将显示在入金方式列表中。 点击 **Edit** 以进入方式详细信息,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-payretailers`,以便在 B2CORE UI 中显示 PayRetailers 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需货币。要使该方式能够处理特定货币的入金,请确保已在此选项卡中添加该货币。 对于 PayRetailers **入金**,用于处理入金的货币与方式 **Configuration** 部分中选择的国家/地区相关联。单个国家/地区可能支持多种**入金货币**: * **阿根廷** → ARS, USD * **巴西** → BRL, USD * **智利** → CLP, USD * **哥伦比亚** → COP, USD * **哥斯达黎加** → CRC, USD * **厄瓜多尔** → USD * **萨尔瓦多** → USD * **墨西哥** → MXN, USD * **巴拿马** → USD * **秘鲁** → PEN, USD * **卢旺达** → RWF, USD * **坦桑尼亚** → TZS, USD * **肯尼亚** → KES, USD * **尼日利亚** → NGN, USD * **南非** → ZAR, USD 例如,对于巴西,入金可以使用 `BRL` 和 `USD` 处理,二者都可以在 **PS Currencies** 选项卡中添加。 此外,还可以通过应用国家/地区限制,将该方式限制为仅在特定国家/地区使用(详见[如何限制入金和出金方式的使用](how-to-restrict-the-use-of-deposit-and-withdrawal-methods#how-to-restrict-the-use-by-country))。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详见[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PayRetailers 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在已在 B2CORE Back Office 中配置 **PayRetailers** 入金方式。 ## 通过 PayRetailers 添加出金方式 [#add-a-withdrawal-method-through-payretailers] 要添加并设置通过 PayRetailers 进行出金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将在 Back Office 中分配给该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过此方式出金将可从以所选货币计价的账户进行。 * 在 **Driver** 下拉列表中,选择 **PayRetailers**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 PayRetailers 连接](#configure-connections-to-payretailers)。 在 **Configuration** 部分中,在 **Channel** 下拉列表内选择支付渠道。 点击 **Save** 以创建出金方式。 **PayRetailers** 出金方式将显示在出金方式列表中。 点击 **Edit** 以进入方式详细信息,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-payretailers`,以便在 B2CORE UI 中显示 PayRetailers 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需货币。要使该方式能够处理特定货币的出金,请确保已在此选项卡中添加该货币。 对于 PayRetailers **出金**,每种货币都与特定国家/地区严格一一对应。这意味着以某种货币进行的出金仅适用于其对应的国家/地区。因此,客户必须选择相应的国家/地区,并提供该地区所需的银行详细信息。 以下映射显示每种**出金货币**所对应的国家/地区: * **阿根廷** → ARS * **巴西** → BRL * **智利** → CLP * **哥伦比亚** → COP * **厄瓜多尔** → USD * **墨西哥** → MXN * **秘鲁** → PEN * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详见[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 PayRetailers 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在已在 B2CORE Back Office 中配置 **PayRetailers** 出金方式。 [Payrock](https://payroc.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE。它支持: * 以下货币的入金:`CNY`(通过支付宝、P2P 和银行转账)、`JPY`(通过 P2C 和银行转账)以及 `EGP`(通过移动支付)。 * 以下货币的出金:`CNY`(通过支付宝、P2P 和银行转账)和 `JPY`(通过 P2C)。 在 Payrock 中,每种货币对应特定国家,这意味着支付表单中显示的详情将因该国家而异,例如可用于转账的银行列表。 请按照以下说明配置 Payrock 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明对应于通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss),但包含 Payrock 特有的详细信息。 在继续执行以下说明之前,您必须已注册 Payrock 并拥有一个活跃账户。如有任何疑问,您可以查阅官方 [Payrock 文档](https://support.payroc.com/s/)或联系其支持团队。 ## 配置 Payrock 连接 [#configure-connections-to-payrock] 如果您计划将 Payrock 同时用于入金和出金,则必须配置两个独立连接:一个用于入金,另一个用于出金。 要配置 Payrock 连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如 `Deposits_Payrock` 或 `Withdrawals_Payrock`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择 **Payrock**。 在显示的 **Credentials** 部分中,配置 Payrock 特定设置: * 在 **API base URL** 字段中,指定 `https://gateway-dev.payrock.io`。 * 在 **Merchant code** 字段中,输入 Payrock 为您的账户分配的 Merchant code。 * 在 **Merchant key** 字段中,输入 Payrock 为您的商户账户提供的密钥,该密钥用于验证 API 请求。 您需要向 Payrock 支持团队申请 **Merchant code** 和 **Merchant key**。 点击 **Save** 创建连接。 **Payrock** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设为 **Yes**。 点击 **Save** 应用更改。 如果您需要通过 Payrock 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 Payrock 添加入金方式 [#add-a-deposit-method-through-payrock] 要添加并设置通过 Payrock 入金的方式: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将在 Back Office 中分配给该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 Payrock 的入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **Payrock**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 Payrock 连接](#configure-connections-to-payrock)。 跳过 **Configuration** 部分,因为 Payrock 入金方式无需任何设置。 点击 **Save** 创建入金方式。 **Payrock** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定将在 B2CORE UI 中显示为入金方式图标的图片 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以启用该方式。 * 在 **PS Currencies** 选项卡中,添加所需货币。要使该方式能够处理特定货币的入金,请确保该货币已添加到此选项卡。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(有关详细信息,请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Payrock deposit method — Settings tab 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Payrock** 入金方式。 ## 通过 Payrock 添加出金方式 [#add-a-withdrawal-method-through-payrock] 要添加并设置通过 Payrock 出金的方式: 在 B2CORE Back Office 中,前往 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将在 Back Office 中分配给该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 Payrock 的出金将可从以所选货币计价的账户进行。 * 在 **Driver** 下拉列表中,选择 **Payrock**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 Payrock 连接](#configure-connections-to-payrock)。 跳过 **Configuration** 部分,因为 Payrock 出金方式无需任何设置。 点击 **Save** 创建出金方式。 **Payrock** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定将在 B2CORE UI 中显示为出金方式图标的图片 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以启用该方式。 * 在 **PS Currencies** 选项卡中,添加所需货币。要使该方式能够处理特定货币的出金,请确保该货币已添加到此选项卡。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(有关详细信息,请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Payrock withdrawal method — Settings tab 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Payrock** 出金方式。 [Paytiko](https://www.paytiko.com/) 可通过 PSS 连接到 B2CORE,仅支持入金。 如需查看可通过 PSS 连接的完整支付系统列表,请参阅 [集成 > 支付系统](../../integrations/payment-systems)。此类系统会在 **PSS-supported** 列中标记为 `Yes`。 请按照以下说明配置 Paytiko 连接,并在 B2CORE Back Office 中设置入金方式。这些说明与通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 Paytiko 专属的详细信息。 在继续以下说明之前,您必须已注册 Paytiko 并拥有有效账户。 ## 配置与 Paytiko 的连接 [#configure-a-connection-to-paytiko] 要配置用于入金的 Paytiko 连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如 `Deposits_Paytiko`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 在显示的 **Driver** 下拉列表中,选择 **Paytiko**。 在显示的 **Credentials** 部分中,配置 Paytiko 专属设置: * 在 **API base URL** 字段中,指定 `https://core.paytiko.com`。 * 在 **Secrete key** 字段中,输入您的密钥。要查找您的密钥,请登录 Paytiko 账户并前往 **Payment settings** > **Merchants**,您可以在那里复制该密钥。 创建与 Paytiko 的连接 点击 **Save** 以创建连接。 **Paytiko** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**Enabled** 列显示 **No**),请点击 **Edit** 按钮打开连接详细信息,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 ## 通过 Paytiko 添加入金方式 [#add-a-deposit-method-through-paytiko] 要添加并设置通过 Paytiko 进行入金的方式: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。此标题将分配给 Back Office 中的方式,并会在 B2CORE UI 中向客户显示。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 Paytiko 的入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **Paytiko**。 * 在 **Connection** 下拉列表中,选择先前配置的 [Paytiko 连接](#configure-a-connection-to-paytiko)。 跳过 **Configuration** 部分,因为 Paytiko 无需进行任何设置。 创建 Paytiko 入金方式 点击 **Save** 以创建入金方式。 **Paytiko** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详细信息,并完成以下字段: * 在 **Settings** 选项卡中,于 **Group** 下拉列表选择 **Fiat**。 * 在 **Icon** 字段中,指定 `paymethod-paytiko`,以便在 B2CORE UI 中显示 Paytiko 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未启用(**Enabled** 字段显示 **No**),请通过将 **Enabled** 下拉列表设置为 **Yes** 来启用它。 * 在 **PS Currencies** 选项卡中添加所需货币(有关该选项卡的说明,请参阅[入金方式](../../back-office-guide/system/deposit-system#details))。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 入金方式详细信息 点击 **Save** 以应用更改。 现已在 B2CORE Back Office 中配置 **Paytiko** 入金方式。 ## 在您的 Paytiko 账户中设置 Webhook [#set-up-a-webhook-in-your-paytiko-account] 要在 B2CORE 中接收已发起入金的状态更新,您需要在 Paytiko 账户中设置通知 Webhook。 ### 从 B2CORE Back Office 复制 Webhook URL [#copy-the-webhook-url-from-the-b2core-back-office] 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 找到已配置的 **Paytiko** 入金方式,然后点击 **Edit** 进入方式详细信息。 前往 **Webhooks** 选项卡。 复制 **Notification URL** 字段中显示的 URL。 ### 将 Webhook URL 添加到您的 Paytiko 账户 [#add-the-webhook-url-to-your-paytiko-account] 在您的 Paytiko 账户中,前往 **Payment settings** > **Merchants**。 在 **Merchant settings** 中,将复制的 Webhook URL 粘贴到 **External service** 部分下的 **Url** 字段中。 将 Webhook URL 添加到您的 Paytiko 账户 点击 **Save** 以应用更改。 现已完全配置 **Paytiko** 入金方式,客户可在 B2CORE UI 中进行入金时使用该方式。 [Praxis](https://praxis.tech/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,并支持入金和出金。 请按照以下说明配置 Praxis 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明对应于通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss),但包含 Praxis 特有的详细信息。 在继续操作前,您必须已注册 Praxis 并拥有有效账户。 ## 配置 Praxis 连接 [#configure-connections-to-praxis] 如果您计划将 Praxis 同时用于入金和出金,则必须配置独立的连接,每个连接专用于特定的入金或出金方式。 通过 Praxis 的出金可处理至**银行卡**,或通过**替代支付方式** (APM),例如电子钱包。 必须为每个连接配置相应的驱动程序,以确保对应入金或出金方式正确运行。 要配置 Praxis 连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如 `Deposits_Praxis` 或 `Withdrawals_Praxis`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉菜单中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉菜单中,选择: * **Praxis cashier** — 用于处理入金。 * **Praxis bank card** — 用于向银行卡出金。 * **Praxis alternative payment method** — 用于通过 APM(如电子钱包)出金。 在显示的 **Credentials** 部分中,配置 Praxis 专用设置: * 在 **Environment** 下拉菜单中(仅适用于 **Praxis bank card** 驱动程序),选择 **Production**。 * 在 **API base URL** 字段中,指定 `https://gw.praxisgate.com`。 * 在 **API secret** 字段中,输入 Praxis 提供的密钥。 * 在 **Merchant ID** 字段中,输入您的 Praxis Merchant ID。 * 在 **Application key** 字段中,输入在您的 Praxis 账户中生成的密钥。 点击 **Save** 创建连接。 用于入金或出金的 **Praxis** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉菜单设为 **Yes**。 点击 **Save** 应用更改。 如果您需要为其他支付方式创建额外的 Praxis 连接,请按照相同说明使用不同的驱动程序创建新连接。 下图显示了三个已配置的 Praxis 连接:一个用于入金方式,两个用于出金方式。 Praxis 外部连接 ## 通过 Praxis 添加入金方式 [#add-a-deposit-method-through-praxis] 要添加并设置通过 Praxis 入金的方式: 在 B2CORE Back Office 中,转到 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉菜单中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉菜单中,选择一种或多种货币。通过 Praxis 入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉菜单中,选择 **Praxis cashier**。 * 在 **Connection** 下拉菜单中,选择之前配置的[用于入金的 Praxis 连接](#configure-connections-to-praxis)。 跳过 **Configuration** 部分,因为 Praxis 入金方式无需任何设置。 点击 **Save** 创建入金方式。 **Praxis** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉菜单选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-praxis`,以便在 B2CORE UI 中显示 Praxis 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉菜单设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡上添加所需货币。要使该方式能够处理特定货币的入金,请确保该货币已在此选项卡中添加(有关此选项卡的说明,请参阅[入金方式](../../back-office-guide/system/deposit-system#details))。 * 如有需要,可在 **Commissions** 选项卡上为该方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Praxis 入金方式 — Settings 选项卡 点击 **Test configuration** 验证入金方式的连接设置。测试将基于方式表单中指定的设置以及所选外部连接中提供的数据执行。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Praxis** 入金方式。请确保在您的 Praxis 账户中应用以下设置,以正确处理入金。 ## 在您的 Praxis 账户中设置入金处理 [#set-up-the-settings-for-deposit-processing-in-your-praxis-account] 登录您的 Praxis 账户并应用以下设置: * 必须启用 **Allow Payment Link Generation** 选项。 您无法自行激活此选项。要启用它,请向 Praxis 支持团队提交请求。 * **Validate IP** 选项应禁用,或包含您的 B2CORE Back Office 所在主机的 IP 地址。 * **Validate domain** 选项: * 如果除 B2CORE UI 外您还拥有[移动应用](../../release-notes/release-notes-mobile),则必须禁用此选项。 * 如果您仅拥有 B2CORE UI,则此选项应禁用,或包含您的 B2CORE UI 所在的域名。 ## 通过 Praxis 添加出金方式 [#add-a-withdrawal-method-through-praxis] 要添加并设置通过 Praxis 出金的方式: 在 B2CORE Back Office 中,转到 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的该方式,并对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉菜单中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉菜单中,选择一种或多种货币。通过 Praxis 出金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉菜单中,选择: * **Praxis bank card** — 用于向银行卡出金的驱动程序。 * **Praxis alternative payment method** — 用于通过 APM(替代支付方式),例如电子钱包,进行出金的驱动程序。 * 在 **Connection** 下拉菜单中,选择之前配置的[用于出金的 Praxis 连接](#configure-connections-to-praxis)。 在显示的 **Configuration** 部分中: * **Gateway hash** 字段显示: * 如果您选择了 **Praxis bank card** 驱动程序,则显示 **Card processor**。 * 如果您选择了 **Praxis alternative payment method** 驱动程序,则显示 **E-Wallet**。 * 在 **Profile ID** 下拉菜单中(仅适用于 **Praxis bank card** 驱动程序),选择您的 Praxis 配置文件类型。 点击 **Save** 创建出金方式。 **Praxis** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡上,使用 **Group** 下拉菜单选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-praxis`,以便在 B2CORE UI 中显示 Praxis 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉菜单设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡上添加所需货币。要使该方式能够处理特定货币的出金,请确保该货币已在此选项卡中添加(有关此选项卡的说明,请参阅[出金方式](../../back-office-guide/system/payout-system#details))。 * 如有需要,可在 **Commissions** 选项卡上为该方式配置佣金(详情请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Praxis 出金方式 — Settings 选项卡 点击 **Test configuration** 验证出金方式的连接设置。测试将基于方式表单中指定的设置以及所选外部连接中提供的数据执行。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现已在 B2CORE Back Office 中配置 **Praxis** 出金方式。 如果您同时需要向银行卡和电子钱包出金,请添加并设置另一个使用不同驱动程序和连接的出金方式。 [Proxpay](https://www.proxpay.co/auth/login) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE。它支持通过二维码入金以及向银行账户出金,并以 `THB` 进行处理。 请按照以下说明配置 Proxpay 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 支持的支付系统添加方式的[常规流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 Proxpay 特有的详细信息。 在继续执行说明之前,您必须已注册 Proxpay 并拥有有效账户。 ## 配置与 Proxpay 的连接 [#configure-connections-to-proxpay] 如果您计划将 Proxpay 同时用于入金和出金,则必须配置两个独立连接:一个用于入金,另一个用于出金。 要配置与 Proxpay 的连接: 在 B2CORE Back Office 中,转到 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_Proxpay` 或 `Withdrawals_Proxpay`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在出现的 **Driver** 下拉列表中,选择 **Proxpay**。 在出现的 **Credentials** 部分中,配置 Proxpay 专属设置。 ### 用于入金: [#for-deposits] * 在 **API base URL** 字段中,指定: * `https://api.proxpay.co` — 用于生产环境 * `https://stg-api.proxpay.co` — 用于沙盒测试环境 * 在 **API key** 字段中,输入由 Proxpay 提供的、用于验证请求的 API 密钥。 * 在 **Username** 和 **Password** 字段中,指定与您的 Merchant ID 关联的凭据。 * 在 **API start base URL** 字段中,指定 `https://payment.thehabito.com`。此 URL 仅适用于生产环境,测试环境中不可用。 * 在 **Start token** 字段中,输入用于通过 Proxpay 发起 API 会话的令牌。 * 在 **Merchant ID** 字段中,指定由 Proxpay 分配给您的 Merchant ID。 * 在 **Proxpay merchant ID** 字段中,指定用于二维码入金的唯一商户标识符。 ### 用于出金: [#for-withdrawals] * 在 **API base URL** 字段中,指定: * `https://api.proxpay.co` — 用于生产环境 * `https://stg-api.proxpay.co` — 用于沙盒测试环境 * 在 **API key** 字段中,输入由 Proxpay 提供的、用于验证请求的 API 密钥。 * 在 **Username** 和 **Password** 字段中,指定与您的 Merchant ID 关联的凭据。 * 在 **Merchant ID** 字段中,指定由 Proxpay 分配给您的 Merchant ID。 您需要向 Proxpay 支持团队申请配置连接所需的全部凭据。 点击 **Save** 创建连接。 **Proxpay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详细信息,并将 **Enabled** 下拉列表设为 **Yes**。 点击 **Save** 应用更改。 如果您需要支持通过 Proxpay 进行入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 Proxpay 添加入金方式 [#add-a-deposit-method-through-proxpay] 要添加并设置通过 Proxpay 进行入金的方式: 在 B2CORE Back Office 中,转到 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将在 Back Office 中分配给该方式,并会在 B2CORE UI 中对客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 Proxpay 的入金将适用于以所选币种计价的账户。必须为这些币种配置 `THB` 的转换汇率。 * 在 **Driver** 下拉列表中,选择 **Proxpay**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于入金的 Proxpay 连接](#configure-connections-to-proxpay)。 在 **Configuration** 部分中,按照 Proxpay 支持团队提供的信息输入 **Product detail** 字段的值。 点击 **Save** 创建入金方式。 **Proxpay** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详细信息并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定将在 B2CORE UI 中显示为入金方式图标的图片 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活该方式。 * 在 **PS Currencies** 选项卡中,添加 `THB`。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详见[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Proxpay 入金方式 — Settings 选项卡 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,**Proxpay** 入金方式已在 B2CORE Back Office 中配置完成。 ## 通过 Proxpay 添加出金方式 [#add-a-withdrawal-method-through-proxpay] 要添加并设置通过 Proxpay 进行出金的方式: 在 B2CORE Back Office 中,转到 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将在 Back Office 中分配给该方式,并会在 B2CORE UI 中对客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 Proxpay 的出金将适用于以所选币种计价的账户。必须为这些币种配置 `THB` 的转换汇率。 * 在 **Driver** 下拉列表中,选择 **Proxpay**。 * 在 **Connection** 下拉列表中,选择之前配置的[用于出金的 Proxpay 连接](#configure-connections-to-proxpay)。 跳过 **Configuration** 部分,因为 Proxpay 出金方式无需任何设置。 点击 **Save** 创建出金方式。 **Proxpay** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详细信息并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定将在 B2CORE UI 中显示为出金方式图标的图片 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活该方式。 * 在 **PS Currencies** 选项卡中,添加 `THB`。 * 如有需要,请在 **Commissions** 选项卡中为该方式配置佣金(详见[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Proxpay 出金方式 — Settings 选项卡 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 现在,**Proxpay** 出金方式已在 B2CORE Back Office 中配置完成。 ## 在 Proxpay 中设置 webhook [#set-up-webhooks-in-proxpay] 要在 B2CORE 中接收入金和出金的状态更新,必须在 Proxpay 端设置通知 webhook。 ### 从 B2CORE Back Office 复制 webhook URL [#copy-webhook-urls-from-the-b2core-back-office] 您需要分别为入金和出金方式提供独立的 webhook URL。 在 B2CORE Back Office 中,转到: * **System** > **Deposit system** > **Deposit methods** * **System** > **Payout system** > **Payout methods** 找到已配置的 Proxpay 入金或出金方式,然后点击 **Edit** 打开其详细信息。 转到 **Webhooks** 选项卡。 复制 **Notification URL** 字段中显示的 URL。 ### 向 Proxpay 提供 URL [#provide-urls-to-proxpay] 将复制的 webhook URL(包括入金和出金的 URL)发送给 Proxpay 支持团队,以便他们在其端进行配置。 [Sticpay](https://www.sticpay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,并支持入金和出金。 请按照以下说明配置 Sticpay 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明与通过 PSS 添加支付系统支持的方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 Sticpay 的特定详细信息。 在继续以下说明前,您必须已注册 Sticpay 并拥有一个有效账户。 ## 支持的币种 [#supported-currencies] 下表列出了通过 Sticpay 进行入金和出金所支持的币种。交易通过您 Sticpay 账户中创建的钱包处理。要启用特定币种,您必须先创建该币种的钱包。 ### 法定货币 [#fiat-currencies] 以下法定货币同时支持**入金和出金**: ### 加密货币 [#cryptocurrencies] 以下加密货币仅支持**入金**: ## 最低入金和出金金额 [#minimum-deposit-and-withdrawal-amounts] Sticpay 对入金和出金采用动态最低金额,该金额根据 Sticpay 的汇率相当于 **1 USD**。如果创建的入金或出金请求低于此最低阈值(换算为 USD),Sticpay 将拒绝该交易。 对于入金,当客户重定向至 Sticpay 页面时,如果金额低于限额,客户将看到错误信息。 对于出金,如果金额低于限额,交易将在 Sticpay 端处理时失败,且客户不会看到失败原因。为防止此情况,强烈建议在 B2CORE Back Office 的 Sticpay 出金方式中,为每种支持的币种配置最低出金金额。 ## 在您的 Sticpay 账户中配置 API 设置 [#configure-api-settings-in-your-sticpay-account] 要启用 Sticpay 与 B2CORE 之间的集成,您需要在 Sticpay 账户中配置特定的 API 设置。 配置 API 设置: 登录您的 Sticpay 账户并前往 **Sticpay API** 部分。 配置以下设置,这是入金和出金方式在 B2CORE 中正常运行所必需的: * 选中 **Enable** 复选框以启用基于 API 的支付。 * 选中 **Unique order-no** 复选框,以确保每笔交易均具有唯一订单号,避免重复。 * 在 **Success URL** 字段中,使用以下格式指定客户成功入金后将被重定向到的 URL: `https://{your-Front-Office-URL}/en/payment/success` * 在 **Failure URL** 字段中,使用以下格式指定客户入金失败后将被重定向到的 URL: `https://{your-Front-Office-URL}/en/payment/failed` * 在 **Referrer URL** 字段中,使用以下格式指定客户取消入金后将被重定向到的 URL(例如,您的 B2CORE UI 中的 **Funds** > **Deposit** 页面): `https://{your-Front-Office-URL}/en/funds/deposit` 请确保将 `{your-Front-Office-URL}` 替换为您的 B2CORE UI 域名。 * 在 **Callback URL** 字段中,输入在 B2CORE Back Office 中配置该方式后,入金方式设置的 **Webhooks** 选项卡中生成的 webhook URL(详见[在您的 Sticpay 账户中设置 webhook](#set-up-a-webhook-in-your-sticpay-account))。 * 选中 **Plain JSON Callback** 复选框,以确保回调响应采用纯 JSON 格式。 * 在 **Whitelist IPs** 字段中,输入允许向您的 API 发送请求的 IP 地址,以逗号分隔。 * 在 **Encryption type** 下拉列表中,选择 **SHA256** 以使用此加密方式进行请求签名和验证。与 B2CORE 集成仅支持 **SHA256**。 Sticpay API settings 点击 **Save** 以应用更改。 ## 配置至 Sticpay 的连接 [#configure-connections-to-sticpay] 如果您计划同时使用 Sticpay 进行入金和出金,则必须配置两个独立连接:一个用于入金,另一个用于出金。 配置至 Sticpay 的连接: 在 B2CORE Back Office 中,前往 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_Sticpay` 或 `Withdrawals_Sticpay`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **Driver** 下拉列表中,选择 **Sticpay**。 在显示的 **Credentials** 部分中,配置 Sticpay 专属设置: * 在 **Interface version** 下拉列表中,根据您设置的是生产环境还是测试集成,选择 **Live** 或 **Sandbox**。 * 在 **API base URL** 字段中,指定 `https://api.sticpay.com`,该地址同时用于生产和沙盒环境。 * 在 **Merchant email** 字段中,输入与您的 Sticpay 商户账户关联的电子邮件地址。该电子邮件可在 **Account** 部分中找到。 * 在 **API key** 字段中,输入在您账户的 **Sticpay API** 部分生成的 API 密钥。 点击 **Save** 以创建连接。 **Sticpay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设为 **Yes**。 点击 **Save** 以应用更改。 如果您需要通过 Sticpay 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 Sticpay 添加入金方式 [#add-a-deposit-method-through-sticpay] 添加并设置通过 Sticpay 入金的方式: 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 Sticpay 入金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择 **Sticpay**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于入金的 Sticpay 连接](#configure-connections-to-sticpay)。 跳过 **Configuration** 部分,因为 Sticpay 入金方式无需任何设置。 点击 **Save** 以创建入金方式。 **Sticpay** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-sticpay`,以便在 B2CORE UI 中显示 Sticpay 入金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 * 检查方式状态。 如果方式未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需币种。要使该方式能够处理特定币种的入金,请确保该币种已添加至此选项卡。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详见[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Sticpay deposit method — Settings tab 点击 **Test configuration** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 **Sticpay** 入金方式现已在 B2CORE Back Office 中配置完成。 ## 在您的 Sticpay 账户中设置 webhook [#set-up-a-webhook-in-your-sticpay-account] 要在 B2CORE 中接收已发起入金的状态更新,您需要在 Sticpay 账户中设置通知 webhook。 ### 从 B2CORE Back Office 复制 webhook URL [#copy-the-webhook-url-from-the-b2core-back-office] 在 B2CORE Back Office 中,前往 **System** > **Deposit system** > **Deposit methods**。 找到已配置的 **Sticpay** 入金方式,然后点击 **Edit** 进入方式详情。 前往 **Webhooks** 选项卡。 复制 **Notification URL** 字段中显示的 URL。 ### 将 webhook URL 添加至您的 Sticpay 账户 [#add-the-webhook-url-to-your-sticpay-account] 在您的 Sticpay 账户中,前往 **Sticpay API** 部分。 将复制的 webhook URL 粘贴到 **Callback URL** 字段中。 点击 **Save** 以应用更改。 ## 通过 Sticpay 添加出金方式 [#add-a-withdrawal-method-through-sticpay] 添加并设置通过 Sticpay 出金的方式: 在 B2CORE Back Office 中,前往 **System** > **Payout system** > **Payout methods**。 点击页面右上角的 **+Create**。 在 **Create a payout method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种币种。通过 Sticpay 出金将适用于以所选币种计价的账户。 * 在 **Driver** 下拉列表中,选择 **Sticpay**。 * 在 **Connection** 下拉列表中,选择先前配置的[用于出金的 Sticpay 连接](#configure-connections-to-sticpay)。 跳过 **Configuration** 部分,因为 Sticpay 出金方式无需任何设置。 点击 **Save** 以创建出金方式。 **Sticpay** 出金方式将显示在出金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-sticpay`,以便在 B2CORE UI 中显示 Sticpay 出金方式的[预定义图标](../../integrations/payment-systems)。如需使用自定义图标,请指定要显示的图像 URL。 如果方式未激活(**Enabled** 字段显示 **No**),请将 **Enabled** 下拉列表设为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需币种。要使该方式能够处理特定币种的出金,请确保该币种已添加至此选项卡。 Sticpay 对出金采用动态最低金额,该金额根据 Sticpay 的汇率相当于 **1 USD**。 如果创建的出金低于此最低金额,交易将在 Sticpay 端处理时失败,且客户不会看到失败原因。为防止此情况,请在向 **PS Currencies** 选项卡添加每种币种时,为其指定最低金额(换算为 USD)。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详见[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Sticpay withdrawal method — Settings tab 点击 **Test configuration** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **Save**。 **Sticpay** 出金方式现已在 B2CORE Back Office 中配置完成。 [TopChange Pay](https://www.topchange.net/) (TC Pay) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接到 B2CORE,支持以 `USD`、`IRR`、`EUR`、`AED`、`TRY`、`CNY`、`RUB` 和 `USDT` 进行入金和出金。 请按照以下说明配置 TC Pay 连接,并在 B2CORE Back Office 中设置入金和出金方法。这些说明与通过 PSS 为支付系统添加方法的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss)相对应,但包含 TC Pay 特有的详细信息。 在继续以下说明之前,您必须已注册 TC Pay 并拥有有效账户。如有任何疑问,您可以查阅官方 [TC Pay 文档](https://topchange1.zendesk.com/)或联系其支持团队。 ## 配置 TopChange Pay 连接 [#configure-connections-to-topchange-pay] 如果您计划同时使用 TC Pay 进行入金和出金,则必须配置两个单独的连接:一个用于入金,另一个用于出金。 要配置与 TC Pay 的连接: 在 B2CORE Back Office 中,前往 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面上,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_TC_Pay` 或 `Withdrawals_TC_Pay`)。 * 在 **标题** 字段中,输入将应用于 Back Office 中该连接的标题。 * 在 **提供商** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加用于入金方法的连接。 * **PaymentSystemWithdrawal** — 添加用于出金方法的连接。 在显示的 **驱动程序** 下拉列表中,选择 **TC Pay**。 在显示的 **凭证** 部分中,配置 TC Pay 特有的设置: * 在 **API 基础 URL** 字段中,指定 `https://pg.topayment.net`。 * 在 **商户 ID** 字段中,输入 TC Pay 分配给您账户的商户 ID。 * 使用 **TC RSA 密钥生成器**生成一对 RSA *私钥*和*公钥*。 如有任何疑问,您可以查阅官方 [TC Pay 文档](https://topchange1.zendesk.com/)或联系其支持团队。 * 在 **私有 RSA 密钥** 字段中,指定*私钥*,并确保在您的 TC Pay 账户中指定相应的*公钥*。 点击 **保存** 以创建连接。 **TC Pay** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**已启用** 列中显示 **否**),请点击 **编辑** 按钮打开连接详情,并将 **已启用** 下拉列表设为 **是**。 点击 **保存** 以应用更改。 如果您需要通过 TC Pay 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 TopChange Pay 添加入金方法 [#add-a-deposit-method-through-topchange-pay] 要添加并设置通过 TC Pay 入金的方法: 在 B2CORE Back Office 中,前往 **系统** > **入金系统** > **入金方法**。 点击页面右上角的 **+创建**。 在 **创建入金方法** 页面上,填写以下字段: * 在 **名称** 字段中,输入方法名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方法标题。该标题将分配给 Back Office 中的方法,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **可用账户货币** 下拉列表中,选择一种或多种货币。通过 TC Pay 入金将适用于以所选货币计价的账户。 * 在 **驱动程序** 下拉列表中,选择 **TC Pay**。 * 在 **连接** 下拉列表中,选择先前配置的[用于入金的 TC Pay 连接](#configure-connections-to-topchange-pay)。 在 **配置** 部分中,填写与您的 TC Pay 商户账户关联的 **终端 ID**。这可确保交易被正确路由并归属到相应的支付终端。请注意,允许使用的货币由指定的终端 ID 决定。 点击 **保存** 以创建入金方法。 **TC Pay** 入金方法将显示在入金方法列表中。 点击 **编辑** 进入方法详情,并完成以下字段: * 在 **设置** 选项卡上,使用 **组** 下拉列表选择应包含该方法的一个或多个组。 * 在 **图标** 字段中,指定将在 B2CORE UI 中显示为入金方法图标的图片 URL。 * 检查方法状态。 如果方法未激活(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设为 **是** 以激活它。 * 在 **PS 货币** 选项卡上,添加所需货币。要使该方法能够处理特定货币的入金,请确保已在此选项卡中添加该货币。 对于 TC Pay,每个入金方法在 **PS 货币** 选项卡下只能支持一种货币。因此,如果您希望允许客户以所有受支持的货币(`USD`、`IRR`、`EUR`、`AED`、`TRY`、`CNY`、`RUB` 和 `USDT`)入金,则必须创建八个单独的入金方法 — 每种货币一个,并与指定的 **终端 ID** 相对应。 * 如有需要,请在 **佣金** 选项卡上为该方法配置佣金(详情请参阅[如何为入金和出金方法配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 TC Pay 入金方法 — 设置选项卡 点击 **测试配置** 以验证入金方法的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **TC Pay** 入金方法。 ## 通过 TopChange Pay 添加出金方法 [#add-a-withdrawal-method-through-tc-pay] 要添加并设置通过 TC Pay 出金的方法: 在 B2CORE Back Office 中,前往 **系统** > **出金系统** > **出金方法**。 点击页面右上角的 **+创建**。 在 **创建出金方法** 页面上,填写以下字段: * 在 **名称** 字段中,输入方法名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方法标题。该标题将分配给 Back Office 中的方法,并对 B2CORE UI 中的客户可见。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **可用账户货币** 下拉列表中,选择一种或多种货币。通过 TC Pay 出金将适用于以所选货币计价的账户。 * 在 **驱动程序** 下拉列表中,选择 **TC Pay**。 * 在 **连接** 下拉列表中,选择先前配置的[用于出金的 TC Pay 连接](#configure-connections-to-topchange-pay)。 在 **配置** 部分中,填写与您的 TC Pay 商户账户关联的 **终端 ID**。这可确保交易被正确路由并归属到相应的支付终端。请注意,允许使用的货币由指定的终端 ID 决定。 点击 **保存** 以创建出金方法。 **TC Pay** 出金方法将显示在出金方法列表中。 点击 **编辑** 进入方法详情,并完成以下字段: * 在 **设置** 选项卡上,使用 **组** 下拉列表选择应包含该方法的一个或多个组。 * 在 **图标** 字段中,指定将在 B2CORE UI 中显示为出金方法图标的图片 URL。 * 检查方法状态。 如果方法未激活(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设为 **是** 以激活它。 * 在 **PS 货币** 选项卡上,添加所需货币。要使该方法能够处理特定货币的出金,请确保已在此选项卡中添加该货币。 对于 TC Pay,每个出金方法在 **PS 货币** 选项卡下只能支持一种货币。因此,如果您希望允许客户以所有受支持的货币(`USD`、`IRR`、`EUR`、`AED`、`TRY`、`CNY`、`RUB` 和 `USDT`)出金,则必须创建八个单独的出金方法 — 每种货币一个,并与指定的 **终端 ID** 相对应。 * 如有需要,请在 **佣金** 选项卡上为该方法配置佣金(详情请参阅[如何为入金和出金方法配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 TC Pay 出金方法 — 设置选项卡 点击 **测试配置** 以验证出金方法的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **TC Pay** 出金方法。 [UniPayment](https://unipayment.io/en/) 可通过 PSS 连接到 B2CORE,支持通过银行卡入金,并以 `EUR`、`GBP` 和 `USD` 处理。 请按照以下说明配置 UniPayment 连接,并在 B2CORE Back Office 中设置入金方式。这些说明与通过 PSS 支持的支付系统添加方式的[常规流程](how-to-add-deposit-and-withdrawal-methods-through-pss)一致,但包含 UniPayment 特有的详细信息。 在继续执行说明之前,您必须已注册 UniPayment 并拥有一个有效账户。如有任何疑问,您可以查阅官方 [UniPayment Help Center](https://help.unipayment.io/en/) 或联系其支持团队。 ## 配置 UniPayment 连接 [#configure-a-connection-to-unipayment] 要配置用于入金的 UniPayment 连接: 在 B2CORE Back Office 中,导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_UniPayment`)。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 在显示的 **Driver** 下拉列表中,选择 **UniPayment**。 在显示的 **Credentials** 部分中,配置 UniPayment 专属设置: * 在 **API base URL** 字段中,指定: * `https://api.unipayment.io/` — 用于生产环境 * `https://sandbox-api.unipayment.io/` — 用于沙盒测试环境 * 在 **Client ID** 字段中,输入在您的 UniPayment 账户中生成的客户端标识符。 * 在 **Client secret** 字段中,输入与您的 UniPayment 客户端关联的密钥。 要生成客户端 ID 和密钥,请登录您的 UniPayment 账户,点击个人资料图标并选择 **API Management**。 点击 **Save** 以创建连接。 **UniPayment** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未激活(**Enabled** 列中显示 **No**),请点击 **Edit** 按钮打开连接详情,并将 **Enabled** 下拉列表设置为 **Yes**。 点击 **Save** 以应用更改。 ## 通过 UniPayment 添加入金方式 [#add-a-deposit-method-through-unipayment] 要添加并设置通过 UniPayment 入金的方式: 在 B2CORE Back Office 中,导航至 **System** > **Deposit system** > **Deposit methods**。 点击页面右上角的 **+Create**。 在 **Create a deposit method** 页面中,填写以下字段: * 在 **Name** 字段中,输入方式名称。该名称必须唯一,且只能包含拉丁字母、数字、连字符和下划线。 * 在 **Caption** 字段中,输入方式标题。该标题将分配给 Back Office 中的该方式,并将对 B2CORE UI 中的客户可见。 * 在 **Provider** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **Available account currencies** 下拉列表中,选择一种或多种货币。通过 UniPayment 入金将适用于以所选货币计价的账户。 * 在 **Driver** 下拉列表中,选择 **UniPayment**。 * 在 **Connection** 下拉列表中,选择之前配置的 [UniPayment 连接](#configure-a-connection-to-unipayment)。 在 **Configuration** 部分中,填写以下字段: * 在 **Application ID** 字段中,输入您在 UniPayment 账户中创建的应用程序标识符。 * 在 **Payment method type** 下拉列表中,选择 **Card**。 UniPayment 中的应用程序 点击 **Save** 以创建入金方式。 **UniPayment** 入金方式将显示在入金方式列表中。 点击 **Edit** 进入方式详情,并完成以下字段: * 在 **Settings** 选项卡中,使用 **Group** 下拉列表选择应包含该方式的一个或多个组。 * 在 **Icon** 字段中,指定 `paymethod-unipayment`,以在 B2CORE UI 中显示 UniPayment 入金方式的[预定义图标](../../integrations/payment-systems)。若要使用自定义图标,请指定要显示图像的 URL。 * 检查方式状态。 如果该方式未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活它。 * 在 **PS Currencies** 选项卡中,添加所需货币,例如 `EUR`、`GBP` 和 `USD`。通过 UniPayment 的入金将以此选项卡中添加的货币进行处理。 * 如有需要,请在 **Commissions** 选项卡中配置该方式的佣金(详情请参阅[如何配置入金和出金方式的佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 UniPayment 入金方式 — Settings 选项卡 点击 **Save** 以应用更改。 现已在 B2CORE Back Office 中配置 **UniPayment** 入金方式。 [Visionpay (HILZI)](https://visionpay.com/) 可通过 [PSS](../../integrations/payment-systems#payment-system-service-pss) 连接至 B2CORE,支持通过 Whish Money 应用以 `USD` 处理入金和出金。 请按照以下说明配置 Visionpay (HILZI) 连接,并在 B2CORE Back Office 中设置入金和出金方式。这些说明对应于通过 PSS 支持的支付系统添加方式的[通用流程](how-to-add-deposit-and-withdrawal-methods-through-pss),但包含 Visionpay 特有的详细信息。 在继续以下说明之前,您必须已注册 Visionpay 并拥有有效账户。 配置 Visionpay 连接所需的所有详细信息,包括 API 基础 URL 和凭据,均必须向 Visionpay 支持团队索取。 ## 配置 Visionpay (HILZI) 连接 [#configure-connections-to-visionpay-hilzi] 如果您计划将 Visionpay (HILZI) 同时用于入金和出金,则必须配置两个独立连接:一个用于入金,另一个用于出金。 要配置 Visionpay (HILZI) 连接: 在 B2CORE Back Office 中,导航至 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面中,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线(例如,`Deposits_Hilzi` 或 `Withdrawals_Hilzi`)。 * 在 **标题** 字段中,输入将应用于 Back Office 中该连接的标题。 * 在 **提供商** 下拉列表中,选择: * **PaymentSystemDeposit** — 添加将用于入金方式的连接。 * **PaymentSystemWithdrawal** — 添加将用于出金方式的连接。 在显示的 **驱动程序** 下拉列表中,选择 **Hilzi**。 在显示的 **凭据** 部分中,配置 Visionpay 专属设置: * 在 **API 基础 URL** 字段中,指定 Visionpay 为您的集成环境提供的基础 URL。 * 在 **登录名** 和 **密码** 字段中,输入 Visionpay 提供的凭据。 您需要向 Visionpay 支持团队索取 **API 基础 URL** 和凭据。 点击 **保存** 以创建连接。 **Visionpay (HILZI)** 连接将显示在外部连接列表中。 检查连接状态。 如果连接未启用(**已启用** 列中显示 **否**),请点击 **编辑** 按钮打开连接详情,并将 **已启用** 下拉列表设为 **是**。 点击 **保存** 以应用更改。 如果您需要通过 Visionpay (HILZI) 同时支持入金和出金,请按照相同说明为另一项操作创建新连接。 ## 通过 Visionpay (HILZI) 添加入金方式 [#add-a-deposit-method-through-visionpay-hilzi] 要添加并设置通过 Visionpay (HILZI) 进行入金的方式: 在 B2CORE Back Office 中,导航至 **系统** > **入金系统** > **入金方式**。 点击页面右上角的 **+创建**。 在 **创建入金方式** 页面中,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并会在 B2CORE UI 中向客户显示。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemDeposit**。 选择 **PaymentSystemDeposit** 后,将显示以下字段: * 在 **可用账户货币** 下拉列表中,选择 `USD`。 * 在 **驱动程序** 下拉列表中,选择 **Hilzi**。 * 在 **连接** 下拉列表中,选择之前配置的[用于入金的 Visionpay (HILZI) 连接](#configure-connections-to-visionpay-hilzi)。 跳过 **配置** 部分,因为入金方式无需进行任何设置。 点击 **保存** 以创建入金方式。 **Visionpay (HILZI)** 入金方式将显示在入金方式列表中。 点击 **编辑** 进入方式详情,并完成以下字段: * 在 **设置** 选项卡中,使用 **组** 下拉列表选择应包含该方式的一个或多个组。 * 在 **图标** 字段中,指定将在 B2CORE UI 中显示为入金方式图标的图片 URL。 * 检查方式状态。 如果方式未启用(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设为 **是** 以启用该方式。 * 在 **PS 货币** 选项卡中,添加 `USD`,这是处理入金时唯一支持的货币。 * 如有需要,可在 **佣金** 选项卡中为该方式配置佣金(详细信息请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Visionpay (HILZI) 入金方式 — 设置选项卡 点击 **测试配置** 以验证入金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **Visionpay (HILZI)** 入金方式。 ## 通过 Visionpay (HILZI) 添加出金方式 [#add-a-withdrawal-method-through-visionpay-hilzi] 要添加并设置通过 Visionpay (HILZI) 进行出金的方式: 在 B2CORE Back Office 中,导航至 **系统** > **出金系统** > **出金方式**。 点击页面右上角的 **+创建**。 在 **创建出金方式** 页面中,填写以下字段: * 在 **名称** 字段中,输入方式名称。该名称必须唯一,并且只能包含拉丁字母、数字、连字符和下划线。 * 在 **标题** 字段中,输入方式标题。此标题将分配给 Back Office 中的该方式,并会在 B2CORE UI 中向客户显示。 * 在 **提供商** 下拉列表中,选择 **PaymentSystemWithdrawal**。 选择 **PaymentSystemWithdrawal** 后,将显示以下字段: * 在 **可用账户货币** 下拉列表中,选择 `USD`。 * 在 **驱动程序** 下拉列表中,选择 **Hilzi**。 * 在 **连接** 下拉列表中,选择之前配置的[用于出金的 Visionpay (HILZI) 连接](#configure-connections-to-visionpay-hilzi)。 跳过 **配置** 部分,因为出金方式无需进行任何设置。 点击 **保存** 以创建出金方式。 **Visionpay (HILZI)** 出金方式将显示在出金方式列表中。 点击 **编辑** 进入方式详情,并完成以下字段: * 在 **设置** 选项卡中,使用 **组** 下拉列表选择应包含该方式的一个或多个组。 * 在 **图标** 字段中,指定将在 B2CORE UI 中显示为出金方式图标的图片 URL。 * 检查方式状态。 如果方式未启用(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设为 **是** 以启用该方式。 * 在 **PS 货币** 选项卡中,添加 `USD`,这是处理出金时唯一支持的货币。 * 如有需要,可在 **佣金** 选项卡中为该方式配置佣金(详细信息请参阅[如何为入金和出金方式配置佣金](how-to-configure-commissions-for-deposit-and-withdrawal-methods))。 Visionpay (HILZI) 出金方式 — 设置选项卡 点击 **测试配置** 以验证出金方式的连接设置。 测试结果将显示在页面上。 成功验证配置后,点击 **保存**。 现已在 B2CORE Back Office 中配置 **Visionpay (HILZI)** 出金方式。 ## 在 Visionpay (HILZI) 中设置 Webhook [#set-up-webhooks-in-visionpay-hilzi] 要在 B2CORE 中接收入金和出金状态更新,必须在 Visionpay 端设置通知 Webhook。 ### 从 B2CORE Back Office 复制 Webhook URL [#copy-webhook-urls-from-the-b2core-back-office] 您需要为入金和出金方式分别配置独立的 Webhook URL。 在 B2CORE Back Office 中,导航至: * **系统** > **入金系统** > **入金方式** * **系统** > **出金系统** > **出金方式** 找到已配置的 Visionpay (HILZI) 入金或出金方式,并点击 **编辑** 打开其详情。 转到 **Webhook** 选项卡。 复制 **通知 URL** 字段中显示的 URL。 ### 将 URL 提供给 Visionpay [#provide-urls-to-visionpay] 将复制的 Webhook URL(包括入金和出金 URL)发送给 Visionpay 支持团队,以便其在其端完成配置。 您可以根据**验证级别**、**国家/地区**或**客户类型**限制入金和出金方式的使用。此外,您还可以组合使用这些限制条件,以精细调整访问权限。 ## 如何按验证级别限制使用 [#how-to-restrict-the-use-by-verification-level] 您可以限制入金或出金方式的使用,使其仅可由达到特定[验证级别](../../back-office-guide/verification/levels)的客户使用(例如,出于监管要求)。 要按验证级别限制入金或出金方式的使用: 导航至 **System** > **Deposit system** > **Deposit methods**,或\ 导航至 **System** > **Payout system** > **Payout methods**。 选择该方式,然后点击该方式行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后在下拉列表中选择 **Verification level restrictions**。 在 **Restrictions** 弹窗中,填写以下信息: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 此选项禁止所选验证级别使用该方式。 * **Allow only** — 此选项仅允许所选验证级别使用该方式。 * 在 **Rules** 下拉列表中,选择一个或多个验证级别。 点击 **Save** 以应用更改。 ## 如何按国家/地区限制使用 [#how-to-restrict-the-use-by-country] 您可以限制入金或出金方式的使用,使其仅可由来自特定国家/地区的客户使用。 要按国家/地区限制入金或出金方式的使用: 导航至 **System** > **Deposit system** > **Deposit methods**,或\ 导航至 **System** > **Payout system** > **Payout methods**。 选择该方式,然后点击该方式行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后在下拉列表中选择 **Country restrictions**。 在 **Restrictions** 弹窗中,填写以下信息: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 此选项禁止所选国家/地区使用该方式。 * **Allow only** — 此选项仅允许所选国家/地区使用该方式。 * 在 **Rules** 下拉列表中,选择一个或多个国家/地区。 点击 **Save** 以应用更改。 ## 如何按客户类型限制使用 [#how-to-restrict-the-use-by-client-type] 您可以限制入金或出金方式的使用,使其仅可由属于特定[类型](../../back-office-guide/clients/types)的客户使用,例如*个人*或*企业*。 要按客户类型限制入金或出金方式的使用: 导航至 **System** > **Deposit system** > **Deposit methods**,或\ 导航至 **System** > **Payout system** > **Payout methods**。 选择该方式,然后点击该方式行中的 **Edit** 按钮。 点击页面右上角的 **Actions**,然后在下拉列表中选择 **Client type restrictions**。 在 **Restrictions** 弹窗中,填写以下信息: * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Type** 下拉列表中,选择以下两个选项之一: * **Deny only** — 此选项禁止所选客户类型使用该方式。 * **Allow only** — 此选项仅允许所选客户类型使用该方式。 * 在 **Rules** 下拉列表中,选择一个或多个客户类型。 点击 **Save** 以应用更改。 {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} ## 问题 [#problem] 客户无法通过 B2CORE UI 创建交易账户,并遇到错误。 ## 可能原因 [#possible-reasons] 此问题可能由以下一个或多个原因导致: * 与交易平台的连接配置错误或已禁用。 * 产品设置阻止创建账户(例如,账户数量限制或入金要求)。 * 产品货币组未正确映射到平台。 * 已超出客户特定的账户数量限制。 ## 解决方案 [#solution] 要检查与在交易平台上创建账户相关的必要设置: ### 检查交易平台连接设置 [#check-the-trading-platform-connection-settings] * 在 Back Office 中,前往 **Products** > **Platforms**。 * 点击相关平台的 **Edit** 按钮以打开其详细信息。 * 点击 **Test connection** 以验证连接设置。 * **Test connection** 按钮上的勾选标记表示连接配置正确。 * 红色的 **Test connection** 按钮表示设置中存在错误,系统将列出这些错误。 * 更正设置并再次测试,直到连接成功。 * 确保连接已启用。 ### 检查用于在特定平台创建账户的相关产品设置 [#check-the-setting-of-the-related-product-used-for-creating-account-on-a-specific-platform] * 在 Back Office 中,前往 **Products** > **Products**。 * 点击相关产品的 **Edit** 按钮以打开其详细信息。 * 检查以下字段: * **Max accounts** – 客户可为该产品的每种货币创建的最大账户数量。客户可能已超出此限制。 * **Min deposit amount (USD)** – 开设账户所需的最低入金金额。如果客户不满足此要求,则无法创建账户。 有关这些设置的更多详细信息,请参阅 [Products](../../back-office-guide/products/products#details)。 ### 验证产品货币是否已分配到正确的平台组 [#verify-that-the-product-currency-is-assigned-to-the-correct-platform-group] * 在 Back Office 中,前往 **Products** > **Products**。 * 点击相关产品的 **Edit** 按钮以打开其详细信息。 * 前往 **Currencies** 选项卡。 * 点击所需货币的 **Edit** 按钮。 * 检查 **Platform group** 下拉菜单中选择的组,并在需要时进行调整。这些组是在相应平台上创建的组。可用货币选项受已配置平台组的设置限制。 ### 检查客户详细信息中允许账户数量的限制 [#check-the-limit-on-the-number-of-allowed-accounts-in-the-client-details] * 在 Back Office 中,前往 **Clients** > **General**。 * 点击相关客户的 **Edit** 按钮。 * 前往 **Settings** 选项卡。 * 检查以下字段: * **Max Demo Trading Accounts** * **Max Live Trading Accounts** 如果这些字段中设置了限制,则其优先于产品设置。客户可能已经达到允许创建的最大账户数量。您可以在需要时调整这些限制。 ## 问题 [#problem] 客户的交易账户在 B2CORE 后台中显示为 **E**(错误)或 **A**(已归档)状态。 ## 可能原因 [#possible-reasons] * 该账户已在 B2CORE 中归档。 * 该账户已在交易平台上归档或删除,但在 B2CORE 中仍然可见。 * 连接问题导致账户状态无法正常同步。 ## 解决方案 [#solution] 按以下步骤排查这些状态: ### 在 B2CORE 后台中取消归档账户(如有需要) [#unarchive-an-account-in-the-b2core-back-office-if-required] * 前往 **Clients** > **Accounts**。 * 在列表中找到该账户,然后点击 **Edit** 按钮以打开其详细信息。 * 点击右上角的 **Actions** 按钮,并在下拉菜单中选择 **Unarchive**。 ### 处理处于 E(错误)状态的账户 [#handle-an-account-in-the-e-error-status] 处于 **E** 状态的账户通常表示该账户已在交易平台上归档或删除。要解决此问题,请在交易平台上恢复或取消归档该账户。 恢复后,更新后的状态将同步到 B2CORE。 ### 检查交易平台连接设置 [#check-the-trading-platform-connection-settings] 如果账户显示为 **A**(已归档)状态,但预期应处于活跃状态,请检查交易平台连接。有关详细信息,请参阅 [客户无法通过 B2CORE UI 创建交易账户](clients-can-not-create-trading-accounts-via-the-b2core-ui)中的 **步骤 1**。 ### 如果无法取消归档或恢复账户,则在 B2CORE UI 中隐藏该账户 [#hide-an-account-in-the-b2core-ui-if-cant-be-unarchived-or-restored] 如果无法在交易平台上取消归档或恢复账户,请在 B2CORE 后台中移除该账户的 `Visible` 权限。这样可确保该账户不会在 B2CORE UI 中向客户显示。操作步骤如下: * 前往 **Clients** > **Accounts**。 * 在列表中找到该账户,然后点击 **Edit** 按钮以打开其详细信息。 * 在 Rights 列表中,移除 `Visible` 权限。 * 点击 **Save** 以应用更改。 从 Rights 字段中移除 Visible {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} 经理是可访问 Back Office 的用户,负责组织工作并与分配给他们的客户进行沟通。新注册的客户会自动分配给现有经理。 添加经理前,请确保已在 [系统 > 用户 > 用户](../../back-office-guide/system/users/users) 页面创建相应用户,然后继续将该用户添加为经理。 要添加经理: 导航至 **客户** > **经理**。 点击页面右上角的 **+创建**。 在 **创建经理** 页面中,填写以下字段: * 在 **电子邮件** 下拉列表中,选择已在 **系统** > **用户** > **用户** 页面注册到 Back Office 的用户的电子邮件地址。 * 在 **姓名** 字段中,输入经理的全名。 * 在 **电话** 字段中,可选择填写经理的电话号码。 * 在 **启用** 下拉列表中,选择 **是** 或 **否** 以设置经理的资料状态。客户只能分配给 `Enabled` 状态的经理。 * 在 **称谓** 字段中,可选择输入经理的称谓(例如 `Mr` 或 `Mrs`)。 * 在 **默认** 下拉列表中,选择: * **是** — 将该经理设为默认经理。系统会根据国家限制,将所有新客户自动分配给该经理。 * **否** — 保持该经理为非默认经理。 点击 **保存** 以创建经理资料。 ## 如何对经理应用国家限制 [#how-to-apply-country-restrictions-to-a-manager] 通过国家限制,系统会根据客户所在的国家自动将客户分配给相应的经理。 要对经理应用国家限制: 导航至 **客户** > **经理**。 选择经理,然后点击 **编辑**。 在 **编辑经理** 页面中,点击页面右上角的 **操作** 按钮,然后在下拉列表中选择 **国家限制**。 在 **限制** 弹出窗口中,填写以下字段: * 将 **启用** 下拉列表设置为 **是**。 * 在 **类型** 下拉列表中,选择规则类型: * **仅拒绝** — 该经理可以被分配所有客户,但来自所选国家的客户除外。 * **仅允许** — 该经理只能被分配来自指定国家的客户。 * 在 **规则** 下拉列表中,选择一个或多个要应用 **仅拒绝** 或 **仅允许** 规则的国家。 点击 **保存** 以应用更改。 要创建用户组并为其分配自定义权限: 导航至 **系统** > **用户** > **组**。 点击页面右上角的 **+创建**。 在 **标题** 字段中,输入用户组名称(例如,“经理”)。 在 **权限** 部分下选择相应的复选框,为用户组授予所需权限。 所有权限均按与主菜单项对应的分组进行分类,并按字母顺序列出。 如需快速选择所有权限或某一特定类型的权限,请点击 **选择**,然后选择以下选项之一:**全部**、**查看**、**创建**、**更新** 或 **删除**。 如需取消选择所有权限,请点击 **取消全选**。 点击 **保存** 以创建用户组。 只有当您拥有管理用户所需的权限时,才能添加新的后台用户,例如管理员。 要添加新的后台用户: 导航至 **系统** > **用户** > **用户**。 点击页面右上角的 **+创建**。 在 **创建用户** 页面中,填写以下字段: 创建用户页面 * 在 **电子邮件** 字段中,输入用户的电子邮件地址。 * 在 **密码** 字段中,输入密码。 您也可以点击字段右侧的 **生成** 按钮来生成安全密码。要查看生成的密码,请启用 **显示密码** 选项。 * 在 **状态** 下拉列表中,选择 **已启用**。 * 在 **群组** 下拉列表中,选择新用户将加入的一个或多个群组(详情请参阅 [如何添加用户组并授予权限](how-to-add-a-user-group-and-grant-permissions))。 所选群组定义了新用户将拥有的权限。 **管理员** 群组会向加入该群组的用户授予所有可用权限。 * 在 **姓名** 字段中,输入用户的名字和姓氏。 * 选中 **发送至电子邮件** 复选框,以将凭据发送至指定的用户电子邮件地址。 * 选中 **数据脱敏** 复选框,以防止用户查看客户个人数据。启用此选项后,客户姓名、电子邮件地址和电话号码等数据将以星号(`*`)显示给该特定后台用户。 点击 **保存** 以在后台中注册新用户。 对于新注册的后台用户,默认启用通过电子邮件验证码进行的双重身份验证(2FA)。输入凭据后,用户在登录后台时将需要输入发送至其电子邮件地址的验证码。 要启用 B2CORE UI 中的语言或将其禁用: 导航至 **System** > **Localizations**。 从列表中选择语言,然后点击 **Edit**。 要启用语言,请将 **Enabled** 设为 **Yes**。要禁用语言,请将 **Enabled** 设为 **No**。如果所选语言被标记为默认语言,则无法将其禁用。 点击 **Save** 以应用更改。 要阻止来自特定国家的客户注册: 导航至 **System** > **Countries**。 可用于注册的国家列表会显示在 **Countries** 页面上。 对于要阻止注册的国家,将 **Enabled** 开关切换为非激活状态。 在显示的弹窗中,点击 **Yes** 确认操作。 所选国家现在无法在注册表单中使用。 ## 为单个注册配置文件阻止某个国家 [#block-a-country-for-a-single-registration-profile] **Countries** 页面在 B2CORE 中共享,因此在此处禁用某个国家会使其在所有提供国家选择的区域中隐藏,而不仅仅是在注册期间。 若要仅针对一个注册表单阻止某个国家,同时使其在其他位置保持可用,请在 **Countries** 页面中保持该国家启用,并将其添加到 **System** > **Registration** 中相关注册配置文件的 **Countries Blacklist** 部分。列入黑名单的国家仅会从该注册表单的 **Country** 选择框中隐藏。 有关详细信息,请参阅[如何迁移到新的注册设置](how-to-migrate-to-new-registration-settings)。 您可以查看和更改后台中显示的图片。 要查看和更改后台图片,您必须被授予 **查看后端图片** 和 **编辑后端图片** 权限。这些权限位于 **系统** 权限组下(详情请参阅[如何添加用户组并授予权限](how-to-add-a-user-group-and-grant-permissions))。 要更改为后台元素指定的图片,请点击 **删除** 按钮移除当前图片,然后添加新图片。 要添加新图片: 导航至 **系统** > **后端图片**,然后点击页面右上角的 **+创建** 按钮。 在 **类型** 下拉列表中,选择要应用新图片的后台元素。可用选项如下: * 主菜单徽标 * 登录页面上的徽标 * 登录页面上的背景图片 点击 **上传图片**,然后在您的计算机上找到要分配给所选用户界面元素的图片。 点击 **保存** 以更新指定的图片。 您可以修改用于配置在 B2CORE UI 中运行的流程的向导工作流,例如客户注册、授权、密码恢复等。 要更改向导工作流: 导航至 **System** > **Wizards**。 选择要更改的向导,然后点击 **Edit** 按钮。 前往 **Workflow** 选项卡。 对于支持额外步骤的向导,您可以在工作流中添加或删除这些步骤: * 要添加步骤,点击 **Add**,选择所需步骤,然后点击 **Save**。 * 要删除步骤,点击步骤行中的 **bin** 图标,然后在显示的弹窗中确认删除。 您还可以为特定国家或客户类型限制工作流步骤: * 点击步骤行中的 **Actions** 按钮。 * 选择限制类型:**Country restrictions** 或 **Client type restrictions**。 * 在显示的弹窗中,填写以下字段: * 在 **Type** 下拉列表中,选择规则类型: * **Allow only** — 仅允许特定国家或客户类型使用该步骤。 * **Deny only** — 禁止特定国家或客户类型使用该步骤。 * 在 **Rules** 下拉列表中,选择要应用所选规则的一个或多个国家或客户类型。 * 将 **Enabled** 选项设置为 **Yes** 以应用限制。 点击 **Save** 以将更改应用于向导工作流。 [Acuity Trading](https://acuitytrading.com/) 是一家提供市场分析工具和交易信号的服务商。完成配置后,经纪商可以让客户直接在 B2CORE UI 中访问 Acuity Trading 的研究和分析内容。 ## Acuity Trading 小部件 [#acuity-trading-widgets] 连接完成后,以下小部件将对 B2CORE UI 中的客户可用: * **Research Terminal** — 需要交易账户 * **AnalysisIQ** — 需要交易账户 * **AssetIQ** * **Economic & Corporate Calendars** * **NewsIQ & Dynamic Emails** 默认情况下,所有小部件都会在菜单中隐藏。创建连接后,请[启用小部件](#enable-acuity-trading-widgets-for-clients),以提供您希望展示的内容。 在 Back Office 中配置连接之前,请通过您的客户经理向 Acuity Trading 申请 API 访问权限,或在 [Acuity Trading 网站](https://acuitytrading.com/)上注册。您将收到连接所需的 API 密钥和其他凭据。 ## 配置与 Acuity Trading 的连接 [#configure-a-connection-to-acuity-trading] 要在 B2CORE Back Office 中配置连接,请执行以下操作: 导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入您希望用于该连接的名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该平台的标题。 * 在 **Provider** 下拉列表中,选择 **Acuity Trading**。 点击 **Save** 以创建连接。 在列表中找到新创建的连接,然后点击 **Edit**。 在 **Edit connection** 页面中,使用 Acuity Trading 提供的凭据填写以下字段: * 在 **API Key** 字段中,输入您的 Acuity Trading API 密钥。 * 在 **API URL** 字段中,输入 Acuity Trading API 端点。 * 在 **Salt** 字段中,输入用于对发送至 Acuity Trading 的请求进行签名的 salt 值。 * 在 **Enabled** 下拉列表中,选择 **Yes**。 点击 **Save** 以应用更改。 一次只能有一个 Acuity Trading 连接处于活动状态。 ## 为客户启用 Acuity Trading 小部件 [#enable-acuity-trading-widgets-for-clients] 默认情况下,Acuity Trading 小部件在 B2CORE UI 菜单中隐藏。要使其对客户可用: 导航至 **Promotion** > **Menu**。 点击 **General** 行中的**眼睛**图标,以查看菜单项列表。 找到您希望提供给客户的 Acuity Trading 小部件(**Research Terminal**、**AnalysisIQ**、**AssetIQ**、**Economic & Corporate Calendars**、**NewsIQ & Dynamic Emails**),并为每个小部件启用 **active toggle**。 有关菜单项设置的更多详细信息,例如将可见性限制为特定[验证级别](../../back-office-guide/verification/levels)或[客户类型](../../back-office-guide/clients/types),请参阅 [菜单](../../back-office-guide/promotion/menu)。 要将 **RudderStack** 平台与 B2CORE 配合使用并收集 B2CORE UI 中各种事件的数据,请配置与 RudderStack 的连接。 在 Back Office 中配置连接之前,您必须先注册 RudderStack 并拥有一个已配置 *sources*(即收集事件数据的位置)和 *destinations*(即您希望将事件数据发送到以进行分析的平台)的有效账户。如有任何疑问,您可以查阅官方 [RudderStack 文档](https://www.rudderstack.com/docs/) 或联系其支持团队。 要在 B2CORE Back Office 中配置连接: 导航至 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面中,填写以下字段: * 在 **名称** 字段中,输入您希望用于该连接的名称。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该平台的标题。 * 在 **提供商** 下拉列表中,选择 **RudderStack**。 点击 **保存** 以创建连接。 在列表中找到新创建的连接,然后点击 **编辑**。 在 **编辑连接** 页面中,填写以下字段: * 在 **Data Plane URL** 字段中,指定用于路由和处理事件的 URL。 * 在 **Write Key** 字段中,指定您的来源的唯一标识符。RudderStack 使用此密钥将事件从来源发送到指定目标。 您可以在 RudderStack 主页上找到这些参数。 RudderStack 主页 * 在 **已启用** 下拉列表中,选择 **是**。 点击 **保存** 以应用更改。 要将 **Zendesk** 支持平台与 B2CORE 配合使用,请配置与 Zendesk 的连接。完成配置后,客户可以点击 B2CORE UI 或[移动应用](../../release-notes/release-notes-mobile)中的 **HelpDesk** 菜单,通过单点登录 (SSO) 重定向至 Zendesk 界面,无需进行额外身份验证。在 Zendesk 中,客户可以提交和管理工单、访问在线聊天支持以及使用 AI 驱动的功能来获取帮助。 在 Back Office 中配置连接之前,您必须已注册 Zendesk,并拥有已配置 SSO 选项的有效账户。如有任何疑问,您可以查阅官方 [Zendesk 文档](https://support.zendesk.com/hc/en-us)或联系其支持团队。 要在 B2CORE Back Office 中配置连接,请执行以下操作: 导航至 **System** > **External connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接的唯一名称。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **Zendesk**。 点击 **Save** 以创建连接。 在列表中找到新创建的连接,然后点击 **Edit**。 在 **Edit connection** 页面中,填写以下字段: ### 常规设置 [#common-settings] * 在 **Zendesk URL** 字段中,指定您的 Zendesk URL,例如: `https://{your-subdomain}.zendesk.com` Zendesk 会使用此 URL 调用 API 方法,以验证移动应用单点登录所需的 JSON Web Tokens (JWTs)。 在 **Channels** > **Mobile SDK** 菜单中为移动 SDK 配置 SSO 时,请确保也在 Zendesk **Admin Center** 中输入并保存此 URL。 Channels > Mobile SDK 中的 Zendesk URL * 在 **SSO Redirect URL (brand url)** 字段中,指定客户通过单点登录成功完成身份验证后将被重定向到的 Zendesk 页面 URL,例如: `https://{your-subdomain}.zendesk.com/hc/en-us` ### SSO 设置 [#sso-settings] * 在 **SSO Shared Secret** 字段中,指定来自 Zendesk 的密钥,该密钥用于生成单点登录所需的 JWT。 此密钥会在 Zendesk **Admin Center** 中配置 SSO 时生成,必须从中复制。 Zendesk 中的共享密钥 ### 移动 SDK 设置 [#mobile-sdk-settings] 仅当您拥有[移动应用](../../release-notes/release-notes-mobile)并需要在应用与 Zendesk 之间启用 SSO 时,才需要这些设置。如果您没有移动应用,则无需配置这些设置。 * 在 **App ID** 字段中,指定来自 Zendesk 的应用标识符。 * 在 **Client ID** 字段中,指定来自 Zendesk 的客户端标识符。 * 在 **SDK JWT Secret** 字段中,指定在 Zendesk 中生成的密钥,该密钥用于签署从 B2CORE 发送至 Zendesk 以进行单点登录的 JWT。 在 **Channels** > **Mobile SDK** 菜单中为移动 SDK 配置 SSO 时,所有这些值都会在您的 Zendesk **Admin Center** 中生成,必须从中复制。 ### Zendesk 中的移动 SDK [#mobile-sdk-in-zendesk] 在 Zendesk **Admin Center** 的 **Channels** > **Mobile SDK** 中,输入 **JWT URL**。该 URL 必须采用以下格式: `https://{your-Back-Office-URL}/api/v2/my/helpdesk/zendesk/auth/mobile/exchange` 请确保将 `{your-Back-Office-URL}` 替换为您的 B2CORE Back Office 域名。 Zendesk 中的移动 SDK 设置 在 B2CORE Back Office 中指定必要设置后,在 **Enabled** 下拉列表中选择 **Yes**。 点击 **Save** 以应用更改。 如果您之前使用 **SupportPal** 作为帮助台平台,请参阅[如何从 SupportPal 切换到 Zendesk](how-to-switch-from-supportpal-to-zendesk),以确保您的客户仅通过 Zendesk 提交新工单,同时仍可查看其 SupportPal 工单历史记录。 ## 如何配置 Zendesk 聊天机器人 [#how-to-configure-the-zendesk-chatbot] 要在 B2CORE 中使用 Zendesk 聊天机器人,您需要在 Zendesk 账户中配置小组件和身份验证设置。该聊天机器人将显示在 B2CORE UI 中,使客户能够提问、快速查找所需信息、报告问题并无缝切换至在线客服,且无需进行额外身份验证。 要设置聊天机器人小组件并生成所需凭据,请执行以下操作: 在 Zendesk Admin Center 中,导航至 **Channels** > **Messaging and social** > **Messaging**。 添加一个 Web 小组件。 复制小组件代码片段以获取 **Widget Key**,即 UUID 格式的标识符。在 B2CORE Back Office 中配置小组件设置时将需要此密钥。 要为与聊天机器人交互的客户设置自动身份验证,请导航至 **Account** > **Security** > **End user authentication**。 在 **Messaging** 选项卡上,点击 **Create key**。 复制 **Messaging Auth ID** 和 **Messaging Auth Shared Secret** 字段中的值。在 B2CORE Back Office 中配置小组件设置时将需要这些值。 ## 如何在 B2CORE Back Office 中配置聊天机器人设置 [#how-to-configure-chatbot-settings-in-the-b2core-back-office] 在 Zendesk 中配置聊天机器人后,请继续在 B2CORE Back Office 中进行相应设置,以在 B2CORE UI 中启用该机器人: 在 B2CORE Back Office 中,导航至 **System** > **External connections**。 在列表中找到现有的 Zendesk 连接,然后点击 **Edit**。 在 **Edit connection** 页面中,填写以下字段: ### 小组件设置 [#widget-settings] * 在 **Enable Widget on WEB** 下拉列表中,选择 **Yes** 以在 B2CORE UI 和移动应用中启用聊天机器人的显示。 * 在 **Widget ID** 字段中,输入您从 Zendesk 复制的 **Widget Key**。 * 在 **Widget Auth Key ID** 字段中,输入从 Zendesk 获取的 **Messaging Auth ID**。 * 在 **Widget Auth Key Secret** 字段中,输入从 Zendesk 获取的 **Messaging Auth Shared Secret**。 点击 **Save** 以应用更改。 现在,Zendesk 聊天机器人将显示在 B2CORE UI 中,使客户能够快速访问支持并解决疑问。 电子邮件模板用于就特定系统事件通知客户和[后台用户](../../back-office-guide/system/users/users)。您可以配置自定义电子邮件模板来替代预配置模板。有关支持的事件类型及相关预配置电子邮件模板的完整列表,请参阅[电子邮件模板类型](../../back-office-guide/references/email-template-types)。某些类型用于通知客户,其他类型则用于通知[后台用户](../../back-office-guide/system/users/users)。 要配置电子邮件模板: 导航至 **System** > **Templates** > **Email** > **Templates**。 点击页面右上角的 **+Create**。 在 **Create email template** 页面中,填写以下字段: * 在 **Type** 下拉列表中,选择将使用该电子邮件模板的[事件类型](../../back-office-guide/references/email-template-types)。 例如,`accountCreated`:当为客户创建钱包或交易账户(例如 **MetaTrader** 平台上的账户)时,将使用此模板发送电子邮件通知。 * 在 **Locale** 下拉列表中,选择电子邮件模板的语言。 * 在 **Enabled** 下拉列表中,选择 **Yes**。 * 在 **Subject** 字段中,输入电子邮件模板的主题。 * 在 **Email template** 字段中,指定电子邮件模板的 HTML 布局。 点击 **Preview** 以渲染 HTML,并检查模板在电子邮件中的显示效果,确保不存在布局错误。 如果模板已启用,只有在成功渲染并显示在预览区域后才能保存。 点击 **Save** 以创建模板。 该模板将用于针对所选事件类型发送电子邮件通知。 ## 如何在电子邮件模板中添加交易终端下载链接 [#how-to-add-download-links-for-trading-terminals-to-email-templates] 在向客户发送账户创建电子邮件时,在电子邮件模板中添加交易终端下载链接会很有帮助,使客户能够轻松访问所需的终端。 要添加下载链接: 导航至 **System** > **Templates** > **Email** > **Templates**。 选择所需的模板,例如 `accountCreated`、`cTraderAccountCreated`、`MatchTraderClientCreated` 或其他模板。这些模板用于在相应平台上创建账户时向客户发送电子邮件。添加相应终端的下载链接可能会很有用。 点击 **Edit** 按钮以打开模板详细信息。 在 **Email template** 字段中,以 HTML 格式添加下载链接。 示例: ```html For Web: Open
For Windows: Download
For Mac: Download
For Linux: Download
For iOS: Download
For Android: Download
``` 如果使用上述示例,请务必将 `{link-to-web-trading-terminal}` 和 `{download-link}` 替换为各交易终端的实际 URL,并将 `{color-code}` 替换为所需的链接颜色代码。您还可以根据需要调整其他样式,例如 `text-decoration`,以匹配您的电子邮件模板设计。
点击 **Preview** 以渲染 HTML,并检查模板在电子邮件中的显示效果,确保不存在布局错误。 如果模板已启用,只有在成功渲染并显示在预览区域后才能保存。 点击 **Save** 以应用更改。
电子邮件模板将包含交易终端下载链接,使客户能够直接通过通知更轻松地访问平台。 可以在 Back Office 中配置设置,以便在 B2CORE UI 中显示 iOS 和 Android 应用的下载链接及下载说明。 配置完成后,下载按钮将显示在**登录**页面上,客户无需登录即可下载应用。 此外,客户登录后,该按钮还会显示在**仪表板**顶部。 要配置移动应用下载设置: 导航至 **System** > **Settings**。 在 **Mobile** 部分中,配置以下设置: * 在 **Mobile application** 下拉列表中,选择要提供移动应用下载链接的平台: * **iOS** — 选择此选项可提供从 Apple Store 下载 iOS 应用的链接。 * **Android** — 选择此选项可提供从 Google Play 下载 Android 应用的链接。 * **Android APK Registry** — 选择此选项可提供下载 Android APK 的链接。 如果您的 iOS 和 Android 移动应用均已上线,可以选择多个选项。 * 如果选择了 **iOS**,请在 **iOS URL** 字段中指定从 Apple Store 下载 iOS 应用的 URL。 * 如果选择了 **Android**,请在 **Android URL** 字段中指定从 Google Play 下载 Android 应用的 URL。 * 如果选择了 **Android APK Registry**,请在 **Android APK Registry ID** 字段中指定 Android APK 的通用唯一标识符(UUID)。此 UUID 用于生成 Android APK 的下载链接。 如果您没有 UUID,请联系您的客户经理获取帮助。 点击 **Save** 以应用更改。 以下示例展示了显示在 B2CORE UI **登录**页面上的移动应用下载按钮。 The download options for iOS and Android 点击该按钮后,将显示相应平台的应用下载选项。 The download button for mobile apps on the Sign In page Android 的 APK 安装说明详见下文。 The Android APK installation steps 创建批量操作,以便同时对多个客户执行特定操作。 要创建批量操作: 导航至 **System** > **Bulk actions**。 点击页面右上角的 **+Create**。 在 **Action** 下拉列表中,选择要作为批量操作执行的操作类型。可用的操作类型如下: * 禁止客户 * 更改客户类型 * 更改内部客户类型 * 更改验证级别 * 进行入金 * 将余额清零 在 **Name** 字段中,输入批量操作的名称。 在 **Description** 字段中,输入批量操作的描述。 点击 **Upload csv file**,然后选择之前已下载到计算机上的 CSV 文件,该文件包含适用此批量操作的客户电子邮件地址(详情请参阅 [如何导出包含电子邮件地址的 CSV 文件](how-to-export-a-csv-file-with-email-addresses))。 根据您选择的批量操作类型,可能会显示需要填写的其他字段。 点击 **Save** 以应用更改。 批量操作已创建并执行。要验证其是否已成功执行,请查看 **Bulk actions** 页面上的 **Status** 列。 要创建请求解决类型: 导航至 **系统** > **请求** > **解决类型**。 点击 +**创建**。 填写表单: * 设置类型的**名称**(例如,`financial`)。 * 设置**标题** — 将显示在解决类型下拉列表中的类型标题(例如,`Financial Rejection`)。 * 将**已启用**设置为**是**。 点击**保存**以创建解决类型。 要创建请求解决方案: 导航至 **System** > **Requests** > **Resolutions**。 点击 **+Create**。 填写表单: * 设置解决方案的 **Name**(例如,`suspicious`)。 * 设置 **Caption** — 将在解决方案下拉列表中显示的解决方案标题(例如,`Suspicious Transaction`)。 * 将 **Enabled** 设置为 **Yes**。 * 从列表中选择 **Resolution type**。解决方案类型必须已在系统中创建(详情请参阅[如何创建请求解决方案类型](how-to-create-a-request-resolution-type))。 点击 **Save** 以创建解决方案。 本指南适用于希望让客户除了使用电子邮箱和密码之外(或替代电子邮箱和密码),还能使用其 Google 或 Apple 账户登录或注册的经纪商。本文说明您需要自行准备的内容,以及将信息交给 B2Broker 后会发生什么。 这是一个**联合配置**:您负责 Google/Apple 开发者账户和凭据,B2Broker 将它们接入您的 B2CORE 实例。只有双方都完成相关工作后,此功能才会启用。 此功能需支付**一次性配置费**。在申请开通前,请联系您的客户经理或我们的支持团队确认费用和可用性。 ## 您将获得什么 [#what-you-get] * 您的登录和注册页面上将显示“使用 Google 登录”和/或“使用 Apple 登录”按钮。 * 通过这种方式注册的新用户会自动创建,无需单独填写注册表单。 * 已拥有密码账户的用户也可以稍后关联 Google/Apple 账户(通过电子邮箱地址关联)。 ## 开始前 [#before-you-start] * 请与您的 B2Broker 客户经理确认,您的 B2CORE 实例是否可使用社交登录功能。这取决于您是否已在使用当前身份认证平台。 * 决定您希望使用**哪些提供商**:仅 Google、仅 Apple,或两者都使用。Apple 需要付费的 Apple Developer 账户,因此如需使用该功能,请提前做好规划。 * 您需要有人员能够访问贵公司的 Google Cloud / Apple Developer 账户(或具备创建新账户的权限)。 ## 您需要准备的内容 — Google [#what-you-need-to-prepare--google] 1. \*\*一个 Google Cloud 项目。\*\*使用现有公司项目,或创建一个专用于登录的新项目。 2. \*\*OAuth 同意屏幕。\*\*配置: * 应用名称、支持邮箱、徽标(这是您的用户会在 Google 同意提示中看到的信息)。 * 作用域:`openid`、`email`、`profile`。 * 发布状态:当应用处于**测试**状态时,只有明确添加的测试用户能够登录,其他人都会收到 `access_denied`。正式上线前,请将应用切换为**已发布**状态。 3. **一个 OAuth 2.0 Client ID**(应用类型:**Web application**)。 * 我们会向您提供需要注册的确切**Authorized redirect URI**。该 URI 与您的 B2CORE 实例主机名绑定,格式如下: ``` https:///srvsz/auth/clients/v1/self-service/methods/oidc/callback/google ``` * 将相同的主机(不含路径)添加为**Authorized JavaScript origin**。 4. 复制生成的**Client ID**和**Client secret**。 ## 您需要准备的内容 — Apple [#what-you-need-to-prepare--apple] Apple 的配置步骤更多,并且需要拥有有效的 [Apple Developer Program](https://developer.apple.com/programs/) 会员资格。 1. **一个 App ID**,并启用**Sign In with Apple**功能(如果已有可复用现有 App ID,或创建新的)。 2. **一个 Services ID** — 这是 Apple 实际用于 OAuth 的客户端。配置时: * **Domain**:您的 B2CORE 实例 API 主机(不含协议和路径)。 * **Return URL**:我们提供的 Apple 回调 URL,其格式与上述 Google 的 URL 相同,但以 `/apple` 结尾。 3. 在 Apple 的 **Keys** 部分生成一个\*\*“Sign in with Apple”私钥(`.p8` 文件)\*\*,并将 Sign In with Apple 功能关联至您的 App ID。 此文件只能下载一次 — 请立即将其保存到安全的位置。 4. 您的**Team ID**(10 位字母数字字符,显示在您的 Apple Developer 账户页眉中)。 5. 您在第 3 步创建的密钥的**Key ID**。 您最终会获得五项信息:Services ID(client ID)、Team ID、Key ID、`.p8` 私钥文件;与 Google 不同,没有单独需要复制的“client secret”,Apple 的密钥由前四项信息派生而来。 ## 将凭据交给 B2Broker [#handing-credentials-to-b2broker] 请向我们发送: * Google:Client ID + Client secret。 * Apple:Services ID、Team ID、Key ID 和 `.p8` 私钥文件。 **请将这些信息视为机密** — 尤其是 Apple 私钥。请通过您的客户经理提供的安全渠道发送(例如机密信息共享链接或加密附件),而不要通过普通电子邮件或聊天工具发送。我们会在凭据安全存储到我方系统后向您确认,并告知您按钮何时上线。 ## 接下来会发生什么 [#what-happens-next] 收到您的凭据后,我们会在您的 B2CORE 实例上启用该功能并进行部署。 这通常会导致登录服务短暂重启 — 预计不会造成停机,但请避免在高峰时段安排。 ## 上线后的测试 [#testing-after-go-live] 1. 打开您的登录页面 — 您应该能看到 Google/Apple 按钮。 2. 使用每个已启用提供商的真实账户登录。 3. 确认用户已成功登录,并确认其电子邮箱/姓名在您的管理面板中显示正确。 4. 如果 Google 仍处于**测试**模式,只有您添加到同意屏幕中的测试用户能够登录,其他所有人都会看到 `access_denied`。在向真实用户推广该功能前,请发布应用。 ## 注意事项 [#good-to-know] \*\*Apple 仅会在用户首次授权时共享其姓名和电子邮箱。\*\*如果用户在 Apple ID 设置中撤销您的应用授权,然后稍后再次登录,Apple 将只返回一个匿名标识符 — 此后可能不会再提供姓名。这是 Apple 的限制,并非我方的问题。 **Apple 电子邮箱可能是“私密中转”地址**(`...@privaterelay.appleid.com`)。这些是真实且可用的地址 — 只是通过 Apple 中转。请将其视为用户的规范电子邮箱;它们不会自动匹配使用用户真实电子邮箱的现有密码账户。 \*\*Google 要求电子邮箱已验证。\*\*如果 Google 账户的电子邮箱未验证,登录将按设计失败 — 这可保护您的用户群免受未经验证的身份影响。 **提供商 ID 是固定的**(`google`、`apple`)。如果您需要轮换凭据(例如密钥泄露),请联系 B2Broker — 我们可以更新凭据,而无需更改您的用户已在使用的登录 URL。 ## 问题 / 支持 [#questions--support] 请通过您的 B2Broker 客户经理或支持渠道联系我们,并提供您的经纪商名称以及您正在配置的提供商。 可以将各种类型的数据导出为 CSV 文件。本文介绍如何导出包含客户电子邮件地址的 CSV 文件。此类 CSV 文件可用于执行批量操作,并识别批量操作将应用于哪些客户。 导航至 **Clients** > **General**。 您可以对客户列表应用筛选条件,以显示要导出的特定记录。 点击页面右上角的 **Column visibility**。 隐藏除 **Email** 列以外的所有列。 点击页面右上角的 **Export**。 选择 CSV 格式。 选择导出方式。您可以将 CSV 文件发送到您的电子邮件地址,或将其下载到计算机。 导出的包含电子邮件地址的 CSV 文件可用于创建批量操作。为此,请打开该文件并删除 **Email** 列标题,以便文件中仅列出电子邮件地址。 您可以从 CSV 或 TSV 文件向 Back Office 导入有关客户、其账户以及 [IB 计划](../../back-office-guide/introducing-brokers)的数据。 要导入数据: 导航至 **系统** > **导入数据**。 点击页面右上角的 **+创建**。 在 **标题** 字段中,输入您要为数据导入操作指定的名称。 在 **描述** 字段中,您可以选择性地输入导入操作的简短描述。 在 **操作** 下拉列表中,选择以下选项之一: * `import-users` — 用于导入客户相关数据 * `import-accounts` — 用于导入现有客户的账户数据 * `import-ibs` — 用于导入现有客户的 IB 相关数据 下方列出了每个导入选项所需的数据和格式要求。 在 **分隔符** 下拉列表中,选择用于分隔 CSV 或 TSV 文件中数据的分隔符字符(例如 `comma`、`semicolon` 或 `tab`)。 点击 **浏览**,然后选择要导入数据的 CSV 或 TSV 文件。 点击 **保存** 以开始导入操作。 ### `import-users` 选项: [#the-import-users-option] 要成功导入客户相关数据,CSV 或 TSV 文件必须包含 Email、Last name 和 First name 标题。若缺少任何这些必填字段,导入操作将失败。 下载 `template_import_users.csv` 文件,您可以使用该文件验证 CSV 文件是否包含正确的标题和数据格式。您可以在文件中使用分号或制表符代替逗号作为分隔符。 导入数据期间: * 如果电子邮件地址已存在于 B2CORE 中,客户数据将使用 CSV 或 TSV 文件中的数据进行更新。 * 如果电子邮件地址不存在于 B2CORE 中,将为其添加新的客户资料。 ### `import-accounts` 选项: [#the-import-accounts-option] 要成功导入客户账户数据,CSV 或 TSV 文件必须包含 Email、Account number、Product ID 和 Product currency 标题。若缺少任何这些必填字段,导入操作将失败。 下载 `template_import_accounts.csv` 文件,您可以使用该文件验证 CSV 文件是否包含正确的标题和数据格式。您可以在文件中使用分号或制表符代替逗号作为分隔符。 导入数据期间: * 如果电子邮件地址已存在于 B2CORE 中,客户账户数据将被添加至该客户。 * 如果电子邮件地址不存在于 B2CORE 中,账户数据将不会被导入。 ### `import-ibs` 选项: [#the-import-ibs-option] IB 相关数据只能从 CSV 文件导入。 要成功导入此类数据,CSV 文件必须包含 IB Email、Client Email 和 IB Type ID 标题。若缺少任何这些必填字段,导入操作将失败。 下载 `template_import_ibs.csv` 文件,您可以使用该文件验证 CSV 文件是否包含正确的标题和数据格式。您可以在文件中使用分号或制表符代替逗号作为分隔符。 导入数据期间: * 如果指定为 **IB Email** 的电子邮件地址已存在于 B2CORE 中,该客户将被添加为 IB 合作伙伴,并将为该客户导入 IB 相关数据。 * 如果指定为 **IB Email** 的电子邮件地址不存在于 B2CORE 中,IB 相关数据将不会被导入。 导入操作完成后,您可以查看其状态,并点击导入操作行中的 **编辑** 按钮,以查看 **日志消息** 和 **错误消息** 字段。这些字段会列出成功导入的记录详情以及导入过程中发生的错误。 您可以从 JSON 文件将有关[用户组](../../back-office-guide/system/users/groups)的数据导入 Back Office,包括授予每个用户组的权限数据。 要导入有关 Back Office 用户组的数据: 导航至 **系统** > **用户** > **组**。 点击页面右上角的 **导入** 按钮。 在 **导入组** 弹出窗口中,点击 **浏览**,然后导航至包含您要导入数据的 JSON 文件。 若文件中列出的用户组名称与现有组名称相同,要选择如何导入数据,请在 **替换** 下拉列表中选择以下选项之一: * **已启用** — 使用导入的用户组替换现有用户组。 * **已禁用** — 将导入的用户组添加到现有用户组中。在这种情况下,递增后缀(例如 (1)、(2) 等)会添加到导入用户组的名称中。 如果其名称与现有用户组名称不匹配,这些组将追加到 Back Office 用户组列表中。 点击 **保存** 以导入数据。 使用与 [Salesforce](https://salesforce.com/) 的集成,可将客户数据从 B2CORE 自动同步到 Salesforce。此集成有助于集中管理客户信息、简化内部流程,并在您的 Salesforce 环境中支持销售和营销工作流。 此集成目前仅支持从 B2CORE 到 Salesforce 的单向数据传输;不支持反向同步。 在继续操作前,您必须注册 Salesforce 并创建一个 **外部客户端应用程序**,该应用程序允许外部服务与 Salesforce API 交互。如有任何疑问,请参阅官方 [Salesforce 帮助中心](https://help.salesforce.com/)或联系其支持团队。 ## 在 Salesforce 中创建外部客户端应用程序 [#create-an-external-client-app-in-salesforce] 要在 Salesforce 中创建外部客户端应用程序: 在 Salesforce 中,前往 **设置** > **设置**。 在 **设置** 部分的搜索框中输入 **App Manager**,然后在搜索结果中点击它。 点击 **新建外部客户端应用程序**。 在 **基本信息** 部分,填写以下字段: * **外部客户端应用程序名称** — 指定您的 B2CORE 实例名称。如果您有多个实例,请在 Salesforce 中为每个实例配置外部客户端应用程序时使用不同的名称。 * **API 名称** — 根据应用程序名称自动填充。 * **联系邮箱** — 输入联系用户的电子邮件地址。 * **分发站点** — 选择 **本地**。此设置决定哪些用户可以在创建的外部客户端应用程序中查看和授权。**本地** 表示该应用程序仅可在您的组织内部访问。 展开 **API(启用 OAuth 设置)** 部分,并选中 **启用 OAuth** 复选框。 * 在 **回调 URL** 中,指定 `https://login.salesforce.com/services/oauth2/success`。 * 在 **OAuth 范围** 中,选择所需权限。API 访问所需的最小权限集为: * 通过 API 管理用户数据 (api) * 随时执行请求 (refresh\_token, offline\_access) * 访问 Salesforce API 平台 (sfap\_api) * 选中 **内省所有令牌** 复选框(推荐)。这使资源服务器无需针对每个请求调用 Salesforce,即可验证访问令牌。 在 **流程启用** 部分,选择 **启用客户端凭据流程**。 在 **安全性** 部分,选择以下选项: * 启用客户端凭据流程 * 要求 Web 服务器流程提供密钥 * 要求刷新令牌流程提供密钥 * 对支持的授权流程要求使用代码交换证明密钥 (PKCE) 扩展 * 为指定用户签发基于 JWT Web Token (JWT) 的访问令牌 点击 **保存** 以创建应用程序。 创建应用程序后,Salesforce 会生成 **消费者密钥** 和 **消费者密钥机密**,它们分别用作应用程序的标识符和密钥。您可以通过打开应用程序卡片,前往 **设置** > **OAuth 设置**,然后点击 **消费者密钥和密钥机密** 按钮来查看它们。 在 B2CORE Back Office 中配置 Salesforce 连接时,需要使用 **消费者密钥** 和 **消费者密钥机密**。 ## 进一步配置外部客户端应用程序 [#further-external-client-app-configuration] 创建外部客户端应用程序后,请继续执行以下额外配置步骤: 在 Salesforce 中,前往 **设置** > **用户** > **用户**,然后找到您在注册 **外部客户端应用程序** 时指定的联系用户。 打开用户卡片,并在 **权限集分配** 部分添加 **启用 API 权限**。 复制 **用户名** 字段中的名称。 前往 **设置** > **外部客户端应用程序** > **外部客户端应用程序管理器**,并打开您的应用程序卡片。 在应用程序卡片中,前往 **策略** > **OAuth 策略** > **OAuth 流程和外部客户端应用程序增强功能**,选中 **启用客户端凭据流程** 复选框,并输入之前复制的用户名。 在 **策略** > **OAuth 策略** > **应用程序授权** 中,选择 **在指定时间后使刷新令牌过期**,并填写以下参数: * **刷新令牌有效期** — 设置为 `365`。 * **刷新令牌有效期单位** — 选择 `天`。 * **IP 放宽** — 选择 `强制执行 IP 限制`。 * **指定用户基于 JWT 的访问令牌设置** — 选择 `设置应用程序特定的令牌超时时间(1 小时)`。 点击 **保存** 以应用更改。 ## 获取您的 Salesforce 域名 [#get-your-salesforce-domain] 在 Salesforce 中,前往 **设置** > **设置** > **公司设置** > **我的域名**。 复制 **当前我的域名 URL** 字段中的值。 在 B2CORE Back Office 中配置 Salesforce 连接时,需要使用 Salesforce 域名。 ## 如何在 B2CORE Back Office 中配置 Salesforce 连接 [#how-to-configure-a-connection-to-salesforce-in-the-b2core-back-office] 要在 B2CORE Back Office 中配置 Salesforce 连接: 前往 **系统** > **外部连接**。 点击页面右上角的 **+创建**。 在 **创建连接** 页面中,填写以下字段: * 在 **名称** 字段中,输入连接名称。该名称必须唯一。 * 在 **标题** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **提供商** 下拉列表中,选择 **Salesforce**。 点击 **保存** 以创建连接。 **Salesforce** 连接将显示在外部连接列表中。 点击 **编辑** 以输入连接详细信息,并完成以下字段: * 在 **域名 URL** 字段中,提供您的 Salesforce 实例 URL,例如: `https://{your-domain}.my.salesforce.com` 您可以在 Salesforce 中通过前往 **设置** > **设置** > **公司设置** > **我的域名** 找到域名 URL。 * 在 **消费者密钥** 字段中,指定 Salesforce 在创建 **外部客户端应用程序** 后生成的消费者密钥。 * 在 **消费者密钥机密** 字段中,指定在同一个 Salesforce Connected App 中生成的消费者密钥机密。该密钥机密与 **消费者密钥** 一起用于验证 API 请求。 您可以在 Salesforce 应用程序卡片中通过前往 **设置** > **OAuth 设置**,然后点击 **消费者密钥和密钥机密** 按钮来找到 **消费者密钥** 和 **消费者密钥机密**。 * 在 **公司(应用于所有新潜在客户)** 字段中,输入在 Salesforce 创建新潜在客户记录时应显示的公司名称。潜在客户记录是为从 B2CORE 同步的每位客户创建的 Salesforce 记录。此字段为 Salesforce 必填项。 检查连接状态。 如果连接未激活(**已启用** 字段中显示 **否**),请将 **已启用** 下拉列表设置为 **是** 以激活连接。 点击 **保存** 以应用更改。 配置连接后,B2CORE Back Office 中 **客户** > **常规** 下列出的所有客户将自动与 Salesforce 同步,每位客户都会作为单独的潜在客户记录添加。之后对客户个人详细信息的任何更新也将同步到 Salesforce。 ## 与 Salesforce 同步的客户数据概览 [#overview-of-client-data-synced-with-salesforce] 以下必填和可选客户字段将从 B2CORE 同步到 Salesforce 的潜在客户记录中: ### 必填字段 [#required-fields] 以下必填客户字段始终会从 B2CORE 同步到 Salesforce: * **姓氏** — 如果未指定,则会向 Salesforce 发送 `Undefined`。 * **公司** — 将向 Salesforce 发送在 B2CORE Back Office 中配置的外部连接的 **公司(应用于所有新潜在客户)** 字段中指定的公司名称。 ### 可选字段 [#optional-fields] 如果在 B2CORE Back Office 的客户详细信息中指定,以下可用于业务流程的可选字段将从 B2CORE 同步到 Salesforce: * **名字** * **中间名** * **电子邮件** * **城市** * **州/省** * **地址** * **邮政编码** * **国家/地区** 和 **国家/地区代码 (ISO)** * **电话** — 如果在 B2CORE Back Office 中为某位客户指定了多个电话号码,则会向 Salesforce 发送已确认的号码;如果没有号码被确认,则使用最近更新的号码。 ## 如何添加从 B2CORE 同步到 Salesforce 的自定义字段 [#how-to-add-custom-fields-for-syncing-from-b2core-to-salesforce] 您可以将 B2CORE 中的其他字段同步到 Salesforce,例如客户的 **状态**、**验证级别** 和 **客户类型**,以便在 Salesforce 的潜在客户记录中显示这些字段。 在 **Salesforce** 中,添加这些字段: 登录 Salesforce。 前往 **设置** > **对象管理器**。 选择 **潜在客户** 对象。 在对象详细信息中,选择 **字段和关系**,然后点击 **新建**。 选择字段类型,例如 **文本**。 输入 **字段标签**。**字段名称** 将根据标签自动填充。 如有需要,您可以指定其他字段参数。有关更多信息,请参阅 [Salesforce 帮助中心](https://help.salesforce.com/)。 保存更改以将新字段添加到对象。 在 **B2CORE Back Office** 中,设置字段映射: 前往 **系统** > **外部连接**。 找到为 Salesforce 配置的连接,然后点击 **编辑** 以打开连接详细信息。 通过为 **状态**、**客户类型** 和 **验证级别** 选择在 Salesforce 中创建的相应字段,设置字段映射。 设置字段映射 点击 **保存** 以应用更改。 字段添加并映射后,客户的 **状态**、**客户类型** 和 **验证级别** 将从 B2CORE 自动同步,并显示在 Salesforce 的潜在客户记录中。如果一个或多个字段未映射,则不会同步到 Salesforce。 [Amplitude](https://amplitude.com/) 是一个基于事件的分析平台,可配置为接收有关客户在 B2CORE UI、**iOS** 和 **Android** 应用中的活动数据。它可提供有关参与度、留存率和财务结果的洞察,帮助您评估绩效并改进服务。 ## Amplitude 中的关键概念 [#key-concepts-in-amplitude] 在 Amplitude 中,**事件**代表客户在 B2CORE 中执行的操作,例如注册、登录、入金、出金、创建钱包等。每个事件都可以包含**事件属性**(例如平台名称、金额、币种等),为深入分析提供上下文。通过跟踪事件,您可以更好地了解客户行为,并评估他们如何与 B2CORE UI、iOS 和 Android 应用进行交互。 **默认 Amplitude 事件** Amplitude 提供一组默认事件,例如 **Start Session**、**End Session** 等。这些事件会标有 Amplitude 徽标。 **B2CORE 专属事件** B2CORE 提供一组预定义事件,例如 **Deposit page clicked**、**Deposit submitted**、**Verification started**、**Verification submitted**、**Wallet created**、**Feedback** 等。将 Amplitude 连接到您的 B2CORE 后,这些事件会自动开始跟踪。可供跟踪的完整 B2CORE 专属事件列表请参阅文档 **Tracking B2CORE Events with Amplitude**,您可通过您的客户经理申请获取该文档。 ## 注册 Amplitude [#sign-up-for-amplitude] 请按照官方 [Amplitude 文档](https://amplitude.com/docs)自行注册 Amplitude。您可以从免费版本开始使用。如有任何问题,请联系其支持团队。 ## 在 Amplitude 中创建项目和来源 [#create-a-project-and-sources-in-amplitude] 您应先在 Amplitude 中为您的组织创建一个**账户**,然后创建一个**项目**并添加**来源**,用于表示发送至 Amplitude 的数据来源(例如 iOS、Android、Web 或 Backend)。 可使用适用于各个平台的相应 [Amplitude SDK](https://amplitude.com/docs/sdks/analytics) 添加来源。 Amplitude sources 添加来源后,请将生成的 API 密钥分享给 B2BROKER,以便我们为您完成 SDK 设置。此设置可将您 B2CORE 中的事件数据发送至 Amplitude。 ## 检查用于 Amplitude 跟踪的传入事件 [#check-incoming-events-for-amplitude-tracking] 配置来源并且您的 Amplitude 项目开始接收来自 B2CORE 的数据后,所有接收到的事件都会在 **Data** > **Events** 中收集,其事件属性则会显示在 **Data** > **Properties** 中。 您必须根据 **Tracking B2CORE Events with Amplitude** 中记录的事件,验证状态为 `Unexpected` 的传入事件,以了解其含义,并将您希望跟踪的事件添加到您的 Amplitude 计划中,或删除不需要的事件。 建议仔细执行事件验证,并考虑您的 Amplitude 计划限制。某些事件(例如 **Page viewed**)发生频率非常高(例如每次页面加载时),可能会迅速消耗每月事件配额,从而可能超出您的 Amplitude 计划限制。 Add events to your Amplitude tracking plan 包含在您的 Amplitude 跟踪计划中的事件会标记为 `Live`,并开始实时跟踪。 ## 在 Amplitude 中配置数据展示方式 [#configure-data-representation-in-amplitude] 在您的 Amplitude 项目中,访问 **Home** 页面上的 **Dashboard**。默认情况下,它包含一组预定义的小组件,其中展示从默认 Amplitude 事件收集的数据。您可以完全自定义 **Dashboard**,以显示与您最相关的信息和图表。 Amplitude Home ## 在 Amplitude 中构建图表 [#build-charts-in-amplitude] Amplitude 中的图表可将原始事件数据转化为有关客户如何与 B2CORE 交互的可视化洞察。每个图表都基于您跟踪的事件,使您能够监控参与度、转化率、留存率和用户分布。这使您更容易了解客户行为并改进服务。 要创建图表,请点击 **Create** > **Charts**,然后选择所需的图表类型。 有关图表操作的更多详细信息,请参阅官方 [Amplitude 文档](https://amplitude.com/docs)。 以下是在 Amplitude 中可构建的一些简单图表示例。您可以将图表添加到您的 **Dashboard**、分享图表,并在需要时导出数据。 ### 分段图表 [#segmentation-chart] **Segmentation** 图表可在选定时间段内,按事件属性比较或细分您的事件。 Segmentation chart 上方图表显示了过去一年中访问 IB room 的独立客户数量,并按国家/地区进行了细分。 ### 漏斗图表 [#funnel-chart] **Funnel** 图表可帮助您了解客户如何在 UI 中导航,并识别他们容易流失的潜在问题区域。漏斗分析的常见示例是分析注册和引导流程。 Funnel chart 上方图表显示了过去 7 天内从开始注册到完成注册的客户转化率。 ### 用户构成 [#user-composition] **User Composition** 图表可帮助您深入了解客户群体的结构。与事件驱动的分析不同,该图表依赖于用户属性,例如国家/地区、语言、平台或账户类型,而非客户操作。 User composition 上方图表显示了已注册客户在不同国家/地区的分布情况,帮助您了解客户来源以及客户群体的组织结构。 B2CORE 支持通过 iframe 将第三方 Web 应用直接嵌入客户 UI。当自定义菜单项配置为 **Iframe** 行为时,B2CORE 会在界面中加载您的应用,为客户提供无需离开平台的无缝体验。 本指南涵盖两个方面:在 B2CORE Back Office 中配置自定义菜单项,以及准备您的应用以确保其能在 B2CORE iframe 中正常运行。 ## 前提条件 [#prerequisites] 在继续之前,请确保满足以下条件: * 您的应用可通过 HTTPS 访问。 * 您拥有可访问 B2CORE Back Office 且具有 `Update menu` 权限的账户(详情请参阅[如何添加用户组并授予权限](how-to-add-a-user-group-and-grant-permissions))。 * 您熟悉[如何添加自定义菜单项](../manage-advertising-options/how-to-add-custom-menu-items)流程。 ## 第 1 步:配置您的服务器以允许 iframe 嵌入 [#step-1-configure-your-server-to-allow-iframe-embedding] 默认情况下,大多数 Web 服务器和框架会阻止页面被嵌入其他域中的 iframe。要允许 B2CORE 加载您的应用,您必须在服务器上配置相应的 HTTP 响应标头。 您需要设置以下标头中的**一个或两个**: ### Content-Security-Policy [#content-security-policy] 带有 `frame-ancestors` 指令的 `Content-Security-Policy` 标头用于控制哪些源可嵌入您的页面。设置此标头以包含您的 B2CORE 实例源: ``` Content-Security-Policy: frame-ancestors 'self' https://portal.example.com ``` 将 `https://portal.example.com` 替换为客户所使用的 B2CORE UI 的实际源。如果您的应用需要嵌入多个 B2CORE 实例,可以指定多个以空格分隔的源。 有关更多信息,请参阅 [MDN 上的 Content-Security-Policy 文档](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy)。 ### X-Frame-Options [#x-frame-options] `X-Frame-Options` 标头是一种可实现类似效果的旧机制。如果您使用它,请将其设置为带有您的 B2CORE 源的 `ALLOW-FROM`: ``` X-Frame-Options: ALLOW-FROM https://portal.example.com ``` 并非所有浏览器都支持 `X-Frame-Options: ALLOW-FROM` 指令。建议将带有 `frame-ancestors` 指令的 `Content-Security-Policy` 标头用作主要机制,并仅将 `X-Frame-Options` 作为对旧版客户端的后备方案。 有关更多信息,请参阅 [MDN 上的 X-Frame-Options 文档](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options)。 ## 第 2 步:在 B2CORE Back Office 中添加自定义菜单项 [#step-2-add-a-custom-menu-item-in-the-b2core-back-office] 要让客户能够访问您的应用,请添加一个具有 iframe 行为的自定义菜单项: 导航至 **Promotion** > **Menu**。 点击 **General** 行中的**眼睛**图标以查看菜单树。 点击页面右上角的 **+Create**。 填写必填字段: * 在 **Name** 字段中,输入菜单项的唯一名称。 * 在 **Caption** 字段中,输入客户将在菜单中看到的标签。 * 在 **External URL** 字段中,指定您的应用 URL。 * 在 **Icon** 字段中,指定 SVG 图标的 URL(16x16 px、单色、透明背景)。 * 在 **Custom Behavior** 下拉列表中,选择 **Iframe**。 如有需要,配置可选限制: * 若要将可见性限制为特定验证级别,请在 **Verification Level Allowance** 下拉列表中选择相应级别。 * 若要将可见性限制为特定客户类型,请在 **Client Type Allowance** 下拉列表中选择相应类型。 启用 **Visible** 复选框,使该项目显示在菜单中。 点击 **Save** 以添加自定义菜单项。 当客户点击此菜单项时,您的应用将在 B2CORE UI 内的 iframe 中加载。 自定义菜单项还提供另外两种行为选项:**Same tab**(在当前浏览器标签页中打开 URL)和 **New tab**(在新的浏览器标签页中打开 URL)。iframe 选项是唯一可将您的应用嵌入 B2CORE 界面内的选项。 ## 第 3 步(可选):实现 postMessage 通信协议 [#step-3-optional-implement-the-postmessage-communication-protocol] 如果您的应用需要识别经过身份验证的 B2CORE 用户、匹配 B2CORE UI 主题,或遵循用户选择的语言,您可以实现下述 `postMessage` 通信协议。此步骤为可选步骤——如果您的应用不需要用户身份验证、主题同步或语言同步,可以跳过此步骤。 ### 消息参考 [#message-reference] #### 从您的应用发送至 B2CORE 的消息 [#messages-from-your-application-to-b2core] | 消息类型 | 描述 | 载荷 | | ------------------------- | ------------------------ | ------------------------------------- | | `embed-iframe-ready` | 表示 iframe 已加载完毕并准备好接收消息。 | `{ type: "embed-iframe-ready" }` | | `embed-request-jwt-token` | 向 B2CORE 请求 JWT 身份验证令牌。 | `{ type: "embed-request-jwt-token" }` | #### 从 B2CORE 发送至您的应用的消息 [#messages-from-b2core-to-your-application] | 消息类型 | 描述 | 载荷 | | ----------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------- | | `embed-theme-change` | 每当 B2CORE UI 主题变更时发送(并会在 `embed-iframe-ready` 后立即发送一次)。 | `{ type: "embed-theme-change", theme: "dark-theme" \| "light-theme" }` | | `embed-language-change` | 每当 B2CORE UI 语言变更时发送(并会在 `embed-iframe-ready` 后立即发送一次)。 | `{ type: "embed-language-change", lang: "" }` | | `embed-jwt-token` | 对令牌请求的成功响应。 | `{ type: "embed-jwt-token", token: "", expiresAt: "" }` | | `embed-jwt-token-error` | 令牌生成失败时的错误响应。 | `{ type: "embed-jwt-token-error", error: "" }` | | `embed-logout` | 当 B2CORE 用户退出登录时发送。此前向您的应用签发的任何令牌均不再有效。 | `{ type: "embed-logout" }` | `lang` 字段包含与 B2CORE UI 当前所选语言对应的小写 ISO 639-1 语言代码(例如 `en`、`de`、`ar`)。 通过 `embed-jwt-token` 签发的 JWT 令牌绑定于签发时已登录的 B2CORE 用户。当该用户退出登录时,B2CORE 会发送 `embed-logout`,此后不得再使用该令牌。收到此消息后,请丢弃所有缓存令牌、停止计划的刷新任务,并清除用户特定状态。如果之后有其他用户登录,请使用 `embed-request-jwt-token` 请求新令牌——系统将为新用户签发全新的令牌。 ### 通信流程 [#communication-flow] 您的应用与 B2CORE 之间的消息顺序遵循以下模式: **发送就绪信号。** 当您的页面完成加载时,向 B2CORE 发送 `embed-iframe-ready` 消息。这会告知宿主您的应用已准备好接收数据。 **接收当前主题。** B2CORE 会响应包含当前主题(`dark-theme` 或 `light-theme`)的 `embed-theme-change` 消息。将该主题应用于您的 UI。用户切换主题时,您也会收到此消息。 **接收当前语言。** B2CORE 还会响应包含 B2CORE UI 当前所选语言代码(例如 `en` 或 `ar`)的 `embed-language-change` 消息。将相应区域设置应用于您的 UI。用户更改语言时,您会再次收到此消息。 **请求身份验证令牌。** 当您需要识别当前用户时,发送 `embed-request-jwt-token`。如果令牌生成成功,B2CORE 会响应 `embed-jwt-token`(包含 JWT 及其过期时间);如果令牌生成失败,则会响应 `embed-jwt-token-error`。 **在令牌过期前刷新令牌。** JWT 的过期时间在 `expiresAt` 字段中提供(ISO 8601 格式)。在当前令牌过期前请求新令牌,以保持不中断的访问。 **处理退出登录。** 当 B2CORE 用户退出登录时,B2CORE 会发送 `embed-logout`。收到后,请丢弃缓存的令牌、取消所有计划的刷新任务,并清除用户特定状态,以免数据泄露给下一位用户。如果之后有其他用户登录,请使用 `embed-request-jwt-token` 请求新的令牌。 ### 代码示例 [#code-example] 您可以在应用中包含以下完整 JavaScript 代码片段: ```javascript (function () { const B2CORE_ORIGIN = '*'; // Replace with your B2CORE instance origin for production let currentToken = null; let tokenRefreshTimer = null; // --- Send a message to B2CORE --- function sendToHost(message) { window.parent.postMessage(message, B2CORE_ORIGIN); } // --- Handle incoming messages from B2CORE --- function handleMessage(event) { const data = event.data; if (!data || !data.type) return; switch (data.type) { case 'embed-theme-change': applyTheme(data.theme); break; case 'embed-language-change': applyLanguage(data.lang); break; case 'embed-jwt-token': handleToken(data.token, data.expiresAt); break; case 'embed-jwt-token-error': console.error('Token error from B2Core:', data.error); break; case 'embed-logout': handleLogout(); break; } } // --- Apply theme to your UI --- function applyTheme(theme) { document.documentElement.setAttribute('data-theme', theme); } // --- Apply language to your UI --- function applyLanguage(lang) { document.documentElement.setAttribute('lang', lang); } // --- Handle received JWT token --- function handleToken(token, expiresAt) { currentToken = token; // Schedule a refresh 2 minutes before expiry if (tokenRefreshTimer) { clearTimeout(tokenRefreshTimer); } const refreshIn = new Date(expiresAt).getTime() - Date.now() - 2 * 60 * 1000; if (refreshIn > 0) { tokenRefreshTimer = setTimeout(requestToken, refreshIn); } else { requestToken(); } } // --- Request a JWT token from B2CORE --- function requestToken() { sendToHost({ type: 'embed-request-jwt-token' }); } // --- Handle B2CORE user logout --- function handleLogout() { // The token is bound to the user who just logged out — stop using it. currentToken = null; if (tokenRefreshTimer) { clearTimeout(tokenRefreshTimer); tokenRefreshTimer = null; } // Clear any user-specific state in your app here. } // --- Initialize --- window.addEventListener('message', handleMessage); sendToHost({ type: 'embed-iframe-ready' }); requestToken(); })(); ``` 在生产环境中,请将 `B2CORE_ORIGIN` 值替换为您的 B2CORE 实例实际源(例如 `'https://portal.example.com'`)。仅在开发期间可以使用 `'*'`,因为它允许任何源与您的应用通信。 ### TypeScript 类型定义 [#typescript-type-definitions] 如果您的应用使用 TypeScript 构建,可以使用以下类型定义: ```typescript type EmbedTheme = 'dark-theme' | 'light-theme'; // Messages: Your App -> B2CORE interface EmbedIframeReadyMessage { readonly type: 'embed-iframe-ready'; } interface EmbedRequestJwtTokenMessage { readonly type: 'embed-request-jwt-token'; } type EmbedOutboundMessage = EmbedIframeReadyMessage | EmbedRequestJwtTokenMessage; // Messages: B2CORE -> Your App interface EmbedThemeChangeMessage { readonly type: 'embed-theme-change'; readonly theme: EmbedTheme; } interface EmbedLanguageChangeMessage { readonly type: 'embed-language-change'; readonly lang: string; // ISO 639-1 code, e.g. "en", "de", "ar" } interface EmbedJwtTokenMessage { readonly type: 'embed-jwt-token'; readonly token: string; readonly expiresAt: string; // ISO 8601 } interface EmbedJwtTokenErrorMessage { readonly type: 'embed-jwt-token-error'; readonly error: string; } interface EmbedLogoutMessage { readonly type: 'embed-logout'; } type EmbedInboundMessage = | EmbedThemeChangeMessage | EmbedLanguageChangeMessage | EmbedJwtTokenMessage | EmbedJwtTokenErrorMessage | EmbedLogoutMessage; ``` ## 第 4 步(可选):验证 JWT 令牌 [#step-4-optional-validate-the-jwt-token] B2CORE 签发的 JWT 令牌可针对 B2CORE API(Admin Panel 后端)公开的 JSON Web Key Set (JWKS) 端点进行验证。这通常是 API/admin 域,而不是面向客户的 UI 域: ``` https://api./.well-known/jwks.json ``` 使用此端点获取验证令牌签名所需的公钥。大多数 JWT 库都原生支持基于 JWKS 的验证。 在开发期间进行手动检查时,您可以使用 [JWT 解码器工具](https://dinochiesa.github.io/jwt)解码和验证 JWT 令牌。 **另请参阅** [如何添加自定义菜单项](../manage-advertising-options/how-to-add-custom-menu-items) [如何在 B2CORE UI 中配置菜单](../manage-advertising-options/how-to-configure-a-menu-in-the-b2core-ui) [菜单](../../back-office-guide/promotion/menu) 为了保持精细化访问控制,您可以允许后台用户(例如管理员或经理)仅查看特定客户。 您应已创建后台用户并将其分配到特定用户组(详情请参阅[如何添加管理员用户](how-to-add-an-admin-user)和[如何添加用户组并授予权限](how-to-add-a-user-group-and-grant-permissions))。 要让后台用户仅查看特定客户: 导航至 **系统** > **用户**。 选择您希望其仅能查看特定客户的用户。 点击位于用户行中的 **编辑** 按钮。 在 **允许的客户标签** 下拉菜单中,选择一个或多个用于标识应对该用户可见客户的标签(详情请参阅[如何为客户分配标签](../manage-clients/how-to-assign-tags-to-clients))。 点击 **保存** 以应用更改。 现在,所选后台用户仅可查看已分配特定标签的客户。 以下说明介绍如何将客户及其相关数据(包括个人信息、账户和 KYC 文档)从外部 CRM 迁移到 B2CORE。迁移过程包括导入所有必需的客户数据,将文档作为数字资源上传,并安全地关联到 B2CORE 中对应的客户资料。 强烈建议在使用实际客户数据执行完整迁移之前,先在沙盒环境中测试导入功能。这样可以帮助您了解流程、验证数据要求并识别任何限制,从而确保安全、无错误地迁移到生产环境。 要将客户及其相关数据迁移到 B2CORE: ## 导入客户及其个人信息 [#import-clients-and-their-personal-information] 使用 `import-users` 选项导入客户列表和所需的个人信息,该选项可通过导航至 **系统** > **导入数据** 找到。 有关详细信息,请参阅[如何导入与客户相关的数据](how-to-import-client-related-data),尤其是 [import-user 选项](how-to-import-client-related-data#the-import-users-option)。 ## 导入客户账户 [#import-client-accounts] 导入客户后,使用 `import-accounts` 选项继续导入其账户信息,该选项同样可通过导航至 **系统** > **导入数据** 找到。 有关详细信息,请参阅[如何导入与客户相关的数据](how-to-import-client-related-data),尤其是 [import-accounts 选项](how-to-import-client-related-data#the-import-accounts-option)。 ## 迁移客户 KYC 文档 [#migrate-client-kyc-documents] 通过 B2CORE API 使用以下端点,将客户为 KYC 验证提交的文档(如身份证、护照或其他类型的文档)迁移到 B2CORE: `POST` `[host]/api/v2/documents` B2CORE API 受限,且*不*向公众开放。 必须通过支持工单申请访问 API 及其文档,并清晰、详细地说明您的预期使用场景。 遵循这些步骤,您可以确保以结构化、准确且安全的方式将客户数据迁移到 B2CORE,最大限度地减少错误并保持数据完整性。 自 2026 年 7 月中旬起,B2CORE 提供了新的注册设置来替代注册向导。新的注册设置可与自定义字段配合使用,因此您可以根据需求构建注册流程——从仅包含电子邮件地址和密码的简单表单,到包含自定义字段的多步骤流程。 与专为技术熟练用户构建且较难支持的注册向导和高级数据步骤相比,新的注册设置更加灵活,也更易于维护。 如果您有移动应用程序,请勿关闭或删除现有的注册向导。安装了旧版应用程序的终端用户无法在没有这些向导的情况下注册。我们将监控注册向导的使用情况,并在未来版本中将其移除,因此目前请保持原样。 ## 迁移概述 [#migration-overview] 要迁移到新的注册设置,请完成以下步骤: 1. 可选:为您希望收集的任何标准个人资料字段以外的信息设置自定义字段。 2. 在 **System** > **Registration** 中创建注册配置文件,并配置其字段、选项、条款和自定义字段。 3. 启用注册配置文件,并在 B2CORE UI 中验证注册流程。 ## 步骤 1. 设置自定义字段(可选) [#step-1-set-up-custom-fields-optional] 仅当您的注册流程需要标准字段以外的信息时,才完成此步骤。若仅需收集电子邮件地址、密码和电话号码等标准字段,请跳至[步骤 2](#step-2-create-a-registration-profile)。 要管理自定义字段,请导航至 **System** > **Custom Fields**。此菜单包含两个页面: * **Groups** — 用于组织相关字段的部分,例如个人信息、税务信息或经济概况。 * **Fields** — 各个单独的字段,每个字段均属于一个组,并定义了类型、标签和验证规则。 System > Custom Fields 菜单中的 Groups 页面 System > Custom Fields 菜单中的 Fields 页面 要添加字段,请在 **Fields** 页面上点击 **+Create**,然后输入标签、选择组、设置 **Required** 等验证规则,并为选择字段添加客户可选择的选项。 包含标签、组、验证和选项的字段创建表单 有关创建和管理自定义字段的详细信息,请参阅[自定义字段](../../back-office-guide/system/custom-fields)。 ## 步骤 2. 创建注册配置文件 [#step-2-create-a-registration-profile] 要创建注册配置文件: 导航至 **System** > **Registration**。 点击页面右上角的 **+Create**,然后选择要创建的配置文件类型,例如个人注册配置文件。 在 **General Settings** 部分中,填写以下字段: * **Caption** — 向客户显示的配置文件名称,作为 B2CORE UI 中 **Sign up** 页面上的注册选项。 * **Status** — 设置为 **Enabled** 以使该配置文件在 **Sign up** 页面上可用,或设置为 **Disabled** 以将其隐藏。 * **Register As (Client Type)** — 分配给通过此配置文件注册的客户的客户类型,例如个人或企业。 * **Verification Level** — 注册后分配给客户的初始验证级别。 在 **Fields Configuration** 部分中,启用客户在注册期间填写的标准字段,例如 **Email**、**Password**、**First Name**、**Last Name**、**Country** 和 **Phone**,并禁用您不需要的字段。 在 **Registration Options** 部分中,选择要应用的选项,例如用于验证 **Birthday** 字段的 **Require age 18+**,以及 **Require email confirmation**。 注册配置文件的常规设置、字段配置和注册选项 在 **Countries Blacklist** 部分中,选择要在此注册表单的 **Country** 选择列表中隐藏的国家。所选国家在 **Countries** 页面上仍会保持全局启用状态,但不会提供给通过此配置文件注册的客户。 使用此选项可限制特定注册配置文件的国家选择,而不会影响 B2CORE 的其他区域。若要一次性在所有位置阻止某个国家,请改为在 **Countries** 页面上将其禁用——请参阅[如何阻止某个国家的注册](how-to-block-registration-for-a-country)。 在 **Terms & Conditions** 部分中,点击 **+Add Term** 以添加客户在注册期间接受的每项协议,然后设置其翻译键和备用标题。备用标题支持链接,因此您可以将客户引导至客户协议或其他文档。 在 **Custom Fields** 部分中,选择要在注册表单中显示的自定义字段。 * 默认情况下,自定义字段会按您在步骤 1 中设置的组分组,并显示在多个页面上。 * 若要在单个注册步骤中显示所有自定义字段,请选择 **Don't split fields by groups**。 若要仅在另一个字段具有特定值时显示某个自定义字段,请使用 **Conditional Display** 部分。点击 **+Add Rule**,选择要显示的字段、要检查的字段以及触发显示的值。两个字段也必须在 **Custom Fields** 部分中被选中。 注册配置文件的条款和条件、自定义字段及条件显示 点击 **Save** 以创建注册配置文件。 ## 本地化字段和条款 [#localize-fields-and-terms] 请先用英语填写所有标题、自定义字段以及条款和条件,然后在 B2TRANSLATE 中将其翻译为您支持的语言。 要将可翻译键传输到 B2TRANSLATE,请在注册配置文件页面的右上角点击 **Copy B2TRANSLATE keys JSON**。该按钮会将配置文件中所有自定义字段以及条款和条件的可翻译键复制为 JSON,之后您可以将其粘贴到 B2TRANSLATE 中,翻译为所需的各种语言。 ## 步骤 3. 验证注册流程 [#step-3-verify-the-registration-process] 将配置文件状态设置为 **Enabled** 后,相应的注册选项将显示在 B2CORE UI 的 **Sign up** 页面上供客户使用。完成一次测试注册,以确认字段、选项和自定义字段是否按预期运行。 客户为自定义字段填写的值可在 B2CORE Admin Panel 的 **Clients** > 客户配置文件 > **Custom fields** 选项卡中查看,管理员也可以在那里查看和编辑这些值。 在您不再支持旧版移动应用程序之前,请保持现有注册向导处于启用状态。有关先前方法的详细信息,请参阅[如何设置注册向导](how-to-set-up-the-registration-wazard)。 **另请参阅** * [自定义字段](../../back-office-guide/system/custom-fields) 本说明介绍如何在 Back Office 中设置 2FA 服务,使您的客户能够在 B2CORE UI 中使用 Google Authenticator 或 SMS 进行 2FA,从而保护其个人资料。 ## 如何使用 Google Authenticator 设置 2FA [#how-to-set-up-2fa-with-google-authenticator] 要为您的客户提供在 B2CORE UI 中使用 Google Authenticator 进行 2FA 的选项,请在 Back Office 中配置以下设置: 导航至 **System** > **Settings**,并在 **Two-factor authentication** 部分配置以下选项: * **Enabled Two-factor auth providers** — 选择 **Google Authenticator**,以便您的客户可以在 B2Core UI 中使用此 2FA 选项。 * **Google authenticator service name** — 输入将在 Google Authenticator 应用中向客户显示的名称(例如,您的公司名称)。如有需要,可以更改此名称。 有关更多详细信息,请参阅 [设置](../../back-office-guide/system/settings)。 验证相关向导的配置: * **2FA Google Authenticator** * **2FA Google Auth** 确保这些向导已启用且没有限制: * 导航至 **System** > **Wizards**。 * 找到所需向导并点击 **Edit**。 * 转到 **Workflow** 选项卡。 * 对于每个向导步骤,点击 **Actions**,然后选择 **Country restrictions**、**Client type restriction** 或 **Jurisdiction restriction**。 * 在各选项的 **Restrictions** 弹窗中,确认 **Enabled** 设置为 **No**。 客户现在可以在 B2CORE UI 中通过 Google Authenticator 启用并使用 2FA,以保护其个人资料。 ## 如何使用 SMS 设置 2FA [#how-to-set-up-2fa-with-sms] 在使用 SMS 设置 2FA 之前,请确保您已添加并配置 2FA SMS 提供商(例如 [Twilio](../manage-communication-platforms/how-to-configure-twilio) 或 Vonage)。 要为您的客户提供在 B2CORE UI 中通过 SMS 使用 2FA 的选项,请在 Back Office 中配置以下设置: 导航至 **System** > **Settings**,并配置以下选项: 在 **Client settings** 部分中: * **Unique phone** — 选择 **Enabled**,以确保每位客户的电话号码唯一。 在 **Other settings** 部分中: * **Confirmation phone code lifetime** — 指定发送至客户电话号码的验证码有效时长,以秒为单位。 * **Sms limit for each recipient** — 指定客户每天可请求的验证码消息最大数量。 在 **Two-factor authentication** 部分中: * **Enabled two-factor auth providers** — 选择 **SMS**,以便您的客户可以在 B2Core UI 中使用此 2FA 选项。 有关更多详细信息,请参阅 [设置](../../back-office-guide/system/settings)。 创建用于通过 SMS 发送 2FA 验证码的模板: * 导航至 **System** > **Templates** > **Sms** > **Confirmation Templates**。 * 点击页面右上角的 **+Create**。 * 在 **Create template** 页面上,填写以下字段: * 在 **Name** 字段中,输入 `default`。 * 在 **Caption** 字段中,输入您希望在 Back Office 中用于该模板的名称(例如 `2FA SMS`)。 * 在 **Template** 字段中,指定消息文本,例如: `: Your verification code is %CODE%.` * 点击 **Save** 保存模板。 验证相关向导的配置: * **2FA SMS** * **2FA SMS Auth** * **Phone Confirm** 确保这些向导已启用且没有限制: * 导航至 **System** > **Wizards**。 * 找到所需向导并点击 **Edit**。 * 转到 **Workflow** 选项卡。 * 对于每个向导步骤,点击 **Actions**,然后选择 **Country restrictions**、**Client type restriction** 或 **Jurisdiction restriction**。 * 在各选项的 **Restrictions** 弹窗中,确认 **Enabled** 设置为 **No**。 客户现在可以在 B2CORE UI 中通过 SMS 启用并使用 2FA,以保护其个人资料。 此外,您还可以通过 SMS 发送验证码,在注册期间启用客户电话号码确认(有关详细信息,请参阅 [如何添加和配置注册向导](how-to-set-up-the-registration-wazard/how-to-add-and-configure-the-registration-wizard))。 ### 如何测试 SMS 2FA 的运行情况 [#how-to-test-operation-of-2fa-with-sms] 在 Back Office 中配置 SMS 2FA 后,您可以按如下方式测试其运行情况: 登录 B2CORE UI。 点击页面右上角的个人资料图标,然后在下拉菜单中选择 **Security**。 在 **Two-factor authentication** 部分中,启用 **SMS Confirmation** 选项。 在显示的表单中输入您的电话号码。 点击 **Continue**。 如果您已在指定电话号码上收到验证码,则 SMS 2FA 运行正常。 您可以配置与 Apple 推送通知服务 (APNs) 的连接,使已部署的 [iOS 应用](../../b2core-mobile/deploying-your-ios-app) 能够在发生以下事件时发送推送通知: * 创建入金请求 * 创建更新客户验证级别的请求 * 更新现有公告 * 收到 HelpDesk 回复 要配置与 APNs 的连接: 导航至 **System** > **External Connections**。 点击页面右上角的 **+Create**。 在 **Create connection** 页面中,填写以下字段: * 在 **Name** 字段中,输入连接名称。该名称必须唯一。 * 在 **Caption** 字段中,输入将在 Back Office 中应用于该连接的标题。 * 在 **Provider** 下拉列表中,选择 **ApplePushNotification**。 点击 **Save** 以创建连接。 **ApplePushNotification** 连接将显示在外部连接列表中。 点击 **Edit** 以输入连接详细信息,并完成以下字段: * 在 **App key id** 字段中,输入 iOS 应用的密钥标识符。 * 在 **App team id** 字段中,输入您加入 Apple Developer Program 后分配给开发团队的标识符。 * 在 **App bundle id** 字段中,输入 iOS 应用的 bundle 标识符。 * 在 **Private key content** 字段中,输入访问 APNs 并对通信进行身份验证所需的私钥。 * 在 **Production** 下拉列表中,选择 **Yes** 以启用 iOS 应用发送推送通知。 检查连接状态。 如果连接未激活(**Enabled** 字段中显示 **No**),请将 **Enabled** 下拉列表设置为 **Yes** 以激活连接。 点击 **Save** 以应用更改。 现在,已安装并登录您的 iOS 应用的客户将收到推送通知。 您可以设置通过以下渠道向 [Back Office 用户](../../back-office-guide/system/users/users)发送事件通知:电子邮件、短信、Slack 或 Telegram。 ## 前提条件 [#prerequisites] 在设置事件通知之前,必须满足以下前提条件: * 如果您计划通过 Slack 或 Telegram 发送事件通知,请创建并配置相应的机器人,然后在 **System** > **Settings** 页面上的 **Slack bot** 或 **Telegram bot** 字段中指定机器人令牌。 要了解如何获取机器人令牌,请参阅[如何设置 Slack 机器人](../manage-communication-platforms/how-to-set-up-a-slack-bot)和[如何设置 Telegram 机器人](../manage-communication-platforms/how-to-set-up-a-telegram-bot)。 * 如果您计划以直接 Slack 或 Telegram 消息的形式向 Back Office 用户发送事件通知,请在[Back Office 用户详细信息页面](../../back-office-guide/system/users/users#details)的 **Slack chat Id** 和 **Telegram chat Id** 字段中为每位用户指定其 Slack 和 Telegram 标识符。 要了解如何获取用户的 Telegram 标识符,请参阅[如何获取 Telegram 聊天、群组和频道标识符](../manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers)。 * 为您计划用于发送事件通知的每个渠道创建通知模板。为此,请转到 **System** > **Templates**,然后选择要为其创建模板的渠道。 要查看电子邮件、短信、Slack 和 Telegram 模板示例,请参阅[模板](../../back-office-guide/system/templates/)。 满足前提条件后,请按如下方式设置事件通知: 转到 **System** > **Event Notifications**,然后点击页面右上角的 **+Create**。 在 **Event** 下拉列表中,选择要在该事件发生时触发通知的事件(详情请参阅[用于触发 Back Office 用户事件通知的事件类型](../../back-office-guide/references/event-types-for-triggering-event-notifications-for-back-office-users))。 在 **Description** 字段中,指定事件通知的简短描述。 在 **Users** 字段中,指定将接收通知的 Back Office 用户的电子邮件地址。要将所有 Back Office 用户添加到通知收件人列表中,请点击 **All users**。 启用一个或多个通知发送渠道。可用选项包括:**Email**、**Sms**、**Slack,** 和 **Telegram**。 * 启用 **Email** 或 **Sms** 选项后,展开 **Template** 下拉列表并选择通知模板。 电子邮件和短信通知选项 * 启用 **Slack** 或 **Telegram** 选项后,请执行以下操作: * 选择 **Private**,以直接 Slack 或 Telegram 消息的形式向收件人发送通知。 消息将发送到[Back Office 用户详细信息页面](../../back-office-guide/system/users/users#details)的 **Slack chat Id** 和 **Telegram chat Id** 字段中指定的聊天。 * 选择 **Group**,以将通知发送到特定群组或频道。 * 在显示的 **Group Id** 字段中,指定将接收通知的群组或频道标识符(详情请参阅[如何获取 Telegram 聊天、群组和频道标识符](../manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers))。 * 在 **Template** 下拉列表中,选择通知模板。 Slack 和 Telegram 通知选项 在 **Enabled** 下拉列表中,选择 **Enabled**,以便在所选事件发生后发送通知。 点击 **Save** 以保存通知设置。 从 SupportPal 切换到 Zendesk 时,您的目标是让客户仅通过 Zendesk 提交新工单,同时仍能查看其 SupportPal 工单历史记录。 若要防止客户通过 SupportPal 提交新工单,同时允许他们查看现有工单: 导航至 **系统** > **外部连接**。 在 **提供商** 列中找到 `SupportPal` 连接,然后点击 **编辑**。 在 **编辑连接** 页面上,将 **只读** 选项设置为 **是**。 点击 **保存** 以应用更改。 本指南适用于希望让其他应用程序(您的自有产品、合作伙伴的应用,或 Keycloak 等身份平台)允许用户使用现有 B2CORE 账户登录,而无需构建独立登录系统的经纪商。 B2CORE 作为 **OpenID Connect (OIDC) 身份提供商**。您的应用程序(依赖方)会将用户重定向到 B2CORE 进行登录,并获取证明其身份的令牌。用户只需针对其 B2CORE 身份验证一次;无需为您的应用创建单独的账户。 这可实现 **单点登录 (SSO)**:用户使用其 B2CORE 账户登录一次,即可访问您连接的应用程序,无需单独登录。 此功能需要支付 **一次性设置费用**。在申请访问权限前,请联系您的客户经理或我们的支持团队,以确认费用和可用性。 ## 这是否适合您? [#is-this-the-right-fit] 如果符合以下情况,请使用此功能: * 您拥有 Web 或移动应用,并希望提供“使用 B2CORE 登录”选项。 * 您希望将 B2CORE 联合到您已运行的其他身份系统中(例如,在您自己的 Keycloak realm 中将 B2CORE 添加为身份提供商)。 这是标准的 OAuth2 / OIDC——任何主流库或身份平台(Keycloak、Auth0、`oidc-client-ts`、`openid-client`、`go-oidc`、Passport、NextAuth 等)都可以使用它,因为客户端所需的一切信息均发布在一个发现文档中。 ## 申请访问权限前需要确定的事项 [#what-you-need-to-decide-before-requesting-access] 请提前准备以下信息——在注册您的应用程序时,您的客户经理会要求您提供: | 项目 | 我们需要的信息 | | ---------------- | ----------------------------------------------------------------------------------------- | | **应用程序名称** | 简短、易于识别的名称(用于我们的记录及任何同意页面)。 | | **重定向 URI** | 应用中应接收登录响应的精确 URL,例如 `https://app.example.com/auth/callback`。必须完全一致——协议、主机、路径和尾随斜杠都会影响匹配。 | | **退出登录后重定向 URI** | 用户退出登录后跳转到的位置,例如 `https://app.example.com/`。 | | **作用域** | 始终需要 `openid`。如果需要用户的姓名/邮箱,请添加 `profile` 和 `email`。仅在需要长期有效的刷新令牌时添加 `offline_access`。 | ## 您将从我们这里获得什么 [#what-youll-receive-from-us] 注册您的应用程序后,您将收到: * **Client ID**(与您提供的应用程序名称一致)。 * 通过安全渠道提供的 **Client Secret**。请像存储数据库密码一样存储它;它不会过期,但可根据请求轮换(请参阅[须知](#good-to-know))。 * 您的 B2CORE 实例的 OIDC 发现 URL: ``` https:///srvsz/auth/hydra/v1/.well-known/openid-configuration ``` 将您的 OIDC 库指向此单一 URL——它会自行发现授权、令牌、userinfo、JWKS 和退出登录端点。您无需硬编码任何单独的端点。 ## 集成您的应用程序 [#integrating-your-application] 1. 使用上述发现 URL、Client ID 和 Client Secret 配置您的 OIDC 客户端库。 2. 如果您的库支持,请使用带 PKCE 的 **授权码流程**(建议 Web 和移动应用均使用)。 3. 仅请求实际需要的作用域——至少为 `openid`,并视情况添加 `profile`、`email` 和 `offline_access`。 4. 如需获取用户的个人资料信息,请调用 `/userinfo` 端点(或解码 `id_token`),不要尝试从 `access_token` 中读取任何信息——访问令牌是不透明的,并非用于解析。 5. 如需让用户退出登录,请将其重定向到发现文档中的 `end_session_endpoint`,并附带 `id_token_hint` 和您已注册的 `post_logout_redirect_uri`。 **联合身份验证而不是集成自定义应用?** 如果您要在自己运行的其他身份平台(例如 Keycloak)中将 B2CORE 添加为身份提供商,而不是集成自定义应用,请使用上述相同的发现 URL、Client ID 和 Client Secret 将其配置为通用 OpenID Connect 提供商——具体步骤取决于您的平台。某些平台使用与您选择的提供商别名关联的固定回调 URL(Keycloak 的 broker endpoint 就是一个示例);如果您的平台也是如此,请在我们注册您的重定向 URI 之前与我们确认该别名,因为它们必须完全匹配。 ## 须知 [#good-to-know] **退出登录仅在本地生效。** 重定向到退出登录端点会结束您应用的会话;不会让用户退出 B2CORE 本身或其已登录的任何其他应用。目前不支持跨应用“全部退出登录”。 **刷新令牌为一次性使用。** 每次刷新都会返回一个新刷新令牌以替换先前的令牌——刷新后请勿重复使用旧令牌。 **重定向 URI 必须完全匹配。** 请在初始申请中添加测试期间所需的任何本地/开发 URL;之后如需更改,则需要再次联系我们。 **轮换您的 Client Secret** 需要联系 B2Broker 支持团队。我们生成新密钥与您更新应用程序之间会有一个短暂窗口,在此期间,使用旧密钥的登录将失败——请将更换安排在低流量时段。 ## 设置后的测试 [#testing-after-setup] 1. 从您的应用程序(或者,如果使用联合身份验证,则从您的身份平台)触发登录流程,并确认其通过 B2CORE 的登录页面进行重定向。 2. 使用真实的 B2CORE 账户登录,并确认您已返回应用程序、成功登录且获得预期的用户信息。 3. 如果您请求了 `offline_access`,请测试令牌刷新。 4. 测试退出登录流程,并确认其清除了您应用程序的会话。 ## 问题 / 支持 [#questions--support] 请联系您的 B2Broker 客户经理或支持渠道,并提供您的经纪商名称及[上表](#what-you-need-to-decide-before-requesting-access)中的应用程序详细信息。 {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} You can temporarily block a partner. Blocked partners don't receive rewards, their referral links can't be used. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner that you want to block and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set **Enabled** to **No**. Click **Save** to block the partner. You can **unblock** the partner any time: set **Enabled** back to **Yes**. You can also permanently delete a partner by clicking in the list. Note that this action **can't be undone**. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, select a new partnership program from the **IB type** dropdown. Click **Save** to apply the changes. **See also:** * [How to configure personal rewards](how-to-configure-personal-rewards) * [How to configure a Master IB](how-to-configure-a-master-ib) Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set **Master** to **Yes**. Set **Number of Master levels** — a number of levels which you want to reward for this partner. Defaults to **100**. Set **Master Level Ratio** — a fixed multiplier for any level within *Master IB max level* value. Click **Save** to apply the changes. The **Level 1** with the multiplier **1** is configured by default for any IB type. You can modify it. To create the next level: Go to **Introducing Brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Navigate to the **Levels** tab. Click **Create**. Set level **Ratio**, which is a reward multiplier. Click **Save** to apply the changes. Go to the **Preferences** tab. Click **Save** to apply the changes. Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. On the **Personal data** tab, set the **Personal ratio** value — a personal multiplier which will be used for rewards calculations. Click **Save** to apply the changes. This article is intended for clients who already have an API driver configured for Converter. To configure a driver for the Converter to B2CORE API v2.x on your IB instance, follow the steps below: Add a new admin user by navigating to **System** > **Users** > **Users**. Click **+Create** and fill in the required fields. Refer to [How to add an admin user](https://docs.b2core.b2broker.com/how-to-articles/manage-system-settings/how-to-add-an-admin-user) for details. Select **Administrators** in the **Groups** dropdown. Navigate to **Introducing Brokers** > **Platforms** > **Platforms**. Select the platform for which you're configuring a driver. Go to the **Drivers** tab and click **Create**. Fill in the following fields: * **Provider** — select **API** in the dropdown. * **Name** — enter **API**. * **Server** — specify the Back Office base URL in the following format: `{baseUrl}/api/v2`. For example, `test.com/api/v2`. * **Login** — enter the newly added admin user's email that you specified at Step 1. * **Password** — enter the newly added admin user's password that you specified at Step 1. * **Version** — specify the version of a driver. Click **Save** to add the Converter driver to your IB instance. Go to **Introducing Brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Go to the **Tiers** tab. Click **Create**. Enter the **Name** of the tier. Set required number of **Active traders** to receive increased rewarding. Set the value to **0** to ignore this parameter in reward calculations. Set required amount of **Trading volume, in lots** to receive increased rewarding. Set value to **0** to ignore this parameter in reward calculations. Set required amount of **Trading volume, in USD** to receive increased rewarding. Set value to **0** to ignore this parameter in reward calculations. Set tier **Ratio** — rewards multiplier for the partners who have reached volume/clients goals for a tier period. Click **Save** to apply the changes. Go to the **Preferences** tab and set **Tier period** in days — the number of days in which amounts set on the previous step must be achieved by a partner to receive increased rewarding. Click **Save** to apply the changes. How reward calculation applies a tier: * A partner qualifies for a tier only if **all three** configured conditions (active traders, trading volume in lots, trading volume in USD) are met — a condition set to **0** is always satisfied and does not block qualification. * If a partner qualifies for more than one tier, the tier with the **highest ratio** is applied, not the first one configured. * The tier period is measured from the trade that triggers the reward, not from today: the window is the tier period ending the day **before** that trade (the trade's own day is not included). * If the tier period is not set (or is 0 or less), the payment fails validation and no reward is paid. * A partner with no sub-accounts (no clients in their chain) always gets zero traders/volume metrics, so they can only qualify for a tier where every condition is set to 0. It's assumed that a connection to cTrader has already been configured in the B2CORE Back Office by the admin who is assigned the permissions to manage external connections and platforms. To configure a cTrader connection to an IB instance, do the following: Navigate to **Introducing Brokers** > **Platforms** > **Platforms**. Click **Create** and fill in the following fields: * **Provider** — select **cTrader** from the dropdown. * **Platform** — select **cTrader** from the dropdown. * **Name** — specify the platform name. Click **Save** to apply the changes. Click the **Edit** button located in the row of the newly created cTrader platform. The **Preferences** tab displays the cTrader configuration settings specified when a connection to this platform was set up in the B2CORE Back Office. Switch to the **Drivers** tab and click **Create**. Configure a connection to a synchronizer database. This is a MySQL database that stores the data collected from the cTrader platform. To establish the connection, fill in the following fields: * **Provider** — select **PDO** from the dropdown. * **Name** — specify the name of a synchronizer database. * **Server** — specify the address of a synchronizer database. * **Login** — enter the username for connecting to a synchronizer database. * **Password** — enter the password for connecting to a synchronizer database. * **Version** — specify the version of a synchronizer connection driver. The currently supported version is `3`. Click **Save** to connect the **cTrader** platform to an IB instance. Before creating a new type, make sure that the following necessary parameters are configured and enabled in the Back Office: * Navigate to **Products** > **Products** and check that at least one product with type **Partner** is created and enabled. You can use filter by type for quick search. If there is no product with this type, [create one](how-to-set-up-a-wallet). Go to **Introducing brokers** > **Program** > **Types**. Click **Create**. The **Preferences** tab of the Type details will open. Click **Save** to apply the changes. In the **Name** field, enter a partnership program name. In the **Description** field, enter a partnership program caption. This can be, for example, conditions for participation. From the **Registration** dropdown, select an option of joining a partnership program: * **Auto**: Each client signing up to the B2CORE UI automatically becomes a partner. If multiple partnership programs are available, an IB account is created for each program. * **Public**: Clients can see available partnership programs in the B2CORE UI and can apply for it. For this type of registration, **Approvement** option is available and enabled by default, which means that clients join a partnership program only after their [joining requests](#user-content-fn-1)[^1] are approved by a Back Office admin. If the option is disabled, the partner can access the IB Room immediately after the registration. * **Private**: Clients are added to a partnership program by a Back Office admin. Applying via the B2CORE UI is unavailable. * **Inherited**: Clients are added to a partnership program automatically if the partner who referred them already participates in this program. Applying via the B2CORE UI is unavailable and the program isn't visible to clients. If the referring partner doesn't participate in the program, or a client signs up without a referral link, no IB account is created. The **Approvement** option isn't available for this type of registration, since the program is assigned by the system rather than requested by a client. * **Restricted**: Clients can join a partnership program only using a link provided by a participant of another or the same program. Specify the program identifier in the **Restriction** field. For this type of registration, **Approvement** option is available and enabled by default, which means that clients join a partnership program only after their [joining requests](#user-content-fn-2)[^2] are approved by a Back Office admin. If the option is disabled, the partner can access the IB Room immediately after the registration. From the **Product** dropdown, select a product. From the **Currency** dropdown, select a currency. Click **Save** to apply the changes. [^1]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/back-office-guide/clients/requests). [^2]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/back-office-guide/clients/requests). ## Generate a QR code [#generate-a-qr-code] Go to **Introducing brokers** > **Program** > **Introducing brokers**. Select a partner from the list and click the name or . For a quick search, you can filter partners by a name, email, and other criteria. Go to the **Links** tab and click a link in the **Landing page** column. At the bottom of the page, you can see the **Change color** and **Add icon** dropdowns. There are two default background colors — black and white. You can customize colors, see [below](how-to-generate-a-qr-code#customize-colors) for details. Icon is optional, you can ignore this field, but remember that using an icon for QR codes can increase the number of scans by 2-3 times. You can customize icons, see [below](how-to-generate-a-qr-code#customize-icons) for details. Use the **Click to generate QR code** button to create a QR code. You can copy your QR code by clicking **Copy Embed** or download it to your device by clicking **Download QR Code**. ## Customize colors [#customize-colors] Navigate to **Introducing brokers** > **Promo** > **QR Codes** > **Colors**. Click **Create** to create a new color and fill out the form: * **Name** — enter the name of the color. * **Background color** — enter the HEX code of the background. * **Foreground color** — enter the HEX code of the foreground. Click **Save** to save a new color. The color is now available in the dropdown of colors when creating a QR code. ## Customize icons [#customize-icons] Navigate to **Introducing brokers** > **Promo** > **QR Codes** > **Icons**. Click **Create** to create a new icon and fill out the form: * **Name** — enter the name of the icon. * **Icon** — attach the icon file. Make sure your icon is a PNG image and its size is from 128 x 128 to 512 x 512 and less than 100 KB. Click **Save** to save a new icon. The icon is now available in the dropdown of icons when creating a QR code. To import data: ## Prepare a CSV file to import [#prepare-a-csv-file-to-import] The file must contain the following fields: Download the `template_import_ibs.csv` file that you can use to verify that your CSV file includes the correct headers and data formats. You can use a semicolon or tab as a delimiter instead of a comma in your file. ## Create an import operation [#create-an-import-operation] 1. Go to **System** > **Import data**. 2. Click **+Create** in the upper-right page corner. ## Fill out the form [#fill-out-the-form] 1. In the **Title** field, enter a name that you want to assign to your data import operation. 2. In the **Description** field, optionally enter a short description for your import operation. 3. From the **Action** dropdown, select `import-ibs` — to import IB-related data for existing clients. 4. In the **Delimiter** dropdown, select a delimiter character you used to separate data in your prepared CSV file (such as `comma`, `semicolon`, or `tab`). ## Upload the CSV file [#upload-the-csv-file] Click **Browse** and select your prepared CSV file for data import. ## Run the data import [#run-the-data-import] Click **Save** to start the import operation. Mind that all fields in the CSV file are required. If any of the fields are missing, the import operation will fail. During the data import: * If an email address specified as **IB Email** exists in B2CORE, this client will be added as an IB partner and the IB-related data will be imported for that client. * If an email address specified as **IB Email** doesn’t exist in B2CORE, the IB-related data won't be imported. After the import operation is finished, you can check its status and click the **Edit** button located in the import operation row to view the **Log messages** and **Error messages** fields listing the details about the records that were successfully imported as well as errors that occurred during import. To create a partner profile: Go to **Introducing brokers** > **Program** > **Introducing brokers**. Click **Create**. Enter the **Email** of the client who is registered in the B2CORE UI. If the client hasn't yet registered in the B2CORE UI, you can create the profile. From the **Type** dropdown, select a partnership program. Click **Save** to apply the changes. Go to **Introducing brokers** > **Program** > **Types**. Select an IB type from the list and click its name or . Go to the **Symbols** tab. Select the symbol for which you want to configure payment preferences and click . For a quick search, you can filter symbols by a platform, trading group, symbol name, and other criteria. From the **Payment plan** dropdown, select an option for reward calculation. For detailed descriptions, refer to [Payment plans](../payment-plans). Remember that available payment plans depend on the platform. Depending on the selected payment plan, fill in corresponding fields (see [below](how-to-set-up-a-payment-plan-for-symbols#payment-plan-settings)). In the **Position** field, select the positions for which you want to calculate the reward amount: open, close, or both. In the **Apply** field, select whether to apply the specified settings to the current symbol or to a trading group. Click **Create** to apply the changes. ## Payment plan settings [#payment-plan-settings] * Indicate the **Percentage** of the received commission that you want to pay to your partners. For example, **10** means 10%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. * Select the **Currency** in which rewards will be paid. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * Specify the **Amount** that you want to pay your partners for each lot traded by their clients. Positive integer and decimal values greater than or equal to 0 (zero) are supported. Keep in mind that you must monitor profitability using this scheme as the reward amounts may exceed the commissions charged. For this payment plan you need to preliminary configure a required amount of levels. Refer to [How to configure levels](how-to-configure-levels) for step-by-step instructions. * Select the **Currency** in which rewards will be paid. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. * In the **Amount** field, specify the max amount of the reward. This is the amount that will be paid to partners for trades of their direct clients (Level 1: *IB* → *Direct client*). Positive integer and decimal values greater than or equal to 0 (zero) are supported. * Click links below the **Amount** field to specify the exact amounts that partners receive at each level. The number of links depends on the number of configured levels. In the example below, 3 Levels are configured for the IB type. Therefore, you can see two links: * distribution of the **Max amount** between 2 levels (*IB* → *SubIB* → *Client*) * distribution of the **Max amount** between 3 levels (*IB* → *SubIB* → *SubIB* → *Client*) Max amount Refer to [Max amount](../payment-plans#max-amount) for a distribution example. * Specify the **Markup**, in points, that you want to pay your partners for each lot traded by their clients. Positive integer values greater than or equal to 0 (zero) are supported. * In the **Markup, %** field, specify your markup on the trading platform. This value is required for correct calculations of reward amounts. * In the **Percentage** field, indicate a percentage of your markup (**Markup, %**) that you want to pay your partners for each lot traded by their clients. Positive integer and decimal values greater than or equal to 0 (zero) are supported. * Indicate the **Percentage** of the market spread value that you want to pay to your partners. For example, **10** means 10%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. The **Position** field is automatically set to **closed** and cannot be changed. * Indicate the **Percentage** of the platform spread value that you want to pay to your partners. For example, **50** means 50%. Positive integer and decimal values in the range from 0 (zero) to 100 are supported. The **Position** field is automatically set to **closed** and cannot be changed. * The markup percentage is automatically retrieved from the trading platform's symbol configuration and used in reward calculations. A **Wallet** is a partner account, to which all partner rewards are credited. Before creating a partner product, navigate to **Products** > **Platforms** and make sure that **Personal** platform is enabled. Go to **Products** > **Products**. Click **Create** and select **eWallet** from the dropdown. The **Create product** popup will open. From the **Platform group** dropdown, select **eWallet**. From the **Currency** dropdown, select a currency in which you want to pay rewards to your partners. If a partner's wallet currency differs from the reward currency, then the reward amount is converted into the wallet currency. The conversion occurs at the current exchange rate at the time of calculation. In the **Name** field, enter a wallet name. It can be the same as currency for your convenience. Select **Group**. From the **Factory** dropdown, select **100** if a wallet is denominated in currency subunits (for example, cents); otherwise, leave the default value **1**. From the **Type** dropdown, select **Partner**. Click **Save**. The **Info** tab of the Product details will open. Set the **Caption**, which will be displayed in the B2CORE UI. Set localizations if needed. Set **Status** to **Enabled**. Grant permissions: select required **Rights** or check **eWallet** in the **Group rights**. Set **Max accounts** to **-1**. Click **Save** to apply the changes. Go to **Platforms** > **Groups** and confirm that the cent trading group already exists for the platform. If it doesn't, create it on the trading platform side first. In the B2CORE Back Office, go to **Products** > **Product Currencies** and open the product currency linked to the cent account. Set **Factory** to **100**. This value marks the product currency as a cent one. Go to **Platforms** > **Groups**, open the cent group, and set **Lot size** to **0.01** — matching the platform's 1:100 contract-size ratio for cent accounts. Apply these steps in order: **Platform group** → **Product currency (Factory)** → **IB group (Lot size)**. If the Lot size step is skipped or done before the others, calculated volumes and rewards come out 100x too high. ## Reward rate [#reward-rate] Once **Lot size = 0.01** is set for the group, reuse the existing per-standard-lot reward rate as-is — don't rescale it manually. Lot size already accounts for the 1:100 ratio, so rescaling the rate too would double-count it (e.g. a $2 per-lot rate doesn't need to become $0.02). ## Notes [#notes] * No new IB type, reward currency, or separate wallet is required for a cent account — the existing setup and reward plan can be reused. * The reward/wallet currency isn't hardcoded to USD — it follows the platform group's **Payment currency**. * A separate "cent" currency (e.g. USC) doesn't need to be created or enabled anywhere — cent-ness is determined only by the product currency's **Factory** field. This article covers two common scenarios for managing client structures in the IB system: * Transferring an entire client tree from one IB to another. * Transferring an individual client from one IB to another. You can also reassign clients and sub-IBs between IBs directly on the [Reassign Users](../back-office-guide/program/reassign-users) page, without exporting and importing IB-related data. ### Before you start [#before-you-start] * Ensure you have proper backup of client data. * Confirm that the destination IB exists and is active. * Always verify exports before deleting source IBs. ## Transferring the entire client structure from one IB to another [#transferring-the-entire-client-structure-from-one-ib-to-another] Use this method to move all clients or SubIBs from one Introducing Broker to another while preserving all relationships and data. This scenario requires the **mandatory removal of the source IB** from which clients are being transferred. Go to **Introducing brokers** > **Program** > **Introducing brokers** and open the profile of the source IB (`IB1`). On the **Clients** tab, export all first-level clients under `IB1`. Export only first-level clients. All lower-level clients will be automatically transferred with their relationships preserved. After confirming the export is complete, delete `IB1` from the system. Import IB data, as described here: [How to import IB-related data](how-to-import-ib-related-data). In your CSV file, specify the following: * In the **IB Email** column, the email address of the destination IB (`IB2`). * In the **Client Email** column, the email addresses of clients exported from `IB1`. * In the **IB Type ID** column, the identifier of the desired IB type. To find IB type IDs, go to **Introducing brokers** > **Program** > **Types** and export the existing types. The required IDs will be available in the exported file. Upload the CSV file and complete the import process. All clients will be transferred to `IB2` with their transaction data, reward information, and subordinate client relationships intact. ## Moving a particular client from one IB to another [#moving-a-particular-client-from-one-ib-to-another] Use this method to transfer an individual client or SubIB from a source IB to a target IB while preserving all their data. Identify the current IB under which the client is located (`IB1`) and determine the target IB where the client should be moved (`IB2`). Go to **Introducing brokers** > **Program** > **Clients** and remove the client from `IB1`. Go to **Introducing Brokers** > **Program** > **Introducing brokers** and select the target `IB2`. On the **Clients** tab, click the **Create** button to add the client. On the **Clients** tab, enter the client's email address to create them under the target `IB2`. The system will automatically preserve all transaction and reward information during this process. Verify that the client has been successfully moved to the target `IB2` with all their historical data intact. ## Set up IB [#set-up-ib] ## Create your IB program [#create-your-ib-program] ## Manage partners [#manage-partners] ## Other [#other] On the **Partner Dashboard** page (labeled **Dashboard** on some stands), you can find a set of widgets displaying the data related to the partnership programs you've joined. In the dropdown located at the top of the page, select a partnership program for which you want to display widgets. The set and layout of widgets displayed may vary depending on the broker configuration. The following widgets are available: **Wallet** View the total balance of your rewards in your wallet, as well as the total rewards earned. In the widget, you can click **Withdraw** to navigate to the **Funds** > **Withdraw** page and withdraw a desired amount from your wallet, or you can click **Transactions** to navigate to the **Transactions** tab of the [Reports](reports/transactions) page, listing reward payments related to a selected partnership program. *** **Partner Link** View the details of your referral link. You can select a **Landing Page** (currently, only **Sign Up** is available) and a **Language** (select **Global** for a non-localized link), then copy the generated link. *** **CPA Program** Track the CPA (Cost Per Acquisition) program activity for a selected period. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. If there is no CPA program activity for the selected period, the widget displays an empty state. *** **Savings Rebates** Track savings-rebate activity for a selected period. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. *** **Trading Report** Monitor the number of your active traders, trading volume, and the amount of paid rewards. You can select a period for which you want to display the data, such as **Day**, or apply a custom period by selecting the start and end dates in the date range field. The report table includes the following columns: **Date**, **Active Traders**, **Trades**, **Trading Vol.**, **Reward Amount**. *** **Acquisition Report** Track the number of clicks on your referral links or promo banners and the number of registrations made after clicking your referral materials. The widget displays a chart showing **Clicks** and **Registration** trends. The report table includes the following columns: **Date**, **Clicks**, **Registrations**. You can select a period for which you want to display the data, such as over the past hour, day, week, month, or year. Alternatively, you can apply a custom period by selecting the start and end dates in the date range field. *** **Rewards by Symbol** Monitor the rewards generated per traded symbol. The report table includes the following columns: **Symbol**, **Trades**, **Volume (Lots)**, **Reward/Lot**, **Reward Amount**. Depending on the broker configuration, this menu section may be labeled **IB Room** or **Partners** in the B2CORE UI. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} In this guide, we'll cover the primary features and functionalities of IB. The **Interface overview** provides a general description of the Back Office interface and its main controls. The following pages mirror the structure of the **Introducing brokers** menu in the Back Office. Each page includes a detailed explanation of a corresponding Back Office section, listing the available fields, applicable filters, limits, value ranges, and so on. This guide serves primarily as a reference and isn't focused on explaining specific user scenarios in detail. However, the guide pages contain cross-references to relevant how-to articles (step-by-step tutorials) and include links to other materials that may be helpful. The Back Office user interface is uniform across all pages, ensuring consistent look and feel and featuring a common set of basic options. ## The top bar options [#the-top-bar-options] At the top of a typical Back Office page, you can find a top bar with the following elements: * — click it to expand or collapse the main menu. * — click it to see the events that were scheduled for Admins in the **Event Calendar**. The number of upcoming events is displayed on a counter badge. * — click it to see pending client requests. The number of new requests is displayed on a counter badge. * **Language** **menu** — click it to select the interface language. * **User profile pane** — click this panel to access the **Log out** button. ## Common buttons and icons [#common-buttons-and-icons] The following buttons can be found on most Back Office pages. * the **Create** button — used to add a new entry. * the **Export** button — used to export table data to a CSV file. * the **Import** button — used to import an XLSX or a CSV data file. * — used to apply custom filters. * — used to reset custom filters. * — used to access details. * — used to delete an entry. Page elements may serve as hyperlinks which can be clicked to drill down to details. Access to this data is maintained based on the permissions assigned to a particular user group. ## Filtering [#filtering] Throughout the Back Office, the data is typically organized in tables that can be filtered. You can specify multiple criteria for filtering column data. When filtering is available, the appropriate input fields are displayed in column headers. The inputs vary depending on a data format, such as text, number, date, time, or list. To facilitate filtering by date, two fields for the start and end dates may be displayed so that you can define a time period. To enable or disable filters, click and buttons. ## Sorting [#sorting] In the Back Office, you can sort the data available in tables. The columns by which you can sort data are marked with displayed in column headers (no arrows are displayed when sorting isn't available). You can click these arrows to sort data in an ascending () or descending () order, by a single column at a time. ## Pagination [#pagination] You can display table data across multiple pages and specify how many records to display on a page. You can also view the total number of records found. To open the previous or next page, click the left or right arrow. ## Export and import [#export-and-import] Some Back Office pages support data export to CSV files. This option is available on pages that contain an **Export** button above the data table. The data in a resulting file matches the applied sorting and filtering criteria. To export page data to a CSV file, click the **Export** button. Some Back Office pages also support importing of CSV and XLSX files. This option is useful when you need to update the symbol settings for a partnership program. To import data, click the **Import** button, choose the file that you want to import and click **Open**. ## Localizations [#localizations] In the B2CORE Back Office, you can configure fields that support localizations to have multiple language options in the B2CORE UI. Using the **localization** buttons, you can set translations for these fields into different languages. To set localizations, click the **Localization** button next to the field, enter the translation in the supported languages and click **OK**. Note that only enabled localizations are displayed. You can enable or disable localizations in the **System** > **Localizations** section. View the following information for each process: **Date** The date and time when a process started running. *** **Process name** The name of a process. Possible values: * **Clear Cache** (`cache`) — clears cache for the specified time period. * **Cancel Payments** (`cancel`) — reverts reward payments. * **Create Payments** (`payments`) — initiates reward payments. * **Process Payments** (`transactions`) — processes reward transfers. * **Run Automation** (`schedule`) — runs consequentially the full process cycle (Sync Symbols + Sync Groups + Sync Trades + Create Payments + Process Payments + Sync Accounts). * **Run Diagnostics** (`diagnostics`) — runs diagnostics of IB services. * **Sync Accounts** (`accounts`) — runs synchronization of [accounts](platforms/accounts) with trading platforms. * **Sync Groups** (`groups`) — runs synchronization of [groups](platforms/groups) with trading platforms. * **Sync Symbols** (`symbols`) — runs synchronization of [symbols](platforms/symbols) with trading platforms. * **Sync Trades** (`trades`) — runs synchronization of [trades](platforms/trades) with trading platforms. *** **Memory** The amount of memory used by a process. *** **CPU Time** The time which it took a process to run. *** **PID** The process identifier. *** **Exit code** The process result. Possible values: * **0** — the process completed successfully. * **1** — the process wasn't completed due to errors. * **2** — the process was gracefully stopped due to service maintenance. On this page, you can monitor the synchronization pipelines that keep IB data in sync with trading platforms. To run a synchronization manually, click the **Run process** button. The following information is provided about each pipeline run: **Date** The date and time when a pipeline run started. *** **Platform** The trading platform for which the synchronization was run. *** **Steps** The synchronization steps included in the pipeline run. *** **Status** The current status of the pipeline run. The weekly calendar view displays the pipeline runs by day of the week. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} 要管理翻译,您必须被分配 *编辑者* 权限。 您无法编辑 **DEMO** 项目中的翻译。 要添加新翻译或编辑现有翻译: 在 **项目** 页面上,点击项目名称。 在表格上方的语言下拉列表中,选择所需语言。 仅显示该项目支持的语言。 找到所需的键。 要查找键,请点击 **放大镜图标**,然后在搜索字段中开始输入键名或翻译内容,或者使用[筛选器](../filter-keys)。 在 **自定义翻译** 字段中输入翻译。 该字段支持 HTML 自动补全和语法高亮。 如可用,您可以[使用变量](use-variables-in-translations)并[处理复数形式](handle-plural-forms)。 您还可以请求为您的项目启用 [AI 翻译](translate-with-ai)。 更改会自动保存。 在本文中,您将了解如何在产品的 WebUI 中启用编辑模式。 此功能可帮助您轻松查找页面上任何翻译键的标识符。 ### 启用编辑模式 [#activate-the-editing-mode] 您可以在产品 WebUI 的任何页面上启用编辑模式: 在浏览器地址栏中,在页面 URL 后追加 `?showTranslateEditor=true`,然后按 *Enter*。 您将在页面顶部看到相应的通知。 启用编辑模式 您可以在 WebUI 页面之间切换:编辑模式将保持启用状态,直到您点击 **退出编辑模式** 将其禁用。 ### 复制键 [#copy-a-key] 在此模式下,页面上的所有可用翻译都会标记为 **铅笔图标**。 请注意,默认未显示的元素会在悬停时显示。 选择要编辑的翻译,然后点击其附近的 **铅笔图标**,即可将其键复制到剪贴板。 复制键标识符 ### 定位键 [#locate-the-key] 1. 在 B2TRANSLATE 的 **项目** 页面中,选择您的项目。 2. 点击 **放大镜图标**,然后将复制的值粘贴到搜索字段中。 键列表将按键标识符自动筛选。 现在您可以编辑翻译。 有关详细信息,请参阅[添加或修改翻译](add-or-modify-translations)。 您可以从同一项目类型中包含的另一个项目复制翻译。 在目标项目中,翻译仅会添加到尚未包含翻译的键(**Custom translation** 字段为空)。 现有翻译(**Custom translation** 字段不为空)不会被覆盖。 您必须在目标项目中拥有 *Editor* 权限,并且在源项目中至少拥有 *Viewer* 权限。 要复制翻译: 在 **Projects** 页面上,点击要将翻译复制到其中的项目名称。 从表格上方的语言下拉列表中,选择所需语言。 点击页面标题中的 **Import keys**。 导入键 在 **Import keys** 弹出窗口中,检查所选平台(如适用)和语言。 从 **Import from project** 下拉列表中,选择要从中复制翻译的项目。 仅会显示包含所选平台(如适用)和语言,且您在其中至少拥有 *Viewer* 权限的项目。 选择要从中导入键的源项目 点击 **Import** 按钮。 如有需要,请对其他语言重复上述操作。 ### 将翻译导出为 CSV 文件 [#export-translations-to-a-csv-file] 1. 在 **Projects** 页面上,点击项目名称。 2. 从表格上方的语言下拉菜单中,选择所需语言。 3. 勾选要复制的键的复选框。勾选顶部复选框可全选。 4. 从表格上方显示的 **Bulk actions** 下拉菜单中,选择 **Download CSV**。 Download CSV 或者,您可以下载项目中的**所有**键: 1. 在 **Projects** 页面上,选择一个项目并点击 **three dots**。 2. 选择 **Download CSV**。 3. 选择所需的平台(如适用)和语言。 4. 点击 **Download**。 CSV 文件将下载到您的计算机。 ### 在 CSV 文件中编辑翻译 [#edit-translations-in-the-csv-file] 请注意以下事项: * 仅编辑 `translation` 列中的值。 * 只能使用逗号(`,`)或分号(`;`)作为分隔符。请注意:如果您使用 Apple Inc. 的 Pages 编辑文件,它有时可能会在第一行添加额外的分号,从而可能影响文件上传。 * 对于包含空格的多词翻译,请使用引号(`"My new translation"`)。 * 如果没有 `originalDefaultTranslation`,则始终会忽略自定义翻译。 * 如果 `languageDefaultTranslation` 与自定义翻译相同,则会忽略自定义翻译。 * 在其他情况下,将更新自定义翻译。 ### 导入 CSV 文件 [#import-the-csv-file] 1. 返回项目的翻译页面。 2. 点击页面标题中的 **Upload CSV**。 Upload CSV 3. 选择所需语言。 4. 将文件拖放到上传区域,或点击 **Add file** 从计算机中选择文件。允许的最大文件大小为 3 MB。 Add CSV file 5. 点击 **Upload**。 6. 刷新页面以查看已上传的翻译。 或者,您可以从项目列表上传文件: 1. 在 **Projects** 页面上,选择一个项目并点击 **three dots**。 2. 选择 **Upload CSV**。 3. 选择所需的平台(如适用)和语言。 4. 将文件拖放到上传区域,或点击 **Add file** 从计算机中选择文件。 5. 点击 **Upload**。 B2TRANSLATE 的复数化功能可准确翻译不同语言中依赖数量的字符串。 本指南介绍如何在翻译会随数量变化的内容时处理复数形式。 ## 了解复数形式 [#understanding-plural-forms] 不同语言的复数形式规则各不相同。 英语通常使用两种形式(单数和复数),而其他语言可能会根据复杂的语法规则要求使用多种形式,例如: * **英语**:1 file,2 file**s**,5 file**s** * **俄语**:1 файл,2 файл**а**,5 файл**ов** B2TRANSLATE 会根据您的目标语言自动确定所需的复数形式,并显示相应的输入字段。 ## 复数化面板 [#the-pluralization-panel] 处理复数化键时,您会看到专用的 **复数化** 面板,其中包含多个输入字段,每个字段代表目标语言的一种不同复数形式。 复数化面板 ### 其他形式 [#the-other-form] 这是全球所有语言中使用的主要必填形式。 每个复数化翻译都必须包含此形式,因为它可作为所有未指定情况的后备形式。 如果您只填写 **其他** 形式并将其他形式留空,B2TRANSLATE 会自动使用 **其他** 形式的值填充其余形式。 这样可确保您在完成所有形式的翻译时,译文仍能正常使用。 在项目的翻译页面中,对于具有复数形式的键,此形式会显示在 **翻译** 字段中。 ### 默认值 [#default-value] 在每个复数形式输入字段下方,您会看到默认值(通常是英文源文本)。 显示逻辑如下: * 如果您的目标语言具有比源语言更多的复数形式(例如,俄语有 4 种形式,而英语有 2 种),默认值只会显示在对应数量的形式下方。 * 当目标语言中不存在默认翻译时,只会显示英文翻译,并保持现有逻辑。 ## 翻译工作流程 [#translation-workflow] ### 访问复数化面板 [#access-the-pluralization-panel] 在 **翻译** 页面中,点击所需键的 **三个点**(查看详情)。 如适用,您会看到 **复数化** 选项卡。 否则,只有 **信息** 选项卡可用。 ### 填写复数形式 [#fill-in-the-plural-forms] 1. 首先翻译 **其他** 形式,因为这是所有语言的必填项。如果您只填写 **其他** 形式并将其他形式留空,B2TRANSLATE 会自动使用 **其他** 形式的值填充其余形式。这样可确保您在完成所有形式的翻译时,译文仍能正常使用。 2. 对于需要多种形式的语言,请确保在保存前正确填写每个字段。虽然此步骤并非强制要求,但根据目标语言的要求,留空某些字段可能会导致翻译不完整。 填写复数形式 ### 保存更改 [#save-changes] **复数化** 面板中的所有修改都必须使用 **保存更改** 按钮手动保存。 系统不会在您输入时自动保存更改,因此您可以在提交译文前处理多种形式。 ## 最佳实践 [#best-practices] 处理复数形式时,请考虑以下事项: * **同时检查所有形式**:由于一个键的所有形式会同时显示,请利用此机会确保术语和风格保持一致。 * **使用上下文指引**:每种形式都包含标签和工具提示,用于说明应在何时使用该特定形式。 * **使用数字测试**:考虑您的翻译在不同数量下的显示方式(1 个项目、2 个项目、5 个项目、100 个项目)。 * **完成所有必填形式**:对于要求完整形式集合的语言,请确保填写所有形式。 * **验证其他形式**:始终为 **其他** 形式提供翻译,因为它是通用后备形式。 * **定期保存**:请记得使用 **保存更改** 按钮手动保存您的更改。 您可以将翻译复制到包含在同一项目类型中的另一个项目。 源项目中的翻译会被分配到目标项目中的相同键。 您必须在目标项目中被分配 *Editor* 权限,并且在源项目中至少拥有 *Viewer* 权限。 如果目标项目中已存在翻译,它们将被**覆盖**。 要复制翻译: 在 **Projects** 页面上,点击要从中复制翻译的项目名称。 从表格上方的语言下拉菜单中,选择所需的语言。 勾选要复制的键对应的复选框。勾选顶部复选框可全选。 从表格上方显示的 **Bulk actions** 下拉菜单中,选择 **Send translations**。 发送翻译 在 **Send translations** 弹出窗口中,勾选一个或多个要将所选翻译复制到的项目。 仅显示包含所选语言且您被分配 *Editor* 权限的项目。 选择要导入键的目标项目 点击 **Send**。 B2TRANSLATE 提供与 ChatGPT 的集成,用于翻译键值。 此选项默认不提供,但可为单个项目申请开通。 请联系您的客户经理以申请访问权限。 除英语(默认语言)外,所有语言均可使用 AI 翻译。 您必须被授予 *Editor* 权限,才能使用 AI 添加和编辑翻译。 使用 AI 翻译: 在 **Projects** 页面上,点击项目名称。 在表格上方的语言下拉菜单中,选择所需语言。 仅显示该项目支持的语言。 确保 **Translate with AI** 按钮处于激活状态(以蓝色高亮显示),这表示当前项目已启用 AI 翻译。 否则,如果 **Translate with AI** 按钮未激活(显示为灰色),请向您的客户经理申请访问权限。 Translate with AI enabled 点击 **Translate with AI** 按钮。 如果 **Source** 翻译为空,则无法使用 AI 翻译。 **Source** 值将被翻译为您所选的语言,并添加到 **Custom translation** 字段中。 某些键支持在翻译中使用变量。 这些变量会在产品运行期间替换为计算得出的实际值。 如果某个键支持变量,这些变量会显示在 **Custom translation** 字段下方。 点击变量即可将其包含在翻译中。 每个变量只能包含一次。 或者,也可以省略变量,以使用不那么详细的消息。 ## 示例 [#example] 下图中的键支持变量。 当消息显示在 WebUI 中时,变量会被替换为实际链接。 翻译变量 您可以为在 MT4/5 上交易的客户配置返现奖励计划。 返现根据 MT 账户在一天内交易的交易量进行奖励,以平仓头寸为准,并于次日存入客户账户。例如,5 月 24 日交易的交易量返现将于 5 月 25 日奖励给客户。 通过 **MetaTrader 交易量** 菜单,您可以访问 **MetaTrader 4** 和 **MetaTrader 5** 页面,为各个平台配置返现计划。 每个页面分为两个标签页: * [偏好设置选项卡](preferences-tab) * [层级选项卡](tiers-tab) 在此选项卡中,您可以配置 MT4 或 MT5 返现奖励计划的以下设置: **已启用** 如果为**已启用**,则该返现计划已为 MT4 或 MT5 平台启用;否则为**已禁用**。 *** **返现金额(每手)** 每个交易手数的固定费率。返现金额可以表示为整数或小数值。 返现金额按以下方式计算: `Cashback amount = Cashback value * Number of traded lots` *** **返现货币** 返现计划货币。 返现仅针对以返现计划货币计价的 MT 账户中交易的交易量进行计算。此外,这也是向客户支付返现所使用的货币。 要获得已赚取的返现,客户必须拥有以返现计划货币计价的 `trade` 或 `personal` 类型账户。 例如,返现费率为 0.7,返现计划货币为 USD。对于在以 USD 计价的 MT 账户上交易的 10 手交易量,返现计算如下: `0.7 * 10 = 7` MT 账户所有者将获得 7 USD 的返现奖励。 *** **账户目标类型** 返现奖励到账的账户类型: * **交易** — 返现奖励到客户的 MT 交易账户,该账户已交易用于返现计算的交易量。 * **个人** — 返现奖励到客户的 `personal` 类型账户,例如以返现计划货币计价的钱包。 如果选择**个人**账户类型,请确保您的客户拥有所需货币的个人类型账户;否则,已赚取的返现将无法存入其账户。 默认情况下,选择**交易**账户类型。 *** **忽略的交易品种组** 忽略的交易品种列表。 在所选交易品种中进行的交易将不计入返现计算。 *** **账户平台组允许范围** MT 账户组列表。 默认情况下,MT 平台上配置的所有账户组均会被选中。 如果**账户号码允许范围**字段为空,则**账户平台组允许范围**字段中所选组包含的所有 MT 交易账户均可获得返现奖励。 *** **账户号码允许范围** 以逗号分隔的 MT 账户号码列表。 默认情况下,该列表为空。 如果此字段中列出一个或多个 MT 账户号码,则只有列出的账户可获得返现奖励,且会忽略**账户平台组允许范围**选项。 *** **已更新** 返现计划最后修改的日期。 **另请参阅** [如何为 MT4 和 MT5 配置返现计划](../../../how-to-articles/manage-cashback-options/how-to-configure-cashback-programs-for-mt4-and-mt5) 在此选项卡中,您可以管理用于确定已在一天内交易特定交易量的客户返现比例提升的层级。 查看有关每个返现奖励层级的以下信息: **名称** 层级名称。 *** **交易量,手数** 为获得提升后的返现而必须交易的交易量(以手数计)。 *** **返现金额** 如果 MT 账户在一天内的交易量已达到所需的层级交易量,则使用提升后的返现比例,而非 **偏好设置** 选项卡中指定的比例。 *** **创建时间** 创建该层级的日期和时间。 *** **更新时间** 上次修改该层级的日期和时间。 **另请参阅** [如何添加返现奖励层级](../../../how-to-articles/manage-cashback-options/how-to-configure-cashback-programs-for-mt4-and-mt5#how-to-add-cashback-reward-tiers) 在此选项卡中,您可以查看客户的[账户](../accounts)列表。要查看特定账户的详细信息,请点击相应行中的 **编辑** 按钮。 在此选项卡中,您可以查看客户在注册期间提供的附加信息。 此选项卡上显示的字段取决于[注册向导配置](../../system/wizards#registration-wizard) 此选项卡默认可见。在这里,您可以查找有关特定客户的信息,并查看客户资料详细信息,例如资料状态和验证等级。 灰显字段已被禁用,无法编辑(其中大多数为系统字段,会自动填充)。 自定义以下字段时请谨慎,因为这可能会影响客户的权限: * **邮箱** — 此字段默认被禁用。客户使用此邮箱地址登录系统。 要启用客户邮箱编辑功能,请点击 **编辑** 按钮。 要查看为客户指定的先前邮箱地址,请切换到[历史记录选项卡](history-tab),并选择 **邮箱变更历史记录** 选项。 * **出生日期** — 此字段默认被禁用。 要启用客户出生日期编辑功能,请点击 **编辑** 按钮。 用户必须年满 18 岁才能使用系统。 * **状态** — 客户资料的当前[状态](../../references/client-statuses)。 * **客户类型** — 客户资料的[类型](../types)。 * **经理** — 客户的[经理](../managers)。客户获准执行的活动范围可能因客户所属部门及其分配的经理而异。 * **验证等级** — 客户获得的[验证等级](../../verification/levels)。此等级决定客户获准执行的活动范围。 * **客户权限** — 分配给客户的[客户权限](../../system/client-rights),用于确定客户可在 B2CORE UI 中执行的操作。 * **客户标签** — 分配给客户的标签,用于对显示给[后台管理员](../../system/users/)的客户列表进行排序。这些标签不会影响客户权限。 * **风险等级** — 分配给客户的风险等级,可能决定该客户获准执行的活动范围。 在此选项卡中,您还可以通过点击图片框中的 **编辑** 按钮并选择所需图片,为客户资料添加图片。添加的图片将显示在 B2CORE UI 中的客户资料内。 在此选项卡中,您可以查看、添加和编辑与特定客户相关的文本备注或评论。 这些评论仅显示在 Back Office 中。添加这些评论时,您的客户不会收到任何通知。 每条内部评论会显示以下信息: **评论** 关于客户的内部评论文本。 *** **日期** 添加评论的日期和时间。 *** **创建者** 添加评论的管理员。 *** **最后编辑者** 最后编辑评论的管理员。 在此标签页中,您可以查看客户的地址和电话号码列表,还可以通过点击 **+Add** 按钮添加所需的联系信息。 ## 地址 [#addresses] 本节提供以下信息: **地址类型** 地址的类型: * **住宅地址** — 客户的主要居住地址。 * **账单地址** — 与账单或发票关联的地址。 * **邮寄地址** — 用于接收信件的地址。 * **出生地** — 客户出生的地点。 * **法定地址** — 用于法律用途的正式地址。 *** 地址详细信息,例如 **国家**、**城市**、**州/省**、**邮政编码**和街道地址。 ## 电话 [#phones] 本节提供以下信息: **电话** 客户在注册时提供的电话号码(如果您的注册流程要求提供电话号码),或由后台用户添加的电话号码。 *** **已确认** * **是** — 表示该电话号码是客户通过短信最后确认的电话号码。 例如,如果提供了两个电话号码且客户确认了第一个号码,则该号码会被标记为已确认。如果客户之后确认了第二个号码,则第二个号码会变为已确认,而第一个号码会被标记为未确认。 * **否** — 表示该电话号码未确认。 *** **默认** 此字段已弃用,不再使用。 *** phone-button — **电话**图标 可从后台拨打指定客户的电话号码。 要使用此选项,必须配置电话服务提供商(例如 Twilio)(详情请参阅 [如何配置 Twilio](../../../how-to-articles/manage-communication-platforms/how-to-configure-twilio))。 *** delete_button — **垃圾桶**图标 如果您被授予 `Update clients` 权限,则可以使用此选项。该权限包括在 **联系人** 标签页中编辑客户信息的功能。点击该图标后,您可以删除任何已添加的电话号码,包括已确认的电话号码。 删除已确认的电话号码后,客户可以添加并确认新的电话号码以关联到其个人资料。 电话号码被删除后,即可用于注册新的客户资料,前提是您的注册流程要求[电话号码必须唯一](../../system/settings#client-settings)。 在此选项卡中,您可以查看和编辑为客户指定的[自定义字段](../../system/custom-fields)值。 这些字段按照系统中配置的[自定义字段组](../../system/custom-fields#groups)进行组织。选择一个组以查看和编辑其中包含的字段。 可用字段和组的集合取决于在 **System** > **Custom Fields** 中配置的自定义字段。 在此选项卡中,您可以查看客户登录 B2CORE UI 所使用的设备列表。 此列表显示客户 IP 地址、最后登录的日期和时间、设备操作系统、客户浏览器以及设备指纹数据(包括画布代码图片),其中包含有关客户登录 B2CORE UI 所使用设备的详细信息。 在此选项卡中,您可以查看客户提交用于[验证](../../verification/)的文档列表。 **ID** Back Office 中的文档标识符。 *** **类型** [文档类型](../../verification/document-types)。 *** **状态** 文档审批的[客户请求当前状态](../../references/client-request-statuses)。 *** **请求 ID** 客户文档审批请求的标识符。 *** **上传者** 指示由谁上传了文档。 *** **上传时间** 文档上传的日期和时间。 **另请参阅** [如何使用 KYC 构造器](../../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor) 在此选项卡中,您可以查看和管理与特定客户相关的文件。 默认情况下,此选项卡中的文件夹树会反映[系统客户文件夹](../../system/client-folders)的结构。作为一种更高级的文件存储方式,您可以创建并管理自定义文件夹,但需注意以下事项: * 文件夹树可以具有任意嵌套深度。 * 无法在此选项卡中删除预定义文件夹。 * 您只能查看已被授予访问权限的预定义系统文件夹。 如果系统文件夹的名称与某个客户的自定义文件夹名称相同,系统会在自定义文件夹名称后添加 `_Custom` 后缀,并在同一嵌套级别创建系统文件夹。 使用以下按钮执行特定操作: **全部下载** 选择一种方法来导出包含与特定客户相关文件的 ZIP 压缩包(您可以将压缩包发送至您的电子邮箱地址,或下载到您的计算机)。 要导出所有文件,请点击 **全部下载**。 要导出特定文件,请按住 **Command**(在 macOS 上)或 **Ctrl**(在 Windows 上),使用鼠标光标选择所需文件,然后点击 **全部下载**。 *** **添加文件** 从您的计算机或云端将客户文件上传到 Back Office。 *** **上传多个文件** 一次上传多个客户文件。 *** **添加目录** 创建新文件夹。 *** **编辑** 重命名文件或将其移动到其他文件夹。文件只能在与特定客户相关的文件夹之间移动。 *** **删除** 删除选定的文件或文件夹。 *** **取消** 放弃未保存的更改。 *** **保存** 应用更改。 **另请参阅** [如何上传文件](../../../how-to-articles/manage-clients/how-to-upload-files-to-a-client-profile) 在此选项卡中,您可以查看客户的入金和出金钱包列表,以及已保存的出金模板列表。 选择钱包类型以查看详细信息: ## 出金钱包 [#withdrawal-wallets] 在此页面中,您可以查看客户用于出金的钱包列表。 **方式** 用于出金的[方式](../../system/payout-system#payout-methods)。 *** **币种** 钱包币种。 *** **地址** 公开钱包地址。 *** **Destination tag** 仅适用于某些币种(XRP、XLM、BNB 和 XEM)。 ## 已保存的出金 [#saved-withdrawals] 在此页面中,您可以查看已保存的出金模板列表。客户可以在出金时创建此类模板,以避免在后续类似出金中重复填写相同信息。 **名称** [支付系统](../../../integrations/payment-systems)的名称。 *** **保存时间** 保存出金模板的日期和时间。 点击**眼睛**图标后,您将跳转至显示所选出金模板详细信息的页面。 出金模板数据以 JSON 格式存储。 ## 入金钱包 [#deposit-wallets] 在此页面中,您可以查看为客户生成的加密货币钱包列表。 **方式** 用于入金的[方式](../../system/deposit-system#deposit-methods)。 *** **币种** 为钱包启用的币种。 *** **地址** 公开钱包地址。 *** **Destination tag** 仅适用于某些币种(XRP、XLM、BNB 和 XEM)。 在此标签中,您可以查看客户密码、电子邮件地址、验证级别和 2FA 选项的变更历史记录。 选择以下选项之一以查看详细信息: ## 密码变更历史记录 [#passwords-change-history] 在此页面中,您可以查看此前已更改的客户密码的详细信息: **日期** 密码更改的日期和时间。 *** **类型** 导致密码更改的操作类型: * **已恢复** — 密码由客户更新。 * **由管理员更改** — 客户密码由管理员更新。 *** **更改者** 更改密码的人员的电子邮件地址。 **另请参阅** [如何更改客户密码](../../../how-to-articles/manage-clients/how-to-change-a-client-password) ## 测试结果 [#test-results] 在此页面中,您可以查看客户在 B2CORE UI 中通过的[认证测试](../../verification/client-tests)列表及其结果。 ## 授权历史记录 [#authorization-history] 在此页面中,您可以查看 B2CORE UI 中的客户会话日志。 **授权日期** 客户登录 B2CORE UI 的日期和时间。 *** **授权 IP** 客户登录 B2CORE UI 所使用的 IP 地址。 *** **授权位置** 客户登录 B2CORE UI 的位置(国家和城市),该位置根据客户 IP 地址确定。 *** **状态** 登录尝试的结果:`success` 或 `failed`。 ## 电子邮件变更历史记录 [#email-change-history] 在此标签中,您可以查看客户电子邮件地址的变更日志。 **原始电子邮件** 客户之前的电子邮件地址。 *** **更改为** 客户当前用于登录 B2CORE UI 的电子邮件地址。 *** **更改日期** 电子邮件地址更改的日期。 *** **更改者** 更改客户电子邮件的人员的电子邮件地址。 如果是首次指定电子邮件地址,则 **原始电子邮件** 和 **更改者** 列为空。 ## 2FA 历史记录视图 [#2fa-history-view] 显示为客户启用或禁用 2FA 时间的日志包含以下数据: **日期** 为客户启用或禁用 2FA 的日期和时间。 *** **已启用** 表示 2FA 是启用还是禁用的操作类型。 *** **提供商** 2FA 服务提供商。 **另请参阅** [如何为客户禁用双重身份验证](../../../how-to-articles/manage-clients/how-to-disable-2fa-for-a-client) ## 验证变更历史记录 [#verification-change-history] 在此页面中,您可以查看客户获得的每个[验证级别](../../verification/levels)的详细信息。 此信息包括之前和新获得级别的名称、获得每个验证级别的日期和时间、向客户授予该级别的人员姓名,以及授予该级别的原因。 **另请参阅** [如何使用 KYC 构造器](../../../how-to-articles/manage-verification-options/how-to-use-the-kyc-constructor) 在此页面上,您可以找到所有通过 B2CORE UI 或后台办公室注册的客户列表。 ## 常规信息 [#general-information] 系统会提供有关每位客户的以下信息: **ID** 客户在系统中的标识符。 *** **姓名** 客户的姓名。 *** **创建时间** 创建客户资料的日期和时间。 *** **状态** B2CORE UI 中客户资料的当前[状态](../../references/client-statuses)。 *** **电子邮箱** 客户用于登录 B2CORE UI 的电子邮件地址。 *** **昵称** 客户的昵称。 *** **标签** 分配给客户的标签,用于对显示给[后台办公室管理员](../../system/users/users)的客户列表进行排序。 *** **经理** 客户的[经理](../managers)。 *** **电话** 客户的电话号码。 *** **国家/地区** 客户的[国家/地区](../../system/countries)(如果客户在注册或 KYC 验证过程中指定)。 *** **司法管辖区** 客户所属的[司法管辖区](../jurisdictions),可在注册时自动分配或手动分配。 *** **城市** 客户所在的城市。 *** **类型** 客户的[资料类型](../types)。 *** **内部客户类型** 仅供内部使用。内部客户资料类别。 *** **验证级别** 客户获得的[验证级别](../../verification/levels)。 *** **公司简称** 客户公司的简称。 *** **公司全称** 客户公司的全称。 *** **风险级别** 分配给客户的风险级别,该级别可能决定客户被允许执行的活动范围。 *** **上次登录** 客户上次登录 B2CORE UI 的日期和时间。 要为多个客户分配标签或一次性更改其资料状态,请点击 **选择** 按钮,然后通过点击客户行选择客户,或点击 **全选**。接下来,展开 **编辑所选客户** 下拉菜单,然后选择 **分配标签** 或 **选择状态**。 *** **通信语言** 客户的首选语言,该语言也决定 B2CORE UI 中使用的本地化设置。 默认情况下,该列处于隐藏状态,但可以使用 **列可见性** 选项将其添加到表格中。 要查看客户详细信息,请点击 **编辑** 按钮并切换到显示所需信息的选项卡。 *** **UTM 元数据** 附加到 URL 的跟踪信息,用于识别客户来源,使您能够跟踪哪些营销活动或渠道将客户带到 B2CORE,并分析转化效果。 默认情况下,该列处于隐藏状态,但可以使用 **列可见性** 选项将其添加到表格中。 ## 详细信息 [#details] 要访问显示附加信息的选项卡,请点击位于页面右上角的 下拉菜单按钮(菜单按钮),然后展开显示可用选项的下拉菜单。 可用选项卡将在本文档的后续部分中说明。 **另请参阅** [如何注册新客户](../../../how-to-articles/manage-clients/how-to-register-a-new-client) [如何为客户分配标签](../../../how-to-articles/manage-clients/how-to-assign-tags-to-clients) 在此选项卡中,您可以查看客户已加入的推荐计划信息。 **介绍经纪商 ID** 客户加入特定推荐计划后被分配的标识符。 *** **类型** 推荐计划的名称。要查看计划详情,请点击其名称。 在此选项卡中,您可以查看发送至客户邮箱的消息列表,并将这些数据导出为 CSV 或 XLSX 文件。 **ID** 电子邮件标识符。 *** **活动队列 ID** 包含该电子邮件的队列标识符。 *** **电子邮件** 客户的电子邮件地址。 *** **主题** 电子邮件主题。 *** **尝试日期** 最近一次尝试发送电子邮件的日期和时间。 *** **状态** 电子邮件投递状态:`IN PROGRESS`、`FAIL` 或 `SUCCESS`。 *** **原因** 电子邮件投递失败的原因。 若要将电子邮件数据导出为 CSV 或 XLSX 文件,请点击屏幕右上角的 **导出** 按钮。您可以将文件下载到计算机,或将其发送至您个人资料中指定的电子邮件地址。 若要查看发送给所有客户的完整电子邮件列表,请通过依次导航至 **邮件发送** > **系统** > **日志**,切换到[邮件发送日志](../../mailing/system#log)。 在此标签页中,您可以查看和管理为客户收集的营销属性,例如通信同意、通信语言、电子邮件地址和首次入金金额。 每个属性提供以下信息: **字段** 属性名称及其在系统中的标识符。 *** **值** 属性值。 *** **创建时间** 创建该属性的日期和时间。 *** **更新时间** 该属性最后更新的日期和时间。 要添加新属性,请点击 **添加** 按钮。完成更改后,点击 **保存** 以应用更改。 在此选项卡中,您可以配置各种客户资料设置,这些设置归类在以下部分中: ## 设置 [#settings] 在此部分中,您可以选择通信语言并设置应用于客户请求的颜色: **通信语言** 与客户进行通信时使用的语言。有关支持语言的列表,请参阅[本地化](../../system/localizations)。 *** **请求颜色** 用于突出显示[请求](../requests)部分中显示的客户请求的颜色。 您可以点击灰色输入字段并从调色板中选择颜色。或者,您可以指定颜色名称,或定义其 HEX 或 RGBA 值。 ## 2FA [#2fa] 在此部分中,您可以了解为客户配置的 2FA(双重身份验证)选项: * **SMS** — 如果为 `enabled`,客户将通过短信接收 2FA 验证码 * **Google** — 如果为 `enabled`,客户将通过 Google Authenticator 应用接收 2FA 验证码 ## 权限 [#rights] 在此部分中,您可以覆盖根据已获得的[验证级别](../../verification/levels)授予客户的[权限](../../system/client-rights)。这些权限决定客户可以在 B2CORE UI 中执行哪些类型的操作。 **验证** 如果选中,客户可以在 B2CORE UI 中获得更高的[验证级别](../../verification/levels)。 *** **兑换** 如果选中,客户可以在 B2CORE UI 中兑换资金。 *** **入金** 如果选中,客户可以在 B2CORE UI 中存入资金。 *** **出金** 如果选中,客户可以在 B2CORE UI 中提取资金。 *** **内部转账** 如果选中,可以在同一 B2CORE 系统内将资金从一个客户转移到另一个客户。 *** **使用显式设置覆盖** 为客户启用或禁用特定权限后,选择此选项,然后点击**保存**以应用更改。与客户当前验证级别不对应的权限会标记为 `*`。 ## 选项 [#options] 在**账户限制(覆盖产品最大账户数)**部分中,您可以使用**最大模拟交易账户数**和**最大真实交易账户数**字段限制客户可用的模拟和真实交易账户的最大数量。 对于任何支持创建模拟账户的交易平台,都可以限制模拟账户的数量。 在此选项卡中指定的值会覆盖[产品](../../products/products)部分中定义的默认系统限制。 在此标签页中,您可以查看客户在 **B2TRADER** 上执行的交易历史记录。 **订单 ID** 分配给 B2TRADER 上订单的标识符。 *** **交易工具** 货币对。 *** **方向** 交易方向:`Buy` 或 `Sell`。 *** **数量** 交易数量,以计价货币计。 *** **价格** 交易执行价格。 *** **价值** 交易金额,以基础货币计。 *** **手续费** 交易收取的佣金。 *** **手续费产品** 佣金币种。 *** **日期** 交易执行的日期和时间。 在此标签页中,您可以查看有关客户交易的详细信息。 选择交易类型以查看详细信息: **入金** 客户的[入金](../../finance/deposits)列表。 *** **出金** 客户的[出金](../../finance/payouts)列表。 *** **转账** 客户的[转账](../../finance/transfers)列表。 *** **兑换** 客户的[兑换](../../finance/exchange)列表。 *** **余额变更操作** 因管理员在 Back Office 中执行操作而导致的客户余额变更历史,其中包括以下信息: * **日期** — 客户余额发生变更的日期和时间 * **账户** — 用户账户号码 * **金额** — 交易金额 * **入金/出金** — 交易类型 * **管理员用户** — 执行该交易的管理员 Back Office 管理员对客户余额所做的变更不会显示在[入金](../../finance/deposits)和[出金](../../finance/payouts)页面中。 在此页面中,您可以查看和添加客户标签。为客户分配标签后,您可以为 Back Office 用户(如管理员或经理)筛选客户列表,使其只能看到具有特定标签的客户,而其他客户将保持隐藏。 使用 [jurisdictions](../../clients/jurisdictions) 时,可以手动为客户分配标签,也可以在客户注册后自动分配标签。 以下是每个客户标签的相关信息: **ID** 客户标签的标识符。 *** **Caption** 客户标签的名称。 要更新客户标签,请点击标签行中的 **Edit** 按钮,然后为该标签指定新名称。 **另请参阅** [如何为客户分配标签](../../../how-to-articles/manage-clients/how-to-assign-tags-to-clients) [如何创建司法管辖区](../../../how-to-articles/manage-clients/how-to-create-a-jurisdiction) [如何让管理员用户仅查看特定客户](../../../how-to-articles/manage-system-settings/how-to-make-an-admin-user-see-only-specific-clients) 在此页面上,您可以查看 Back Office 中创建的所有用户群组列表并管理其权限。 ### 常规信息 [#general-information] 每个用户群组提供以下信息: **ID** 用户群组的标识符。 *** **群组** 群组名称。 **Administrators** 群组无法删除,且其权限无法修改。 此群组中的用户将被授予所有可用权限。 要将 Back Office 用户群组的数据(包括授予每个群组的权限数据)导出到 JSON 文件,请点击页面右上角的 **导出** 按钮。 要导入 Back Office 用户群组的数据,请点击 **导入** 按钮,然后选择包含所需数据的 JSON 文件。 要查看群组详细信息,请点击 **编辑** 按钮。 ### 详细信息 [#details] 详细信息页面包含以下选项卡: * **群组** — 授予此群组中用户的权限列表。 * **用户** — 此群组中包含的用户列表。 **另请参阅** [如何添加用户组并授予权限](../../../how-to-articles/manage-system-settings/how-to-add-a-user-group-and-grant-permissions) [如何导入与 Back Office 用户组相关的数据](../../../how-to-articles/manage-system-settings/how-to-import-data-related-to-back-office-user-groups) 在此页面中,您可以查看已注册 Back Office 用户(如管理员或经理)的列表,修改其个人资料设置,以及添加新用户。 ### 常规信息 [#general-information] 每个用户均提供以下信息: **ID** 用户标识符。 *** **名称** 用户的姓名。 *** **电子邮件** 用于登录 Back Office 的用户电子邮件地址。 *** **允许的客户标签** 用于对向用户显示的客户列表进行排序的客户标签。 *** **状态** 用户个人资料的状态:`Enabled` 或 `Disabled`。 个人资料被禁用的用户无法登录 Back Office。 *** **双重身份验证** 2FA 的状态: * `Disabled` — 2FA 已禁用。 * `Email` — 已启用使用电子邮件验证码的 2FA。 * `TOTP` — 已启用使用基于时间的一次性密码 (TOTP) 的 2FA,例如通过 Google Authenticator 应用程序。 用户可以通过点击顶部栏中显示其电子邮件地址的个人资料按钮,并在下拉菜单中选择 **启用 2FA**,为其个人资料启用 TOTP 2FA。在弹出窗口中确认操作后,他们应按照显示的说明使用 Google Authenticator 设置 2FA。 *** **IP 白名单** 为用户指定的[允许的 IP 地址](../../security/white-lists)列表。 *** **组** 用户所属的[组](groups)列表。 组定义了分配给用户的权限。 *** **创建者** 创建用户个人资料的用户标识符。 点击该标识符可跳转至用户详情页面。 *** **创建时间** 创建用户个人资料的日期和时间。 要查看用户详情,请点击 **编辑** 按钮。 ### 详情 [#details] 每个用户均提供以下附加信息: **电话** 用户的电话号码。 *** **密码** 用于登录 Back Office 的已掩码密码。 *** **Telegram 聊天 ID** 用于接收事件通知的 Telegram 聊天、群组或频道的标识符(详情请参阅[如何获取 Telegram 聊天、群组和频道标识符](../../../how-to-articles/manage-communication-platforms/how-to-get-telegram-chat-group-and-channel-identifiers))。 *** **Slack 聊天 ID** 用于接收事件通知的 Slack 频道标识符。 *** **事件通知** 用户会收到通知的事件列表。 您可以向此列表添加事件或从中移除事件。 该列表包含在[系统 > 事件通知](../event-notifications)页面上配置的事件通知。 *** **发送至电子邮件** 启用此选项可将凭据发送至指定的用户电子邮件地址。 *** **掩码数据** 启用此选项可防止用户在 Back Office 中查看客户个人数据。 启用后,客户姓名、电子邮件地址和电话号码等数据会以星号(`*`)形式向用户隐藏。 *** 要向用户个人资料添加图片,请点击图片框中的 **编辑** 按钮并选择图片。 * 支持的格式:PNG、JPG 和 JPEG * 文件大小:最大 3 MB Back Office 用户只能为自己的个人资料上传图片。 上传的图片会作为图标添加至顶部栏中显示的用户电子邮件地址。 *** 要管理用户的 2FA 选项,请点击页面右上角的 **操作** 按钮,然后选择以下选项之一: * **将 2FA 重置为电子邮件** — 为用户启用使用电子邮件验证码的 2FA。 * **禁用 2FA** — 为用户禁用当前正在使用的任何 2FA 方法。 *** ### 筛选字段 [#fields-for-filtering] **国家/地区** * 如果启用了 **除以下之外的全部** 选项,并且在下方字段中指定了一个或多个国家/地区,则用户可以查看除下方字段中指定的国家/地区外的所有国家/地区的客户列表。 * 如果禁用了 **除以下之外的全部** 选项,并且在下方字段中指定了一个或多个国家/地区,则用户只能查看下方字段中指定的国家/地区的客户列表。 **另请参阅** [如何添加管理员用户](../../../how-to-articles/manage-system-settings/how-to-add-an-admin-user) 在此子章节中,您可以管理 HTML 电子邮件模板,这些模板用于就特定事件类型通知客户和 [Back Office 用户](../users/)。 ## 模板类型 [#template-types] 在此页面上,您可以管理可通过电子邮件通知客户和 Back Office 用户的事件类型。 ### 常规信息 [#general-information] 以下是每种事件类型的相关信息: **名称** 事件类型名称。 *** **标题** 事件类型描述。 *** **已启用** 如果为 **是**,则该事件类型已启用,可触发事件通知;否则为 **否**。 要查看模板类型详情,请点击 **编辑** 按钮。 ### 详情 [#details] 在详情页面上,您可以编辑 **名称** 和 **标题** 字段,也可以启用或禁用模板类型。 此外,您可以将与所选模板类型相关的 HTML 模板恢复为默认配置。为此,请点击页面右上角显示的 **操作** 按钮,然后在下拉菜单中选择 **重置模板**。之后,[模板](email#templates) 页面中列出的 HTML 电子邮件模板将恢复为默认值。 ## 模板 [#templates] 在此页面上,您可以管理 HTML 电子邮件模板,这些模板用于向客户和 Back Office 用户发送已发生事件的通知。 ### 常规信息 [#general-information-1] 以下是每个模板的相关信息: **类型** [电子邮件模板类型](../../references/email-template-types)。 *** **区域设置** 电子邮件模板的语言。 *** **主题** 电子邮件模板的主题。 *** **已启用** 如果为 **是**,则该电子邮件模板已启用,可用于发送通知;否则为 **否**。 要查看模板详情,请点击 **编辑** 按钮。 ### 详情 [#details-1] 在 **模板** 窗口中,您可以查看或编辑模板的 HTML 代码。 可以在电子邮件模板中插入 [键值存储](../key-storage) 中定义的参数,例如文本颜色或公司名称。当向客户或 Back Office 用户发送电子邮件通知时,这些参数将被替换为存储中为其指定的值。 要渲染 HTML 代码并查看模板在电子邮件中的显示效果,请点击 **预览** 按钮。 如果模板已启用,则只有在成功渲染并显示在预览区域后才能保存。 ### 示例 [#example] 以下是电子邮件模板 HTML 代码的示例: ```html         ``` ## 模板 [#templates] 在此页面上,您可以管理用于通过 Slack 向[后台用户](../users/)发送[事件通知](../event-notifications)的模板。 对于 Slack,以下[事件类型](../../references/event-types-for-triggering-event-notifications-for-back-office-users)支持使用模板: * `PayoutRequestInitialized` * `TestPassing` ### 常规信息 [#general-information] 每个模板均提供以下信息: **名称** 模板名称。 *** **标题** 模板描述。 *** **已启用** 如果为**是**,则模板已启用并可用于事件通知;否则为**否**。 要查看模板详细信息,请点击**编辑**按钮。 ### 详细信息 [#details] 在**模板**字段中,您可以查看或小幅编辑模板文本。 ### 支持的 Slack 模板 [#supported-slack-templates] 使用下方提供的 Slack 模板来接收有关支持的事件类型的通知。这些模板包含一些键,当事件发生并向收件人发送通知时,这些键会被替换为相应的值。 #### **PayoutRequestInitialized** [#payoutrequestinitialized] 用于通知客户创建出金请求的模板: ``` Project: {frontUrl}|{companyName} Type: Payout Payout number: {urlMetaDetails}|{metaId} Client Email: mailto:{clientEmail}|{clientEmail} Task: check and approve the {urlRequestDetails}|withdrawal ``` #### **TestPassing** [#testpassing] 用于通知客户完成认证测试的模板。 ``` Project: {frontUrl}|{companyName} Test: testName Request number: {urlRequestDetails}|{applicationId} Client Email: mailto:{clientEmail}|{clientEmail} ``` 在此子部分中,您可以管理用于短信通知的模板。 ## 通用模板 [#general-templates] 在此页面上,您可以管理用于通过短信向[后台用户](../users/)发送[事件通知](../event-notifications)的模板。 ### 常规信息 [#general-information] 每个模板提供以下信息: **名称** 模板名称。 *** **标题** 模板描述。 *** **已启用** 如果为**是**,则模板已启用,可用于事件通知;否则为**否**。 要查看模板详情,请点击**编辑**按钮。 ### 详情 [#details] 在**模板**窗口中,您可以查看或编辑模板文本。 ### 示例 [#example] 以下是客户创建的出金请求短信通知模板示例: ``` Project: {companyName} Type: Payout Payout number: {metaId} Client Email: {clientEmail} ``` ## 确认模板 [#confirmation-templates] 在此页面上,您可以管理用于通过短信向启用了 2FA(双重身份验证)的客户发送验证码的模板。 ### 常规信息 [#general-information-1] 每个模板提供以下信息: **名称** 模板名称。 名称为**default**的模板无法禁用、删除或重命名。 *** **标题** 模板描述。 *** **已启用** 如果为**是**,则模板用于通过短信向客户发送验证码;否则为**否**。 要查看模板详情,请点击**编辑**按钮。 ### 详情 [#details-1] 在**模板**窗口中,您可以查看或编辑模板文本。 ### 示例 [#example-1] 以下是通过短信发送验证码的模板示例: ``` Your verification code is %CODE%. ``` ## 模板 [#templates] 在此页面上,您可以管理用于通过 Telegram 向 [Back Office 用户](../users/)发送[事件通知](../event-notifications)的模板。 对于 Telegram,以下[事件类型](../../references/event-types-for-triggering-event-notifications-for-back-office-users)支持使用模板: * `PayoutRequestInitialized` * `TestPassing` ### 基本信息 [#general-information] 每个模板均提供以下信息: **名称** 模板名称。 *** **标题** 模板描述。 *** **已启用** 如果为**是**,则模板已启用,可用于事件通知;否则为**否**。 要查看模板详情,请点击**编辑**按钮。 ### 详情 [#details] 在**模板**字段中,您可以查看或稍微编辑模板文本。 ### 支持的 Telegram 模板 [#supported-telegram-templates] 请使用以下提供的 Telegram 模板,以便接收有关支持的事件类型的通知。这些模板包含一些键,在事件发生并向收件人发送通知时,这些键会被替换为相关值。 #### **PayoutRequestInitialized** [#payoutrequestinitialized] 用于通知客户创建出金请求的模板: ``` Project: {frontUrl}|{companyName} Type: Payout Payout number: {urlMetaDetails}|{metaId} Client Email: mailto:{clientEmail}|{clientEmail} Task: check and approve the {urlRequestDetails}|withdrawal ``` #### **TestPassing** [#testpassing] 用于通知客户完成认证测试的模板。 ``` Project: {frontUrl}|{companyName} Test: testName Request number: {urlRequestDetails}|{applicationId} Client Email: mailto:{clientEmail}|{clientEmail} ``` 要配置固定利率储蓄计划的设置,请在 **固定预设详情** 部分指定以下设置: * **计划时长(天)** — 选择投资于储蓄计划的金额必须持有的期限(以天为单位)。 计划时长可按 30 天的间隔指定,例如 30、60、90 等。 在计划时长结束时,客户为该计划投入的投资金额将退还至客户钱包。 * **付款周期(天)** — 选择一个期限(以天为单位),用于指示利息付款频率。 付款周期可按 30 天的间隔指定,例如 30、60、90 等,并且必须小于或等于计划时长。 * **投资金额** — 输入客户订阅储蓄计划时必须投入的金额。投资金额将从以计划币种计价的客户钱包中扣除。如果客户拥有多个以计划币种计价的钱包,客户可以选择要从中扣除投资金额的钱包。 投资金额可以指定为整数或小数值。 * **利率(百分比)** — 输入投资金额的百分比,该百分比用于计算每个付款周期结束时获得的利息(详情请参阅[利息计算示例 — 固定策略](configure-the-fixed-strategy-settings#interest-calculation-example--fixed-strategy)。) 利率可以指定为整数或小数值。 * **罚金类型** — 选择罚金的计算方式。如果客户在计划时长结束前提取其投资资金,将向客户收取罚金金额。 * **固定** — 扣除固定金额作为罚金。 * **百分比** — 扣除投资资金的一定百分比作为罚金。 * **取消罚金** — 按如下方式指定: * 对于 **固定** 罚金类型,指定向客户收取的确切罚金金额。该金额必须为整数或小数值,且必须低于投资金额。 * 对于 **百分比** 罚金类型,指定从投资金额中扣除作为罚金的百分比。 ## 利息计算示例 — 固定策略 [#interest-calculation-example--fixed-strategy] 此示例说明如何为订阅了采用 `Fixed` 策略的储蓄计划的客户计算利息。 假设储蓄计划配置了以下设置: * **投资金额** 为 1,500 USD * **利率(百分比)** 为 3% * **计划时长(天)** 为 180 天 * **付款周期(天)** 为 60 天 从客户订阅该计划之日起,第一个 60 天期间内累计并支付给客户的利息计算如下: `Earned interest = Investment amount * Interest rate / 100` `1,500 * 3 / 100 = 45 USD` 在计算后续期间的利息时,不会考虑已获得的 45 USD 利息。这意味着,在本示例中,每 60 天获得并支付一次相同的利息,即 45 USD,直至计划时长结束。 有关向订阅储蓄计划的客户支付利息的详细信息,可在[储蓄 > 计划](../../../back-office-guide/savings/plans)页面列出的付款计划中查看。 要配置具有灵活利率的储蓄计划设置,请在 **灵活预设详细信息** 部分指定以下设置: * **最低投资金额** — 输入初始投资的最低金额。低于指定金额的投资将不会被接受。 * **最低追加投资金额** — 输入客户可以追加到初始投资中的最低金额。客户无法追加低于此指定最低金额的金额。 最低投资金额和追加投资金额可以指定为整数或小数值。 * **罚金期限(天)** — 指定期限(以天为单位),在此期间客户无法无罚金地提取其投资资金。 * **罚金类型** — 选择罚金的计算方式。如果客户在罚金期限结束前提取其投资资金,则会向客户收取罚金金额。 * **固定金额** — 扣除固定金额作为罚金。 * **百分比** — 扣除总投资资金的一定百分比作为罚金。 * **赎回罚金** — 按如下方式指定: * 对于 **固定金额** 罚金类型,指定将向客户收取的确切罚金金额。该金额必须是整数或小数值,且必须低于最低投资金额。 * 对于 **百分比** 罚金类型,指定将从总投资资金中扣除作为罚金的百分比。 * **付款周期** — 表示利息付款频率,设置为 `The first day of each month`,且无法更改。 例如,如果客户在 5 月 31 日成功认购储蓄计划,首次利息付款将在次日(6 月 1 日)进行。 在 **分层** 部分,设置用于应用灵活利率的层级: * **层级起始金额** — 输入客户必须投资的最低金额,以获得分配给该层级的利率。该金额表示该层级的起点以及上一层级的终点。 存在一个 **层级起始金额** 值等于 0(零)的层级,且无法删除。 * **年利率** — 输入应用于该层级的年利率(百分比)(有关利息计算详细信息,请参阅[利息计算示例 — 灵活策略](configure-the-flexible-strategy-settings#interest-calculation-example--flexible-strategy)) 根据储蓄计划需要添加任意数量的层级。要添加新层级,请点击 **添加** 按钮。 ## 利息计算示例 — 灵活策略 [#interest-calculation-example--flexible-strategy] 本示例说明如何计算认购采用 `Flexible` 策略的储蓄计划的客户利息。 假设储蓄计划配置了以下设置: * 第 1 层:**层级起始金额** 为 0,且 **年利息 (%)** 为 10% * 第 2 层:**层级起始金额** 为 5,000,且 **年利息 (%)** 为 14.6% * **最低投资金额** 为 3,000 USD * **最低追加投资金额** 为 1,000 USD 如果客户在 5 月 30 日认购该计划并存入 3,650 USD,客户将获得 10% 的年利率。 在 5 月 30 日结束时,利息将被计提。计算方式如下: `Earned interest = Investment amount * (Interest rate / 100) / 365` `3,650 * (10 / 100) / 365 = 1 USD` 如果客户在 5 月 31 日追加 1,350 USD,使总投资额达到 5,000,则客户将获得 14.6% 的年利率。 在 5 月 31 日结束时,利息计提如下: `5,000 * (14.6 / 100) / 365 = 2 USD` 5 月 30 日和 5 月 31 日两天累计的总利息为 3 USD,将于 6 月 1 日支付到客户钱包。 有关向认购储蓄计划的客户支付利息的详细信息,可在[储蓄 > 计划](../../../back-office-guide/savings/plans)页面列出的付款计划中找到。 ## 修改采用灵活策略的储蓄计划的层级 [#modify-tiers-for-savings-programs-with-flexible-strategies] 在现有储蓄预设中,您可以修改用于应用灵活利率的层级。 要修改层级: 导航至 **储蓄** > **预设**。 选择预设并点击 **编辑** 按钮。 在 **分层** 部分,您可以: * 更改 **层级起始金额** 字段中的金额 * 调整应用于层级的利率 * 删除现有层级 * 添加新层级 要更新已基于所选预设创建的储蓄计划所应用的层级,请启用 **更新储蓄计划层级** 复选框。修改后的层级将用于所有现有储蓄计划的利息计算。 如果您希望修改后的层级仅应用于新的储蓄计划,请保持该复选框未选中。 点击 **保存** 以应用更改。 您可以创建采用 `Fixed` 和 `Flexible` 策略的储蓄计划,使您的客户能够将资金投资于这些计划并赚取利息。 要创建储蓄计划: 导航至 **Savings** > **Presets**。 点击页面右上角的 **+Create**,然后选择: * **Fixed preset** — 创建固定利率计划 * **Flexible preset** — 创建浮动利率计划 配置以下常规设置: * 在 **Currency** 下拉列表中,选择储蓄计划的币种。要订阅该计划,您的客户必须拥有以该计划币种计价的钱包。 * 在 **Name** 字段中,输入储蓄计划的唯一名称。该计划名称会显示在客户的 B2CORE UI 中。 * 在 **Description** 字段中,输入计划描述。该计划描述会显示在客户的 B2CORE UI 中。 * 将 **Status** 选项设为 **Active** 或 **Inactive**。 * 如果设为 **Active**,B2CORE UI 中将显示包含储蓄计划详情的卡片,客户可以订阅该计划。 * 如果设为 **Inactive**,B2CORE UI 中不会显示该储蓄计划的卡片。 * 在 **Admission fee** 字段中,输入客户订阅储蓄计划时必须支付的费用金额。准入费用将从以该计划币种计价的客户钱包中扣除。准入费用可以指定为整数或小数值。如果您不想收取准入费用,请输入 0(零)。 继续配置所选储蓄策略特有的设置: * [配置灵活策略设置](configure-the-flexible-strategy-settings) * [配置固定策略设置](configure-the-fixed-strategy-settings) 配置完成后,点击 **Save** 创建储蓄计划。 储蓄计划预设将显示在 **Savings Preset** 页面上。 如果预设被分配为 **Active** 状态,已创建储蓄计划的卡片将显示在客户的 B2CORE UI 中,客户可以订阅该计划。 ## 字段类型 [#field-types] 注册向导支持的字段类型包括: * **input** — 文本输入字段。 * **group** — 包含一个或多个不同类型字段或其他组的容器。 * **passwordButton** — 包含显示/隐藏按钮的密码输入字段,可用于切换已输入密码的可见性。 * **select** — 允许客户从预定义列表中选择单个选项的下拉列表。 * **multiSelect** — 允许客户从预定义列表中选择多个选项的下拉列表。 * **radio** — 呈现多个选项的单选选择器,允许客户从预定义列表中选择一个选项。 * **boolean** — 允许客户将其标记为 true 或 false 的复选框字段。 * **date** — 用于输入或选择日期的字段。 * **phone** — 用于按照预定义格式输入电话号码的字段。 ## 验证规则 [#validation-rules] 可分配给注册向导字段的数据验证规则包括: * `required` — 表示字段为必填项。 * `email:rfc,spoof,strict` — 验证电子邮件地址是否符合正确格式。 * `unique_active_email` — 确保电子邮件地址唯一,且尚未在您的系统中注册。 * `password_length` — 验证密码是否满足所需长度。 * `password_content` — 验证密码是否包含所需的字符和符号。 * `same:password` — 确保在 **确认密码** 字段中输入的密码与 **密码** 字段中的密码一致。 * `string` — 字符串。 * `min:1` — 要求输入的字符串至少包含一个字符。 * `max:30` — 将输入的字符串限制为最多 30 个字符。 * `info_name` — 验证输入的字符串是否包含允许的字符。 * `phone:AUTO` — 验证电话号码是否符合正确格式。 * `distinct` — 确保该电话号码唯一,且尚未被您系统中其他已注册客户确认。 * `date` — 验证输入或选择的值是否为日期。 * `age:18` — 确保用户年满 18 岁(除 `date` 规则外)。 * `requiredValue` — 验证所选值是否为 **True**。 * `countries_handbook` — 确保该值来自您系统中配置的国家列表。 * `client_addresses_handbook` — 确保该值来自您系统中已注册的地址类型列表。 * `nullable` — 允许字段接受空值。 * `array` — 值数组。 * `numeric` — 数值。 注册向导在基本信息步骤中只能接受和处理特定数据。 下表概述了此步骤支持的字段: * [电子邮箱、密码和确认密码字段](#email-password-and-password-confirmation-fields) * [名字、姓氏和生日字段](#first-name-last-name-and-birthday-fields) * [地址字段](#address-fields) * [电话字段](#phone-fields) * [同意和协议字段](#consent-and-agreement-fields) 对于每个字段,都会说明其是否可以独立使用,还是必须嵌套在特定组内。 字段名称必须与**名称**列中提供的名称完全一致。 将在 B2CORE UI 的**注册**页面上显示的字段标签可根据您的偏好进行修改。 此外,应分配给字段的特定数据验证规则列在**验证规则**列中。 有关所有可用字段类型以及可分配给字段的数据验证规则的说明,请参阅[字段类型](field-types-and-validation-rules#field-types)和[验证规则](field-types-and-validation-rules#validation-rules)。 ## 电子邮箱、密码和确认密码字段 [#email-password-and-password-confirmation-fields] 下表提供了用于输入电子邮箱、设置密码和确认密码的字段信息,包括字段类型、验证规则和用于正确配置的附加属性。 ## 名字、姓氏和生日字段 [#first-name-last-name-and-birthday-fields] 下表概述了用于输入名字、姓氏和出生日期的字段。 这些字段必须嵌套在名为 `info` 的 **group** 字段内。 ## 地址字段 [#address-fields] 下表概述了用于输入地址信息的字段。 这些字段必须嵌套在名为 `0` 的 **group** 字段内,而该字段又必须嵌套在名为 `addresses` 的 **group** 内。 ## 电话字段 [#phone-fields] 下表概述了用于输入电话号码的字段。 该字段必须嵌套在名为 `0` 的 **group** 字段内,而该字段又必须嵌套在名为 `phones` 的 **group** 内。 ## 同意和协议字段 [#consent-and-agreement-fields] 下表概述了客户同意所需的字段。这些字段对于获得客户必要的协议和同意至关重要。这些字段必须嵌套在名为 `requirements` 的 **group** 字段内。 **已弃用。** 注册向导已弃用。要设置客户注册流程,请改用新的注册设置和自定义字段 — 请参阅[如何迁移到新的注册设置](../how-to-migrate-to-new-registration-settings)。 如果您有移动应用程序,请保持现有的注册向导处于启用状态,直到您不再支持旧版本的应用程序,因为这些版本的最终用户依赖它们进行注册。 注册向导决定了 B2CORE UI 中新客户的注册流程,以及在注册期间提示客户提供的信息。 您可以添加多个注册向导,以配置不同的注册流程,例如面向个人和企业客户的流程。 要添加和配置注册向导: 导航至 **系统** > **向导**。 在 **向导** 页面中,点击页面右上角的 **+创建**。 在 **创建向导** 页面中,填写以下字段: * 在 **名称** 字段中,输入向导名称,例如企业或个人。向导名称会作为 B2CORE UI 中 **注册** 页面上的注册选项名称显示给客户。 * 在 **类型** 下拉列表中,选择 **注册**。 * 在 **默认** 下拉列表中,选择: * **是** — 将该向导标记为默认注册向导。如果配置了多个注册向导,默认向导将作为 B2CORE UI 中 **注册** 页面上的第一个注册选项显示。 * **否** — 如果配置了多个注册向导,则将该向导显示在 B2CORE UI 中 **注册** 页面上的默认向导之后。 点击 **保存** 以添加向导。 在向导列表中,找到添加的注册向导,然后点击 **编辑**。 在 **向导** 选项卡的 **描述** 字段中,您可以选择输入注册流程的简短说明或客户在开始注册前应了解的其他有用信息。该描述会显示在 B2CORE UI 中 **注册** 页面上的向导名称下方。 要配置注册流程步骤,请转到 **工作流** 选项卡。 默认情况下,已配置以下两个步骤,并按照注册期间执行的顺序排列: * 步骤 1:**基本信息** — 系统会提示客户填写所需的个人信息,例如电子邮件地址、名字和姓氏、电话号码、地址,以及用于访问其 B2CORE UI 个人资料的密码。 要查看为基本信息步骤添加的预定义字段列表,请点击位于步骤行中的 **编辑** 按钮,然后转到 **自定义字段** 选项卡。 启用您希望客户在注册期间填写的字段,并禁用其他字段(有关详细信息,请参阅[如何设置基本信息步骤的字段](how-to-set-up-fields-for-the-basic-information-step))。 * 步骤 2:**用户注册** — 客户将在 B2CORE 中完成注册,并被分配客户类型和初始验证级别(有关详细信息,请参阅[如何配置用户注册步骤](how-to-configure-the-user-registration-step))。 注册向导的工作流选项卡 要在注册流程中添加其他步骤,请点击 **+添加**。 在 **添加工作流** 弹出窗口中,选择步骤类型。可用步骤包括: * **客户类型** — 系统会提示客户选择个人资料类型,例如个人或企业。 * **电子邮件确认** — 系统会提示客户使用发送至该电子邮件地址的验证码,确认在基本信息步骤中输入的电子邮件地址。 * **新电话号码确认** — 系统会提示客户使用发送至该号码的验证码,确认在基本信息步骤中输入的电话号码。 * **高级** *(已弃用)* — 此步骤不再可添加到新的注册向导中。 如果之前已将高级步骤添加到现有注册向导中,该步骤会被保留,并且仍可修改或删除(有关详细信息,请参阅[如何设置高级步骤的字段](how-to-set-up-fields-for-the-advanced-step))。 点击 **保存** 以将所选步骤添加到注册流程中。系统会根据为每个步骤预定义的顺序将该步骤添加到步骤列表中。 完成注册流程步骤的配置后,转到 **向导** 选项卡。 在 **向导** 选项卡上,在 **已启用** 下拉列表中选择 **是** 以启用向导。 点击 **保存** 以应用更改。 启用向导后,相应的注册选项会显示在 B2CORE UI 的 **注册** 页面上供客户选择。 下图展示了 B2CORE UI **注册** 页面的示例,新客户可在其中选择 **个人**、**企业** 或 **合作伙伴** 注册选项。 注册页面 **另请参阅** [如何阻止某个国家的注册](../how-to-block-registration-for-a-country) 在用户注册步骤中,客户会在 B2CORE 中注册并被分配初始验证级别。 您可以选择注册后分配给客户的客户类型和验证级别。 当您为个人客户和企业客户配置两个独立的注册流程,并希望为这些客户分配不同的初始验证级别时,此功能可能非常有用。 选择注册后分配给客户的客户类型和验证级别: 导航至 **系统** > **向导**。 选择注册向导,然后点击 **编辑**。 转到 **工作流** 选项卡。 点击位于用户注册步骤行中的 **编辑** 按钮。 转到 **设置** 选项卡,并填写以下字段: * 在 **注册为** 下拉列表中,选择注册后分配给客户的客户类型。该列表包含在 [客户 > 类型](../../../back-office-guide/clients/types) 页面上配置的所有已启用客户类型。 如果您在 **注册为** 下拉列表中保留 `未选择`,则会在 [客户 > 类型](../../../back-office-guide/clients/types) 页面上标记为默认的客户类型分配给注册后的客户。如果未设置默认类型,则会分配优先级索引最低的类型。 * 在 **验证级别** 下拉列表中,选择注册后分配给客户的初始验证级别。该列表包含在 [验证 > 级别](../../../back-office-guide/verification/levels) 页面上配置的所有验证级别,但不包括分配了零(`0`)索引的默认验证级别。 如果您希望在注册后为客户分配默认验证级别,请在 **验证级别** 下拉列表中保留\ `未选择`。 用户注册步骤 点击 **保存** 以应用更改。 高级步骤已*弃用*,无法再添加到新的注册向导中。如果之前已将高级步骤添加到现有向导中,您可以编辑或删除该步骤,但无法向此步骤添加新字段。 注册后,在高级步骤中收集的信息将显示在客户详情的[高级选项卡](../../../back-office-guide/clients/general/advanced-tab)中。 要为高级步骤设置字段: 导航至 **系统** > **向导**。 选择现有的注册向导,然后点击**编辑**。 转到**工作流程**选项卡。 点击高级步骤行中的**编辑**按钮。 转到**自定义字段**选项卡。 要修改现有字段的设置,请点击字段行中的**编辑**按钮。 配置以下字段设置: * 在**主要字段设置**部分中: * 在**类型**下拉列表中,选择字段类型。 * 在**已启用**下拉列表中,选择 `Enabled` 以在注册期间显示字段,或选择 `Disabled` 以隐藏字段。 * 在**字段属性**部分中: * 在**名称**字段中,输入在 Back Office 中使用的字段名称。仅允许使用拉丁字符、数字和下划线。 * 在**标签**字段中,输入字段标签。字段标签将显示在 B2CORE UI 的**注册**页面上。 * 在**规则**下拉列表中,选择一项或多项规则,以验证客户在字段中输入的数据。 有关可分配给字段的所有可用字段类型和数据验证规则的说明,请参阅[字段类型](field-types-and-validation-rules#field-types)和[验证规则](field-types-and-validation-rules#validation-rules)。 点击**保存**以应用对字段设置的更改。 保存字段设置后,您将被重定向到**自定义字段**选项卡中的字段列表。 确保您希望客户在高级步骤中填写的所有字段均已启用。 要删除高级步骤中不再需要的字段,请点击字段行中的**垃圾桶**图标。 点击**保存**以应用对向导的更改。 在“基本信息”步骤中,系统会提示客户通过填写 B2CORE UI 中 **注册** 页面上显示的字段来提供个人信息。 此步骤包含一组预定义字段。您可以编辑或删除这些字段,但无法向此步骤添加新字段。 要为“基本信息”步骤设置字段: 导航至 **系统** > **向导**。 选择现有的注册向导,然后点击 **编辑**。 前往 **工作流** 选项卡。 点击“基本信息”步骤行中的 **编辑** 按钮。 前往 **自定义字段** 选项卡。 自定义字段选项卡 要修改现有字段的设置,请点击字段行中的 **编辑** 按钮。 注册向导只能接受和处理一组特定的数据。 有关可添加字段的详细信息,包括其名称、设置和属性,请参阅[“基本信息”步骤中支持的字段](fields-supported-in-the-basic-information-step)。 配置以下字段设置: * 在 **主要字段设置** 部分中: * 在 **类型** 下拉列表中,选择字段类型。 * 在 **已启用** 下拉列表中,选择 `Enabled` 以在注册期间显示字段,或选择 `Disabled` 以隐藏字段。 * 在 **字段属性** 部分中: * 在 **名称** 字段中,输入在 Back Office 中使用的字段名称。 * 在 **标签** 字段中,输入字段标签。字段标签将显示在 B2CORE UI 的 **注册** 页面上。 * 在 **规则** 下拉列表中,选择一项或多项规则,以验证客户在字段中输入的数据。 字段属性列表取决于所选字段类型,还可能包含其他属性。如果该字段有其他可用属性,请参阅[“基本信息”步骤中支持的字段](fields-supported-in-the-basic-information-step)。 点击 **保存** 以应用对字段设置所做的更改。 保存字段设置 保存字段设置后,您将被重定向到 **自定义字段** 选项卡中的字段列表。 确保已启用所有希望客户在注册期间填写的字段。 要删除注册时不再需要的字段,请点击字段行中的 **删除** 图标。 点击 **保存** 以应用对向导所做的更改。 **已弃用。** 注册向导已弃用。若要设置客户注册流程,请改用新的注册设置和自定义字段 — 请参阅[如何迁移到新的注册设置](../how-to-migrate-to-new-registration-settings)。 如果您有移动应用程序,请保持现有注册向导处于启用状态,直到您不再支持旧版本的应用程序,因为这些版本的最终用户需要依赖它们进行注册。 The **Promo Banners** tab on the **Promo** page lists a preconfigured collection of promo banners that can be used to attract new clients by means of banner advertising. A **promo banner** is represented by a rectangle of a varying size and color, within which some message is displayed. In the context of banner advertising, the purpose of such banners is to attract visitors of a host website where a banner is placed and encourage them to navigate to a specified landing page. Each banner card displays its size, language, and landing type (for example, **Registration**). **Key points:** * You can configure multiple promo banners for your referral campaign. * The promo banners can be placed on websites or any other advertising platforms. * You can filter the banners displayed on this page by their size, language, or theme. * To change the number of banners displayed per page, use the **Rows per page** dropdown. * Every promo banner configured by the broker is automatically made available to all partners of the selected partnership program — banner visibility cannot be limited to specific partners. ## Filter data [#filter-data] You can filter the banners displayed on this page using the following criteria: * **Size** — select a banner size to display banners of this size. * **Language** — select a language to display banners localized for this language. * **Theme** — select a theme to display banners with this theme. To change the number of banners displayed per page, use the **Rows per page** dropdown. ## Configure a banner [#configure-a-banner] To configure a promo banner: 1. From the dropdown located at the top of the page, select a **partnership program** for which you want to configure a banner. 2. Click a **banner** that you want to configure. 3. From the **Landing page** dropdown, select a landing page to which users should be navigated after clicking the banner.\ At present, only the **Sign up** page of the B2CORE UI can be used as a landing page. 4. Click **Copy** to copy the HTML code of your banner to the clipboard. The HTML code includes your unique ID. The copied HTML code can be embedded into an advertising website of your choice. A click is only registered once the banner code is actually rendered on a page and a visitor loads it — simply opening the landing page URL in a browser (without the banner being embedded and shown) will not be counted as a click and will not attribute the resulting registration to you. The **Promo** page includes the following tabs: The same link-building controls are also available in the **Partner Link** widget on the [Partner Dashboard](../dashboard). ## Referral links [#referral-links] The **referral link** (also referred to as **Partner Link**) is a personal URL created by a partner introducing new clients to the B2CORE UI. The URL includes a unique identifier (ID) that is assigned to a partner after joining a partnership program. The ID is used to keep track of new clients introduced by each partner and calculate rewards for trades executed by their clients. A partner may have multiple IDs after joining several programs. **Key points:** * A number of referral links can be created (your referral links can be localized or global). * Every link includes a unique partner ID. * You can convert the links into [QR codes](links#qr-codes). * The links can be shared on websites, through social media, in emails, or by any other means preferred by a partner promoting the B2CORE UI. ### Create a personal link [#create-a-personal-link] To create a referral link: 1. In the dropdown located at the top of the page, select a partnership program for which you want to create a link. 2. In the **Link settings** section: * **Landing Page** — select a webpage displayed after clicking the referral link. At present, only the **Sign Up** page of the B2CORE UI can be used as a landing page. * **Language** — select a language to create a localized URL. Select **Global** to create a regular URL that doesn't indicate a particular language. 3. Optionally, you can include [UTM parameters](links#utm-parameters) in your referral link by expanding the **UTM parameters** section and specifying the needed parameters. After you've configured the link settings, your referral link is displayed on the right side of the page. You can copy the URL to the clipboard using the **Copy** button. ### UTM parameters [#utm-parameters] The UTM parameters (or *tracking tags*) are short text codes that you can include into referral links to track various metrics and assess the efficiency of your marketing strategies. You can specify the following UTM parameters: ## QR codes [#qr-codes] If required, your referral links can be converted into QR codes that users can scan to be forwarded to a landing webpage pointed by the link URL. **Key points:** * You can generate multiple QR codes for a single referral link. * The QR codes can be customized by specifying various background colors and adding icons to them. * Similar to regular referral links, the QR codes can be shared on websites, through social media, in emails, or by any other means preferred by a partner seeking to attract new clients. * The QR codes can be downloaded to your computer and then used in printed promo materials. ### Generate a QR code [#generate-a-qr-code] To generate a QR code for your referral link, click the **Generate code** button displayed on the right side of the page. Optionally, you can apply custom settings to your QR code before generating it: * **Color** — select a QR code color. * **Icon** — select an icon to be added to a QR code. After the QR code is generated: * **Download PNG** — click this button to download a PNG image of the generated QR code to your computer. * **Copy embed code** — click this button to copy the HTML code of the generated QR code to the clipboard. You can then embed this code into your website or any other promo material. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Account ID** The trading account identifier. *** **Platform** The trading platform on which an account is created. *** **Currency** The currency in which an account is denominated. *** **Balance** The current balance on an account. *** **Credit** The credit on an account. *** **Profit** The profit earned on an account. *** **PnL** The current profit-loss value calculated for an account. *** **Trades** The total number of trades executed on an account. *** **Vol** The total trading volume on the account. *** **Lots** The total volume, in lots, traded on the account. *** **Rewards** The total amount of rewards paid to you for trades executed on the account. *** **Created** The date and time when the account was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on trading accounts created by this client. * **Account ID** — enter an account identifier to display the data on this account. * **Date Range** — select a start and end date to display the data on trading accounts created during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To specify how many items to show on each page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The total number of clicks, registrations, and the click conversion rate are displayed for the selected program. The following information is displayed in the report table: **Click ID** The identifier of the click on a referral link or promo banner. *** **Client ID** The client identifier. It's displayed if after clicking your referral link or promo banner, a user has signed up to the B2CORE UI and become your [direct client](#user-content-fn-1)[^1]. *** **Country** The country where a user who clicked your referral link or promo banner is located, based on the user's IP address. *** **IP Address** The IP address of a user who clicked your referral link or promo banner. *** **Link** The identifier of a referral link or promo banner that was clicked. *** **Referrer** The resource from where a user came, such as a website or social media platform. *** **Date** The date and time when a referral link or promo banner was clicked. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on clicks made by this client. * **Country** — select a country to display the data on clicks made by users located in this country. * **Landing page** — select a landing page to display the data on clicks resulting in this page being opened. Users are navigated to this page after clicking your referral links or promo banners. * **Referrer** — specify a resource, such as a website or social media platform, to display the data on clicks made on this resource. * **Date range** — select a start and end date to display the data on clicks made during the specified period. * **Show UTM filters** — expand this section to specify [UTM parameters](../promo/links#utm-parameters) and display the data on traffic sources. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. [^1]: The client who signed up to the B2CORE UI by your referral link. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Client ID** The client identifier. *** **Name** The full name of a client. *** **Email** The client's email address. *** **Country** The country specified by a client when signing up to the B2CORE UI. *** **Trading Volume** The total volume, in lots, traded by the client and their clients. *** **Rewards** The total amount of rewards paid to you for trades executed by the client and their clients. *** **Clients** The total number of your clients attracted by your client, both [direct clients](#user-content-fn-1)[^1] and [sub-IB clients](#user-content-fn-2)[^2]. *** **Date** The date and time when a client has signed up to the B2CORE UI after clicking your referral link or promo banner. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **SubIB**: * Select **Yes** to display a list of your [sub-IB clients](#user-content-fn-3)[^3]. * Select **No** to display a list of your [direct clients](#user-content-fn-4)[^4]. * Select **None** to display a full list of clients. * **Client ID** — enter a client identifier to display the data on this client. * **Country** — select a country to display a list of clients who specified this country when signing up to the B2CORE UI. * **Date range** — select a start and end date to display the data on clients who have signed up to the B2CORE UI during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## View client details [#view-client-details] To open the **Client details** page, select a client and click the client row area. On the details page, you can switch between the following tabs: On this tab, you can find information about the client identifier, name, email address, location, and level[^5]. Depending on the configuration of your partnership program, partners rewards may be calculated based on levels assigned to their clients. On this tab, you can find a list of all clients, both [direct clients](#user-content-fn-6)[^6] and [sub-IB clients](#user-content-fn-7)[^7]. On this tab, you can find a list of client trading accounts, platforms on which the accounts were created, as well as trading and balance operations made on these accounts. On this tab, you can find a list of all trades executed by a client and learn about the rewards paid to you for each trade. [^1]: Clients who signed up to the B2CORE UI by your referral link. [^2]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. [^3]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. [^4]: Clients who signed up to the B2CORE UI by your referral link. [^5]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../../broker-guide/key-terms#level "mention") [^6]: Clients who signed up to the B2CORE UI by your referral link. [^7]: Clients who signed up to the B2CORE UI by your referral link and then became partners too. The **CPA** report lists clients you have referred to the CPA program and shows how far each client has progressed through the program conditions. ## Generate a report [#generate-a-report] The following information is displayed in the report table: **Client** The unique identifier of the referred client. *** **CPA Program** The name of the CPA program to which the client was referred. *** **Steps Accomplished** The conditions from the CPA program payment plan that the client has completed. Possible steps include: * **Registration** — the client has registered using your referral link. * **KYC** — the client has completed identity verification. * **Minimum Deposit** — the client has made the minimum required deposit. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **CPA Program** — select a CPA program to display acquisitions attributed to this program. * **Date range** — select a start and end date to display acquisitions created during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following data is displayed in the report table: **Client Email** The email address of the client who owns the account to which the deposit was made. *** **Id** The identifier of a deposit operation. *** **Account** The trading account number. *** **Currency** The deposit currency. *** **Amount** The deposit amount. *** **Date** The date and time when a deposit was made. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Platform unique value** — enter a unique identifier of a deposit operation to display the corresponding deposit. * **Account** — enter a trading account number to display the data on deposits made to this account. * **Date range** — select a start and end date to display the data on deposits made during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. The **Reports** page is a single page with the following tabs. Each tab provides its own table columns, and shares common **Filters** and **Rows per page** controls. ## Generate a report [#generate-a-report-] The following information is displayed in the report table: **Client ID** The client identifier. *** **Level** The client level[^1]. *** **Platform** The trading platform on which a trade was executed. *** **Account ID** The identifier of a trading account on which a trade was executed. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbols traded. *** **Volume Lot** The volume traded, in lots. *** **Reward Amount** The rewards paid to you for a trade. *** **Trade Execution Time** The date and time when a trade was executed. *** **Transaction ID** The identifier of the transaction through which the reward was paid. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Client ID** — enter a client identifier to display the data on trades executed by this client. * **Account ID**, **Trade ID**, **Transaction ID** — enter an account, trade, or transaction identifier to display the corresponding trades. * **Symbol** — specify trade symbols, such as **ETH/USD**, to display the data on trades that were made on these symbols. * **Level** — enter a client level to display the data on rewards generated by the clients assigned this level. * **Date range** — select a start and end date to display the data on trades executed during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. [^1]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../../broker-guide/key-terms#level "mention") The **Savings Rebates** report lists the rewards you have received for clients who invested in savings plans. ## Generate a report [#generate-a-report] The following information is displayed in the report table: **Client** The unique identifier of the client whose savings activity generated the reward. *** **Program** The name of the savings program for which the reward was calculated. *** **Level** The program level at which the reward was calculated. *** **Rebate** The reward amount paid to you. *** **Period** The date of the period for which the reward was calculated. *** **Status** The current status of the payment: * **Pending** — the reward is waiting to be processed. * **Succeeded** — the reward was successfully transferred to your account. * **Failed** — the reward could not be transferred. ## Sort data [#sort-data] Click the **Program** column header to sort payments. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Status** — select a status to display payments with this status. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] The following data is displayed in the report table: **Email** The email address of the client who executed the trade. *** **Client ID** The client identifier. *** **Platform** The trading platform on which a trade was executed. *** **Account ID** The identifier of a trading account on which a trade was executed. *** **Symbol** The symbols traded. *** **Position ID** The identifier of the position associated with the trade. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Position** The position status. Possible values: * Open * Closed *** **Volume** The volume traded, in lots. *** **Trade Execution Time** The date and time when a trade was executed. *** **Price** The price at which the trade was executed. *** **Swap** The swap amount charged or credited for the trade. *** **Commission** The commission charged for the trade. *** **Profit** The profit or loss generated by the trade. ## Filter data [#filter-data] You can filter the data displayed on this page using the following criteria: * **Trade ID**, **Position ID**, **Account ID** — enter a trade, position, or account identifier to display the corresponding trades. * **Date range** — select a start and end date to display the data on trades executed during the specified period. * **Email** — specify a client email to display the data on trades executed by this client. * **Client ID** — enter a client identifier to display the data on trades executed by this client. * **Side** — specify a trade side to display the corresponding trades. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following information is displayed in the report table: **Transaction ID** The transaction identifier. *** **Wallet ID** The identifier of a wallet to which a reward was paid. *** **Rewards** The number of trades covered by a single reward payment. *** **Amount** The amount rewarded. *** **Date** The date and time when a transaction was made. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Transaction ID** — enter a transaction identifier to display the corresponding transaction. * **Wallet ID** — enter a wallet identifier to display the data on rewards paid to this wallet. * **Date range** — select a start and end date to display the data on transactions made during the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Generate a report [#generate-a-report] From the dropdown at the top of the page, choose the **partnership program** you wish to view data for. The following data is displayed in the report table: **Client Email** The email address of the client who owns the account from which the withdrawal was made. *** **Account** The trading account number. *** **Currency** The withdrawal currency. *** **Amount** The withdrawal amount. *** **Id** The identifier of a withdrawal operation. *** **Date** The date and time when a withdrawal operation was made. ## Filter data [#filter-data] You can filter the data displayed on this page using the following criteria: * **Platform unique value** — enter a unique identifier of a withdrawal operation to display the corresponding withdrawal. * **Account** — enter a trading account number to display the data on withdrawals made from this account. * **Date range** — select a start and end date to display the data on withdrawals made within the specified period. Click **Filters** to open the filter panel and specify custom filter criteria. To change the number of entries displayed per page, use the **Rows per page** dropdown. ## Account list [#account-list] The following information is provided on each account: **Account** The account number. Click it to view [account details](accounts#account-details). *** **Client ID** The partner identifier in the B2CORE UI. *** **Contact email** The partner email. *** **IB name** The partner name. *** **IB type** The partnership program. *** **Created** The date and time when an account was created. ## Account details [#account-details] To view details, click the **account number** or . The page is divided into the following tabs: On this tab, you can view detailed information about an account. **Account** The account number. *** **Balance** The current balance on an account. *** **Introducing broker** The partner name. *** **Type** The account type. *** **Created** The date and time when an account was created. On this tab, you can view reward-related transactions made on a currently selected account. For a detailed description of the fields, see [Transactions](transactions). ## Currency list [#currency-list] View the following information for each currency: **Name** The currency name. *** **Alias** The currency designation used on a specific trading platform. *** **Alphabetic code** The alphabetic currency code. For fiat currencies, the codes are as per ISO 4217; for cryptocurrencies, conventional coding is used. *** **Numeric code** The numeric currency code. For fiat currencies, the codes are as per ISO 4217; for cryptocurrencies, conventional coding is used. *** **Minor unit** The maximum number of digits after a decimal separator, indicating the decimal precision with which the amounts in a currency are displayed. *** **Sign** The currency symbol. *** **Class** The currency category. Possible values: * Fiat * Crypto *** **Created** The date and time when a currency was added. ## Currency details [#currency-details] To view details, click the **currency number** or . Here you can view and customize currency settings. All fields, except for **Created**, can be modified. On this page, you can view a list of failed IB reward payments along with the error details. The following information is provided about each failed payment: **ID** The identifier of the failed payment. *** **Error Reason** The reason why the payment failed. *** **Error Message** The detailed error message. *** **Transaction ID** The identifier of the related transaction. *** **Account ID** The identifier of the related account. *** **Created At** The date and time when the failed payment was registered. At least one provider is configured by default. For custom crypto assets, you can manually specify a static exchange rate for it. ## Provider list [#provider-list] View the following information for each rate provider: **Priority** The rate provider priority. If you have multiple providers configured, data requests are sent based on their priority. If the highest priority provider doesn’t respond, the request moves to the next provider in line, continuing in this manner until the data is received. *** **Name** The rate provider name. **Created** The date and time when a rate provider was added. ## Rate provider details [#rate-provider-details] To view details, click the **provider name** or . The page is divided into the following tabs: On this tab, you can customize rate provider settings. **Provider** The rate provider. *** **Priority** The rate provider priority. This value can be modified. *** **Name** The rate provider name. This value can be modified. *** **Base currency** *Available for custom rate providers only*. The base currency. This value can be modified. *** **Quote currency** *Available for custom rate providers only*. The quote currency. This value can be modified. *** **Rate** *Available for custom rate providers only*. The exchange rate. This value can be modified. *** **Created** The date and time when a rate provider was added. *Not available for custom static rates*. On this tab, you can run diagnostics and check the connection to a provider, by clicking the **Test connection** button. ## Reward list [#reward-list] View the following information for each reward: **Trade execution time** The date and time when a trade was executed. *** **Trade ID** The identifier of a trade for which a reward was paid. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Currency** The reward currency. *** **Amount** The reward amount. *** **Level** The client level. *** **IB name** The name of a partner. *** **IB email** The partner email. *** **IB type** The partnership program. *** **Transaction ID** The identifier of a transaction that resulted in crediting a reward to a partner's account. Multiple rewards can be paid as part of a single transaction. **State** The current status of a reward payment: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and debited from a partner's account. *** **Created** The date and time when a reward was calculated. ## Reward details [#reward-details] To edit information about a reward, click the **trade execution time** or . The detailed information contains the following: **Reward state** The current status of a reward payment: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and debited from a partner's account. *** **Reward amount** The total amount rewarded. *** **Transaction ID** The transaction identifier. *** **Level** The partner's level. *** **Introducing broker** The name of a partner. *** **Payment plan** The formula for setting up the rewards calculation. To learn more, refer to [Payment plans](../../payment-plans). *** **Level ratio** The multiplier based on which rewards are calculated considering a partner's level. *** **Personal ratio** The individual multiplier based on which rewards are calculated for a specific client. *** **Tier ratio** The multiplier based on which rewards are calculated considering a specific tier. *** **Tier trading volume** The trading volume defined for a tier. *** **Tier active traders** The number of active traders defined for a tier. *** **Tier name** The tier name. *** **Tier period** The number of days during which a partner must meet tier objectives to receive increased rewards. *** **Created** The date and time when a reward was paid. *** **Trading platform** The trading platform name. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Trading account** The account number of a client who executed a trade. *** **Trade ID** The trade identifier. *** **Trade execution time** The date and time when a trade was executed. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Quote currency** The quote currency traded. *** **Contract size** The trade amount. *** **Price** The execution price. *** **Volume, lots** The trade volume, in lots. *** **Volume, USD** The trade volume, in USD. *** **Commission** The paid commission amount. *** **Client email** The email of a client who executed a trade. *** **Client ID** The client identifier in the B2CORE UI. ## Transactions list [#transactions-list] View the following information for each transaction: **ID** The transaction identifier. *** **Currency** The currency in which a reward was paid. *** **Amount** The amount of a transaction. *** **Account number** The partner account number. *** **Client ID** The identifier of a client profile. *** **IB name** The name of a partner. *** **IB email** The partner email. *** **IB type** The partnership program. *** **Status** The current status of a transaction. Possible values: * **Failed** — the transaction failed due to internal technical reasons. This is a final status. * **Invalid** — the transaction amount is `0`, the transaction won't be processed. This is a final status. * **Processing** — the transaction is currently being credited, the status will be changed soon. * **Transferred** — the transaction was successfully credited. This is a final status. *** **Processed** The date and time when a transaction was credited. *** **Created** The date and time when a transaction was created. ## Transaction details [#transaction-details] To view details, click the **transaction ID** or . The page is divided into the following tabs: On this tab, you can view detailed information about a transaction. **Status** The current status of a transaction. Possible values: * **Failed** — the transaction failed due to internal technical reasons. This is a final status. * **Invalid** — the transaction amount is **0** (zero), the transaction won't be processed. This is a final status. * **Processing** — the transaction is currently being credited, the status will be changed soon. * **Transferred** — the transaction was successfully credited. This is a final status. *** **Amount** The amount of a transaction. *** **Side** The transaction side. Possible values: * Debit * Credit *** **Account** The account number of a partner. *** **Client ID** The identifier of a client profile. *** **Contact email** The partner email. *** **IB name** The name of a partner. *** **IB type** The partnership program. *** **Rewards** The number of rewards paid by this transaction. *** **Processed** The date and time when a transaction was credited. *** **Created** The date and time when a transaction was created. On this tab, you can view the rewards credited to a partner's account by this transaction. For more details, refer to [Rewards](rewards). Client acquisitions are tracked per CPA program. To view acquisitions for a program, open the program and go to the **Client Acquisitions** tab. ## Acquisition list [#acquisition-list] View the following information for each CPA acquisition: **Client ID** The unique identifier of the referred client. *** **Client Name** The name of the referred client. *** **Partner Name** The name of the partner who referred the client. *** **Partner User ID** The unique identifier of the partner who referred the client. *** **Events** The conditions from the payment plan that the client has fulfilled. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display acquisitions attributed to this partner. * **Date range** — select a start and end date to display acquisitions created during the specified period. **See also:** * [CPA programs](cpa-programs) * [Payment plans](payment-plans) * [CPA payments](cpa-payments) ## Payment list [#payment-list] View the following information for each CPA payment: **Partner User ID** The unique identifier of the partner who earned the reward. *** **Partner Name** The name of the partner who earned the reward. *** **Payment Amount** The reward amount. *** **Currency** The reward currency. *** **Status** The current status of a CPA payment: * **Pending** — the reward has been calculated and is waiting to be processed. * **Processing** — the reward transfer is in progress. * **Processed** — the reward was successfully transferred to the partner's account. * **Succeeded** — the reward transfer was confirmed as successful. * **Failed** — the reward could not be transferred to the partner's account. * **Cancelled** — the reward was cancelled and will not be paid. *** **Processed At** The date and time when the payment was processed. *** **Created** The date and time when the CPA payment was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display payments for this partner. * **Partner Name** — enter a partner name to display payments for this partner. * **Status** — select a status to display payments with this status. * **Date range** — select a start and end date to display payments processed during the specified period. **See also:** * [CPA programs](cpa-programs) * [CPA acquisitions](cpa-acquisitions) ## Program list [#program-list] View the following information for each CPA program: **Name** The name of a CPA program. Click the name to open the [program details](cpa-programs#program-details). *** **Reward Currency** The currency in which partner rewards are paid. *** **Payment Mode** The mode that determines how rewards are calculated when a client meets multiple conditions: * **Cumulative** — the partner receives a reward for each payment plan whose conditions are met. Rewards from all triggered plans are added together. * **Max Tier** — only the highest-priority payment plan whose conditions are met is rewarded. The payment window defines the period during which the client can still reach a higher tier before the reward is finalised. *** **Active** Whether the CPA program is active: * **Yes** — the program is active and partners can earn rewards. * **No** — the program is inactive and no new rewards are created. *** **Created** The date and time when a CPA program was created. *** **Updated** The date and time when a CPA program was last updated. ## Edit a CPA program [#edit-a-cpa-program] To edit a CPA program, click the **Edit** icon next to the program in the list, or click **Edit** on the program details page. The following fields can be edited: * **Name** — the name of the program. * **Description** — the description of the program. Reward Currency and Payment Mode cannot be changed after the program is created. ## Create a CPA program [#create-a-cpa-program] To create a CPA program: 1. Click **Create**. 2. Fill in the required fields: * **Name** — enter a name for the CPA program. * **Description** — optionally, enter a description. * **Reward Currency** — select the currency in which partner rewards will be paid. * **Payment mode** — select how rewards are calculated. 3. If **Max Tier** is selected as the payment mode, specify the **Payment Window (days)**. This is the period during which a client must meet conditions to trigger a reward. 4. Click **Save**. After creating a program, add [payment plans](payment-plans) and conditions to define the reward structure. ## Program details [#program-details] To access program details, click the **program name**. The page displays the program settings and the list of associated [payment plans](payment-plans), organized in the following tabs: * **General** — program settings. * **CPA Payment Plans** — the payment plans associated with this program. * **Client Acquisitions** — clients referred by partners who have fulfilled the program conditions. See [CPA acquisitions](cpa-acquisitions). ### Activate a program [#activate-a-program] A CPA program can only be activated if it has at least one active payment plan with at least one condition. To activate a program, click **Activate**. To deactivate an active program, click **Deactivate**. Deactivating a program stops new rewards from being created but does not affect rewards already in progress. ### Assign to a partner group [#assign-to-a-partner-group] A CPA program must be assigned to a partner group to take effect. Partners in the group will earn CPA rewards when their referred clients meet the program conditions. To assign a CPA program to a partner group, go to **Program** → **Types**, open the group settings, and select the program in the **CPA Program** field on the **Preferences** tab. ## Filter data [#filter-data] You can filter the data displayed in the CPA programs list using the following criteria: * **Name** — enter a program name to search for programs with a matching name. * **Payment Mode** — select a payment mode to display programs with this mode. * **Active** — select a status to display active or inactive programs. * **Date range** — select a start and end date to display programs created during the specified period. **See also:** * [Payment plans](payment-plans) * [CPA acquisitions](cpa-acquisitions) * [CPA payments](cpa-payments) CPA is disabled by default. Contact your B2BROKER integration team to enable it. Each [CPA program](cpa-programs) contains one or more payment plans. A payment plan defines the set of conditions a referred client must meet for the partner to earn a reward. ## Payment plan list [#payment-plan-list] View the following information for each payment plan: **Name** The name of a payment plan. *** **Payment Amount** The reward amount paid to the partner when the plan conditions are met. *** **Priority** The priority of the plan. Only used in **Max Tier** mode — when a client qualifies for multiple plans, only the plan with the highest priority is rewarded. In **Cumulative** mode, priority has no effect. If two plans have the same priority in **Max Tier** mode, the behavior is undefined — only one plan will be rewarded but the result is not deterministic. Always assign a unique priority to each plan to avoid ambiguity. *** **Conditions** The conditions configured for the payment plan. *** **Created** The date and time when the payment plan was created. ## Edit a payment plan [#edit-a-payment-plan] To edit a payment plan, open the CPA program in edit mode and click the **Edit** icon next to the plan. The following fields can be edited: * **Name** — the name of the plan. * **Description** — the description of the plan. * **Payment Amount** — the reward amount. * **Priority** — the plan priority. * **Conditions** — add or remove conditions. Payment Amount and conditions cannot be changed while the CPA program is active. Deactivate the program first, make the changes, then reactivate it. ## Delete a payment plan [#delete-a-payment-plan] To delete a payment plan, open the CPA program in edit mode and click the **Delete** icon next to the plan. A payment plan cannot be deleted while the CPA program is active. Deactivate the program first. ## Add a payment plan [#add-a-payment-plan] To add a payment plan to a CPA program: 1. Open a CPA program in edit mode (click **Edit**). 2. In the **CPA Payment Plans** section, click **Create**. 3. Fill in the required fields: * **Name** — enter a name for the payment plan. * **Description** — optionally, enter a description. * **Payment Amount** — enter the reward amount to pay to the partner when conditions are met. * **Priority** — set the priority of the plan. Only applies in **Max Tier** mode — when a client qualifies for multiple plans, only the plan with the highest priority is rewarded. * **Conditions** — select one or more conditions the referred client must fulfill. For condition-specific options, see [Condition types](payment-plans#condition-types). 4. Click **Save**. Conditions cannot be added to or removed from a payment plan while the CPA program is active. Deactivate the program first, make the changes, then reactivate it. ## Condition types [#condition-types] **Registration** The client registered in the B2CORE UI by clicking the partner's referral link. No additional fields. *** **KYC Approved** The client passed the KYC verification at the specified level. * **KYC Level** — the verification level the client must reach. The available levels depend on the project configuration. *** **Minimum Deposit** The client deposited at least the specified amount. * **Amount** — the minimum deposit amount. * **Currency** — the currency of the deposit. A payment plan can have multiple conditions selected. All selected conditions must be met for the partner to earn the reward. **See also:** * [CPA programs](cpa-programs) * [CPA acquisitions](cpa-acquisitions) ## Accounts list [#accounts-list] View the following information for each trading account: **Platform** The trading platform name. *** **Group** The account group defined on the platform. *** **Type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Account** The account number on a trading platform. This is a link to [account details](accounts#account-details). *** **Currency** The currency in which an account is denominated. *** **Trades** The number of trades made on the account. *** **Deposits** The amount deposited to an account. *** **Withdrawals** The amount withdrawn from an account. *** **Balance** The balance on an account. *** **Credit** The credit on an account. *** **Equity** The account equity. *** **Commission** The commissions paid for operations on an account. *** **Swap** The swap on an account. *** **Profit** The profit on an account, before commissions. *** **PnL** The profit-loss value calculated for an account. *** **Name** The name of a client profile. *** **Email** The client email. *** **Client ID** The identifier of a client profile. *** **Archived** Indicates whether an account is archived on a trading platform. *** **Enabled** If enabled, the account participates in data sync and calculation of rewards. All accounts are enabled by default (the **Enabled** field is set to **Yes**). You can change the this status in the account details. *** **Hidden** If **Yes**, an account isn't shown to a partner. This means the account is included in a [group](groups) for which the **Hide accounts** setting is enabled. *** **Created** The date and time when an account was created on a trading platform. ## Account details [#account-details] To view details, click the **account number** or . The page is divided into the following tabs: On this tab, you can view general information about an account. On this tab, you can view the deposit history of an account. For a detailed description of the fields, see [Deposits](deposits). On this tab, you can view the withdrawal history of an account. For a detailed description of the fields, see [Withdrawals](withdrawals). On this tab, you can view trading history of an account, with the following data provided on each trade: **Trade execution time** The date and time when a trade was executed. *** **Platform** The name of a platform on which a trade was executed. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Volume, lots** The volume traded, in lots. *** **Position** The current position state. Possible values: * Closed * Open *** **Rewards** The amount of rewards paid for a trade. ## Deposit list [#deposit-list] By default, the list is sorted by date in the descending order (the most recent deposits appear at the top of the list). For a list of deposits made by a client, navigate to the **Program** > **Clients** > **Details** > **Deposits** tab. For a list of deposits made on a trading account, navigate to the **Platforms** > **Accounts** > **Details** > **Deposits** tab. View the following information for each deposit: **Date** The date and time when a deposit operation was made. *** **Platform** The trading platform name. *** **Account** The trading account number. *** **Currency** The deposit currency. *** **Amount** The deposit amount. *** **ID** The deposit identifier. ## Deposit details [#deposit-details] To view details, click the **deposit ID** or . The detailed information contains the following: **Trading platform** The trading platform name. *** **Transaction ID** The unique identifier of a deposit operation on a trading platform. *** **Trading account** The trading account number. *** **Base currency code** The deposit currency. *** **Amount** The deposit amount. ## Group list [#group-list] View the following information for each group: **Platform** The trading platform name. *** **Group** The group of trading accounts as set on a trading platform. *** **Trades** The number of trades made by IB clients. *** **Created** The date and time when a group was created on a trading platform. ## Group details [#group-details] To view details, click the **group name** or . The page is divided into the following tabs: On this tab, you can view the general configuration of a group. **Platform** The trading platform name. *** **Group** The group of trading accounts, as defined on the trading platform. *** **Currency** The currency in which the trading accounts in this group are denominated. *** **Lot size** The lot size. The standard lot size of **1.00** is used by default; the lot size of **0.01** is used for groups providing for greater decimal precision. *** **Hide accounts** If **Yes**, accounts included in this group are hidden and aren't shown to a partner. *** **Archived** If **Yes**, this group was archived on the trading platform. *** **Created** The date and time when a group was created on the trading platform. On this tab, you can view information about trades. **Trade execution time** The date and time when a trade was executed. *** **Platform** The trading platform name. *** **Trade ID** The trade identifier. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol code. *** **Volume** The volume traded. *** **Position** The current position state. Possible values: * Open * Closed *** **Rewards** The amount of rewards paid for a trade. ## Platform list [#platform-list] The page data is presented in a table form, with the table columns providing the following information: **ID** The platform identifier in the B2CORE IB. *** **Name** The trading platform name. *** **Status** The trading platform status. Possible values: * Enabled * Disabled *** **Trades** The number of trades made on a platform. *** **Created** The date and time when a platform was connected to your IB. ## Platform details [#platform-details] To view details, click the **platform name** or . The page is divided into the following tabs: On this tab, you can view trading platform settings. Learn about the provider, credentials, and date and time when a platform was edited. Click the **Platform ID** link to navigate to the **Edit platform** page where you can view the details about a provider and configure its settings. After you have finished configuring a platform, click **Save** to apply the changes. *** **Trades cutoff (UTC)** Empty by default. Set it if you need the system to ignore trades made before a specific date. On this tab, you can view information about drivers. The **Report** and **WEBAPI** drivers are configured by default. You can specify the driver **Priority** so that if a driver with a higher priority fails, a backup driver with a lower priority is used instead. If all drivers fail, the service reports that it can't operate properly. After a driver is added, it's automatically assigned the lowest priority. The priority can be changed later on when configuring drivers. You can run diagnostics by clicking the **Test connection** button. Click the driver name to navigate to the details page where you can view the details about a driver and configure its settings. After you have finished configuring a driver, click **Save** to apply the changes. ## Symbol list [#symbol-list] View the following information for each symbol: **Platform** The trading platform name. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol group** *Applicable only for MetaTrader 5.* The symbol group, as defined on the trading platform. *** **Symbol** The symbol code. *** **Contract size** The contract size. *** **Quote currency code** The code of the quote currency. *** **Archived** If **Yes**, this symbol was archived on the trading platform. *** **Trades** The total number of trades by a symbol. *** **Created** The date and time when a symbol was created on a trading platform. ## Symbol details [#symbol-details] To view details, click the **symbol name** or . The page is divided into the following tabs: On this tab, you can view detailed information about a symbol. **Trading platform** The trading platform name. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol** The symbol code. *** **Quote currency** The second currency listed in a currency pair. *** **Contract size** The contract size. *** **Archived** If **Yes**, this symbol was archived on the trading platform. *** **Created** The date and time when a symbol was created. On this tab, you can view, add and modify payment plans configured for symbols. **#** The sequence number. *** **Type** The partnership program. *** **Payment plan** The configuration of rewards calculation. *** **Position** The position status. Possible values: * Open * Closed *** **Created** The date and time when a payment plan was created. ## Trade list [#trade-list] View the following information for each trade: **Trade execution time** The date and time when a trade was executed. *** **Platform** The name of a trading platform. *** **Account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Account** The number of a trading account. *** **Trade ID** The trade identifier on the trading platform. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The trade symbol. *** **Volume, lots** The volume traded, in lots. *** **Position** The current position state. Possible values: * Open * Closed *** **Reversal** *Applicable for cTrader only.* If **Yes**, the position was reversed as a result of the trade. For more information, refer to [cTrader documentation](https://help.ctrader.com/ctrader-web/interface/trade-watch/#reverse-and-double-position). *** **Rewards** The number of rewards paid for a trade. ## Trade details [#trade-details] To view details, click the **Trade execution time**, **Trade ID** or . The page is divided into the following tabs: On this tab, you can view detailed information about a trade. **Trading platform** The name of a trading platform. *** **Trade account type** The account type. Possible values: * Default * Payment account * PAMM investment account * PAMM master account *** **Trading account** The account number of a client that has executed a trade. *** **Trade ID** The trade identifier on the trading platform. *** **Trade execution time** The date and time when a trade was executed. *** **Side** The trade side. Possible values: * Buy * Sell *** **Symbol** The symbol name. *** **Quote currency** The alphabetic code of a quote currency. *** **Contract size** The contract size. *** **Price** The trade execution price. *** **Volume, lots** The volume traded, in lots. *** **Volume, USD** The volume traded, in USD. *** **Commission** The total amount of paid commissions. *** **Reversal** *Applicable for cTrader only.* If **Yes**, the position was reversed as a result of the trade. For more information, refer to [cTrader documentation](https://help.ctrader.com/ctrader-web/interface/trade-watch/#reverse-and-double-position). *** **Client email** The client email. *** **Client ID** The client identifier. On this tab, you can view detailed information about rewards paid for trades. This tab is empty if no rewards were paid. **Level** The level of a client. *** **Currency** The currency in which a reward was paid. *** **Amount** The amount of a reward. *** **IB name** The partner name. *** **IB email** The partner email. *** **IB type** The name of partnership program. *** **State** The current status of a reward payment. Possible values: * **Done** — the reward was successfully credited to a partner's account. * **Pending** — the reward was calculated, but not yet credited to a partner's account. * **Canceled** — the reward was canceled and then debited from a partner's account. *** **Created** The date and time when a reward was calculated. ## Withdrawal list [#withdrawal-list] The list is sorted by date in descending order by default (newer withdrawals appear at the top of the list). To view a list of withdrawals specified by a client, navigate to the **Program** > **Clients** > **Details** > **Withdrawals** tab. To view a list of withdrawals specified by a trading account, navigate to the **Platforms** > **Accounts** > **Details** > **Withdrawals** tab. View the following information for each withdrawal: **Date** The date and time when a withdrawal operation was executed. *** **Platform** The trading platform name. *** **Account** The account number on a trading platform. *** **Currency** The currency in which a withdrawal operation was executed. *** **Amount** The amount of a withdrawal operation. *** **ID** The identifier withdrawal operation. ## Withdrawal details [#withdrawal-details] To view details, click the **withdrawal ID** or . The detailed information contains the following: **Trading platform** The trading platform name. *** **Transaction ID** The unique identifier of a withdrawal operation on a trading platform. *** **Trading account** The account number on a trading platform. *** **Base currency code** The currency in which a withdrawal operation was executed. *** **Amount** The amount of a withdrawal operation. The B2CORE IB API is currently restricted and **not** publicly available. ## App list [#app-list] View the following information for each app: **App name** The app name. *** **Registration date** The date and time when an app was registered. ## App details [#app-details] To view details, click the **app name** or **pencil icon**. The detailed information contains the following: **App name** The app name. *** **Client ID** The public identifier of your app. *** **Client secret** The private identifier of your app, which is used to verify the client's identity when accessing the system via the API. Your **Client ID** and **Client secret** are used to verify your identity. To properly protect you and your clients, please make sure that these values are kept in a secure storage. **Registration date** The date and time when an app was registered. Date and time values in the B2CORE UI are displayed according to these settings. The values on this page are read-only and can't be modified. On this page, a connection to the IB server is set up. The **API status** field on this page indicates the current API connection status. The most common statuses are listed below: * `Running` — the IB server is functioning properly. * `Maintenance` — the IB server is being updated. * `NotFoundHttpException` — an incorrect **API Base URL**. * `SSL Certificate Problem` — the certificate has expired. This page contains current versions of the B2CORE IB and a link to Release notes. ## Client list [#client-list] View the following information for each client: **Registration date** The date and time when a client was registered. *** **Name** The name of a client. This is a link to [client details](clients#client-details). *** **Country** The client's location. *** **Email** The client's email address. *** **Client ID** The client identifier used in the B2CORE UI. *** **IB type** The partnership program joined by a partner who referred the client. *** **IB** The name of a partner who referred the client. This is a link to [partner details](introducing-brokers#partner-details). ## Client details [#client-details] To access details, click the **client name** or . The page is divided into the following tabs: On this tab, you can view the client identifier, tags, chain, name, email, country, and registration date. On this tab, you can view a client's trading accounts. For a detailed description of the fields, see [Accounts](../platforms/accounts). On this tab, you can view a client's deposit history. For a detailed description of the fields, see [Deposits](../platforms/deposits). On this tab, you can view a client's withdrawal history. For a detailed description of the fields, see [Withdrawals](../platforms/withdrawals). On this tab, you can view a client's trading history. For a detailed description of the fields, see [Trades](../platforms/trades). ## Partner list [#partner-list] View the following information for each partner: **Name** The name of a partner. This is a link to [partner details](introducing-brokers#partner-details). *** **Country** The country specified by a partner during registration and a KYC procedure. *** **Email** The partner email. *** **Client ID** The partner identifier used in the B2CORE UI. *** **Direct clients** The number of partner's [direct clients](#user-content-fn-1)[^1]. *** **Trading volume, lots** The total trading volume, in lots, for which rewards were paid, including the volume traded by all of the partner's clients regardless of their level. Use a quick filter to include or exclude clients with zero trading volume. *** **Trading volume, USD** The total trading volume, in USD, for which rewards were paid, including the volume traded by all of partner's clients regardless of their level. Use a quick filter to include or exclude clients with zero trading volume. *** **Reward amount** The total amount of rewards paid to a partner. *** **IB type** The partnership program joined by a partner. *** **Master** Indicates if a partner is assigned the Master[^2] status. *** **Registration date** The date and time when a partner joined a partnership program. ## Partner details [#partner-details] To access details, click the **partner name** or . The page is divided into the following tabs: On this tab, you can view the partner profile information and do the following: * Configure payment preferences * Change a program joined by a partner * Block a partner On this tab, you can view a partner's banner performance data. For a detailed description of the fields, see [Banners](../promo/banners/). On this tab, you can view a partner's link performance data and generate a QR code. For a detailed description of the fields, see [Landings](../promo/landings). On this tab, you can view the click performance for a partner's links and banners. For a detailed description of the fields, see [Analytics](../promo/analytics/clicks). On this tab, you can view a partner's direct clients and sub-IB clients. For a detailed description of the fields, see [Clients](clients). On this tab, you can view a list of accounts of all partner's clients. For a detailed description of the fields, see [Accounts](../platforms/accounts). On this tab, you can view a partner's account deposit history. For a detailed description of the fields, see [Deposits](../platforms/deposits). On this tab, you can view a partner's account withdrawal history. For a detailed description of the fields, see [Withdrawals](../platforms/withdrawals). On this tab, you can view a partner's trading history. For a detailed description of the fields, see [Trades](../platforms/trades). On this tab, you can view the rewards paid to a partner. For a detailed description of the fields, see [Rewards](../payments/rewards). On this tab, you can view reports for paid rewards. Use the **Group by** option to view trades according to a specific timeframe (previous hour, day, week, month, year). To view trades over a custom timeframe, enter the **Period start** and **Period end** dates. For more details, refer to [Payment report](../reports/payment-report). **See also:** * [How to register a partner](../../how-to-articles/how-to-register-a-partner) * [How to block a partner](../../how-to-articles/how-to-block-a-partner) * [How to configure personal rewards](../../how-to-articles/how-to-configure-personal-rewards) * [How to configure a Master IB](../../how-to-articles/how-to-configure-a-master-ib) [^1]: Clients who signed up to the B2CORE UI by a referral link of a partner. [^2]: Key partners with personal conditions. To learn more, see [#master-ib](../../key-terms#master-ib "mention") On this page, you can reassign clients and sub-IBs from one Introducing Broker to another without manually exporting and importing IB-related data. The following options are available: * **Reassign All** — reassign all users from one IB to another. Specify the following fields: * **Source IB email** — the email address of the IB from which users are reassigned. * **New IB email** — the email address of the IB to which users are reassigned. * **Reassign One** — reassign an individual client or sub-IB to another IB. Specify the following fields: * **Client / Sub-IB email** — the email address of the client or sub-IB to be reassigned. * **Source IB email** — the email address of the IB from which the user is reassigned. * **New IB email** — the email address of the IB to which the user is reassigned. Click **Preview** to review the reassignment before applying it. ## Reassignment history [#reassignment-history] The list of performed reassignments is displayed below, providing the following information: **Type** The reassignment type: `Reassign All` or `Reassign One`. *** **Introducing brokers** The source and destination IBs of the reassignment. *** **Status** The current status of the reassignment. *** **Users** The number of reassigned users. *** **Created** The date and time when the reassignment was created. ## Type list [#type-list] View the following information for each program: **Name** The name of a partnership program. This is a link to [type details](types#type-details). *** **Levels** The number of levels[^1] configured for a partnership program. *** **Tiers** The number of tiers[^2] configured for a partnership program. *** **Introducing brokers** The number of partners participating in a program. *** **Direct clients** The number of your partners' [direct clients](#user-content-fn-3)[^3]. *** **Reward amount** The number of rewards paid to your partners. *** **Created** The date and time when a partnership program was created. ## Type details [#type-details] To access details, click the **type name** or . The page is divided into the following tabs: On this tab, you can view the partnership program settings. **Name** The name of a partnership program. *** **Description** The description of a partnership program. *** **Registration** The options of joining a partnership program. Possible values: * **Auto** — each client signing up to the B2CORE UI automatically becomes a partner. If multiple partnership programs are available, an IB account is created for each program. * **Inherited** — clients are added to a partnership program automatically, but only if the partner who referred them already participates in this program. If the referring partner doesn't participate, or a client signs up without a referral link, no IB account is created. The program isn't visible in the B2CORE UI, so clients can't apply for it. * **Private** — clients are added to a partnership program by a Back Office admin. * **Public** — clients can view available partnership programs in the B2CORE UI and choose which programs they join. * **Restricted** — clients can join a partnership program only using a link provided by a participant of another or the same program. The program identifier is indicated in the **Restriction** field. *** **Approvement** *Applicable only for Public or Restricted registration.* If **Enabled**, clients join a partnership program only after their [joining requests](#user-content-fn-4)[^4] are approved by a Back Office admin. *** **Masked email** If **Enabled**, client names and emails aren't visible to a partner. *** **Hidden levels** If **Yes**, all configured levels are displayed. Disabled by default. *** *** **Tier period** The number of days in which the targets set on the **Tiers** tab must be achieved by a partner to receive an increased reward. *** **Currency** The currency in which rewards to partners are paid. The currency is product-specific and can't be edited. *** **CPA Program** The CPA program assigned to this partnership program. Partners in this program will earn CPA rewards when their referred clients meet the CPA program conditions. Only active CPA programs are available for selection. If the assigned program is later deactivated, it remains linked to the partnership program and is marked as inactive. *** **Created** The date and time when a partnership program was created. On this tab, you can view all the available symbols on connected trading platforms. You can choose different [payment plans](../../payment-plans) for different symbols. Trading platforms can be connected and disconnected in the [Platforms](../platforms/) section. **Platform** The name of a trading platform. *** **Trading group** *Applicable only for MetaTrader 4, MetaTrader 5, cTrader.* The account group, as defined on the trading platform. *** **Symbol group** *Applicable only for MetaTrader 5.* The symbol group, as defined on the trading platform. *** **Symbol** The name of a symbol. This is a link to symbol details. *** **Payment plan** The [payment plan](../../payment-plans) set up for a symbol. *** **Position** The state of positions for which rewards are paid. Possible values: * Open * Closed * Open & Closed On this tab, you can view the configured levels. Define the number of partner levels to reward and specify the multiplier used for calculating rewards. Level 1 is created by default. Create an unlimited number of levels depending on your partnership program design. **Level** The sequence number of a level. *** **Ratio** The rewards multiplier. *** **Created** The date and time when a level was created. *** **Updated** The date and time when a level was last updated. On this tab, you can view configured tiers and define targets for your partners. **Name** The name of a tier. *** **Active traders** The number of clients that a partner must introduce to receive an increased reward. These clients should execute at least one trade during the specified **Tier period** to be considered active traders. If 0 (zero), this benchmark is ignored during calculation of rewards. *** **Trading volume, lots** The volume, in lots, that must be traded by partner's clients. If 0 (zero), this benchmark is ignored during calculation of rewards. *** **Ratio** The reward multiplier. *** **Created** The date and time when a tier was created. *** **Updated** The date and time when a tier was last updated. On this tab, you can view the rewards paid to your partners participating in this partnership program. For a detailed description of the fields, see [Rewards](../payments/rewards). On this tab, you can view reports on paid rewards. View trades for different time intervals (hour, day, week, month, years) or view trades according to partners. To view trades over a custom timeframe, enter the **Period start** and **Period end** times. For more details, refer to [Payment report](../reports/payment-report). **See also:** * [How to create an IB type](../../how-to-articles/how-to-create-an-ib-type) * [How to change an IB type for a partner](../../how-to-articles/how-to-change-an-ib-type-for-a-partner) [^1]: Levels determine how many participants in the chain from a partner to a trader receive a reward. To learn more, see [#level](../../key-terms#level "mention") [^2]: Goals to achieve for receiving increased rewarding. To learn more, see [#tier](../../key-terms#tier "mention") [^3]: Clients who signed up to the B2CORE UI by a referral link of a partner. [^4]: To learn more about client requests, refer to [B2CORE documentation](https://docs.b2core.b2broker.com/en/back-office-requests.html). The **Landings** section is not available in the Back Office. Landing pages are configured at the system level by your B2BROKER integration team and are used by partners in their IB Room. ## How landings work [#how-landings-work] In the current version of B2CORE IB, each instance has a single referral landing page configured at the system level. This is typically the registration page of your client portal. When a partner shares their referral link, it redirects the client to this landing page with the partner's unique token appended as a query parameter: ``` {scheme}://{host}{path}?{token}={partner_token} ``` For example: `https://my.example.com/register?referral=abc123` The following parameters are configured by your B2BROKER integration team: | Parameter | Description | Default | | --------------- | ---------------------------------------------------- | ----------- | | Scheme | Protocol used for the link | `https` | | Host | Domain of your client portal | — | | Path | Path to the registration page | `/register` | | Token parameter | Query parameter name that carries the referral token | `referral` | To configure or update these settings, contact your B2BROKER integration team. ## Partner view [#partner-view] Partners can see and copy their referral links in **IB Room → Promo → Links**. On that page, partners can also: * Select a landing page from the available options * Select a language * Add UTM parameters to their link * Generate a QR code for the link Using the **Acquisition report**, you can do the following: * Identify the partners whose clients have executed at least one trade during the reporting period. If the partner's clients haven't made any transactions for the selected period, such partners aren't included in the report. * Learn whether your referral links or promo banners are being clicked. * Assess different traffic sources and see from where new clients are coming (such as specific websites, social media or other venues). * Identify particular countries where the users who clicked your referral links are located. * View the number of clients who have completed registration after clicking your referral link or banner. * View the click conversion rate. The following filter parameters are available: * **Group by** — the criteria for grouping the filtered data. You can group the data by a country/region, referrer, partner or time period (spanning from one hour to a year). * **IB type** — the partnership program. * **Start date** — the beginning of the reporting period. * **End date** — the end of the reporting period. A report is generated automatically after applying filters. Above the report table, you can find **totals** calculated over a specified time period, along with trends obtained for the one preceding it. When exporting page data, the totals aren't included in the report file. The following data is displayed on this page: **Active partners** The number of new partners whose clients have executed at least one trade during the reporting period. *** **Clicks** The number of clicks. *** **Registrations** The number of registrations. *** **Click conversion rate** The number of registrations divided by the number of clicks, expressed as a percentage. It's calculated according to the following formula: **Registrations / Clicks × 100 %**. With a **Payment** report you can: * Spot the best performing traders generating the most revenue for you. * View the rewards paid to partners during a selected period of time. * Find out about the trading volume, both in lots and USD. To group and filter data, specify the following settings: * **Group by** — indicates whether to group data by partners or a time period * **IB type** — the partnership program * **Start date** — the beginning of a reporting period * **End date** — the end of a reporting period A report is generated automatically after applying filters. Above the report table, you can find **totals** calculated over a specified time period, along with trends obtained for the one preceding it. When exporting page data, the totals aren't included in the report file. The following data is available on this page: **Active partners** The number of new partners whose clients have executed at least one trade during the reporting period. *** **Active traders** The number of traders who have executed at least one rewarded trade. *** **Trades** The number of trades for which partners were rewarded. *** **Trading volume, lots** The volume of trades for which partners were rewarded, in lots. *** **Trading volume, USD** The volume of trades for which partners were rewarded, in USD. *** **Rewards** The rewards paid (and marked as *Credited*), in USD. Savings Rebates is disabled by default. Contact your B2BROKER integration team to enable it. A savings acquisition is created when a client referred by a partner enrolls in a savings program. The acquisition tracks savings activity events for that client. ## Acquisition list [#acquisition-list] View the following information for each savings acquisition: **Client ID** The unique identifier of the referred client. *** **Client Name** The name of the referred client. *** **Partner Name** The name of the partner who referred the client. *** **Partner User ID** The unique identifier of the partner who referred the client. *** **Savings Program** The savings program in which the client enrolled. *** **Events** The savings activity events recorded for this client, such as plan creation and deposits. *** **Created** The date and time when the acquisition was recorded. ## Sort data [#sort-data] Click the **Created** column header to sort acquisitions by creation date. Click again to toggle between ascending and descending order. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Savings Program** — select a program to display acquisitions for this program. * **Partner User ID** — enter a partner user ID to display acquisitions attributed to this partner. * **Date range** — select a start and end date to display acquisitions created during the specified period. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings programs](savings-programs) * [Savings payments](savings-payments) A savings payment is created when a partner earns a reward for a referred client's savings activity during a given period. ## Payment list [#payment-list] View the following information for each savings payment: **Partner User ID** The unique identifier of the partner who earned the reward. *** **Partner Name** The name of the partner who earned the reward. *** **Client ID** The unique identifier of the client whose savings activity generated the reward. *** **Savings Program** The savings program for which the reward was calculated. *** **Level** The program level at which the reward was calculated. *** **Period Date** The date of the period for which the reward was calculated. *** **Payment Amount** The reward amount. *** **Currency** The reward currency. *** **Status** The current status of a savings payment: * **Pending** — the reward has been calculated and is waiting to be processed. * **Processing** — the reward transfer is in progress. * **Processed** — the reward was successfully transferred to the partner's account. * **Succeeded** — the reward transfer was confirmed as successful. * **Failed** — the reward could not be transferred to the partner's account. * **Cancelled** — the reward was cancelled and will not be paid. *** **Created** The date and time when the savings payment was created. ## Filter data [#filter-data] You can filter the data displayed in the table using the following criteria: * **Partner User ID** — enter a partner user ID to display payments for this partner. * **Partner Name** — enter a partner name to display payments for this partner. * **Status** — select a status to display payments with this status. * **Period date range** — select a start and end date to display payments for periods within the specified range. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings programs](savings-programs) * [Savings acquisitions](savings-acquisitions) A savings program defines the conditions and reward rates under which partners earn rebates when their referred clients invest in savings plans. ## Program list [#program-list] View the following information for each savings program: **Name** The name of a savings program. Click the name to open the [program details](savings-programs#program-details). *** **Currency** The currency in which partner rewards are paid. *** **Active** Whether the savings program is active: * **Yes** — the program is active and partners can earn rewards. * **No** — the program is inactive and no new rewards are created. *** **Created** The date and time when a savings program was created. *** **Updated** The date and time when a savings program was last updated. ## Create a savings program [#create-a-savings-program] To create a savings program: 1. Click **Create**. 2. Fill in the required fields: * **Name** — enter a name for the program. * **Description** — optionally, enter a description. * **Currency** — select the currency in which partner rewards will be paid. 3. Click **Save**. After creating a program, add [levels](savings-programs#levels) to define the reward structure, then activate the program. Currency cannot be changed after the program is created. ## Edit a savings program [#edit-a-savings-program] To edit a savings program, click the **Edit** icon next to the program in the list. The following fields can be edited: * **Name** — the name of the program. * **Description** — the description of the program. ## Program details [#program-details] To access program details, click the **program name**. The page displays the program settings and the list of associated levels. ### Levels [#levels] Each savings program contains one or more levels. A level defines the reward rate a partner earns based on their referred clients' savings activity. View the following information for each level: **Level** The level number. *** **Reward Value** The reward rate, as a percentage applied to the client's savings amount. *** **Active** Whether the level is active. #### Add a level [#add-a-level] To add a level to a savings program: 1. Open the program details page. 2. In the **Levels** section, click **Create**. 3. Fill in the required fields: * **Level** — the level number. * **Reward Value** — the reward percentage. * **Active** — whether the level is active. 4. Click **Save**. #### Edit or delete a level [#edit-or-delete-a-level] Levels cannot be added, edited, or deleted while the savings program is active. Deactivate the program first. ### Activate a program [#activate-a-program] A savings program can only be activated if it has at least one active level. To activate a program, click **Activate**. To deactivate an active program, click **Deactivate**. Deactivating a program stops new rewards from being created but does not affect payments already in progress. ### Assign to a partner group [#assign-to-a-partner-group] A savings program must be assigned to a partner group to take effect. Partners in the group will earn savings rewards when their referred clients invest in savings plans. To assign a savings program to a partner group, go to **Program** → **Types**, open the group settings, and select the program in the **Savings Program** field on the **Preferences** tab. ## Filter data [#filter-data] You can filter the data displayed in the savings programs list using the following criteria: * **Name** — enter a program name to search for programs with a matching name. * **Active** — select a status to display active or inactive programs. * **Date range** — select a start and end date to display programs created during the specified period. After specifying custom filter criteria, click **Apply filters** to apply the changes. Click **Reset filters** to reset all filters. **See also:** * [Savings acquisitions](savings-acquisitions) * [Savings payments](savings-payments) {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} If the default list doesn't meet your partnership program requirements, you can add new countries using the **Create** button or modify them according to your preferences using the **pencil icon**. The following information is provided about each country: **Name** The name of a country. *** **Alpha-2 code** The two-letter country code, as per ISO 3166. *** **Alpha-3 code** The three-letter country code, as per ISO 3166. *** **Numeric code** The numeric country code, as per ISO 3166. *** **Geographic region** The geographic subregion, as per ISO 3166. *** **Created** The date and time when an entity was added. By default, you can use the service which determines the client's geolocation based on the IP address. You can edit the available geolocation services or add custom ones. ## Providers list [#providers-list] The following information is provided about each provider: **Priority** The provider priority. If you have multiple providers configured, data requests are sent based on their priority. If the highest priority provider doesn’t respond, the request moves to the next provider in line, continuing in this manner until the data is received. *** **Name** The name of a provider. This is a link to provider details. *** **Created** The date and time when a provider was added. ## Provider details [#provider-details] To access details, click the **provider name** or **pencil icon**. Here you can adjust provider settings. The page is divided into the following tabs: On this tab, you can view general information on a provider, as well as change its name and priority. On this tab, you can view general information on a database, including the number of records. On this tab, you can run diagnostics and check the connection to a provider, by clicking the **Test connection** button. View the following information for each attack: **IP Address** The client IP address from which an attack was registered. *** **Incidents** The number of failed attempts to obtain a token using invalid credentials. *** **Created** The date and time when an attack was registered. View the following information for each authentication: **IP Address** The client IP address from which the authentication was made. *** **Client ID** The client identifier. *** **User-Agent** The User-Agent data. *** **Created** The date and time when a user was authenticated. **Authorization** is a successful obtaining of an access token using provided credentials. View the following information for each authorization: **IP Address** The client IP address from which the authorization was made. *** **Client ID** The client identifier. *** **User-Agent** The User-Agent data. *** **Created** The date and time when a token was obtained. *** **Updated** The date and time when a token was last refreshed. *** **Expires** The date and time when a token expires. Any IP address from which multiple failed attempts to authorize are made is automatically blocked for a certain period of time. Such addresses are added to a blacklist, along with the IP addresses that were blocked manually. View the following blacklist settings: **Enabled** The current access permissions set for an IP address. *** **Auth attempts** The maximum number of attempts to authorize or authenticate made from an IP address before it's added to a blacklist. *** **Deny, seconds** The time period for which an IP address is blocked, in seconds. An **incident** is a failed attempt to obtain a token using invalid credentials. If the number of incidents exceeds the **Auth attempts** threshold set on the **Preferences** > **Security** > **Blacklist** page, it's classified as an [attack](attacks). View the following information for each incident: **IP Address** The client IP address from which an incident was registered. *** **User-Agent** The User-Agent data. *** **Fingerprint** The device fingerprint data. *** **Requests** The amount of failed attempts to obtain a token with invalid credentials. *** **Attack** Indicates whether the incident is considered an attack. *** **Created** The date and time when an incident was registered. View the following information for each IP address: **IP Address** The IP address. *** **Policy** The access policy. Possible values: * **allow** — access to the IB platform is allowed from this IP address. * **deny** — access to the IB platform is denied from this IP address. *** **Time to live** *(optional)* The time period for which a policy holds, in seconds. *** **Expires** The date and time when a policy expires. *** **Created** The date and time when a policy was added. Before enabling a whitelist, make sure **all** trusted IPs are assigned the **allow** policy on the **Preferences** > **Security** > **IP addresses** page. Set **Enabled** to **Yes** to allow access only from specific IP addresses and deny access from all other IPs. ## Click list [#click-list] View the following information for each click: **Date** The date and time when a click was made. This is a link to click details. *** **IP address** The IP address from which registration was completed. *** **Latitude**, **Longitude** The geographical coordinates of a newly registered client. *** **Country** The country of a newly registered client, according to the IP address. *** **Landing page** The landing page to which a referral link is pointing. *** **URL** The resource identifier. *** **UTM Campaign** The URI parameter that specifies an individual campaign name. *** **UTM Content** The URI parameter that’s used to differentiate similar content or links within the same ad. For example, if you have two call-to-action links within the same email message, you can use **UTM Content** and set different values for each so you can tell which version is more effective. *** **UTM Medium** The URI parameter that specifies advertising or marketing media, for example: cpc, banner, email. *** **UTM Source** The URI parameter that identifies an advertiser, site, publication, that’s sending traffic to your property, for example: google, youtube. *** **UTM Term** The URI parameter that identifies paid search keywords. *** **Referrer** An HTTP header identifying the address of a web page from which a resource was requested. *** **User-Agent** The User-Agent data, which may include optional comments. *** **Client ID** The link to a client's profile in the B2CORE UI. *** **Client name** The name of a newly registered client. *** **Contact email** The email of a newly registered client. *** **Country of residence** The country specified by a client during registration. *** **Registration** The status of a client registration request. ## Click details [#click-details] To access details, click the **Date** or . A banner you create is automatically made available to every partner of the corresponding partnership program — there is currently no way to restrict a banner to specific partners or partner groups. ## Banner list [#banner-list] View the following information for each banner: **Banner** The thumbnail banner image. *** **Name** The banner name. *** **Language** The banner [language](languages). *** **Size** The banner [size](sizes). *** **Theme** The banner [theme](themes). *** **Clicks** The number of times a banner was clicked. *** **Registrations** The number of clients registered after clicking a banner. A click is only counted once the banner is actually rendered and loaded on a page a visitor opens — navigating to the banner's landing page URL directly (without the banner itself being displayed) is not counted as a click and does not produce a registration or partner attribution. *** **Click conversion rate** The click conversion rate, which is the number of registrations divided by the number of clicks, expressed as a percentage. *** **Created** The date and time when a banner was created. ## Banner details [#banner-details] To access details, click the **banner name** or . Here you can view and customize banner settings. **Name** The banner name. This value can be modified. *** **Language** The banner language. This value can be modified. *** **Size** The banner size. This value can be modified. *** **Theme** The banner theme. This value can be modified. *** **CDN Image URL** The CDN URL pointing to a banner along with a banner image. This value can be modified. *** **Clicks** The number of times a banner was clicked. *** **Registrations** The number of clients registered after clicking a banner. *** **Click conversion rate** The click conversion rate, which is the number of registrations divided by the number of clicks, expressed as a percentage. *** **Created** The date and time when a banner was created. *** **Updated** The date and time when a banner was last updated. ## Language list [#language-list] View the following information for each language: **Language** The language name. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was added. ## Language details [#language-details] To access details, click the language name or . Here you can view and customize language settings. **Name** The language name. This value can be modified. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was created. *** **Updated** The date and time when a language was last updated. ## Size list [#size-list] View the following information for each language: **Size** The size name. *** **Banners** The number of banners of this size. *** **Created** The date and time when a size was added. ## Size details [#size-details] To access details, click the size name or . Here you can view and customize size settings. **Width** The banner width. This value can be modified. *** **Height** The banner height. This value can be modified. *** **Banners** The number of banners in a language. *** **Created** The date and time when a language was created. *** **Updated** The date and time when a language was last updated. ## Theme list [#theme-list] View the following information for each theme: **Theme** The theme name. *** **Created** The date and time when a theme was created. *** **Banners** The number of banners added to a theme. ## Theme details [#theme-details] To access details, click the theme name or . Here you can view and customize theme settings. **Name** The theme name. This value can be modified. *** **Banners** The number of banners added to a theme. *** **Created** The date and time when a theme was created. *** **Updated** The date and time when a theme was last updated. ## Color list [#color-list] View the following information for each color: **Priority** The priority that defines the order in which colors are listed in the B2CORE UI. *** **Name** The color name. *** **Background color** The HEX code of a background color. *** **Foreground color** The HEX code of a foreground color. *** **Created** The date and time when a color was added. ## Color details [#color-details] To access details, click the color name or . Here you can view and customize color settings. **Name** The color name. This value can be modified. *** **Priority** The priority that defines the order in which colors are listed in the B2CORE UI. This value can be modified. *** **Background color** The HEX code of a background color. This value can be modified. *** **Foreground color** The HEX code of a foreground color. This value can be modified. *** **Created** The date and time when a color was added. *** **Updated** The date and time when a color was last updated. ## Icon list [#icon-list] View the following information for each color: **Priority** The priority that defines the order in which icons are listed in the B2CORE UI. *** **Icon** The thumbnail icon image. *** **Name** The icon name. *** **Created** The date and time when an icon was added. ## Icon details [#icon-details] To access details, click the icon name or . Here you can view and customize icon settings. **Name** The icon name. This value can be modified. *** **Priority** The priority that defines the order in which icons are listed in the B2CORE UI. This value can be modified. *** **Icon** The icon image. *** **Created** The date and time when an icon was added. *** **Updated** The date and time when an icon was last updated. {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} {/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} ## General information [#general-information] The B2CONNECT FIX server provides all the functionality necessary for real-time trading and receiving up-to-date market information via the Financial Information eXchange protocol. In this document, you can find a detailed description of the B2CONNECT FIX API, including the information about how to connect to a demo FIX server. The B2CONNECT FIX API is based on the version 4.4 of the Financial Information eXchange protocol. It’s assumed that the reader of this document is already familiar with the FIX protocol. To learn more about the protocol specification, see the [FIX Trading Community website](https://www.fixtrading.org/). If your trading engine is powered by Go, take a minute to learn about [SimpleFix Go](https://github.com/b2broker/simplefix-go/). This open-source library is provided by the B2CONNECT team to help you quickly integrate FIX messaging into your environment. The library is entirely written in Go and supports any FIX API version. ### Supported message types [#supported-message-types] The following message types can be assigned to the `<35> MsgType` field of a [Standard header](fix-api#standard-header): * `0` — [Heartbeat](fix-api#heartbeat) (Client ↔ B2CONNECT) * `1` — [Test Request](fix-api#test-request) (Client ↔ B2CONNECT) * `2` — [Resend Request](fix-api#resend-request) (Client ↔ B2CONNECT) * `3` — [Reject](fix-api#reject) (Client ← B2CONNECT) * `4` — [Sequence Reset](fix-api#sequence-reset) (Client ↔ B2CONNECT) * `5` — [Logout](fix-api#logout) (Client ↔ B2CONNECT) * `8` — [Execution Report](fix-api#execution-report) (Client ← B2CONNECT) * `9` — [Order Cancel Reject](fix-api#order-cancel-reject) (Client ← B2CONNECT) * `A` — [Logon](fix-api#logon) (Client → B2CONNECT) * `D` — [New Order Single](fix-api#new-order-single) (Client → B2CONNECT) * `F` — [Order Cancel Request](fix-api#order-cancel-request) (Client → B2CONNECT) * `V` — [Market Data Request](fix-api#market-data-request) (Client → B2CONNECT) * `W` — [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) (Client ← B2CONNECT) * `Y` — [Market Data Request Reject](fix-api#market-data-request-reject) (Client ← B2CONNECT) ### Standard header [#standard-header] All FIX messages must start with a **Standard header**. The **Standard header** includes the following fields: ### Standard trailer [#standard-trailer] Along with a Standard header, all FIX messages must also contain a **Standard trailer**. The **Standard trailer** includes the following fields: ## Session messages [#session-messages] The messages listed in this section are used to maintain any live FIX session with the B2CONNECT FIX server, including both [quoting](fix-api#quoting) and [trading](fix-api#trading) sessions. ### Heartbeat [#heartbeat] This message is sent back and forth between the FIX server and the client to check the connection status and in response to [Test Request](fix-api#test-request) messages. The **Heartbeat** message includes the following fields: ### Test Request [#test-request] This message is sent back and forth between the FIX server and the client in response to [Heartbeat](fix-api#heartbeat) messages as a means of connectivity check. The **Test Request** message includes the following fields: ### Resend Request [#resend-request] This message is sent by the client or FIX server to initiate the retransmission of messages, which may be required upon detecting a gap in the sequence numbers or losing a particular message. The **Resend Request** message includes the following fields: ### Reject [#reject] This message is sent by the FIX server upon receiving a malformed message from the client. The possible reason for rejection is specified in the `<373> SessionRejectReason` field. This message is unrelated to a trade-level rejection ([Order Cancel Reject](fix-api#order-cancel-reject)) issued when a FIX server is unable to place a requested order. The **Reject** message includes the following fields: #### Possible reasons [#possible-reasons] When the FIX server sends a [Reject](fix-api#reject) notification informing the client that a session-level request has been rejected, the `<373> SessionRejectReason` field can be set to one of the following values specifying the reason for message rejection: * `0` — an invalid tag number * `1` — a required tag is missing * `2` — a tag isn’t defined for this message type * `3` — a tag is undefined * `4` — a tag has no value assigned * `5` — an assigned value is incorrect (out of range) for this tag * `6` — an incorrect value data format * `7` — an issue related to decryption * `9` — an issue related to `CompID` * `10` — an accuracy issue related to `<52> SendingTime` * `11` — an invalid `<35> MsgType` * `12` — an XML validation error * `13` — the same tag appears more than once * `14` — a tag is specified not in the required order * `15` — a wrong order of repeating group fields * `17` — a non-“Data” value includes a field delimiter (an SOH character) * `99` — other (unspecified) reason ### Sequence Reset [#sequence-reset] This message is sent by the client or FIX server to indicate to the recipient the sequence number of the next message from the sender, immediately following the Sequence Reset message. This may be necessary to recover from a disconnect, in case if some messages were lost or their resending is not desirable. The **Sequence Reset** message includes the following fields: ### Logon [#logon] This message is sent by the client to initiate a FIX session. The **Logon** message includes the following fields: ### Logout [#logout] This message is sent by the client or FIX server to terminate a session. When terminated, the possible reason is specified in the `<58> Text` field. The **Logout** message includes the following fields: ## Demo mode [#demo-mode] The B2CONNECT FIX server supports a Demo mode that allows clients to establish a test connection and simulate quoting and trading sessions. Contact your account manager to obtain a set of settings and credentials. ## Quoting [#quoting] After connecting to the FIX server and establishing a live quoting session, the client can send a [Market Data Request](fix-api#market-data-request) to subscribe to quote updates streamed by B2CONNECT. To subscribe to multiple symbols, the client should send a separate [Market Data Request](fix-api#market-data-request) for each symbol. Upon successful subscription to a selected symbol, the FIX server starts streaming market data updates by sending [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) messages each time the market data is updated. The quote updates are streamed continuously for the entire duration of a FIX session. If a subscription request can’t be executed for some reason (for example, when a requested symbol isn’t found), the FIX server responds with a [Market Data Request Reject](fix-api#market-data-request-reject) message providing detailed information about an error. To terminate a specific subscription and stop receiving the updates, the client can send a [Market Data Request](fix-api#market-data-request) with the `<263> SubscriptionRequestType` set to `2` (standing for “Unsubscribe”). Upon sending a [Logout](fix-api#logout) request, the current session is closed and subscriptions to all ticker symbols are terminated. ### Market Data Request [#market-data-request] This message is sent by the client to start receiving up-to-date quoting data for a specified ticker symbol. The **Market Data Request** message includes the following fields: ### Market Data Request Reject [#market-data-request-reject] This message is sent by the FIX server to reject a [Market Data Request](fix-api#market-data-request) with invalid values. The **Market Data Request Reject** message includes the following fields: #### Possible reasons [#possible-reasons-1] The `<281> MDReqRejReason` field can be set to one of the following values specifying the reason for request rejection: * `0` — the specified symbol isn’t recognized * `1` — a duplicate `<262> MDReqID` * `2` — insufficient bandwidth * `3` — insufficient permissions * `4` — the specified `<263> SubscriptionRequestType` isn’t supported * `5` — the specified `<264> MarketDepth` isn’t supported * `6` — the specified `<265> MDUpdateType` isn’t supported * `8` — the specified `<269> MDEntryType` isn’t supported ### Market Data — Snapshot/Full Refresh [#market-data--snapshotfull-refresh] Such messages are continuously sent by the FIX server after the client subscribes to a ticker symbol. A new message is sent with each market data update. The **Market Data — Snapshot/Full Refresh** message includes the following fields: ## Trading [#trading] **Place an order** After establishing a trading session with the FIX server, the client can place a new order by sending a [New Order Single](fix-api#new-order-single) message. In response to this, the FIX server sends back an [Execution Report](https://docs.b2connect.b2broker.com/en/fix-api.html#execution-report) with the `<150> ExecType` field set to `A`, indicating that the order is placed successfully. If the order can’t be placed (for example, due to lack of credit funds or other issues), the report is sent with `<150> ExecType` set to `8`. After placing the order, the FIX server sends a separate report with `<150> ExecType` set to `F` each the order status changes: * If the order is executed partially, `<39> OrdStatus` is set to `1`. * When the order is fully filled, `<39> OrdStatus` is set to `2`. **Cancel an order** To cancel an open order, the client can send an [Order Cancel Request](fix-api#order-cancel-request). If the order is canceled (either explicitly by a trader, or automatically due to timeout), the [Execution Report](fix-api#execution-report) is sent with `<150> ExecType` set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled, and `<151> LeavesQty` indicates the unfilled amount. If an order can’t be canceled for any reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. ### New Order Single [#new-order-single] This message is sent by the client to place a new order with specified parameters. The **New Order Single** message includes the following fields: ### Order Cancel Request [#order-cancel-request] This message is sent by the client to cancel an open order in its entire remaining amount. This request is assigned a unique `<11> ClOrdID` and is treated as a separate order. Upon successful cancellation of the order, an [Execution Report](fix-api#execution-report) is sent with the `<39> OrdStatus` field set to `4`. In this case, the `<14> CumQty` field indicates the amount that has already been filled by the time the order was canceled. If the order can’t be canceled for some reason, the FIX server sends back an [Order Cancel Reject](fix-api#order-cancel-reject) message indicating why the order cancellation failed. The **Order Cancel Request** message includes the following fields: ### Order Cancel Reject [#order-cancel-reject] This message is sent by the FIX server upon receiving an [Order Cancel Request](fix-api#order-cancel-request) that can’t be fulfilled. The **Order Cancel Reject** message includes the following fields: ### Execution Report [#execution-report] This message is sent by the FIX server upon successfully placing or cancelling an order, or any change to the order status (such as a complete or partial execution). Among other data, the report indicates: * the current order status at the moment of report creation (`<39> OrdStatus`) * the most recent change in the order status, which is being reported (`<150> ExecType`) The **Execution Report** message includes the following fields: Explore the liquidity providers and FIX platforms supported by B2CONNECT Explore the liquidity providers and FIX platforms supported by B2CONNECT Find step-by-step instructions on most common user scenarios Find step-by-step instructions on most common user scenarios Explore the B2CONNECT FIX API reference Explore the B2CONNECT FIX API reference ## August 31, 2026 [#august-31-2026] ### New features [#new-features] #### Monthly traded volume reports [#monthly-traded-volume-reports] Following the daily turnover reports introduced in the previous release, **B2CONNECT** now also produces a monthly notional **Turnover Report** for each hub and delivers it to the Slack channels and email addresses of your choice, with the CSV and PDF attached to the message itself. The monthly report covers a full calendar month and uses the same breakdown as the daily one: traded volume per trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators set the monthly publication time per hub alongside the daily schedule, produce a report for any past month on demand with **Publish now**, and re-download earlier months from the report archive. Where the daily report keeps reporting teams current on activity, the monthly report gives management, finance, and account managers the period figures they reconcile and invoice against — replacing the month-end roundups these teams previously assembled by hand. If a month isn't yet fully covered by the platform's data, the report says so explicitly, so a partial period is never mistaken for a complete one. #### Multiple margin accounts on one FIX connector [#multiple-margin-accounts-on-one-fix-connector] A single FIX connector can now serve many margin accounts on a hub. The taker platform names the account on each order in the standard FIX **Account** field (Tag 1), **B2CONNECT** routes the order to the matching margin account, and returns the same value on every execution report. Previously, every margin account needed a FIX connector of its own. A platform running several White Labels, or serving a large number of end clients, can now keep them all on one connector, with each account's positions, margin, and commissions kept entirely separate. The client reference sent with an order (Tag 526) is now carried through to reporting as well. It is stored with the execution and appears in the **Trading Report** under **Hub Reports**, so back-office and reconciliation teams can trace any fill back to the end client that placed it. #### Pegged-price instruments [#pegged-price-instruments] **B2CONNECT** now supports instruments priced at a fixed rate against another instrument instead of from live venue quotes. The rate is configured once, and the platform publishes it continuously, refreshing the order book on a short cycle so connected platforms always receive a current price. This turns what previously called for a bespoke deployment into a standard configuration option — most commonly for stablecoins held at parity with their reference currency, and for any instrument a platform chooses to offer at an administered rate. *** ### Improvements [#improvements] #### Reporting built for the highest trading volumes [#reporting-built-for-the-highest-trading-volumes] The reporting layer's data intake has been reworked to keep up with the busiest hubs. Balance and completed-order data is collected in batches in the same way as execution data, so reports stay current even when a hub is at peak activity, and the highest-volume platforms no longer need to weigh reporting coverage against throughput. Order identifiers have also been unified across the platform: the identifier assigned when an order reaches the hub is now the same one that appears in **Hub Reports**. Back-office teams reconciling a report against their own records work from one identifier throughout, with no cross-referencing between two numbering schemes. #### Steadier operation through brief internal interruptions [#steadier-operation-through-brief-internal-interruptions] **B2CONNECT** services now ride out short interruptions to the platform's internal messaging and reconnect on their own, rather than restarting. Quoting, trading, and reporting services all behave this way, so a momentary infrastructure hiccup no longer turns into a visible restart on a live hub. #### Clearer feedback when uploading a configuration [#clearer-feedback-when-uploading-a-configuration] When an instance configuration file is uploaded in the **B2CONNECT** Web UI, validation errors are now reported in full, naming what in the file needs attention. Administrators previously saw only a generic server error and had to find the cause themselves. *** ### Resolved issues [#resolved-issues] * Resolved two issues affecting hedge accuracy in **Systematic Hedging**. In certain scenarios, a hedge amount was rounded to the instrument's decimal precision rather than to the increment the liquidity provider actually accepts, and a partially filled hedge on the external leg could be booked internally in full instead of proportionally. Hedge sizes now follow each provider's increment, and partial fills are booked in proportion to what was filled. * Resolved two issues that could occasionally cause a fill to be counted twice, or an already-applied fill to be reversed, when the platform re-processed an internal message. Every fill is now identified uniquely, so positions and profit and loss remain accurate. ## July 30, 2026 [#july-30-2026] ### New features [#new-features-1] #### Daily turnover reports delivered to Slack and email [#daily-turnover-reports-delivered-to-slack-and-email] B2CONNECT now produces a Turnover Report for each hub automatically, once a day, and delivers it to the Slack channels and email addresses of your choice. Both the CSV and the PDF arrive as ready-to-open attachments on the message itself, so recipients read the report without opening the Web UI or holding platform credentials. Daily volume becomes visible to management, account managers, and back-office teams alike. Each report covers the previous trading day and breaks traded volume down by trading instrument, asset class, and quote currency, showing bought and sold volume for each, followed by totals per quote currency. Administrators control delivery from the B2CONNECT Web UI: * Set the daily publication time for each hub, or switch the schedule off. * Produce a report on demand with **Publish now**. * Subscribe Slack channels and email recipients under **Business notifications**, alongside the platform's other notifications. * Re-download any past report from the report archive. This is the next step in the rollout of **TRAM** (Tracking, Reporting, Alerting, and Monitoring), the unified reporting and observability layer that brought **Hub Reports** to the Web UI in the April release. Where Hub Reports covers reports requested on demand for individual margin accounts, daily turnover reporting replaces the manual, spreadsheet-based volume roundups that reporting teams previously assembled by hand. #### HTX USDT-M Futures upgraded to API V5 [#htx-usdt-m-futures-upgraded-to-api-v5] B2CONNECT has been upgraded to HTX API V5 for USDT-M perpetual futures across the full path: market data, funding data, symbol information, and trading. HTX has retired the legacy API behind these instruments, so the upgrade keeps this liquidity available on a supported interface. Brokers sourcing HTX perpetual futures liquidity through B2CONNECT keep uninterrupted market data and order flow, with no action required on their side. B2CONNECT now also confirms the collateral mode on every HTX connection when it starts, so a change made to the account on the exchange side can no longer cause order placement to fail without an evident cause. *** ### Improvements [#improvements-1] #### More efficient liquidity provider connections [#more-efficient-liquidity-provider-connections] Liquidity provider connections on a hub now make more efficient use of its infrastructure, while each connection stays isolated from the others and is monitored independently. A new liquidity provider also goes live sooner. The change is being enabled progressively. #### Order recovery after an interruption [#order-recovery-after-an-interruption] After a connection to a liquidity venue is interrupted, B2CONNECT now sizes its recovery request to the length of the interruption instead of using a fixed window, so orders placed during a longer outage are still picked up and reconciled. *** ### Resolved issues [#resolved-issues-1] The issues below occurred infrequently and only under specific conditions. Some may have affected production environments; most were identified in testing before they could. * Resolved an issue where, in rare cases, the connection to a liquidity venue did not re-establish itself after a network drop, leaving the affected instruments without fresh quotes until the service was restarted. Connections now detect a silent drop on their own, reconnect, and restore every affected instrument. * Resolved two issues that could occasionally leave funding data for perpetual futures failing after an instrument's mapping changed. Quotes recovered on their own, but funding rate, mark price, and funding interval could remain affected. Funding data now follows mapping changes as quotes do. * Resolved two issues affecting connection setup and quote acceptance in certain scenarios: a liquidity provider credentials element was rejected as too long when configuring a connection, and quotes for certain FX instruments arriving from a liquidity aggregator hub were rejected because of a mismatch in how the quote's entry count was determined. ## June 29, 2026 [#june-29-2026] ### Improvements [#improvements-2] #### Systematic Hedging under high-frequency flow [#systematic-hedging-under-high-frequency-flow] Systematic Hedging, introduced in the previous release, has been hardened to stay reliable under high-frequency, high-volume flow such as copy-trading and HFT bursts. B2CONNECT shapes the incoming client flow so that only the residual net position is routed to each liquidity provider (LP), keeping order placement comfortably within venue API rate limits even during tick storms. In the B2CONNECT Web UI, the real-time Risk Status view and its cumulative order-accumulation status bar now update accurately at very high request rates, so risk teams keep a precise, live picture of how exposure is building and when it will hedge. #### More flexible symbol and instrument naming [#more-flexible-symbol-and-instrument-naming] The liquidity aggregator integration now supports independent taker-side and maker-side symbols. Previously both legs shared a single venue name, causing a platform to distribute the LP’s symbols to the FIX clients. B2CONNECT now resolves the incoming FIX symbol against a dedicated taker symbol and maps it to the liquidity aggregator catalog name separately — so brokers can keep their own client-facing symbology regardless of an LP’s naming. Asset and trading instrument names can now also include the ampersand (`&`) character. Such symbol names are accepted directly, removing the previous need to substitute `AND`. #### Reduced noise from stale-liquidity alerts [#reduced-noise-from-stale-liquidity-alerts] Stale-liquidity alerts triggered by delisted symbols now fire once instead of repeating, cutting alert noise for monitoring teams when a venue delists an instrument. *** ### Resolved issues [#resolved-issues-2] * Resolved an issue where a market-data subscription on WebSocket liquidity venues (such as Kraken, Huobi, and Binance) could remain silent after a connector reconnect, leaving the affected symbols without fresh quotes — and FIX clients receiving only invalidations — until the connector was restarted. Such subscriptions now recover automatically. * Resolved an issue in the liquidity aggregator integration where a transient quote-cancel message was treated as a permanent subscription rejection, silently stopping quote publishing for the symbol until a restart. Transient cancels no longer drop the subscription, so streaming resumes as soon as the venue sends the next quote. ## May 29, 2026 [#may-29-2026] ### New features [#new-features-2] #### Systematic Hedging [#systematic-hedging] **B2CONNECT** introduces **Systematic Hedging**, a new execution option that complements — and does not replace — standard straight-through processing (STP). When enabled for a symbol, **B2CONNECT** aggregates incoming client flow into a managed risk position, nets opposing buy and sell volume, and hedges only the net residual to the liquidity provider (LP). This gives risk teams tighter control over exposure and lower execution costs. And because only net positions are hedged, platforms send far fewer orders to their LPs — staying comfortably within API rate limits and easing the load on each provider, so every LP connection goes further. Hedging stays fully under the risk team's control and is set per symbol: trigger by accumulated volume, a timer, a schedule, or manually; tune the hedge ratio and lock-routing behavior; or keep routing large orders straight through. The **B2CONNECT** Web UI adds a **Symbol Hedging Configuration** page, a real-time **Risk Status** page, and a master toggle, and risk-position state is restored automatically after any restart — so exposure is never lost or double-counted. #### B2CORE integration [#b2core-integration] **B2CONNECT** now integrates with **B2CORE**, the **B2BROKER** ecosystem's CRM — the centralized control center for a brokerage's front-end client experience and back-end administrative operations. By connecting margin accounts on the **B2CONNECT** hub directly to **B2CORE**, the integration gives B2B clients who power their trading platforms with **B2CONNECT** seamless account onboarding and a streamlined day-to-day experience, with account creation, funding, and balance management all handled from one control center. It also puts the wider advantages of the **B2BROKER** ecosystem within reach on a single, connected stack. Administrators set up and manage the connection from a new **B2CORE Integration** page in the **B2CONNECT** Web UI. #### Tiered commission profiles [#tiered-commission-profiles] **B2CONNECT** now supports **tiered commission profiles**, which automatically lower the commission rate as an account's traded volume grows. Administrators define volume thresholds and the rate that applies beyond each one; **B2CONNECT** tracks cumulative volume over the chosen period — for example, a calendar month — and steps the rate down as each threshold is reached, including on liquidation orders. For brokers, this turns growing volume into lower costs: the more flow through the hub, the lower their own per-trade commission — rewarding scale and protecting margins as the business grows. *** ### Resolved issues [#resolved-issues-3] There have been no customer-facing issues reported in this release. ## April 30, 2026 [#april-30-2026] ### New features [#new-features-3] #### Tiered margin profiles [#tiered-margin-profiles] **B2CONNECT** now supports tiered margin profiles, allowing Administrators to apply different margin rates to different slices of an account's notional exposure. Each profile can define up to five threshold–rate pairs per symbol, so brokers can mirror the bracketed margin schedules used by major liquidity providers — without falling back on inflated blanket rates that deter retail traders or on manual, position-by-position adjustments. This delivers predictable, schedule-aligned leverage on every tranche of a client's position and removes a recurring source of operational overhead for risk and operations teams. #### Hub Reports under TRAM [#hub-reports-under-tram] A new **Hub Reports** section is now available under **TRAM** (Tracking, Reporting, Alerting, and Monitoring) in the **B2CONNECT** Web UI, bringing reporting for margin accounts together in a single place. Back-office operators can request, track, and download reports directly from the platform — an important milestone in the rollout of TRAM, the unified reporting and observability layer for B2CONNECT. The initial release of Hub Reports ships with three reports: * **Consolidation Statement** — a complete picture of an account's activity and exposure for any reporting period, including opening and closing balances, deposits, withdrawals, fees, opening and closing equity, unrealized PnL, used and free margin, margin utilization, and a dedicated **Open Positions** section listing each position's symbol, direction, average price, unrealized PnL, and margin. Account names are populated automatically, so each statement is clearly attributed. * **Trading Report** — per-trade execution details for one or more margin accounts over a chosen date range, delivered as a CSV. Each row includes the connection used, taker login and order identifiers, executed price and volume, and commission, giving back-office and reconciliation teams everything they need to audit individual fills. * **Turnover (Traded Volume) Report** — aggregated traded volume per account and per symbol for the selected period, supporting fee schedules, rebate calculations, and periodic client reviews. *** ### Improvements [#improvements-3] #### Binance Futures WebSocket endpoints [#binance-futures-websocket-endpoints] **B2CONNECT** has been migrated to **Binance**'s new WebSocket URL architecture for perpetual futures, which separates traffic into dedicated public, market, and private channels. Brokers connecting to Binance Futures via B2CONNECT will continue to receive uninterrupted market data and order updates after Binance retires the legacy WebSocket URLs on **2026-04-23**, with no action required on the broker's side. #### Stream update reliability for Incoming Connectors [#stream-update-reliability-for-incoming-connectors] Subscription updates on **Incoming Connectors** are now more resilient under load. The platform allows more time for new streams to take effect and automatically retries on transient failures, preventing the rare cases where a slow update could leave a maker's symbols without fresh quotes until the next resubscription cycle. *** ### Resolved issues [#resolved-issues-4] * Resolved a consistency issue in the oneZero quoting integration where unsubscribing and immediately resubscribing to a symbol could occasionally fail with a duplicate-request error, leaving the symbol without market data until the next resubscription cycle. Resubscriptions are now handled atomically. ## March 2, 2026 [#march-2-2026] ### New features [#new-features-4] #### Automatic account liquidation on stop-out [#automatic-account-liquidation-on-stop-out] **B2CONNECT** now automatically liquidates open positions when an account's equity falls to the stop-out level, eliminating the need for manual intervention during margin events. The liquidation process executes iteratively — the system sends liquidation orders for all active positions, waits for each to reach a final state, and then evaluates whether the account has recovered before scheduling the next iteration. If the account's margin recovers above the stop-out threshold at any point, liquidation halts immediately. The engine is designed for operational reliability: if a restart occurs mid-liquidation, the process resumes safely without duplicating or missing orders. Execution uses live market pricing to ensure liquidation orders reflect current conditions, preventing margin miscalculations during volatile periods. The waiting period before liquidation begins and the retry policy between iterations are configurable. *** ### Improvements [#improvements-4] #### Account cache reliability [#account-cache-reliability] The account management system now supports per-account cache reinitialization. When a cache error is detected, only the affected account's state is rebuilt rather than triggering a broader reset. This targeted recovery approach improves stability and reduces the potential for stale account data to affect margin calculations or order routing during error-recovery scenarios. *** ### Resolved issues [#resolved-issues-5] There have been no customer-facing issues reported in this release. ## February 27, 2026 [#february-27-2026] ### New features [#new-features-5] #### New B2CONNECT website and deep Insights [#new-b2connect-website-and-deep-insights] This February release is dedicated to documentation updates. Alongside the ongoing expansion of our integrations-related docs, we've launched the new **B2CONNECT** product website and introduced the **Insights** section— deep-dive articles aimed at brokers, exchanges, and liquidity providers building multi-asset liquidity infrastructure. *** ### Improvements [#improvements-5] #### Liquidity engine performance, stability, and security enhancements [#liquidity-engine-performance-stability-and-security-enhancements] We've delivered a set of improvements across the quoting and trading engine to increase overall performance and operational robustness. These updates include several security and stability hardening primarily related to the underlying technology stack and runtime components that support core execution workflows. *** ### Resolved issues [#resolved-issues-6] There have been no customer-facing issues reported in this release. ## January 30, 2026 [#january-30-2026] ### New features [#new-features-6] #### Incoming Connectors: Trading Settings tab [#incoming-connectors-trading-settings-tab] A new dedicated **Trading Settings** tab is now available for Incoming Connectors, allowing the Hub Administrators to configure symbols directly within the connector setup. This streamlines onboarding of new liquidity providers and simplifies ongoing symbol configuration and updates. *** ### Improvements [#improvements-6] #### Improved FIX credentials compatibility [#improved-fix-credentials-compatibility] FIX credential settings for supported liquidity aggregators are now more aligned with the standard FIX naming convention, ensuring more consistent configuration and reducing setup friction. #### More descriptive error messages [#more-descriptive-error-messages] Incoming Connector pages now display clearer, human-readable error messages in two common cases: when credential validation fails, and when the Administrator tries to enable trading for a symbol that’s disabled in Hub settings. These messages help identify the issues, so troubleshooting is more straightforward. *** ### Resolved issues [#resolved-issues-7] * Generated FIX credentials no longer start with an underscore in `SenderID` or `TargetID`, resolving compatibility issues with counterparties that reject such values. ## December 22, 2025 [#december-22-2025] ### New features [#new-features-7] #### Perpetuals data over FIX: funding rate, mark price & funding interval [#perpetuals-data-over-fix-funding-rate-mark-price--funding-interval] B2CONNECT now enriches FIX market‑data streams with `FundingRate`, `MarkPrice`, and `FundingInterval` fields, allowing any FIX‑compatible platform to price and offer perpetual futures out of the box. These parameters are delivered alongside standard quote updates in the FIX contract, eliminating the need for custom side channels or additional integrations to pass funding data. #### Interest on idle cash and unused margin (AMS) [#interest-on-idle-cash-and-unused-margin-ams] The **AMS** module now supports paying interest on idle cash and unused margin via dedicated **Interest rate profiles** in the Web UI. Administrators can configure per‑asset interest rates and a daily posting time in UTC; B2CONNECT then accrues interest automatically and posts it once per day as separate **Interest** transactions on client accounts. Brokers, exchanges, and other trading platforms are empowered to create a clear incentive for end-users (traders) to keep extra funds in their accounts, strengthening client retention and serving as a strong competitive differentiator. *** ### Improvements [#improvements-7] #### Maker credentials management inside Incoming Connectors [#maker-credentials-management-inside-incoming-connectors] Trading and quoting Maker credentials are now configured directly within each Incoming Connector. Administrators can add, revoke, and review credentials in the same place where they manage the connection, reducing context switching and keeping connectivity and access control aligned per connector. #### Target maker [#target-maker] A new **Target maker** control has been added to the Incoming Connectors page, making it straightforward to set or review which maker is currently used for routing. This improves transparency around active maker selection and simplifies switching and validating liquidity sources. *** ### Resolved issues [#resolved-issues-8] There have been no customer-facing issues reported in this release. ## October 30, 2025 [#october-30-2025] ### New features [#new-features-8] #### New docs section: Supported FIX platforms [#new-docs-section-supported-fix-platforms] With this release, we’ve added a new [FIX platforms](supported-venues/fix-platforms) section to our documentation, showcasing trading platforms compatible with B2CONNECT via the **FIX protocol**. This new catalog includes baseline configuration guides and is linked to our FIX API reference. Integration teams can now quickly verify FIX compatibility and access the appropriate configuration templates from a single location, streamlining the setup process. *** ### Improvements [#improvements-8] #### Deep order recovery on LP disconnects [#deep-order-recovery-on-lp-disconnects] We’ve moved from a conservative recent‑orders snapshot to a controlled step‑by‑step rebuild that thoroughly recovers pending orders after a disconnect. As before, requests respect each Liquidity Provider’s API limits; the updated pacing keeps us right at the safe edge, delivering a far higher recovery count without triggering rate‑limit bans. Expect more complete catch‑ups on high count bursts and during volatile periods. *** ### Resolved issues [#resolved-issues-9] There have been no customer-facing issues reported in this release. ## September 30, 2025 [#september-30-2025] ### New features [#new-features-9] #### Internal risk warehousing (formerly B-Book) [#internal-risk-warehousing-formerly-b-book] B2CONNECT clients can now execute selected symbols internally within the crypto-native liquidity hub, retaining spread and reducing external fees. This new execution model provides per-symbol control to enable internal execution where it’s commercially advantageous, empowering clients to optimize their risk-return profiles with unprecedented precision. The configuration can be managed via CSV. #### Partial risk internalization (formerly C-Book) [#partial-risk-internalization-formerly-c-book] B2CONNECT clients can now optimize risk management with configurable order splitting between external hedging and internal execution. Set hedge ratios per symbol (0-100%) to determine the split, where the internal portion mirrors external fill pricing and proportions exactly. This approach reduces commission costs while maintaining risk control and supports both market and limit order flows. #### Price invalidation for synthetic symbols [#price-invalidation-for-synthetic-symbols] Synthetic markets now support invalidation signals the same way as organic symbols, providing consistent invalidation behavior across all symbol types. This development unlocks safe production deployment of the invalidation feature, providing traders with more reliable price feeds and reducing the risk of stale quotes across the entire trading ecosystem. #### Liquidity acquisition configuration via incoming connectors [#liquidity-acquisition-configuration-via-incoming-connectors] The configuration of liquidity acquisition service has been migrated from a global CSV to a structured, connector‑based flow. The new approach includes bulk asset upload capabilities, automated symbol-to-maker listing matching, and quoting CSV configuring, reducing setup time and potential errors while enabling more granular control over individual service instances. *** ### Improvements [#improvements-9] #### WebUI modernization [#webui-modernization] The Admin panel interface has been enhanced delivering improved usability. The following upgrades land across the **AMS accounts**, **AMS profiles**, **Notifications**, **Incoming Connectors** and **Symbols** sections: * **Navigation enhancements**: * Streamlined menu structure with fewer clicks to access key data. * Relocated Notifications to Hub settings for better organization. * Expanded table layouts for improved data visibility. * **Single Sign-On**: * Centralized identity provider with standards-based SSO. * Unchanged sign-in experience for end users. * Continued user management capabilities for B2CONNECT administrators. Additionally, the sidebar has been redesigned, with rebuilt left navigation reflecting the new information architecture, making the **Liquidity**, **Symbols**, **Accounts**, and **Settings** sections easier to access. #### AMS profiles: CSV import/export [#ams-profiles-csv-importexport] The **Commission** and **Margin Requirements** profiles setup has been accelerated through an import wizard and one‑click CSV export. These enhancements optimize workflows particularly when working with large instrument lists. #### Asset management [#asset-management] B2CONNECT administrators are now provided with enhanced control over asset configurations with built-in safeguards to prevent deletion of referenced assets. This ensures system integrity while providing the flexibility to clean up obsolete or unused assets. *** ### Resolved issues [#resolved-issues-10] * Fixed an issue with trading parameter calculations for instruments with contract sizes. The system now correctly converts all trading parameters using contract size multipliers, ensuring accurate minimum order amounts, price steps, and notional values are communicated through the FIX SecurityList endpoint. This fix particularly benefits trading of derivative contracts where the underlying instrument differs from the quoted contract size. ## August 29, 2025 [#august-29-2025] ### New features [#new-features-10] #### New docs section: Supported exchanges [#new-docs-section-supported-exchanges] With this release, we've introduced a detailed [Supported exchanges](supported-venues/exchanges) section in our documentation, offering a comprehensive reference for each exchange our platform supports. This addition promotes clarity and easy access, allowing B2CONNECT users to quickly compare and reference available capabilities across exchanges at a glance. *** ### Improvements [#improvements-10] #### Explicit default STP setting [#explicit-default-stp-setting] To prevent unexpected behavior and reduce reliance on exchange policy defaults, we now explicitly set a fixed internal default STP (Self-Trade Prevention) mode in our API calls. This ensures consistent and predictable trade execution across all environments, regardless of future changes by liquidity providers. *** ### Resolved issues [#resolved-issues-11] There have been no customer-facing issues reported in this release. ## July 31, 2025 [#july-31-2025] ### New features [#new-features-11] #### Granular asset management via Web UI [#granular-asset-management-via-web-ui] B2CONNECT administrators now benefit from enhanced control and efficiency in asset management with new export/import options integrated into the B2CONNECT Web UI: * **Bulk asset export**: Efficiently export assets to CSV for reporting or backup purposes, streamlining administrative tasks and protecting essential configuration data. * **Bulk asset import**: Effortlessly import multiple assets from CSV files, reducing manual entry, minimizing errors, and ensuring asset uniqueness through built-in validation rules. #### Alerts system for swap charge issues [#alerts-system-for-swap-charge-issues] The system monitoring has been enhanced by implementing automated notifications for failed swap charges. These real-time notifications provide detailed explanations of failures, facilitating quick troubleshooting, and boosting system reliability. Common issues addressed include missing market rates, symbol data discrepancies, infrastructure issues, and internal errors. *** ### Improvements [#improvements-11] #### Enhanced compatibility with Binance [#enhanced-compatibility-with-binance] To ensure continued compatibility and accuracy, B2CONNECT services have been updated to align with recent changes in the Binance API. This enhancement makes certain that the minimum notional values provided through the B2CONNECT FIX API SecurityList endpoint are always accurate, preventing order rejections due to incorrect amounts. Additionally, the Binance Spot adapter has been updated to meet the latest WebSocket API requirements, ensuring smooth order updates and improved platform reliability. #### Advanced raw message logging [#advanced-raw-message-logging] A significant enhancement has been added to order placement and execution workflow. A key point is the implementation of advanced raw message logging. This enables B2CONNECT to log all raw incoming and outgoing messages during its communication with a supported liquidity provider, thus enabling precise troubleshooting and rapid issue resolution at the LPs end. #### Improved error handling [#improved-error-handling] Another improvement in the order placement and execution workflow includes the refined logic for handling timeout errors. An order is now considered placed if such an error occurs, providing a definitive status and preventing uncertainty during order execution. #### Rate limiting for reliable connectivity [#rate-limiting-for-reliable-connectivity] The reconnect algorithm for a supported liquidity provider has been improved by integrating a robust rate-limiting mechanism. This enhancement caps the number of reconnect attempts to an optimal value, reducing the chance of IP bans and maintaining stable, uninterrupted connectivity. #### Reduced trading service startup time [#reduced-trading-service-startup-time] With this release, the bulk-load order event recovery mechanism has been implemented. By efficiently processing large volumes of order events during system startup, this update significantly reduces the time required to restore services after a restart or unexpected outage. As a result, traders experience minimal downtime, ensuring continuous access to the trading platform and improving overall operational efficiency. *** ### Resolved issues [#resolved-issues-12] There have been no customer-facing issues reported in this release. ## June 30, 2025 [#june-30-2025] ### New features [#new-features-12] #### Advanced multi-provider liquidity orchestration [#advanced-multi-provider-liquidity-orchestration] This release introduces a groundbreaking update in liquidity infrastructure management: B2CONNECT now features liquidity orchestration across multiple liquidity providers and trading platform types. Key enhancements include: * Liquidity acquisition from multiple providers and its distribution to diverse trading platforms and market data consumer types. * Price feed across all asset classes, including forex, CFDs, indices, metals, and crypto (both spot and derivatives), accessible via both single or multiple connectors. * Uninterrupted liquidity with automated order routing based on symbol availability and robust failover policies. #### Advanced spread control [#advanced-spread-control] B2CONNECT administrators can now precisely control the maximum allowable spread in order books, significantly enhancing liquidity and boosting trader confidence. They can set and manage maximum spread limits to avoid sharp market data fluctuations, and track anomalies through detailed metrics. #### Symbol-based price invalidation [#symbol-based-price-invalidation] B2CONNECT introduces sophisticated symbol-based price invalidation to ensure price accuracy: * **Web interface management**: Configure, view, and manage price invalidation parameters directly through the Web UI. * **CSV import**: Import symbols via CSV files that include detailed price invalidation parameters. * **Real-time logic**: Implement comprehensive real-time price invalidation across all stages for consistent and precise quoting and trading. #### Aggregated execution reports [#aggregated-execution-reports] Execution reporting now supports fill aggregation, optimizing reports for platforms such as cTrader. This feature consolidates multiple fills into a single, coherent execution report. B2CONNECT administrators can enable or disable aggregation settings to tailor reporting to the trading platform preferences. Alerts for overfilled aggregation scenarios provide timely insights for effective risk management. #### Automated swap fee charging [#automated-swap-fee-charging] B2CONNECT now streamlines swap charge management. B2CONNECT administrators can easily set up Swap Profiles and apply them to trading accounts. The built-in Swap Charges Planner helps schedule and run swap charges efficiently. Migration to an optimized Account Configuration system provides superior performance and reliability. *** ### Improvements [#improvements-12] #### Enhanced precision handling for FOK orders [#enhanced-precision-handling-for-fok-orders] Handling of Fill-or-Kill (FOK) orders has been improved to guarantee compatibility across all liquidity providers, even when the order amount precision differs from trading platform specifications. #### Standardized order cancellation for Liquidity Takers [#standardized-order-cancellation-for-liquidity-takers] The order cancellation support has been improved for liquidity aggregators and other liquidity consumers, ensuring more responsive and reliable order lifecycle management. #### Symbol integration into account configuration [#symbol-integration-into-account-configuration] Symbol management is now seamlessly incorporated into account configuration to maintain consistency across liquidity settings and to simplify administrative tasks. #### Streamlined UX [#streamlined-ux] The B2CONNECT WebUI has been upgraded, focusing on user experience and performance enhancements. These improvements feature a more intuitive color scheme and streamlined design, offering a modern and visually appealing interface. The user flow has been optimized, making navigation more straightforward and efficient. Additionally, component performance has been boosted, reducing load times and enhancing overall responsiveness for a better user experience. *** ### Resolved issues [#resolved-issues-13] * Fixed an issue where an order cancellation request might be mishandled if received before the system processed the initial order confirmation from a liquidity provider. ## May 30, 2025 [#may-30-2025] ### Improvements [#improvements-13] #### Enhanced FIX API SecurityList endpoint [#enhanced-fix-api-securitylist-endpoint] Improved the liquidity metadata handling to ensure that order placements, based on the liquidity parameters provided via the SecurityList FIX endpoint, are compatible across multiple liquidity streams. This upgrade aggregates liquidity parameters for symbols across multiple providers, combining them into universally supported values. As a result, orders can be placed across several liquidity providers either simultaneously or in a failover mode, ensuring compatibility with all involved providers. #### Improved handling of negative spreads [#improved-handling-of-negative-spreads] Enhanced management of negative spreads has been achieved through more efficient filtering of Level 2 quotes and incremental updates. This improvement targets asset prices that could cause negative spreads in liquidity distributed to trading platforms and other consumers via the FIX protocol. The newly updated business logic effectively and efficiently filters out such quotes to prevent the negative spreads from appearing in the distributed liquidity. #### Enhanced resilience when processing fast subscribe/unsubscribe sequences [#enhanced-resilience-when-processing-fast-subscribeunsubscribe-sequences] B2CONNECT FIX server can robustly handle fast subscribe/unsubscribe sequences by liquidity aggregators, even when these aggregators do not strictly adhere to the FIX protocol standard, reusing the same request IDs. The newly implemented algorithm reliably handles such cases, eliminating even the intermittent subscription failures. *** ### Resolved issues [#resolved-issues-14] * Fixed an issue, where orders were re-sent (placed again) if one of the supported liquidity providers returned an unrecognized error message. Such messages are now categorized under a unified system, resulting in conserving the API rate limits on redundant order placements and reducing the risk of IP bans. * Fixed an issue where, after replacing the API credentials of a supported liquidity provider with new ones, the system continued subscribing to the execution reports stream using the old credentials until restarted. This fix ensures that the credentials can be replaced live, without the restart of services. ## March 31, 2025 [#march-31-2025] ### New features [#new-features-13] #### New integration with Bybit [#new-integration-with-bybit] B2CONNECT has launched a new adapter for **Bybit**, providing full support for perpetual futures contracts. This integration leverages B2CONNECT's robust infrastructure, allowing access to Bybit's market data and trading functionalities. It ensures seamless trading and quoting, enabling client platforms to offer advanced trading options and enhanced user experience. Benefit from efficient order execution and reliable price feeds — all within the B2CONNECT ecosystem! #### Advanced Trade API support for Coinbase integration [#advanced-trade-api-support-for-coinbase-integration] With this release, B2CONNECT introduces full support for **Coinbase Advanced Trade API**, replacing the deprecated Coinbase Pro API. This update ensures uninterrupted access to Coinbase’s liquidity, benefiting from the superior capabilities and performance of the Advanced Trade API. This upgrade affirms B2CONNECT commitment to delivering cutting-edge liquidity solutions, ensuring clients always have access to the best available liquidity infrastructure. *** ### Improvements [#improvements-14] #### Improved symbol specification management and real-time configuration [#improved-symbol-specification-management-and-real-time-configuration] The process for managing symbol specifications during bulk import has been significantly enhanced. Users can now interactively review and selectively edit symbol specifications directly within the import interface. This improvement enables on-the-fly adjustments, ensuring higher accuracy and flexibility when dealing with large sets of symbols. #### Binance Futures adapter enhancements [#binance-futures-adapter-enhancements] Several improvements have been implemented for the Binance Futures adapter, increasing its reliability and stability: * **Execution report deduplication**: Logic has been added to effectively deduplicate execution reports from Binance Futures. This resolves issues caused by occasional duplicate reports originating from the LP side, ensuring accurate order state tracking. * **Order state recovery rate limiting**: A rate limiter has been implemented for requests related to order state recovery. This proactive measure prevents potential rate limit violations on the Binance Futures platform, safeguarding against temporary bans or request throttling during high-activity periods. These updates contribute to a more robust and resilient integration with Binance Futures. *** ### Resolved issues [#resolved-issues-15] There have been no customer-facing issues reported in this release. *** ## Past releases [#past-releases] ### December 24, 2024 🎄 [#december-24-2024-] #### New features [#new-features-14] ##### Taker orders routing to multiple LPs [#taker-orders-routing-to-multiple-lps] This newly released feature allows orders received through a single FIX connector to be routed to multiple liquidity providers. This functionality enables sophisticated order placement and execution strategies through: * **Failover mechanism**: Enables B2CONNECT to maintain each Taker connector linked to multiple liquidity sources and to dynamically reroute orders among them in case a provider becomes unavailable. * **Symbol-based order routing**: Caters to cases where a particular symbol may be unavailable with one liquidity provider, but listed on others. This feature allows for dynamic routing of orders to the most suitable liquidity source based on the specific trading symbol. This feature significantly enhances access to a wider range of trading instruments and improves fault tolerance for liquidity distribution at supported trading venues via both quoting and trading sessions. ##### Incoming connectors creation [#incoming-connectors-creation] B2CONNECT administrators can now create and configure connections to Makers via the Web UI. The solution supports a variety of protocols (WSS, REST, FIX), offering flexible and robust connectivity options. By streamlining the setup process, it enhances the user experience, making it easy to integrate incoming connectors. ##### Order status recovery at WebSocket disconnect [#order-status-recovery-at-websocket-disconnect] This feature ensures the recovery of pending order statuses in case a WebSocket connection is disrupted or unavailable. It's specifically designed for WSS+REST trading integration, allowing retrieval of a placed order status even if the execution report can't be extracted from a WebSocket data stream B2CONNECT subscribed to. This solution largely eliminates cases where an order is placed on the liquidity provider but is not correctly confirmed on the Taker platform due to WebSocket issues. The implementation significantly enhances execution quality and mitigates market risks. #### Improvements [#improvements-15] ##### Symbol creation interface [#symbol-creation-interface] The B2CONNECT Web UI now features a dedicated interface for adding symbols. This enhancement utilizes existing base and quote assets, building on the recent release of the Asset and Asset Classes management UI. This feature is in addition to the bulk settings import functionality, allowing for individual symbol creation and management. #### Resolved issues [#resolved-issues-16] There have been no customer-facing issues reported in this release. *** ### November 29, 2024 [#november-29-2024] #### New features [#new-features-15] ##### Taker FIX credentials management via the Web UI [#taker-fix-credentials-management-via-the-web-ui] The latest B2CONNECT release introduces a brand new Web UI Section in the Liquidity Hub administrative interface, designed for managing FIX protocol credentials. These authorization details are vital for B2CONNECT customers, including digital asset exchanges, brokerages, crypto payment gateways, and other liquidity consumers, to connect to the Liquidity Hub. Following the trend of previous improvements, such as the Maker API keys management interface, this update enables B2CONNECT administrators to efficiently generate and distribute FIX credentials. Once the credentials are generated and validated, B2CONNECT administrator can transfer them to a Taker platform so that their clients can authorize when connecting to the B2CONNECT FIX server. Credentials are automatically updated across B2CONNECT services, ensuring seamless client connectivity. This development marks a significant stride toward achieving comprehensive connectivity and streamlined liquidity distribution within B2CONNECT's growing infrastructure. #### Resolved issues [#resolved-issues-17] There have been no customer-facing issues reported in this release. *** ### October 31, 2024 [#october-31-2024] #### New features [#new-features-16] ##### Faster order placement and execution on the Binance spot platform [#faster-order-placement-and-execution-on-the-binance-spot-platform] B2CONNECT Liquidity Hub has implemented an advanced adapter to the WebSocket API for the Binance (spot) trading platform. This upgrade allows for faster order placement, thereby improving the trading experience and enhancing the liquidity distribution quality. By employing a high-end connectivity technology, trade-related messages are now transmitted through a bidirectional full-duplex protocol. When assessed against previous benchmarks, the order round-trip time on Binance (spot) has been shortened significantly. This advancement will be beneficial to any trading platform or liquidity taker client, substantially enhancing their user experience in order execution. #### Improvements [#improvements-16] ##### Enhanced Admin interface for configuring trading credentials [#enhanced-admin-interface-for-configuring-trading-credentials] B2CONNECT administrators can now independently configure trading credentials via the web interface, ensuring a faster and more secure process. This improvement simplifies the procedure of entering API keys using a dynamic, maker-specific form tailored with relevant fields, thereby streamlining operations. The system automatically validates the entered API keys to minimize errors. This is another addition to the rapidly expanding capabilities of the Liquidity Engine Web UI. #### Resolved issues [#resolved-issues-18] There have been no customer-facing issues reported in this or previous releases. *** ### September 30, 2024 [#september-30-2024] #### New features [#new-features-17] ##### Fully-featured liquidity adapter for Crypto.com [#fully-featured-liquidity-adapter-for-cryptocom] The full-blown liquidity acquisition adapter to **Crypto.com** is now available immediately to all B2CONNECT Liquidity Hub clients connecting via the FIX API. Crypto.com is a top-ranked cryptocurrency exchange platform that has recently been gaining traction among B2B clients as a direct market access enabler. With the introduction of the new connectivity option, B2CONNECT clients can now enhance their offerings with an expanded range of trading pairs. This feature also empowers them to diversify effectively, mitigating various risks such as counterparty, regulatory, and so on. The adapter enables access to price feeds (Level 2 quotes) on the trading platform and supports order placement, execution, and execution confirmation. Besides, its implementation ensures that these two main processes, getting quotes and trading, can be done in parallel, with the highest possible throughput and lowest network latency. This is the next step in B2CONNECT’s mission to enhance access to liquidity for its B2B clientele — digital asset exchanges and brokerages. We’re excited to provide trading platform operators with new opportunities to differentiate themselves by offering the trading community a wider range of trading options and better UX. ##### Liquidity configuration via CSV [#liquidity-configuration-via-csv] The B2CONNECT Web UI has been enhanced with the bulk import option of liquidity settings via a CSV file. This new feature enables B2CONNECT administrators to import an unlimited list of markets along with advanced liquidity parameters such as markups, volume modifiers, market depth, price and volume precision, and so on. Additional fields for defining synthetic instruments are provided to configure synthetic cross legs, quote sources, inversion, and more. The new interface validates the CSV file upon upload and also stores a history of imported settings. The latter empowers the B2CONNECT Hub operators to always have a fresh copy of the setup available for export as a CSV file, making it easier to enter adjustments, re-upload the configuration, and apply new liquidity settings. *** ### August 29, 2024 [#august-29-2024] #### New features [#new-features-18] ##### Faster Perpetual Futures trading via a high-end communication protocol [#faster-perpetual-futures-trading-via-a-high-end-communication-protocol] With this release, the B2CONNECT team has implemented a new integration with a fresh WebSocket API introduced by the Binance Futures platform earlier this year. This is a new option in addition to the time-tested REST API trading. The new connectivity technology uses a bidirectional, full-duplex protocol to transmit trade-related messages, which drastically increases execution quality. The average route time for trades shows an up to fourfold improvement over previously measured round-trip benchmarks. This is a true moonshot advancement in order execution quality that will allow any trading platform or other liquidity taker to offer exceptional trader UX improvements throughout their entire user base. ##### Concurrent connections to multiple API endpoints [#concurrent-connections-to-multiple-api-endpoints] This new feature allows B2CONNECT liquidity adapters to connect simultaneously to multiple endpoints associated with private and public APIs (where available). This enables access to digital resources on both types of endpoints at the same time. This advanced architecture improves resource availability and eliminates a single point of failure, giving B2CONNECT liquidity acquisition and distribution services the ability to simultaneously access market and trading data across various API clusters. The primary benefit of this new feature from a client perspective is much more reliable, fault-tolerant price feeds, order placements, and execution confirmations, improving UX while reducing market risks at the same time. #### Improvements [#improvements-17] * Trading log entries and error messages from both B2CONNECT internal services and external sources (such as supported liquidity providers) are now categorized and given a unified content and format before being transmitted to taker platforms. This ensures that messages are organized in a consistent manner and are better prepared for human consumption. This improvement is aimed at enhancing UX and reducing the load on a technical support team. * An improved B2CONNECT FIX server shutdown procedure has been implemented, which allows for graceful state saving and restoration, as well as prevents data loss due to interruptions of quoting and trading sessions. This enhancement ensures orderly logouts across all platforms connected via the FIX protocol, and availability of FIX messages after a restart. #### Resolved issues [#resolved-issues-19] * Fixed an issue where, in some scenarios, third-party FIX clients had issues reconnecting to the B2CONNECT FIX server after a logout. We have also ensured that a Logout message is consistently sent upon a client’s logout, which in rare cases may have been skipped prior to this release. * Fixed an issue that infrequently caused situations where after setting the order book depth to decrease, the number of levels would sometimes not increase back after reverting the settings. *** ### March 13, 2024 [#march-13-2024] #### New features [#new-features-19] ##### Liquidity distribution to the B2TRADER Brokerage Platform (BBP) [#liquidity-distribution-to-the-b2trader-brokerage-platform-bbp] With this release, the B2CONNECT team is excited to announce that the emerging B2TRADER Brokerage Platform has been added to our growing list of supported trading venues. This addition further advances our commitment to delivering top-notch connectivity to trading platforms and liquidity providers. The key updates encompass a bespoke order execution flow as well as custom FIX API endpoints that streamline the retrieval of available markets and contract specifications. With these enhancements, our industry-standard FIX protocol implementation enables a robust connection between the newly added platform and the liquidity providers supported by B2CONNECT. This integration empowers BBP’s clients to embrace flexible business models and adjustable execution strategies. And, as a result, further boost their success by providing exceptional user experiences to their end users — the members of the trading communities. ### November 10, 2023 [#november-10-2023] #### New features [#new-features-20] ##### Maker-integration with cTrader via the FIX protocol [#maker-integration-with-ctrader-via-the-fix-protocol] With this release, the B2CONNECT team is pleased to announce the achievement of a significant milestone in our ongoing quest to provide exceptional connectivity to both trading platforms and liquidity providers: we have successfully integrated B2CONNECT Liquidity Hub with **cTrader**. With this integration, B2CONNECT Liquidity Hub can now distribute the liquidity to cTrader, a complete trading platform solution for the forex and CFD brokers, via the FIX protocol. On one hand, this furnishes our clients running trading platforms with the ultimate access to liquidity. On the other hand, this empowers liquidity providers to implement comprehensive distribution solutions. This release marks the paradigm shift in the connectivity approach by including trading platform integrations alongside the liquidity providers and liquidity aggregators — our focus previously. This is a major step forward in expanding our ecosystem to include taker-venues, making our product a versatile liquidity distribution solution that meets the needs of a wide range of industry players in the dynamic world of trading. This new integration enables the provision of unique liquidity streams empowering our clients to differentiate themselves in a competitive and highly volatile market. Retail and institutional brokers, crypto exchanges, and liquidity providers can leverage our performant liquidity distribution solutions powered by industry-standard communication protocols and fast APIs built on scalable frameworks. *** ### October 20, 2023 [#october-20-2023] #### New features [#new-features-21] ##### Full support for Bitfinex Derivatives [#full-support-for-bitfinex-derivatives] Following the Bitfinex Spot support implemented earlier this year, we are pleased to announce full support for Bitfinex Derivatives with this release. It has been done per popular client request to support and improve diversification of perpetual futures liquidity flows, following the collapse of a global cryptocurrency derivatives player late last year. With this release, trading platforms powered by the B2BROKER technology receive additional benefits and opportunities, such as: * expand your offer with additional trading instruments * increase market depth due to additional liquidity source * improve liquidity, including faster and more flexible price feeds and better execution quality * diversify liquidity streams by the additional source of liquidity and avoid a single point of failure * differentiate yourself from competing platforms and, at the same time, delight your users by creating unique liquidity streams that have just become available from the newly supported platform. Among other features, the trading API and pre-execution model are fully supported and immediately available to client venues using the FIX protocol and relying upon the B2CONNECT’s signature FIX API (v1.2 and later). #### Improvements [#improvements-18] * A new tutorial has been added to the B2CONNECT Product guide, illustrating the process of setting up a connection to Coinbase. We took a special care to highlight the required credentials and help clients find them easily. *** ### September 29, 2023 [#september-29-2023] #### New features [#new-features-22] ##### FIX API 1.2 [#fix-api-12] With this release, B2CONNECT introduces a new version 1.2 of FIX API, which is an expanded and improved version of the previous implementation: * The Business Message Reject has been deleted. * The [Sequence Reset](fix-api#sequence-reset) message has been added. * The following tags have been added to the [Market Data Request](fix-api#market-data-request) message: `<267> NoMDEntryTypes` (required), `<269> MDEntryType` (required). * The following tag has been added to the [Market Data — Snapshot/Full Refresh](fix-api#market-data-snapshot-full-refresh) message: `<299> QuoteEntryID`. * The following tag has been added to the [New Order Single](fix-api#new-order-single) message: `<1> Account`. * The following tags have been added to the [Execution Report](fix-api#execution-report) message: `<64> SettlDate`, `<75> TradeDate`, `<103> OrdRejReason`. * The following tag has been added to the [Order Cancel Reject](fix-api#order-cancel-reject) message: `<39> OrdStatus` (required). The [FIX API specification](fix-api) has been updated to reflect the changes as well as to become more clear and consistent. *** ### May 12, 2023 [#may-12-2023] #### New features [#new-features-23] ##### A new form for entering API keys [#a-new-form-for-entering-api-keys] The B2CONNECT Web UI has been updated to display a customized form for entering API keys for each of the supported hedging platforms. As a result, the issues with entering the credentials have been eliminated. Since every platform features a different set of fields for entering the API keys, this form was updated to display the authorization fields as they are provided by each hedging platform and to prevent any ambiguity arising from the difference in the field names. #### Improvements [#improvements-19] * The contents of Web UI controls and field descriptions have been revised to afford a more intuitive interface. * The look and feel of the B2CONNECT Web UI has been enhanced by updating some of its most commonly used visual elements. #### Resolved issues [#resolved-issues-20] * Fixed an issue causing the API key editing window to hang when an entry for a hedging platform was absent in the configuration. Such exceptions are now handled, and the stability of the UI has increased as a result. * Fixed an issue due to which empty fields were erroneously assigned zero values after updating the hedging configuration. * Fixed an issue due to which duplicate entries could be displayed for clients on the Hedging Status tab. * Fixed an issue due to which incorrect values were submitted in certain scenarios when enabling or disabling hedging on the Hedging Status page of the Web UI. *** ### April 21, 2023 [#april-21-2023] #### Improvements [#improvements-20] ##### Liquidity provider validation before accepting incoming orders [#liquidity-provider-validation-before-accepting-incoming-orders] The order execution reliability has been greatly improved as a result of including a check for the actual availability of the supported liquidity providers before the B2CONNECT Liquidity Hub services can go forth and accept the incoming orders from a taker platform. Following the update of the B2CONNECT liquidity distribution services, they now always ensure that the connected liquidity providers are ready to execute a placed order, in which case the order is then accepted for execution on the connected trading venue serving as a liquidity consumer. ##### Type-agnostic execution of orders [#type-agnostic-execution-of-orders] If the order type that was set by a taker platform isn’t recognized as a valid execution option, the B2CONNECT liquidity distribution services can be configured to emulate the required order type by assigning a different type to the order. This way you can further ensure that the placed orders will be filled regardless of their types, and their execution quality will match the expectations of your end-users to the fullest possible extent. ##### Repeated requests for order placement [#repeated-requests-for-order-placement] The B2CONNECT order placement services have been revised to enable them to retry order placement if a target liquidity provider platform is unable to fill an order for a transient reason. If the dedicated B2CONNECT service recognizes the returned error as transient (as opposed to intrasient errors, such as those arising from connection failures), the service then works around this issue by automatically sending a repeated request for order placement, which increases the chances that the order will be eventually filled. This is especially useful in times of increased market volatility resulting in drastic increase in traders’ activity, which may overwhelm the liquidity provider services making it difficult to fulfill all the requests for orders execution. #### Resolved issues [#resolved-issues-21] * Fixed some issues affecting the B2CONNECT notification service. These include occasional service stability issues arising from an incorrect data format, as well as the issue due to which a user identifier defined in hedging configuration could not be resolved if this user’s trading platform was left unspecified. * Fixed an issue that affected the adapter used to connect to one of the supported liquidity providers and prevented restarting the service and restoring the connection after the liquidity provider has disconnected the communication protocol. * Fixed some minor issues with the B2CONNECT Web UI due to which it could be difficult for users to replace the API keys in certain scenarios. * Fixed an issue with the Hedging Reports section of the B2CONNECT Web UI due to which the Amount field in the Order Details section could be occasionally assigned incorrect data. *** ### March 10, 2023 [#march-10-2023] #### New features [#new-features-24] ##### Hedging on Bitfinex [#hedging-on-bitfinex] Bitfinex, a global cryptocurrency exchange and spot trading venue, is now supported as a new hedging platform. As is well known, diversification is the key to thriving, regardless of market conditions. This is why with the two most recent releases we specifically focused on providing the widest variety of connectivity options to our global-minded clients, while offering them the opportunity to hedge market risks on suitable platforms in as many regions and jurisdictions as possible with a view of achieving the maximum geographical and regulatory diversity. The newly released trading adaptor for the Bitfinex API is the next step on the B2CONNECT’s journey aimed at empowering its discerning B2B clients, which include cryptocurrency exchanges and crypto brokers. In the meantime, our main goal remains constant: we are eager to not only delight trader communities by ensuring a fantastic user experience, but also to offer trading platforms broad opportunities for spreading risks and allow them to take a savvy approach to exposure in a wide range of market situations. #### Improvements [#improvements-21] ##### Enhanced support for trading instruments engineered as contracts [#enhanced-support-for-trading-instruments-engineered-as-contracts] We have significantly expanded the contract specification capabilities for some of the supported crypto assets by encompassing all popular methods of defining trading instruments. With the enhanced contract sizes, the price and/or amount can be configured in any combinations while designing contracts for various symbols, with taking into consideration both the contracts that are priced by amount and those evaluated by face value regardless of their amount. #### Resolved issues [#resolved-issues-22] * Fixed an issue due to which the adaptor used for price discovery on one of the supported liquidity providers could hang in certain scenarios. * Fixed an issue which hampered the efficiency of the cloud resources utilization by making multiple subscriptions to quotes for the same asset if liquidity for this asset was used to maintain price feeds for several symbols. * Fixed an issue which caused intermittent disconnection of the FIX protocol after restarting one of the supported liquidity aggregators. * Fixed an issue related to number formats which occasionally appeared in hedging reports. As a result, the scientific EXP format used for some of the fields has been replaced with a more user-friendly financial format. *** ### February 17, 2023 [#february-17-2023] #### New features [#new-features-25] ##### Hedging on Kraken [#hedging-on-kraken] As part of our relentless pursuit of providing crypto asset exchanges and brokers seamless access to the widest possible choice of hedging platforms, we are pleased to announce full support for the Kraken trading API, which opens new horizons for trading venues relying on B2CONNECT Liquidity Hub in terms of risk transfer and supplying the price feed. This is a major landmark for B2CONNECT, made possible by enhancing the previously released adapter used for connecting to this well-established bitcoin trading platform and cryptocurrency exchange which is based in San Francisco. As a result, both Level 2 quotes and hedging for all symbols traded on Kraken are now available to B2CONNECT clients. #### Improvements [#improvements-22] ##### Extended documentation [#extended-documentation] [A new tutorial](how-to-articles/how-to-properly-configure-api-keys-on-kraken) has been added to B2CONNECT documentation, illustrating the process of obtaining the API keys required to enable hedging on Kraken using the newly introduced hedging adapter. Paying special attention to keeping our documentation up-to-date and complete, we invite you to learn more about B2CONNECT by exploring our Product Guide and encourage you to contact us if you have any suggestions or need further assistance. #### Resolved issues [#resolved-issues-23] * Fixed an issue which caused the hedging engine to hang up immediately after entering the API keys for connecting to some of the hedging platforms in certain scenarios. * Fixed an issue which prevented simultaneous placement of multiple hedging orders, causing instead their consecutive placements which resulted in slightly delayed execution. * Fixed an issue which caused recurrent switching between the main and backup liquidity providers in certain scenarios. *** ### January 27, 2023 [#january-27-2023] #### New features [#new-features-26] ##### Level 2 quotes supported for Bitfinex spot liquidity [#level-2-quotes-supported-for-bitfinex-spot-liquidity] Yet another major cryptocurrency exchange Bitfinex has been integrated, ensuring steady supply of spot asset liquidity from this global platform. This highly anticipated development opens exciting new opportunities for operators of crypto trading venues, since it is hard to overestimate the importance of being able to connect to unique liquidity sources. For those who are determined to survive the ongoing “crypto winter” and excel in a highly competitive environment, this is a great opportunity to appeal to extremely discerning trader communities with the best possible offering, which includes a wide array of trading instruments and guarantees tighter spreads and remarkable market depth. This is undoubtedly great news both for the exchanges powered by matching engines, such as B2TRADER, and for third-party crypto exchanges and brokers connected to B2CONNECT via the FIX protocol (either using the B2CONNECT proprietary FIX API or solutions relying on liquidity aggregators, such as oneZero and PrimXM). #### Improvements [#improvements-23] ##### Improved handling of Level 2 quotes [#improved-handling-of-level-2-quotes] The performance of locally maintained extended order books with a virtually unlimited number of price levels (up to 5,000 and beyond) has been enhanced, thanks to implementation of an improved solution, which enables combining multiple price feeds into a single data stream, as opposed to one-to-one channel subscriptions that were previously supported. This has resulted in a drastic performance boost for the price discovery engine, along with a notable increase in the frequency of Level 2 quote updates. #### Resolved issues [#resolved-issues-24] * Fixed an issue that caused occasional generation of empty reports due to incorrect logging of executed trades. * Fixed an issue that prevented subscription to more than a hundred trading instruments due to a bug in the adaptor used to connect to one of the supported liquidity providers. * Fixed an issue related to data exchange with message-oriented middleware, which caused occasional rejection of orders placed using the FIX protocol. * Fixed an issue due to which in certain scenarios the hedging engine attempted to place trades on one of the supported liquidity provider platforms despite the corresponding API keys being missing. * Fixed an issue due to which requests to place offset orders were occasionally sent to hedging platforms even when the order volume was zero after applying the trading rules governing decimal precision of order amounts on these platforms. ### December 16, 2022 [#december-16-2022] #### New features [#new-features-27] ##### Support for multiple accounts on a single hedging platform [#support-for-multiple-accounts-on-a-single-hedging-platform] Automated hedging can now be performed simultaneously on two or more accounts on the same hedging platform for routing offset trades with a purpose of hedging market risks. First and foremost, the B2CONNECT team is committed to empowering its user base — that is, operators of trading venues, such as spot crypto exchanges and brokerages — and putting their best efforts to implement as flexible and efficient hedging policies as possible. With that in mind, this newly added feature is aimed at supporting multiple accounts on a single hedging platform, while ensuring precise order placements, timely delivery of execution confirmations and in-depth reporting for each account used to make offset trades on a given liquidity provider platform. #### Improvements [#improvements-24] ##### Unmatched execution quality due to asynchronous placement of orders [#unmatched-execution-quality-due-to-asynchronous-placement-of-orders] The B2CONNECT order placement engine relying on trading sessions maintained using the FIX protocol has been vastly improved by adding support for asynchronous placement of large numbers of orders submitted for execution on liquidity provider platforms, which has resulted in unprecedented speed and unrivaled execution quality. ##### Extended infrastructure for engineering of synthetic instruments [#extended-infrastructure-for-engineering-of-synthetic-instruments] A new improvement to the B2CONNECT synthetics engine has significantly extended the range of available sources of quotes suitable for engineering synthetic trading instruments, such as synthetic crosses, fractional markets and inverted pairs. Accessible price feeds are not only received from a B2CONNECT instance hosting the synthetics engine itself, but also from any other instance within the Liquidity Hub ecosystem. #### Resolved issues [#resolved-issues-25] * Fixed an issue related to the reporting service: when a single order was filled by way of multiple executions on a particular hedging platform, only one of the executions was recorded. * Fixed a bug related to the [SimpleFIX Go library](https://github.com/b2broker/simplefix-go/) implementing the FIX protocol, which could have caused an issue with the logon sequence if a client used a different FIX protocol implementation. * Fixed an issue causing a resource leak in the synthetics engine that could have given rise to intermittent stability issues. In addition, another resource leak has been eliminated in an adapter used to connect to one of the supported spot cryptoasset liquidity providers, ensuring overall stability of the service, its reliability and uninterrupted uptime. ### November 25, 2022 [#november-25-2022] #### New features [#new-features-28] ##### Direct integration of the B2CONNECT FIX server with PrimeXM [#direct-integration-of-the-b2connect-fix-server-with-primexm] The B2CONNECT Liquidity Hub is now capable of distributing liquidity as a maker to PrimeXM. Client connections to this leading liquidity aggregation platform are powered by the industry-standard FIX protocol, and the liquidity bridged by B2CONNECT can now be distributed directly on PrimeXM for its subsequent distribution across other trading venues. Both the quoting and trading sessions are supported, providing immense benefits to trading venues participating in the B2CONNECT ecosystem and offering them new exciting opportunities to grow their business and differentiate from competitors in both the scope and performance of trading instruments available both to their users and the trading community as a whole. #### Improvements [#improvements-25] ##### Automatic validation of markups [#automatic-validation-of-markups] The price construction mechanism featured by B2CONNECT has been further improved by adding validation to the key parameters entered for price markups. If the markup values assigned to the BID and ASK sides are asymmetric, a warning is issued prompting a venue operator to correct the entered values so that unequal markup amounts are not placed on both sides of the order book. ##### More data for tracking orders and matching elements of the hedging flow [#more-data-for-tracking-orders-and-matching-elements-of-the-hedging-flow] The logging and reporting functionality provided by various B2CONNECT services has been enhanced by listing external execution identifiers assigned by connected liquidity providers along with their B2CONNECT-assigned equivalents. This way, order matching has become much quicker, also facilitating subsequent analysis of trades. Moreover, orders have also become easier to track thanks to newly introduced granular timestamps. #### Resolved issues [#resolved-issues-26] * Fixed an issue due to which the order book was reset upon receiving out-of-sequence incremental updates for Level 2 quotes from one of the supported liquidity providers. * Fixed an issue related to one of the supported liquidity providers: a command to subscribe to incremental updates was ignored for all trading instruments if it couldn’t be executed only for some of them. * Fixed an issue related to the B2CONNECT FIX protocol: non-sequential numbers were assigned to certain FIX messages. * Fixed a rarely occurring issue related to the B2CONNECT Web UI: toggling a certain switch when setting up one hedging platform could result in misconfiguration of another hedging platform. * Fixed an issue related to the reporting and alerting service used for sending messages to a Slack channel: in some cases, incorrect data was being reported. *** ### October 14, 2022 [#october-14-2022] #### New features [#new-features-29] ##### Liquidity from and hedging on FTX [#liquidity-from-and-hedging-on-ftx] We are happy to announce yet another major achievement in our quest for unrivaled connectivity for B2CONNECT across the spot crypto liquidity space: with this release, FTX, a top-rated global crypto exchange, has been supported, once again letting B2CONNECT assert itself as a flagship liquidity hub and price discovery engine. The liquidity for all markets represented on FTX is immediately available for any exchange powered by the B2TRADER matching engine as well as to any trading platform connected to B2CONNECT via the FIX API. Along with supplying the price feed for spot markets, the newly introduced connection adapter radically extends the range of price risk hedging options offered by the B2CONNECT hedging engine. #### Improvements [#improvements-26] ##### DB connectivity monitoring [#db-connectivity-monitoring] When it comes to the cloud infrastructure accommodating the B2CONNECT services, we put our best efforts to not only ensure its highest performance and extreme reliability, but also envision efficient ways to monitor and maintain connectivity. In keeping true to our principle — trust, but verify — we have implemented automated detection of connectivity issues related to managed cloud database services. ##### Optimal subscription management [#optimal-subscription-management] Superb performance is the cornerstone on which rests the success of the B2CONNECT liquidity platform, and it’s been proved time and again during its development that the key to achieving the highest degree of efficiency is constant optimization. This time, it has been ensured that the liquidity hub only subscribes to the symbols that take part in liquidity distribution. This saves the cloud resources due to removal of subscriptions which are not currently in demand and further improves the overall platform performance. #### Resolved issues [#resolved-issues-27] * Fixed an issue due to which one of services stopped after removing a subscription to a price feed. * Fixed an issue due to which a mandatory time-in-force parameter value wasn’t sent when placing hedging orders of a certain type on a particular hedging platform. *** ### September 23, 2022 [#september-23-2022] #### New features [#new-features-30] ##### Conversion of derivative contract lot sizes to smaller and larger tradable amounts [#conversion-of-derivative-contract-lot-sizes-to-smaller-and-larger-tradable-amounts] With this release, you can split derivative contracts and reform contract specifications with underlying digital assets to change the contract lot size and lot price. This is a major development, since it enables quoting and trading fractional and, inversely, consolidated crypto derivative contracts. For example, if an instrument is traded at a liquidity provider venue in lots of 1000, such derivatives can now be traded in lots of one to a million on a taker side, with the contract quotes readily adjusted to the new contract sizes. When the orders are placed for executions on liquidity provider venues, they are adjusted to meet the lot size requirements of each venue. #### Improvements [#improvements-27] ##### The order book state may be preserved indefinitely [#the-order-book-state-may-be-preserved-indefinitely] The adapter used to connect to liquidity providers has been further improved by adding the option to hold the last value of a quote indefinitely. A good case for this is dealing with acquisition of quotes when the asset price changes only intermittently even though the connection to the liquidity provider is alive. ##### The current state of Level 2 quotes is now reset upon disconnection [#the-current-state-of-level-2-quotes-is-now-reset-upon-disconnection] This improvement is related to the previous one: it has been ensured that even when the asset price is configured to handle infrequent refreshing of quotes, once connection to a liquidity provider goes down, the state of Level 2 quotes is reset until connection to the source of quotes is renewed. #### Resolved issues [#resolved-issues-28] * Fixed an issue due to which, when asset volume is denominated with high decimal precision, small order amounts could be truncated to zero and error messages may be sent by liquidity providers. It is now ensured that hedging is handled properly, and in cases when orders are so small that they would be rejected by liquidity provider venues, they are not sent there for execution. * Fixed an issue which caused race conditions. This has resulted in improved stability and performance of a hedging agent along with an adapter used to fetch asset quotes from a liquidity provider venue. * Fixed an issue related to recording of time values. It has been ensured that timing is now properly recorded and corrected for ongoing order execution requests. * Fixed an issue concerning a service responsible for handling the FIX protocol. The service is now capable of resuming the price feed after connection to the liquidity taker was reinstated. * Fixed an issue due to which upon entering a long numerical value on a Web UI form, its last digit was switched to zero. *** ### September 2, 2022 [#september-2-2022] #### New features [#new-features-31] ##### Updated documentation [#updated-documentation] A new section has been added to the B2CONNECT documentation providing a user interface overview and illustrating how to accomplish the most common tasks. Refer to the **Product guide** to learn about the hedging functionality provided by B2CONNECT. #### Improvements [#improvements-28] With this release, various changes have been introduced to B2CONNECT user interface, which include the following improvements: * A table header in the Hedging configuration section has become fixed, making it easier to see the field captions when scrolling down the page. * All buttons have been provided with tooltips describing their functionality. * The minimum screen resolution (960px) is now supported on all product pages. *** ### August 12, 2022 [#august-12-2022] #### New features [#new-features-32] ##### Full support for Huobi Futures [#full-support-for-huobi-futures] Huobi Futures, a top-rated derivative exchange platform, has been fully supported. As a result, robust supply of level 2 quotes has been ensured across the entire range of trading instruments, including but not limited to futures, swaps and perpetual swaps available on the newly supported platform. This new level of liquidity has been provided following a major update of a recently released Huobi Spot Adapter, which was greatly extended to allow B2CONNECT clients to explore all the advantages offered by Huobi-powered trading venues. The trading API is also supported, which opens new opportunities for best price execution and radically expands the range of options available to B2CONNECT Liquidity Hub clients in the realm of market risk mitigation while allowing them to offer their end users the tightest spreads and deepest order books across today’s markets. Among other features, pre-execution model is fully supported and immediately available to client venues utilizing the FIX protocol and relying upon the B2CONNECT signature FIX API. #### Improvements [#improvements-29] ##### Increased consistency of synthetic quotes [#increased-consistency-of-synthetic-quotes] The engine responsible for engineering synthetic cross pairs and fractional trading instruments has received yet another boost in functionality to increase the consistency of synthetic quotes by eliminating any outlying values when calculating spreads. ##### Extra validation ensuring decimal precision of asset prices [#extra-validation-ensuring-decimal-precision-of-asset-prices] Arguably, when it comes to cryptocurrencies and other types of digital assets, the issue of decimal precision may be challenging for some legacy trading platforms and liquidity aggregators that primarily deal with fiat instruments and traditional securities. In contrast, B2CONNECT ensures that liquidity is always ingested, handled and distributed with superb efficiency, regardless of decimal precision and numerical value range of asset prices. With an additional layer of validation added to its liquidity engine, B2CONNECT makes sure that decimal precision values are always handled in strict accordance with the client specification, throughout the entire liquidity processing pipeline. #### Resolved issues [#resolved-issues-29] * Fixed an issue due to which supported platforms could sometimes fail to subscribe to level 2 quotes provided by B2CONNECT. * Fixed an issue due to which the final status of an order execution could be recorded incorrectly in certain scenarios involving one of the supported hedging platforms. *** ### July 1, 2022 [#july-1-2022] #### New features [#new-features-33] ##### Hedging reports — New section in Web UI [#hedging-reports--new-section-in-web-ui] On a newly introduced Hedging Reports page, you can find the history of hedging orders, view comprehensive order data and drill down to the minute details of each execution. The data on order placement requests and hedging platform responses is readily available, along with the information related to timing of each step along the order processing pipeline. You can filter the reports by various criteria, including different types of order and counterparty IDs, order placement and execution data, as well as various time intervals. The table layout is configurable, making it possible to reorder the columns and display or hide any column according to your preferences. #### Resolved issues [#resolved-issues-30] * Fixed various usability issues to improve the user experience. * Fixed an issue which prevented access to inputs due to an overlapping menu. *** ### June 10, 2022 [#june-10-2022] #### New features [#new-features-34] ##### A tenfold increase in Level 2 quotes update speed [#a-tenfold-increase-in-level-2-quotes-update-speed] The rate of Level 2 quote updates has been increased ten times compared to the previous release, enabling liquidity feeds to be refreshed with an interval of 100 ms. This feature allows B2CONNECT Liquidity Hub clients to initiate and maintain the most up-to-date order books that enhance user experience for traders on the supported exchange and broker platforms, as well as make risk management aspects of trading venue operations more predictable. #### Improvements [#improvements-30] ##### API rate limits implementation [#api-rate-limits-implementation] The B2CONNECT Liquidity Hub hedging engine’s reliability has been given yet another boost with the implementation of support for request rate limits. This ensures optimal uptime for API connections employed for the purposes of trade executions and reporting. ##### Heartbeats and graceful connection termination [#heartbeats-and-graceful-connection-termination] Health checks and connection handling safeguards have been added to ensure a seamless connection to liquidity provider data. As a result, unmatched reliability in managing Level 2 quote feeds has been achieved. #### Resolved issues [#resolved-issues-31] * Fixed timeout issues that could affect reliability of full-duplex communication channels-while connecting to certain liquidity providers via API. * Fixed an issue with the mechanism responsible for restoring an API connection upon its interruptions in certain corner cases. * Fixed an issue due to which the Filled Amount field in hedging order execution reports could contain incorrect values. *** ### May 20, 2022 [#may-20-2022] #### New features [#new-features-35] ##### Markups as a function of order book depth [#markups-as-a-function-of-order-book-depth] B2CONNECT Liquidity Hub clients can now apply multiple markups based on the price level defined for Level 2 quotes. Together with variable volume modifiers introduced earlier this year, this feature empowers the trading venue operators to manage the liquidity of their order books to a highest precision, thus improving the user experience while mitigating market risks. #### Improvements [#improvements-31] ##### Improved logics for applying markups [#improved-logics-for-applying-markups] The algorithms used for applying both constant and multi-tiered markups have been revised. This has resulted in improved quality of liquidity distribution after applying markups. ##### More granular analytics with new data included in hedging order execution reports [#more-granular-analytics-with-new-data-included-in-hedging-order-execution-reports] More data about orders is now recorded by the B2CONNECT reporting engine. A new field has been added to store the order status information provided by hedging platforms. Furthermore, a new status has been included to distinguish expired orders from those canceled for other reasons. #### Resolved issues [#resolved-issues-32] * Fixed an issue that caused a leak of resources during disconnections occurring as a result of intermittent network failures. * Fixed several issues that occurred in rare scenarios. Reliability and high availability of services responsible for liquidity supply in various market conditions has been ensured as a result. *** ### April 29, 2022 [#april-29-2022] #### New features [#new-features-36] ##### Yet more liquidity from Huobi Global [#yet-more-liquidity-from-huobi-global] The B2CONNECT Liquidity Hub is celebrating a new major update: we worked hard to introduce a fully featured adapter for the top-rated crypto exchange Huobi Global. Both the Level 2 quote and hedging adapters have become available to all B2CONNECT Ecosystem participants. This highly anticipated component has boosted both the breadth and depth of the crypto spot liquidity offering, carrying a great advantage for supported digital asset exchanges, including B2TRADER. For the liquidity hub as a platform, this also ensures increased availability and improved failover capability. The influx of liquidity from the new source will also benefit the client venues integrated with B2CONNECT via FIX API. #### Improvements [#improvements-32] ##### Optimized market data delivery [#optimized-market-data-delivery] The parser of market data coming from one of the world's largest crypto exchanges has been optimized, which resulted in a significant improvement in the adapter performance. Latency has been reduced by an order of magnitude, and the quality of market data and overall reliability have been considerably improved. ##### More flexible hedging with enhanced time-in-force settings [#more-flexible-hedging-with-enhanced-time-in-force-settings] A hedging adapter for one of the major crypto-asset exchanges has been revamped, extending our offering to encompass the full range of trading parameters available for orders placed in the context of market risk hedging. With the newly introduced time-in-force options, our clients are free to devise more flexible and ultimately more efficient hedging strategies. #### Resolved issues [#resolved-issues-33] * Fixed an issue which didn't allow the hedging agent to record certain fields when trades were rejected by a hedging platform. * Fixed an issue which affected processing of incoming and outgoing messages used by one of the supported protocols, when some messages could be blocking other ones at a high load. A considerable potential bottleneck has been prevented as a result. * Fixed an issue that could affect order book consistency for one of the supported exchanges. * Fixed an issue that could have impact on the stability of some of the B2CONNECT services if reports were received in an incorrect format. * Fixed an issue that could result in a failure to cancel a previously placed order while executing a hedging strategy on one of the supported hedging platforms. ### April 8, 2022 [#april-8-2022] #### New features [#new-features-37] ##### Comprehensive integration with Bittrex Global [#comprehensive-integration-with-bittrex-global] A new adapter has been introduced to enable price discovery and market risk hedging on Bittrex Global. Connection to this global crypto exchange drastically extends the range of trading instruments and hedging options provided by B2CONNECT. ##### Hedging on Coinbase [#hedging-on-coinbase] A new adapter has been introduced to enable spot asset hedging on the Coinbase crypto exchange. For B2CONNECT Liquidity Hub clients who already came to appreciate the advantages of seamless Coinbase connection, this improvement signals complete integration with this major crypto trading platform, opening the opportunity for superior spot asset hedging. #### Improvements [#improvements-33] ##### Extended price feed options [#extended-price-feed-options] The price feed can now be streamed in the form of order book snapshots. Adding up to incremental feed updates, this further ensures even and reliable streaming of prices. ##### New performance benchmark reached [#new-performance-benchmark-reached] Over 200% increase in B2CONNECT performance has been secured thanks to optimization of the data interchange mechanism, which resulted in a major reduction of latency and more judicious use of computing resources. Smart use of cloud resources and bandwidth directly translates into the amount of trading instruments which a B2CONNECT instance can handle efficiently. This also implies increased market depth and higher frequency of symbol quote updates, along with a much better quality of order execution and improved bottom line. #### Resolved issues [#resolved-issues-34] * Fixed an issue impairing the reliability of streaming order book data in rare scenarios. * Fixed an issue which occasionally caused a resource leak in cases when specific configuration parameters were missing. The stability of the hedging services has improved as a result. * Fixed an issue causing occasional inversion of sides when hedging trades were placed on certain platforms. *** ### March 18, 2022 [#march-18-2022] #### New features [#new-features-38] ##### Streamlined order book consolidation [#streamlined-order-book-consolidation] With this release, B2CONNECT supports consolidation of Level 2 quotes with unlimited market depth into any order book, according to flexible configuration rules. As a result, B2CONNECT clients can stream a price feed with a specified liquidity distribution to fill an order book with fewer levels while preserving the overall market depth. This way the B2CONNECT platform, with its support for virtually unlimited market depth, becomes even easier to integrate with trading venues whose market depth is limited to just a dozen or a hundred order book levels. At present, this functionality is available only for services accessible via FIX API. ##### Improved SimpleFIX Go documentation [#improved-simplefix-go-documentation] The official documentation for the SimpleFIX Go library has been updated. This state-of-the-art library makes for a major contribution to open source on behalf of B2BROKER, providing an up-to-date FIX engine implementation out of the box while featuring high performance and employing a highly sought-after Go technology stack. The library is available at [https://github.com/b2broker/simplefix-go](https://github.com/b2broker/simplefix-go/) offering the global developer community a quick and easy approach to integrate FIX messaging pipelines into modern trading solutions powered by Go as well as ensure a closer integration with well-proven products from the B2BROKER family. #### Improvements [#improvements-34] ##### Support for liquidity with virtually unlimited order book depth [#support-for-liquidity-with-virtually-unlimited-order-book-depth] As a result of this improvement, nearly unlimited number of Level 2 quotes is now supported when it comes to the actual number of price levels in the order book, which includes (but is not limited to) order books featuring 1,000+ levels that are currently supported. ##### Extended configuration of Level 2 quotes [#extended-configuration-of-level-2-quotes] The set of configuration parameters required for consolidation of Level 2 quotes into a custom price feed has been extended to include the options that define the number of price levels being consolidated into a target order book, volume distribution settings and the rules for discovering prices at specific order book levels. #### Resolved issues [#resolved-issues-35] * Revamped a service responsible for switching the source of Level 2 quotes in the case when the counterparty starts supplying incorrect order book data. Continuous operation of price discovery services has been ensured as a result. * Fixed an issue that caused inversion of hedging trade sides in certain scenarios. *** ### February 25, 2022 [#february-25-2022] #### New features [#new-features-39] ##### Pre-trade execution control [#pre-trade-execution-control] B2CONNECT now supports pre-trade execution control that enables the trading venues integrated via the FIX API to connect to the B2CONNECT Liquidity Hub as takers. When connected as a taker, a venue receives Level 2 quotes, it can place orders and receive confirmations when a maker executes the orders. ##### FIX API documentation [#fix-api-documentation] Basic [FIX API specification](fix-api) has become available to help independent trading venues and liquidity providers integrate B2CONNECT Liquidity Hub into their solutions via the FIX API. #### Improvements [#improvements-35] ##### Pricing Service streams prices with markups already applied [#pricing-service-streams-prices-with-markups-already-applied] A specialized B2CONNECT service providing top-of-the-book prices (that is, Level 1 quotes) is now streaming quotes with configurable markups already applied, as opposed to the earlier implementation, with only the raw quotes provided so that markups had to be applied explicitly upon receiving the markup values via separate REST APIs. The newly introduced approach is much easier and less time-consuming. #### Resolved issues [#resolved-issues-36] * Fixed an issue that resulted in the lot size not being taken into account when placing hedging orders on certain hedging platforms. * Fixed issues that affected the stability and performance of the B2CONNECT hedging engine. *** ### February 4, 2022 [#february-4-2022] #### New features [#new-features-40] ##### Full support for Kraken spot liquidity [#full-support-for-kraken-spot-liquidity] Trading venues participating in the B2CONNECT Ecosystem can now take advantage of ready access to spot liquidity on one of the top-ranked cryptocurrency exchanges — yet another milestone for B2CONNECT continuing on its mission of diversifying access to liquidity, be it crypto spot markets, crypto derivatives or other popular trading instruments. #### Improvements [#improvements-36] ##### Improved support for Poloniex API [#improved-support-for-poloniex-api] The Poloniex connection adapter has been updated following the changes to the API of this leading digital assets exchange, which resulted in enhanced performance and improved connection stability. ##### Extended integration with B2TRADER [#extended-integration-with-b2trader] With this release, B2CONNECT features even deeper integration with B2TRADER, a flagship matching engine and crypto assets exchange platform. As a result, more efficient delivery of trading reports and faster execution of hedging orders have become possible. #### Resolved issues [#resolved-issues-37] * Fixed an issue related to the Poloniex adapter and causing inconsistencies in Level 2 quotes under certain circumstances. * Fixed a reporting-related issue to ensure that the fees and commissions data is properly received and reflected in hedging reports. * Fixed issues causing occasional quote feed inconsistencies arising immediately after updating the configuration of some of the B2CONNECT services. *** ### January 14, 2022 [#january-14-2022] #### New features [#new-features-41] ##### Volume modifiers variable by price level [#volume-modifiers-variable-by-price-level] B2CONNECT Liquidity Hub clients can now configure a volume modifier (otherwise known as multiplier) as a function of market depth. Risk management precision can be ensured by fine-tuning liquidity distribution data in the order book. ##### Execution of hedging orders on Binance Futures [#execution-of-hedging-orders-on-binance-futures] A new adapter has been introduced for execution of hedging orders on Binance Futures, a major platform specializing in crypto derivatives. Combined with instruments for perpetual futures trading, this new service creates truly exciting opportunities for B2CONNECT Liquidity Hub clients. ##### Hedging of spot assets with Binance perpetual futures [#hedging-of-spot-assets-with-binance-perpetual-futures] Spot asset trades can be hedged with perpetual futures. B2CONNECT clients can reduce costs and improve the cash flow by applying more attractive strategies. #### Improvements [#improvements-37] * A new adapter has been introduced for connection to Gemini, another major cryptocurrency exchange providing spot liquidity for B2CONNECT clients. * A new adapter has been introduced for execution of hedging orders on the Poloniex crypto exchange. #### Resolved issues [#resolved-issues-38] * Fixed an issue that could result in omission of some trade parameters in the hedging orders trade history. * Fixed an issue that could cause an order timeout error despite normal execution of actual trades. ### December 17, 2021 [#december-17-2021] #### New features [#new-features-42] ##### Hedging configuration in the B2CONNECT Admin panel [#hedging-configuration-in-the-b2connect-admin-panel] Introducing a new Admin panel with a convenient user interface featuring useful hedging configuration options, allowing you to: * Specify the minimum and maximum amount at which to execute hedging orders, and define different hedge ratios for each order side. * Map some of the hedging order symbols to other symbols, meaning that you can hedge using any symbols apart from those present in a particular instrument. These options can find a variety of applications. For example, you can hedge by forcibly splitting large orders and executing each portion separately. ##### Hedging status — New section in Web UI [#hedging-status--new-section-in-web-ui] On a new Hedging Status page, you can manage and monitor trading venues and hedging platforms to solve any of the following tasks: * Run or stop the hedging process. * Connect hedging platforms to client exchanges or disconnect them according to your risk transfer preferences. * Manage API keys provided by the connected hedging platforms. *** ### December 3, 2021 [#december-3-2021] #### New features [#new-features-43] ##### FIX integration — Another major liquidity distribution platform supported [#fix-integration--another-major-liquidity-distribution-platform-supported] A new adapter has been introduced for connection to another major platform specializing in margin trading. This is a welcome addition to a rich set of connectivity options available to B2CONNECT Liquidity Hub clients. ##### Simultaneous connection to a number of ecosystem makers [#simultaneous-connection-to-a-number-of-ecosystem-makers] Any venue participating in the B2CONNECT ecosystem (or *ecosystem taker*) can now establish a live connection with multiple *ecosystem partners*, enjoying simultaneous access to multiple liquidity streams and gaining a competitive edge on the turbulent hedging market #### Improvements [#improvements-38] * The identifier assigned to executions by an exchange is now being tracked throughout the entire succession of hedging operations. This greatly improves the quality of end-to-end analytics available to risk managers employed at venues participating in the B2CONNECT ecosystem. * The hedging order placement process has been streamlined, resulting in improvements to the prioritization engine, which ensures the fastest possible routing of orders resulting in timely and efficient risk transfer coming handy to any risk management strategy. * In anticipation of possible connection failures or other issues compromising continuous liquidity flow from ecosystem makers, both the price feed and hedging can be configured to prescribe automatic switching to another ecosystem partner or external liquidity provider, followed by switching back to use them again as soon as the connection is restored. #### Resolved issues [#resolved-issues-39] * Fixed an issue that could compromise reliability of order routing services in some scenarios. Fault tolerance is now ensured in potentially disruptive cases, such as when trading symbols are found to be misconfigured or missing from a hedging configuration. *** ### November 12, 2021 [#november-12-2021] #### New features [#new-features-44] ##### The VWAP and total volume included in reports [#the-vwap-and-total-volume-included-in-reports] Hedging orders exceeding a certain amount (configurable) can be executed in multiple portions. The total hedging volume and Volume Weighted Average Price are included into a corresponding report. ##### 100 price levels — Market depth milestone passed [#100-price-levels--market-depth-milestone-passed] Liquidity can now be provided with a market depth of more than 100 order book levels, which in practice implies virtually infinite order book. The previous milestone, with a maximum of 100 levels in the order book, has been reached and passed — the actual market depth now depends solely on the available computing resources. ##### Flexible user roles and granular access permissions [#flexible-user-roles-and-granular-access-permissions] It is now possible to configure and assign custom user roles, dynamically if required. This approach to maintaining access permissions ensures proper access control granularity, promising an easier way to manage a multitude of permissions across various system modules. #### Improvements [#improvements-39] * Data exchange between various product services via the internal messaging system has been optimized, resulting in sturdier interoperability and reduced consumption of cloud resources. * Currency pairs can now be inverted, which adds up to the range of hedging parameters available for synthetic instruments. They can be modeled on any of the symbols in a pair, regardless of whether they are notionally considered base or quoted. #### Resolved issues [#resolved-issues-40] * Fixed an issue that imposed an unreasonable limit upon the order book depth. *** ### October 22, 2021 [#october-22-2021] #### New features [#new-features-45] ##### Synthetic Engine integration [#synthetic-engine-integration] The Synthetics Engine has become an integral part of the B2CONNECT Liquidity Hub ecosystem. ##### Notional values as hedging order limits [#notional-values-as-hedging-order-limits] The set of hedging configuration parameters has been extended, making for a much more flexible risk management: when configuring limit settings of your hedging orders, you can list both a base asset and a notional symbol which may be quoted in any asset, including fiat currencies. ##### More order types, hedging with time-in-force settings [#more-order-types-hedging-with-time-in-force-settings] The set of available time-in-force options has been extended. Apart from a variety of market orders, you can place limit orders and configure their slippage settings. #### Improvements [#improvements-40] * Precise timing is now an important aspect of analytics available to B2CONNECT Liquidity Hub clients. The time of order execution at a hedging platform is now being tracked, opening doors for new insights inspired by accurate execution data. * It is now possible to specify the minimum and maximum amount for hedging orders. The amount limits are adjusted to the hedge ratio. #### Resolved issues [#resolved-issues-41] * Fixed an issue compromising the stability of an internal service monitoring the status of sources supplying Level 2 quotes to B2CONNECT. Continuous streaming of liquidity feeds is now ensured. *** ### June 10, 2021 [#june-10-2021] #### New features [#new-features-46] ##### RESTful API with Swagger documentation [#restful-api-with-swagger-documentation] RESTful API has been provided to lay the ground for a graphical user interface and further integration between B2CONNECT and other B2BROKER products featuring a UI. ##### External liquidity providers as venues for price risk hedging [#external-liquidity-providers-as-venues-for-price-risk-hedging] Trades executed on B2TRADER can now be hedged automatically, by forwarding price risks to an external liquidity provider, such as Binance. ##### Direct hedging upon external liquidity providers for B2BX clients [#direct-hedging-upon-external-liquidity-providers-for-b2bx-clients] Direct hedging of price risks via external liquidity providers has become possible. You can execute hedging orders on Binance or any other platform connected to a client exchange participating in the B2CONNECT ecosystem and receiving liquidity from B2BX. ##### Currency conversion for values displayed in reports [#currency-conversion-for-values-displayed-in-reports] A new service has been introduced, tracking conversion rates and allowing you to convert the reported order size and trade total values into any currency. #### Improvements [#improvements-41] ##### Extended hedging parameters [#extended-hedging-parameters] The set of hedging parameters has been extended, enabling B2CONNECT clients to: * configure hedge parameters based on trader account identifiers * define a hedge ratio based on the trade side (buy or sell) * map a hedging instrument to another spot market symbol (for instance, you can hedge BTC/USDT trades with BTC/USDC orders) ##### Improved trade placement and execution analytics [#improved-trade-placement-and-execution-analytics] More data about each trade is now provided by B2TRADER, improving end-to-end analytics derived from hedging requests and responses. ##### Synthetics engine supports inversion [#synthetics-engine-supports-inversion] When designing synthetic instruments, components of synthetic cross pairs can now be inverted. #### Resolved issues [#resolved-issues-42] * Fixed an issue causing the hedging agent to drop connection in case of empty credentials having been specified for any API member in the configuration. * Fixed an issue preventing operation of some of the markets available to a pricing service. * Fixed an issue related to a price discovery gateway and resulting in improper application of market depth constraints to some of the trading instruments. *** ### February 18, 2021 [#february-18-2021] #### New features [#new-features-47] ##### Internal hedging on B2TRADER [#internal-hedging-on-b2trader] Introducing a new hedging agent, named Hedgehog, for redirecting trading orders placed on one platform to another venue. ##### Authorization based on JSON Web Token [#authorization-based-on-json-web-token] A new JWT-based service has been implemented, enabling authorization of clients connecting to B2CONNECT. Among other things, this makes it possible to identify transactions made on different B2TRADER platforms with a view of subsequent hedging. ##### Tracking of hedging orders [#tracking-of-hedging-orders] A new service has been implemented for gathering statistics and analytics necessary to properly monitor execution of hedging orders. #### Improvements [#improvements-42] ##### Timeout customization for individual instruments [#timeout-customization-for-individual-instruments] Custom timeouts can now be configured separately for each instrument. Using this option, you can reset the instrument's order book and switch to another price source, ensuring price quotation reliability for low-liquidity instruments. ##### Improved price feed [#improved-price-feed] The price feed reliability has been ensured, while the overall performance has improved. ##### New metrics for performance monitoring [#new-metrics-for-performance-monitoring] New metrics have been added for tracking the status and performance of B2CONNECT services to identify and prevent any possible failures. #### Resolved issues [#resolved-issues-43] * Fixed an issue preventing constructed quote (market) updates for some instruments by checking that a corresponding symbol is mapped. Obtenga información sobre plataformas de trading, proveedores de pago y otras soluciones de terceros integradas con B2CORE Obtenga información sobre plataformas de trading, proveedores de pago y otras soluciones de terceros integradas con B2CORE Obtenga una visión más profunda de la interfaz de usuario de B2CORE Back Office Obtenga una visión más profunda de la interfaz de usuario de B2CORE Back Office Guías paso a paso para tareas y configuraciones comunes de administración en B2CORE Back Office Guías paso a paso para tareas y configuraciones comunes de administración en B2CORE Back Office Implemente aplicaciones móviles de marca para iOS y Android Implemente aplicaciones móviles de marca para iOS y Android Identifique y resuelva problemas comunes de forma rápida y eficaz con nuestras guías Identifique y resuelva problemas comunes de forma rápida y eficaz con nuestras guías La API de B2CORE está restringida y *no* está disponible públicamente. Si necesita la documentación de la API, envíe un ticket de soporte con una descripción clara y detallada de sus casos de uso previstos. Proporcionar una explicación exhaustiva de cómo planea utilizar la API nos ayudará a evaluar sus necesidades con precisión y a minimizar las preguntas de seguimiento o las demoras. Back Office API — clients, accounts, finance, verification, and admin operations. Front Office API — the client-facing B2CORE HTTP API. The interactive API reference on these pages is generated from an OpenAPI document. Download the raw file to import it into Postman, Insomnia, Stoplight, or to generate typed clients. Explore the Back Office and learn how to launch your own partnership programs Explore the Back Office and learn how to launch your own partnership programs Discover IB Room and join a partner plan to begin attracting new clients while earning rewards Discover IB Room and join a partner plan to begin attracting new clients while earning rewards ## September 3, 2026 [#september-3-2026] ### New features [#new-features] #### IP whitelist for API apps [#ip-whitelist-for-api-apps] Access to the B2CORE IB API can now be limited to specific IP addresses. In **Preferences** > **Apps**, each app has a new **IP Whitelist** field where you can enter up to 50 IPv4/IPv6 addresses or CIDR ranges. Requests from any other address are rejected. An empty list keeps the previous behavior and allows requests from any IP address. *** #### Inherited registration type [#inherited-registration-type] A new **Inherited** registration type is available for IB types. Clients who sign up using a partner's referral link are added to the partner's program automatically, but only if the referring partner already participates in that program. Clients who sign up without a referral link, or whose partner is in a different program, are not added, and the program isn't shown in the B2CORE UI, so clients can't apply for it themselves. This is designed for invitation-only programs where every referral should land in the same program as the partner who brought them, without manual assignment in the Back Office. *** ### Improvements [#improvements] * A **Trading Volume** tab has been added to the **Reports** page in the IB Room. Partners can now view their own total trading volume in USD per day for a selected period and track their progress towards the next tier without asking the broker. * A **Level** column has been added to the **Platform Deposits** and **Platform Withdrawals** reports in the IB Room. It shows the level of the client in the partner's structure. *** ## Past releases [#past-releases] ### August, 2026 [#august-2026] #### New features [#new-features-1] ##### Client Deposits and Client Withdrawals [#client-deposits-and-client-withdrawals] New **Client Deposits** and **Client Withdrawals** sections list deposits and withdrawals made by IB clients through their B2CORE wallets. These operations are aggregated along the IB chain, which makes it possible to report deposits, withdrawals and the NET result for each IB branch, including sub-IB clients. Both lists show the client's name and email and can be filtered by them. To avoid confusion, the existing **Deposits** and **Withdrawals** sections, which list operations on trading accounts, have been renamed **Platform Deposits** and **Platform Withdrawals**. The same names are used on the **Reports** page in the IB Room. #### Improvements [#improvements-1] * Client tag restrictions for Back Office users now also apply to the **Accounts**, **Trades**, **Rewards** and **Clicks** sections of **Introducing Brokers**, and to partner details. Users restricted by client tags see only the rows that belong to clients within their tags, as they already do on the **Clients** page. * When data masking is enabled for a partnership program, the **Name** and **Email** columns are hidden from the **Client List** report in the IB Room instead of showing masked values. *** ### July, 2026 [#july-2026] #### New features [#new-features-2] ##### Savings Rebates [#savings-rebates] A new **Savings Rebates** reward model is now available. Brokers can reward partners when their referred clients invest in savings plans. A savings program defines the rebate rate for each level of the partner chain and is linked to an IB type, in the same way as a CPA program. Rebates are calculated and paid daily. Programs, acquisitions and payments are managed in the new **Savings Rebates** section of the Back Office. Partners get a **Savings Rebates** widget on the dashboard and a **Savings Rebates** tab on the **Reports** page in the IB Room, listing the rebates earned per client, program and level. Savings Rebates is disabled by default. Contact your B2BROKER integration team to enable it. ##### New IB Room widgets and reports [#new-ib-room-widgets-and-reports] The Partner Dashboard has been extended with new widgets: * **Performance overview** — key indicators for a selected period: new clients, active traders, trading volume, deposits, withdrawals and reward amount. * **Top Clients** — the partner's top clients by reward amount, with their trading volume. * **Transactions** — recent wallet transactions, the same data as the **Transactions** report. * **NET Deposit Summary** and **NET Deposit Top Clients** — deposits, withdrawals and the NET result for the partner's clients, including sub-IB clients. A new **NET Deposits** tab has been added to the **Reports** page, listing deposits, withdrawals and the NET amount per client. The **Transactions** and **Rewards by Symbol** widgets are now part of the default dashboard layout, so partners see them without adding widgets manually. #### Improvements [#improvements-2] * A new rewards distribution mode is available on request. By default, rewards for the whole partner chain are calculated from the payment plan of the client's direct partner, and each partner above receives their level's share of it. In the new mode, each partner in the chain is paid according to their own IB type and payment plan at their own level. If a partner in the middle of the chain is missing or inactive, that link is skipped and the partners above keep their original levels. Contact your B2BROKER integration team to enable it. * The **Min position lifetime** platform setting now applies to both the open and the close side of a position. If a position is closed earlier than the configured lifetime, no reward is generated for either side. Previously, the open-side reward could still be paid for such positions when the **Open & Close** option was used. * Deposits and withdrawals that are edited or deleted on the trading platform are now updated or removed in the **Platform Deposits** and **Platform Withdrawals** lists and in the related reports. *** ### May, 2026 [#may-2026] #### New features [#new-features-3] ##### CPA (Cost-Per-Acquisition) payment plans [#cpa-cost-per-acquisition-payment-plans] A new **Cost-Per-Acquisition (CPA)** payment model is now available. Brokers can reward partners when a referred client reaches a milestone, such as completing **registration**, passing **KYC verification**, or making a **minimum deposit**. *** ##### Granular access permissions [#granular-access-permissions] Access to the **Introducing Brokers** section can now be controlled with greater precision. The broad **View** and **Edit** permissions have been split into per-section permissions, so Back Office roles can be granted access to exactly the sections they need — for example, viewing **Reports** without the ability to edit **Payment plans**. *** #### Improvements [#improvements-3] * A **date range** filter has been added to an individual partner's payment report, making it easier to review rewards over a specific period. *** #### Resolved issues [#resolved-issues] * Resolved an issue where exporting trades for a specific client could be very slow for partners with large trade histories. These exports now complete significantly faster. *** ### April, 2026 [#april-2026] #### New features [#new-features-4] ##### Platform Spread and Platform Markup payment plans [#platform-spread-and-platform-markup-payment-plans] Two new payment plans are now available — **Platform Spread** and **Platform Markup**. They reward partners based on the actual spread and markup applied on the trading platform, captured automatically per symbol, rather than values estimated from a configured ratio. #### Improvements [#improvements-4] * The process that recalculates statistics and reports has been reworked for greater speed and reliability. Partner and program figures now refresh more consistently, even for brokers handling large data volumes. *** ### March, 2026 [#march-2026] #### New features [#new-features-5] ##### IB chain reassignment [#ib-chain-reassignment] New **“Reassign Users”** UI added. Brokers can now reassign an entire IB sub-branch from one partner to another in a single operation. This significantly simplifies the reassignment process, making it faster and less prone to errors than moving branches manually one by one. #### Improvements [#improvements-5] * A **Position lifetime** column has been added to the **Trades** table. *** ### February, 2026 [#february-2026] #### New features [#new-features-6] ##### TradeLocker platform integration [#tradelocker-platform-integration] The **TradeLocker** platform is now supported, enabling brokers to connect TradeLocker to their partnership program and reward partners on the same terms as other platforms. Support covers accounts, symbols, trading groups, trades, and payment plans, all manageable from the Back Office. #### Improvements [#improvements-6] * Added a new **IB Program Type** restriction. *** ### January, 2026 [#january-2026] #### New features [#new-features-7] ##### Asynchronous data exports [#asynchronous-data-exports] Exporting large data sets from the **Introducing Brokers** section — including trades, payments, accounts, and rewards — now runs asynchronously in the background. Brokers can continue working while an export is prepared and download the file once it's ready, rather than waiting on the page or risking a timeout. This makes it possible to export much larger data sets reliably. ### December, 2025 [#december-2025] #### New features [#new-features-8] ##### B2TRADER platform integration [#b2trader-platform-integration] The B2TRADER platform is now integrated with B2CORE IB, enabling brokers to connect B2TRADER to their IB setup and start rewarding partners on the same terms as other platforms. All payment plans are supported, so you can keep existing partner configurations and apply the same reward logic across supported environments. ##### Spread payment plan for cTrader [#spread-payment-plan-for-ctrader] The Spread payment plan is now available for the cTrader platform, allowing brokers to reward partners based on a percentage of the spread. This option aligns cTrader with the spread-based rewards model already available on other platforms, so you can keep a consistent approach to partner payouts. #### Improvements [#improvements-7] * Reports for deposits and withdrawals have been reimplemented to improve consistency and performance. The updated reporting logic is designed to present results in a clearer, more stable way. ### October, 2024 [#october-2024] #### New features [#new-features-9] ##### New Spread payment plan for MT5 platform [#new-spread-payment-plan-for-mt5-platform] The IB team is excited to introduce the much-anticipated Spread payment plan for the MetaTrader 5 platform. This innovative plan enables brokers to reward their partners based on a percentage of the spread, significantly expanding their referral reach across various markets. ##### Tier volume in USD [#tier-volume-in-usd] From now on, trading volume for tiers can be set not only in lots, but in USD as well, offering brokers increased flexibility in IB types configuration. #### Improvements [#improvements-8] * The **IB** column has been added to the **Clients** page. It shows the partner's name who referred the client and serves as a link to the partner details. * The **Payments** > **Methods** page has been removed from the Back Office due to the potential for unforeseen issues arising from modifying or deleting payment methods. For the same reason, it’s no longer possible to delete platforms through the Back Office. * When creating a new IB type, a default tier with empty parameters will no longer be automatically created, as previously done. #### Resolved issues [#resolved-issues-1] There have been no customer-facing issues reported in this release. *** ### August, 2024 [#august-2024] #### New features [#new-features-10] ##### Migration to PostgreSQL [#migration-to-postgresql] Our team is happy to announce that the migration from MongoDB to PostgreSQL has been successfully completed. Although this is mostly an internal technical enhancement, end-users will notice that the IB application now runs faster and more stable. ##### Min. position lifetime for cTrader [#min-position-lifetime-for-ctrader] For the cTrader platform, the **Min position lifetime** option has been added. The logic is exactly the same as for MT platforms: if a position was closed earlier than the Min position lifetime, it’s not taken into account in rewards calculations. The **Min position lifetime, sec.** field is now available in the cTrader platform preferences. #### Improvements [#improvements-9] * IDs of new partners are now in UUID format, not an index number, as it was before. This change eliminates the need for the **Encrypted** setting on the **Promo** > **Landings** > **Links** page. Existing IDs retain the numeric format, the **Encrypted** setting continues to work for them. All existing referral links remain working. * Information on clients’ accounts is now available on a separate **Accounts** tab in IB details. * Payment of rewards has become faster, thanks to technical improvements that allow for parallelization of the process. * Now running the system processes from the Back Office is disabled by default. It’s aimed at avoiding potential overloads of the database and application. Contact our technical support team if you need to restart a process. * To improve system performance, process logs are no longer stored in the database. As a result, the **Introducing brokers** > **Logs** section has been removed from the Back Office menu, and the **Logs** column has been removed from the **Introducing brokers** > **Processes** page. * To improve system performance, data storage limits have been implemented in the database: * Processes: 1 month * Deposits: 1 year * Withdrawals: 1 year * Trades: 1 year ### March 21, 2023 [#march-21-2023] #### New features [#new-features-11] ##### cTrader integration with IB [#ctrader-integration-with-ib] cTrader has been integrated with B2CORE IB, allowing you to connect the cTrader platform to your IB instance by navigating to **Introducing Brokers** > **Platforms** > **Platforms**. #### Resolved issues [#resolved-issues-2] * Fixed an issue due to which it was impossible to create a payment plan for all symbols in a trading group as it was only created for the selected symbol. * Fixed an issue due to which the trade opening time wasn’t updated according to the time zone set on the MetaTrade4 platform. * Fixed an issue due to which the position lifetime didn’t match the time difference between opening and closing a position. * Fixed an issue due to which the clients’ deposit and withdrawal operations weren’t displayed in the **Introducing Brokers** section. * Fixed an issue due to which duplicate records were displayed for deposit and withdrawal operations. ### April 12, 2022 [#april-12-2022] #### New features [#new-features-12] ##### Brand new IB section [#brand-new-ib-section] The IB section featuring new design and extended functionality for running partnership programs has been introduced in the B2CORE UI. For details, refer to the **For partners** section. ##### Max amount payment plan [#max-amount-payment-plan] A new **Max amount** payment plan has been introduced with this release. With this plan, you can pay partners a fixed amount for each lot traded by their clients, in the same way as with the Lot payment plan, but with the opportunity to set the maximum reward amount regardless of the number of levels and specify the exact amount which a partner receives at each level. For details, refer to [Payment plans](broker-guide/payment-plans#max-amount). ##### Data on deposits, withdrawals and trades [#data-on-deposits-withdrawals-and-trades] The **Deposits**, **Withdrawals**, and **Trades** tabs have been added to IB details in the B2CORE Back Office. The tabs display data on deposits, withdrawals, and trades of all clients of a selected partner. The export feature as well as filtering and sorting options are available. *** ### March 29, 2022 [#march-29-2022] #### New features [#new-features-13] ##### Deposits & withdrawals data [#deposits--withdrawals-data] The **Deposits** and **Withdrawals** sections have been added to **Platforms**. They display data on deposits/withdrawals of all clients on all trading accounts, indicating the date-time, account, amount, and currency as well as the unique identifier of the operation on the trading platform. *** ### March 15, 2022 [#march-15-2022] #### New features [#new-features-14] ##### Platform disabling [#platform-disabling] A new feature that enables you to turn off a trading platform without deleting it has been implemented. A new **Status** field (Enabled/Disabled) has been added to the platform details in **Platforms** > **Platforms**. ##### Account disabling [#account-disabling] A new feature that allows you to disable trading accounts without deleting them has been implemented. Disabled accounts are excluded from data sync and reward payment. A new **Enabled** field (Yes/No) has been added to the account details in **Platforms** > **Accounts**. ##### Filter by account type [#filter-by-account-type] This feature is aimed at closer integration with PAMM, MAM, and B2COPY. It helps to distinguish trading accounts from investment accounts. A new **Account type** field has been added to **Platforms** > **Accounts**, **Platforms** > **Trades** and **Payments** > **Rewards**. When opening a trading account, its type is obtained from B2CORE. When changing the type of an accounts group in B2CORE, the type is updated for all accounts. ##### Trading volume in USD [#trading-volume-in-usd] The **Trading volume, USD** column has been added to the **Introducing brokers** section and **Clients** tab in broker details. Filtering by non-zero/zero trading volume (Yes/No) is available. The **USD Trading volume** field has also been added to the **Payment report**, **Reports** tab in partner details and IB type details, to the trade details and payment details. ##### Deposits & withdrawals data [#deposits--withdrawals-data-1] The **Deposits** and **Withdrawals** tabs have been added to the client details in **Program** > **Clients** and account details in **Platforms** > **Accounts**. They display data on deposits/withdrawals, indicating the date-time, account, amount, and currency of the operation. ##### Contract size [#contract-size] A new **Contract size** field has been added to the symbol details, trade details and payment details. *** ### March 1, 2022 [#march-1-2022] #### New features [#new-features-15] ##### Partners and clients data import [#partners-and-clients-data-import] Customers who switch to B2CORE from other systems can now import data of their partners and clients into B2CORE IB. #### Improvements [#improvements-10] * Languages and themes of banners in selectors are now displayed in alphabetical order in the B2CORE UI. *** ### February 15, 2022 [#february-15-2022] #### New features [#new-features-16] ##### Deposits & withdrawals details [#deposits--withdrawals-details] Dates, currencies, amounts, and account numbers of deposits and withdrawals have been synchronized with MT4 and MT5. ##### Trading volume in USD [#trading-volume-in-usd-1] Trading volume in USD is now calculated for each trade. #### Improvements [#improvements-11] * The capability to sort banners by size has been added to the B2CORE UI. The banners are ordered by their width. If two banners have the same width, their length is taken into account. * The Client tag field has been added to the client’s details. Before, it was displayed only on the Clients tab in the partner’s details. *** ### February 1, 2022 [#february-1-2022] #### New features [#new-features-17] ##### PDO Driver v3 [#pdo-driver-v3] MetaTrader 4, MetaTrader5, and B2CORE Payment Method have migrated to the PDO driver v3. ##### B2CORE admin tags [#b2core-admin-tags] Access to the data of B2CORE Back Office sections can now be restricted using tags specified for the admin. See [B2CORE Back Office Guide](https://docs.b2core.b2broker.com/en/back-office-guide.html) for more details. ##### Languages priority [#languages-priority] The Priority property has been added to the Languages tab of **Promo** > **Landing** > **Links**. ##### Symbol group trades [#symbol-group-trades] The Trades tab has been added to the trading group details. On this tab, you can see and export a list of trades in the symbol group. #### Improvements [#improvements-12] * The **Base currency code** and **Quote currency code** fields have been added to **Platforms** > **Symbols**. Filtering and sorting by these fields are supported. *** ### January 18, 2022 [#january-18-2022] #### New features [#new-features-18] ##### WEBAPI v4 driver [#webapi-v4-driver] Sync of trading groups and trading symbols can now be run with the newly integrated WEBAPI v4 driver. ##### Drivers priority [#drivers-priority] The **Priority** property has been added to drivers, with prioritization logic similar to that of rate providers: first, the driver with the highest priority is taken, in case of failure — the next backup driver, and so on. If all drivers return a failure, the service reports that the function can't be performed. This property has been added to the **Drivers** tab in **Platforms** > **Platforms**. When creating a driver, it's automatically assigned the lowest priority; the priority can be changed when a driver is being edited. #### Improvements [#improvements-13] * A validation by platform ID has been added to the B2CORE Back Office, which prohibits connecting the same trading platform multiple times. ### December 21, 2021 [#december-21-2021] #### New features [#new-features-19] ##### Converter platform support [#converter-platform-support] Starting with this release, partners can receive rewards for the exchange operations performed by their clients. Currency pairs data is taken from the Currency pairs section of the B2CORE Back Office. Rewards are paid in the base currency of the partner's account, regardless of the currency pair of the exchange operation. The Commission payment plan is available. Rewards for exchange operations on demo accounts aren't processed. ##### Customizing link languages [#customizing-link-languages] For links in **Promo** > **Landings**, language customization has been added. You can configure separate URLs for each language of the landing page on the **Languages** tab, which has been added to the **Link** editing page. #### Improvements [#improvements-14] * From now on, when clients and partners are deleted from the B2CORE Back Office, their details such as name, email and account number are still displayed in the rewards history. * The **Platforms** section has been optimized to display information about various trading platforms: unused fields have been hidden to reduce the amount of displayed data and make it more accessible. * Sorting by the **Registrations**, **Clicks**, **Click Conversion Rate** fields has been added to the sections **Promo** > **Banners** > **Banners** and **Promo** > **Landing** > **Links**. *** ### December 7, 2021 [#december-7-2021] #### New features [#new-features-20] ##### Concurrency integration [#concurrency-integration] The concurrency framework has been implemented along with parallel processing of commands for synchronizing data with trading platforms, calculating rewards, crediting money to accounts and canceling rewards. The performance is expected to increase on average by 500%. ##### Support for B2CORE multi-currency accounts [#support-for-b2core-multi-currency-accounts] A new version of the **Payment method** for IB has been developed, which is compatible with multi-currency accounts of the B2CORE. It's important that this feature doesn't imply multi-currency payments: rewards are still paid in the original account currency or base currency. #### Improvements [#improvements-15] * The **Landing page** selector has been removed from banners create/edit pages. *** ### October 26, 2021 [#october-26-2021] #### New features [#new-features-21] ##### Export feature [#export-feature] The **Export** button is added to the number of sections and tabs and allows to download available data. For most sections, unless stated otherwise, the data is downloaded in CSV format, and retains all filters and a structure of the original table. The **Export** button is only visible to users with granted **Export** permissions. Explore the new feature here: * **Banners** — Introducing brokers > Program > Introducing Brokers > Edit > Banners tab. * **Links export** — Introducing brokers > Program > Introducing Brokers > Edit > Links tab. * **Currencies** — Introducing Brokers > Payments > Currencies section. * **Account transactions** — Introducing brokers > Payments > Accounts > Edit > Transactions tab. * **Transaction rewards** — Introducing brokers > Payments > Accounts > Edit > Transactions > Edit > Rewards tab. * **Logs** — Introducing brokers > Logs section. * **Countries** — Introducing brokers > Preferences > Location > Countries section. * **Accounts** — Introducing Brokers > Payments > Accounts section. The data in the Accounts section is downloaded in CSV format, and retains all filters and a structure of the original table except for the Balance field, which doesn't get exported. *** ### October 12, 2021 [#october-12-2021] #### New features [#new-features-22] ##### Transactions export [#transactions-export] List of transactions in the **Introducing Brokers** > **Payments** > **Transactions** section can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. The export feature for this and other sections and tabs is only available to users with Export permissions. ##### Symbols export [#symbols-export] List of symbols can now be exported in the **Introducing Brokers** > **Platforms** > **Symbols** and **Introducing brokers** > **Programs** > **Types** > **Symbols** tab sections via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Trades export [#trades-export] Trades data for a particular account or a client can now be exported via the **Export** button located on **Trades** tab in **Introducing Brokers** > **Platforms** > **Accounts** and **Introducing Brokers** > **Clients** sections. The data is downloaded in CSV format, and retains all filters and table structure of the original table. ##### Accounts export [#accounts-export] List of all accounts or accounts belonging to a specific client can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. To explore the feature navigate to **Introducing brokers** > **Platforms** > **Accounts** or **Introducing brokers** > **Clients** > **Account** tab. ##### Clicks statistics export [#clicks-statistics-export] Clicks data on the **Introducing brokers** > **Program** > **Introducing brokers** > **Clicks** tab can now be exported via the **Export** button that replaced the **Excel** and **CSV** buttons. The data is downloaded in CSV format, and retains all filters and table structure of the original table. #### Improvements [#improvements-16] * Newly generated QR codes in the **Promo** section are now displayed in a smaller size. *** ### September 28, 2021 [#september-28-2021] #### New features [#new-features-23] ##### Clients and trading groups export [#clients-and-trading-groups-export] List of Introducing brokers clients and **Platform** > **Groups** can now be exported to a CSV file via the new **Export** button that replaced the **Excel** and **CSV** buttons. This feature is only available to users that have **Export** permissions. All entries in an exported data set are sorted in the same way they were in the original table. #### Improvements [#improvements-17] * Users can now see when a particular program's tier or level was created and updated. * Date-time in all sections is now displayed in a single format: `Mon. DD, YYYY HH:MM:SS`, for example: Jan. 21, 2021 11:28:06. Month abbreviations consist of the first three characters of the month name. Months with four-character names, such as June, aren't abbreviated. * Paxios currency new alias is updated in currency details. #### Resolved issues [#resolved-issues-3] * Fixed the Client ID filter error in Preferences > Security > Authorizations, Preferences > Security > Authentications. *** ### September 14, 2021 [#september-14-2021] #### New features [#new-features-24] ##### Tiers and levels settings export [#tiers-and-levels-settings-export] Tiers and levels settings of an IB Program can now be exported to a CSV file via the new **Export** button (that replaced the **Excel** and **CSV** buttons). This feature is only available to users that have Export permissions. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Introducing Brokers** > **Program** > **Types** > **details** > **Tiers** and **Levels** tab. ##### Clicks records export [#clicks-records-export] Clicks records export is now available to users with **Export** permissions via the new **Export** button. All entries in an exported data set are sorted in the same way they were in the original table. To explore the new feature, navigate to **Promo** > **Analytics** > **Clicks**. *** ### August 31, 2021 [#august-31-2021] #### New features [#new-features-25] ##### Export and import permissions for Introducing brokers [#export-and-import-permissions-for-introducing-brokers] New **Export permission** and **Import permission** groups have been added to the **System** > **Groups** > **Introducing brokers** section of the B2CORE Back Office. ##### Geolocation update button [#geolocation-update-button] It has become possible to update your database to the latest version by clicking the **Update** button on the **Database** tab in the **Preferences** > **Location** > **Geolocation** section. ##### QR code generation [#qr-code-generation] It has become possible to generate QR codes for a partner link. A new feature is available in the **Program** > **Introducing brokers** section on the **Links** tab of the partner’s detailed information. #### Improvements [#improvements-18] * Only the languages, that are enabled in the **System** > **Localization** section, are now being displayed if you click the localization button next to the **Name** and **Description** fields of the **Preferences tab** in the **Introducing brokers** > **Program** > **Types** section. * You can now filter trading groups by multiple parameters at the same time. To do that, type in a list of groups separating them with space, comma, or colon in the filter field. * Symbol settings import support is available for macOS and Windows. *** ### August 03, 2021 [#august-03-2021] #### Improvements [#improvements-19] * The list of trading instruments is now synchronized and displayed in the **Symbols** section of the B2CORE Back Office. *** ### July 20, 2021 [#july-20-2021] #### New features [#new-features-26] ##### New Description field [#new-description-field] A new **Description** field has been added to IB types. In this field you can specify more information about the partnership program. ##### QR codes colors and icons [#qr-codes-colors-and-icons] Color and icon configurations for QR codes generation are added to the B2CORE Back Office. ##### Link to Release notes [#link-to-release-notes] You can navigate to Release notes from the **Updates** section of the B2CORE Back Office. #### Improvements [#improvements-20] * IB types, partners and clients are combined in the **Program** section in the B2CORE Back Office to optimize the convenience of B2CORE IB use. * To create a new IB type, specify only its name, description, type of registration, approval, and currency for rewarding partners. * When registering in the type with disabled approval option, the partner redirects immediately to the IB Room with no need to refresh the page. * The size of the distributive is now 2 times smaller. It speeds up the installation and updating processes, minimizes the amount of space needed on the hard drive and optimizes the hosting costs. * The troubleshooting is faster and more accurate, and the problems can be solved in a few seconds due to the improved diagnostics of the geographical location service. *** ### July 6, 2021 [#july-6-2021] #### Improvements [#improvements-21] * On the **Payment plans** tab of a symbol, you can now configure how much the broker pays for trades with this symbol for all IB types or edit these values in one place. This is especially useful when new symbols appear on trading platforms: on the list of symbols, sort and filter by date to select recently added symbols, then set up payment plans for all types at once on one page. * In the details of a partner, the number of levels for which the broker pays this partner is now explicitly displayed. When changing the IB type, the number of levels automatically changes according to the IB type settings. To set up individual conditions for a partner, the broker can select Custom Levels and specify the number of Master Levels for which the partner receives a reward. * The **encrypted links** configuration is moved from IB type settings to **Links** to make the setup more convenien