Where Did the Extra 0.3 Pips Come From? Auditing Silent Spread Markups End-to-End
Silent spread markups are rarely “fraud.” They’re usually the result of good intentions spread across too many systems: LP quotes, bridge/aggregator rules, platform plugins, account-group configs, and even IB rebates that force pricing tweaks.
The problem is simple: when two (or three) layers apply markup to the same instrument, your client sees a wider spread than your commercial team thinks you’re charging. That can quietly damage conversion, increase churn, and create uncomfortable questions from regulators or professional clients. This post shows a practical way to audit markup layers end-to-end—so you can prove your true all-in spread and remove accidental double-charging.
1) The “markup stack”: where double-charging actually happens
Most brokers don’t have one markup. They have a stack. The stack differs by setup, but the failure mode is consistent: each team optimizes its own component, without a single source of truth for the final client quote.
Common markup layers to map:
- LP / PoP raw feed: the base bid/ask (sometimes already “all-in” if the LP embeds costs in spread).
- Aggregator/bridge markup: symbol-level or group-level rules (fixed pips, percentage, time-based, session-based, or liquidity-source-specific).
- Platform layer (MT4/MT5/cTrader/others): account group settings, plugins, or dealer rules that alter spread/commission presentation.
- Account type packaging: “raw + commission” vs “all-in spread” accounts—where markup can be moved between spread and commission.
- IB / affiliate economics: rebates that motivate adding spread or commission to fund payouts.
Double-charging often happens when (a) the bridge applies a markup and (b) the platform group also applies a markup—or when you run both a “raw+commission” commission schedule and a bridge markup intended for “all-in” accounts.
2) Red flags that usually indicate a silent markup problem
You don’t need a perfect audit to suspect a markup stack issue. A few operational signals show up early—especially when you compare what sales thinks you offer vs what execution actually delivers.
Watch for these patterns:
- Spread complaints that don’t match your quoting policy (e.g., clients report EUR/USD wider by ~0.2–0.5 pips than your “expected markup”).
- Different spreads for the same symbol across account groups that are supposed to be identical.
- Unexpected spread widening during rollovers/news that’s larger than what your LP feed shows.
- High rejection/low fill rates after a pricing change (markup can push you out of top-of-book and change routing/fill behavior).
- Support tickets that mention “my friend has tighter spreads” even when both are on the same account type.
From a compliance and client-communications perspective, these red flags matter because they can create a mismatch between disclosed pricing and effective pricing. Always check local regulations and your client agreements, and involve compliance if you discover systematic overcharging or inconsistent disclosures.
3) Build a “single quote truth” dataset (what to log before you change anything)
The fastest audits fail because teams start changing configs before they can prove where the markup is applied. First, capture evidence.
For a 1–2 week window (or at least several full trading sessions), collect a minimal dataset per symbol and account group:
- Raw LP quote (best bid/ask per LP and consolidated top-of-book if you aggregate).
- Bridge/aggregator output quote (post-markup, post-SOR selection).
- Platform quote delivered to client (what MT4/MT5/cTrader actually publishes).
- Executed fill price (and any slippage vs the platform quote at order time).
- Account metadata: account group, symbol, session/time, execution route (A-book/B-book/hybrid), and commission schedule.
If you can’t log all layers, start with two comparisons:
- LP raw vs platform quote (to detect “something added somewhere”).
- Bridge output vs platform quote (to isolate platform-level markup/plugins).
The goal is a reproducible “quote lineage” for each instrument: LP → bridge → platform → fill. Once you have that, you can quantify markup per layer rather than debating it.
4) Step-by-step: auditing markup layers from LP to client
Run the audit in the same order your pricing flows. Don’t jump straight to MT5 group settings if the bridge is already adding markup.
A practical sequence:
Confirm the LP commercial model
- Is the LP feed truly “raw” (commissioned) or “all-in” (cost embedded in spread)?
- Are there session-based wideners or last-look behaviors that change effective spread?
Audit the bridge/aggregator rules
- Export symbol configs: markups, rounding, min/max spread, spread multipliers.
- Check for multiple rule scopes: global + group + symbol overrides.
- Verify whether markup is applied before or after aggregation (this changes outcomes).
Audit platform group/symbol settings
- Validate per-group spread/commission settings and any “virtual dealer”/dealer plugins.
- Look for “hidden” adjustments like minimum spread floors, asymmetric markups, or symbol suffix mappings that point to a different config than expected.
Audit account packaging logic
- For “raw+commission” accounts, ensure the bridge markup is zero (or explicitly justified).
- For “all-in” accounts, ensure commission schedules aren’t still charging “raw” commissions.
Audit IB funding mechanics
- If IB rebates are funded via spread, confirm the rebate logic doesn’t cause an additional markup layer elsewhere.
Deliverable: a table per symbol and account group showing (a) raw spread, (b) bridge markup, (c) platform markup, (d) commission, and (e) effective all-in cost.
5) A concrete example: how 0.2 pips becomes 0.6 pips
Here’s a simplified scenario that happens more often than teams expect:
- LP raw spread on EUR/USD averages 0.1 pips in liquid hours.
- Your intended broker markup is +0.2 pips (to create an “all-in” spread account).
- The bridge is configured with +0.2 pips on EUR/USD for that group.
- Separately, the MT5 account group has a legacy plugin/config adding +0.2 pips (originally used years ago when liquidity was different).
Result:
- Client sees ~0.5 pips (0.1 + 0.2 + 0.2), not the 0.3 pips sales and marketing believe you’re offering.
Now add a common operational twist:
- The broker also charges a small commission (because the commission schedule wasn’t removed when the account type was repackaged).
At that point, you’re effectively charging in two dimensions (spread + commission) when the product was meant to be spread-only. Even if this is accidental, it’s a client experience problem—and potentially a disclosure problem depending on jurisdiction and client classification.
6) Controls to prevent markup drift (so you don’t reintroduce the issue next quarter)
After you fix today’s configs, you need guardrails. Markup drift comes back when teams add new LPs, new symbols, new account types, or new IB deals.
Put these controls in place:
- One owner for “all-in pricing”: a single function (often dealing/execution + finance) signs off on the final client spread/commission model.
- A markup change log with approvals: who changed what, when, why, and what client groups are affected.
- Automated variance checks (daily/weekly):
- Compare platform quote vs bridge output vs LP raw.
- Alert when the delta exceeds a threshold (e.g., >0.1–0.2 pips on majors during liquid hours).
- Account-type templates: “Raw+Commission” template and “All-in Spread” template with mutually exclusive settings.
- Symbol mapping discipline: consistent naming/suffix rules so you don’t accidentally apply markups to the wrong instrument.
Also consider how your disclosures, T&Cs, and pricing pages describe spreads and commissions. If your effective pricing can vary by liquidity conditions or routing, make sure that’s communicated appropriately and reviewed by compliance.
The Bottom Line
Silent spread markups usually come from layered configurations—not malicious intent. The fix is an end-to-end quote lineage: LP raw → bridge output → platform quote → executed fill, broken down by symbol and account group.
Once you can quantify markup per layer, you can remove duplicates, align account packaging (spread vs commission), and set controls that stop markup drift.
If you want help instrumenting pricing audits across your bridge, platform, CRM, and reporting stack, talk to Brokeret at /get-started.