Commission structure: MDR, scheme, PSP
1) Concept map and what MDR is made of
MDR (Merchant Discount Rate) - the total cost of receiving payments, usually expressed in% of turnover + fix. transaction fee. Classic card stack:1. Interchange (issuing bank): percentage by card type/region/category.
2. Scheme fees (payment systems): assessment, processing, cross-border, brand usage, etc.
3. Acquirer/PSP markup: acquirer/provider surcharge (percentage + fix).
4. Add. fees: chargeback fee, refund fee, representation, retrieval, auth-fee, gateway-fee, rolling reserve (not commission, but affects cash flow), FX spread at conversion.
Total Cost for Merchant = Interchange + Scheme + Markup + Fixed Charges + FX Effects ± Reserve.
2) Pricing models
2. 1. Blended (flat)
One percent + fix. all inclusive fee. Simple but opaque: hides interchange/scheme and FX spread.
2. 2. IC++ (Interchange++ / Interchange pass-through)
Interchange and scheme go "as is," from above - the provider's fixed markup. Transparent, easier to verify, profitable with a "cheap" portfolio of cards.
2. 3. Tiered/Pricing buckets
Several "baskets" (domestic, intra-EEA, inter-regional, commercial, premium). Convenient for reporting, can mask the real cost.
2. 4. Alternative methods (A2A/Wallet/Crypto)
More often flat-fee or% below cards; separate network/provider fees and FX effect during conversion.
3) Where and when the commission arises
Auth/Validation: Authorization Attempt Fee (USP/NESP) .
Capture/Settle: the main share of MDR.
Refund/Partial refund: returns are often charged separately (+ scheme recalculation).
Chargeback/Representment: фикс. case/stage fees.
Gateway/Platform: monthly subscription fee, fee for webhooks, reporting, card tokenization.
FX/Conversion: implicit PSP/bank margin (spread) if the conversion is on their side.
Calendar: minimum monthly fee, early termination, PCI board, 3DS-fee, fraud-suite fee.
4) Surcharges and tariff correctors
Cross-border (issuer ≠ acquirer country), CNP (card-not-present), premium/commercial cards.
High-risk verticals (iGaming) - increased markup/reserve.
Scheme penalties/threshold metrics: exceeding CBR → additional fees.
SCA/3DS: separate fee per transaction/attempt.
Minimum ticket/Small ticket: elevated fix. fees on small checks.
5) Gross vs Net settlement and "where did the interest go"
Gross settlement: the shaft is settled with the PSP, commissions are removed in a separate line (easier to verify).
Net settlement: net funding = turnover − interchange − scheme − markup − fix. fees − reserve.
In net scenarios, it is critical to import the component breakdown, otherwise take-rate "jumps."
6) Formulas and "effective" metrics
6. 1. Effective take-rate (by/PSP method)
take_rate_effective_% = (Σ Fees_all_components) / (Σ Captured_Gross) 100
6. 2. Decomposition into components
Fees_all = Interchange + Scheme + Markup + Auth + Refund + Chargeback + Gateway
+ FX_spread_effect (if applicable)
6. 3. Decline cost
Cost_per_approval = (Σ Auth_Fees + Σ Decline_Fees )/( Number of successful payments)
6. 4. Impact FX
FX_slippage = Σ (Settlement_amount_in_rep - Original_amount FX_reference_rate)
6. 5. Chargeback cost
CB_cost_total = Σ (CB_fee + Representment_fee + Scheme_penalties) + Lost_principal (если не отбит)
7) Data model (simplified)
ref. fee_components (
code PK, name, category, -- INTERCHANGE SCHEME MARKUP AUTH REFUND CHARGEBACK GATEWAY FX_SPREAD unit, -- PCT FIX MIXED is_variable, is_settlement_level
)
finance. psp_pricing (
provider, method, region, bin_range, card_type, card_category,
model, -- BLENDED IC++ TIERED pct_rate, --% rate (if applicable)
fix_fee, -- фикс за trx cross_border_bps, premium_bps, cnp_bps,
refund_fix, cb_fix, auth_fix, gateway_monthly,
valid_from, valid_to, meta
)
finance. settlement_fees (
batch_id, provider, mid, method, period_start_at, period_end_at,
interchange_amt, scheme_amt, markup_amt,
auth_amt, refund_amt, cb_amt, gateway_amt,
fx_spread_amt, reserve_delta, total_fees, currency
)
dw. transactions_flat (
tx_id, provider, method, status, bin, brand, category, region,
amount_original, currency_original, amount_reporting, reporting_currency,
settled_at, funded_at, is_refund, is_cb, fx_reference_rate, fx_effective_rate, meta
)
8) Reconciliation: from transactions to file and back
8. 1. Tx → File (we check that we counted "as in a file")
Aggregate basket sales (BIN/region/card type) × pricing rules.
Apply interchange/scheme/markup/fix rates.
Check with 'settlement _ fees. total_fees` по batch. Delta> threshold → ticket.
8. 2. File → Tx (check that there is no "superfluous" in the file)
Distribute the batch-fee in proportion to the turnover/number of transactions to the tx level (with blended/no granularity).
Find unexpected positions (extra fee line, penalty, minimum monthly top-up).
9) Examples of SQL templates
9. 1. Calculation of effective take-rate by methods/PSP
sql
SELECT provider, method,
SUM(amount_reporting) AS volume_rep,
SUM(f. interchange_amt + f. scheme_amt + f. markup_amt +
f. auth_amt + f. refund_amt + f. cb_amt + f. gateway_amt + f. fx_spread_amt) AS fees_rep,
100. 0 SUM(f. interchange_amt + f. scheme_amt + f. markup_amt +
f. auth_amt + f. refund_amt + f. cb_amt + f. gateway_amt + f. fx_spread_amt)
/ NULLIF(SUM(amount_reporting),0) AS take_rate_effective_pct
FROM dw. transactions_flat t
JOIN finance. settlement_fees f
ON f. provider = t. provider
AND t. settled_at BETWEEN f. period_start_at AND f. period_end_at
GROUP BY 1,2
ORDER BY take_rate_effective_pct DESC;
9. 2. Redistribution of batch-fee to transactions (blended)
sql
WITH vol AS (
SELECT provider, batch_id, SUM(amount_reporting) AS batch_volume
FROM dw. transactions_flat
GROUP BY 1,2
)
SELECT t. tx_id, t. provider, t. batch_id,
(f. total_fees t. amount_reporting / NULLIF(v. batch_volume,0)) AS fee_allocated
FROM dw. transactions_flat t
JOIN finance. settlement_fees f USING (provider, batch_id)
JOIN vol v USING (provider, batch_id);
9. 3. Cost of refusals and cost of approval
sql
SELECT provider, method,
SUM(CASE WHEN status='DECLINED' THEN auth_fee ELSE 0 END) AS decline_cost,
SUM(CASE WHEN status='APPROVED' THEN auth_fee ELSE 0 END) AS approval_auth_cost,
COUNT() FILTER (WHERE status='APPROVED') AS approvals,
(SUM(auth_fee) / NULLIF(COUNT() FILTER (WHERE status='APPROVED'),0)) AS cost_per_approval
FROM dw. auth_events;
9. 4. Allocation of the FX spread (if there is an effective rate)
sql
SELECT provider, DATE(settled_at) AS d,
SUM((fx_effective_rate - fx_reference_rate) amount_original) AS fx_slippage_rep
FROM dw. transactions_flat
WHERE fx_effective_rate IS NOT NULL
GROUP BY 1,2;
10) KPIs and dashboards
Effective Take-Rate% by PSP/Method/MID/Country.
Component stack: Interchange%, Scheme%, Markup%, Fixed per trx.
Cost-per-Approval and Decline-burden.
FX Slippage (bps and in report currency).
Refund/CB Cost per 1000 transactions.
Penalty/Minimum-monthly incidents.
Reserve as% of GMV (to understand the impact on the cache flow).
11) Alerts and thresholds
Take-rate spike: height> X bps d/d or> Y bps w/w.
Scheme delta: calculated scheme-fees discrepancy with file> 0. 3–0. 5%.
FX slippage:> 80 bps for majors or> 150 bps for minors.
Decline cost surge: A spike in approval costs as AR declines.
Unmapped fee line - a new line in the file without component mapping.
Minimum monthly shortfall: shortage of turnover to the minimum wage (additional payment ahead).
12) Negotiation and cost reduction
1. Switch to IC++ if the portfolio is favorable (domestic, consumer debit).
2. BIN-routing/Smart-routing: Break down flows by geo/card type to "cheap" acquirers.
3. A2A/Open Banking/Local methods to reduce the share of expensive cards.
4. Tiered volume discounts: fix thresholds and reviews quarterly.
5. Cap on fixed-fees for micro-ticket segments.
6. Transparent FX: reference-rate + fixed spread_bps, reports on effective FX.
7. Penalty shields: stipulate the limits/conditions of scheme fines and their evidence base.
8. Separate MIDs for high-risk/low-risk portfolios - do not "infect" tariffs.
9. Performance-clauses: SLA by authorizations/3DS, otherwise - markup decline.
13) Edge-cases
Fan-out authorizations (retries) → auth-fees take off. Enable rate-limit/soft-decline strategies.
Partial capture: circuit calculations are recalculated; it is important to properly aggregate.
Ex-post repricing: retroactively, the provider recalculated fees - store file versions and batch revisions.
Refunds later cutoff: Hit the next cycle - adjust reports.
Corporate/premium cards: watch the share - "pulls" the average interchange.
14) Best practices (short)
1. Calculation engine fees on your side + mapping all file lines to components.
2. IC++ and transparent FX where beneficial; blended - only at a real discount.
3. Smart-routing by BIN/geo/card type; PSP A/B tests.
4. Separate accounting of fixed fees and interest; do not mix with FX gain/loss.
5. Versioning pricing and files; deterministic reprocess.
6. Weekly "variance-reports" on take-rate components.
7. Negotiations once a quarter with a package of metrics: CBR, 3DS pass-rate, AR, fraud-rate, share of domestic.
15) Implementation checklist
- Directory 'fee _ components' and 'psp _ pricing' with versions and validity periods.
- Import 'settlement _ fees' with Interchange/Scheme/Markup/Fixed detail.
- ETL of calculating our version of fee by tx and checking against the file.
- Dashboards take-rate and component stack.
- Алерты: spike, mismatch, FX slippage, minimum monthly.
- Negotiation procedures: quarterly audit and mitigation roadmap.
Summary
MDR is not "one percent," but a set of layers: interchange, scheme, markup, fixed boards and FX. A transparent data model, its own calculation of "reference" commissions, regular reconciliation with PSP files and meaningful payment routing turn the cost of acceptance into a manageable KPI. With this discipline, you see a real take-rate, find leaks in FX and fix fees, and confidently reduce the TCO of payments.