GH GambleHub

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.

Contact

Get in Touch

Reach out with any questions or support needs.We are always ready to help!

Start Integration

Email is required. Telegram or WhatsApp — optional.

Your Name optional
Email optional
Subject optional
Message optional
Telegram optional
@
If you include Telegram — we will reply there as well, in addition to Email.
WhatsApp optional
Format: +country code and number (e.g., +380XXXXXXXXX).

By clicking this button, you agree to data processing.