Metric

What is platform fee rate, and how do you measure it?

Definition

Platform fee rate is the share of gross sales that never reaches the seller: platform commission, payment processing, and payout or FX fees combined. The number you care about is the effective rate computed from actual fee lines — not the rate card. Commission tiers, small-business programs, per-transaction minimums, and cross-border surcharges all pull the realized rate away from the advertised one.

Formula: Effective platform fee rate = (commission + processing fees + payout/FX fees) / gross sales × 100

What data do you need?

  • Order or transaction records with gross amount and currency
  • Fee lines split by type: platform commission, processing, payout, FX
  • Refunds and chargebacks, and whether fees were returned on them
  • Tier or program flags (small-business rate, subscription year two, plan level)
  • Settlement or payout statements to reconcile against

SQL pattern

Effective fee rate by platform and month, with rate driftPostgreSQL
WITH monthly AS (
  SELECT
    platform,
    date_trunc('month', ordered_at) AS month,
    SUM(gross_amount) AS gross_sales,
    SUM(refund_amount) AS refunds,
    SUM(commission_fee) AS commission,
    SUM(processing_fee) AS processing,
    SUM(payout_fee + fx_fee) AS payout_and_fx,
    -- Small orders where a fixed per-transaction fee dominates are
    -- where the effective rate diverges most from the rate card.
    COUNT(*) FILTER (WHERE gross_amount < 10) AS small_orders
  FROM creator_orders
  WHERE status IN ('paid', 'partially_refunded', 'refunded')
  GROUP BY 1, 2
), rates AS (
  SELECT
    platform,
    month,
    gross_sales,
    refunds,
    small_orders,
    commission + processing + payout_and_fx AS total_fees,
    100.0 * (commission + processing + payout_and_fx)
      / NULLIF(gross_sales, 0) AS effective_rate_pct,
    100.0 * commission / NULLIF(gross_sales, 0) AS commission_pct,
    100.0 * processing / NULLIF(gross_sales, 0) AS processing_pct
  FROM monthly
)
SELECT
  month,
  platform,
  ROUND(gross_sales, 2) AS gross_sales,
  ROUND(total_fees, 2) AS total_fees,
  ROUND(effective_rate_pct, 2) AS effective_fee_rate_pct,
  ROUND(commission_pct, 2) AS commission_pct,
  ROUND(processing_pct, 2) AS processing_pct,
  -- Rate drift in percentage points, not fee growth: this is what
  -- catches a 30% -> 15% tier flip or a lapsed discount program.
  ROUND(effective_rate_pct - LAG(effective_rate_pct) OVER w, 2)
    AS rate_change_pp,
  ROUND(gross_sales - refunds - total_fees, 2) AS net_to_seller,
  small_orders
FROM rates
WINDOW w AS (PARTITION BY platform ORDER BY month)
ORDER BY platform, month;

Common pitfalls

Using the vendor's headline rate as the number.→ Compute from actual fee lines. Apple and Google's 15% small-business and year-two subscription tiers, plus per-transaction minimums, routinely put the realized rate several points off the rack rate.
Counting only the platform commission.→ Processing, payout, and FX fees are real money leaving the same sale. Track them as separate components under one total so you know which one moved.
Ignoring what happens to fees on refunds.→ Some platforms return commission on a refund and some keep processing fees. Model refunds explicitly or your effective rate is understated in high-refund months.
Comparing the rate across platforms without normalizing gross.→ One platform's 'gross' includes tax and shipping, another's doesn't. Define the denominator once and apply it everywhere before ranking platforms.

Where does this metric apply?

This metric commonly uses data from Gumroad, Patreon, Kajabi, Apple App Store Connect, Google Play Console, Toast, Lightspeed, plus any warehouse models built at the same grain.

Dashboards

Integrations

Metrics

Analytics

FAQ

Should the fee rate be net of refunds?
Report both. Gross-basis rate tells you what the platform charges per dollar transacted; net-basis tells you what you actually kept. The gap between them is a refund story, and reading only one of the two hides it.
How does this connect to margin?
Platform fees are a direct cost of sale, so they belong in gross margin before anything else. For subscription businesses, also carry the fee rate into MRR reporting — gross MRR and net-of-fee MRR are different planning numbers.
Where does the data come from?
Fee-level detail lives in payout and settlement reports, not in the order UI. Land those reports in your warehouse alongside your orders and membership tables (creator_orders, creator_members), then query them in Metabase. Metabase reads databases and warehouses; it does not call platform APIs itself.