Marketplace fees look simple until you try to put them in code. Some are percentages, some are fixed, they apply to different bases, and one of them depends on how the buyer found you.
I built Fee Math, a set of free fee and profit calculators for Etsy, Amazon, eBay, TikTok Shop and payment processors. Etsy was the first one, and it's a nice small modelling exercise. Here is the whole thing in about 25 lines of JavaScript.
Rates below are Etsy's US defaults as last checked in October 2026. Fees change and differ by country, so always confirm on Etsy's fee page before relying on them. This is not financial advice.
The fee lines
For a typical US shop, one order can involve:
| Fee | Rate | Charged on |
|---|---|---|
| Listing fee | $0.20 | per listing published or renewed |
| Transaction fee | 6.5% | item price + shipping |
| Payment processing | 3% + $0.25 | item price + shipping + tax |
| Offsite Ads (only if the sale came from an ad) | 15% (12% for shops over $10k/year), capped at $100 | the order |
| Currency conversion (only if currencies differ) | 2.5% | the order |
Two details people miss:
- Fees apply to shipping too. Charging $5 for shipping costs you about $0.48 in fees.
- The fixed parts ($0.25 + $0.20) don't care about price, which matters a lot for cheap items (more on that below).
The model
const RATES = { transaction: 0.065, processing: 0.03, processingFixed: 0.25, listing: 0.20, offsiteAds: 0.15, offsiteAdsCap: 100, conversion: 0.025, }; const round = (x) => Math.round(x * 100) / 100; function etsyFees({ price, shipping = 0, tax = 0, fromOffsiteAd = false, conversion = false }) { const sale = price + shipping; const lines = { transaction: sale * RATES.transaction, processing: (sale + tax) * RATES.processing + RATES.processingFixed, listing: RATES.listing, offsiteAds: fromOffsiteAd ? Math.min(sale * RATES.offsiteAds, RATES.offsiteAdsCap) : 0, conversion: conversion ? sale * RATES.conversion : 0, }; for (const k in lines) lines[k] = round(lines[k]); lines.total = round(Object.values(lines).reduce((a, b) => a + b, 0)); return lines; } Each line is rounded to cents on its own, because that's how fees show up on a statement. If you build something bigger, store money as integer cents from the start and avoid float surprises altogether.
Example 1: a $25 item with $5 shipping
etsyFees({ price: 25, shipping: 5 }); // { transaction: 1.95, processing: 1.15, listing: 0.2, // offsiteAds: 0, conversion: 0, total: 3.3 } Revenue is $30, fees are $3.30 (11%). If the item costs $8 to make and $4.50 to ship, profit is:
30.00 - 3.30 - 8.00 - 4.50 = $14.20 (47% margin) Now the same order, but the buyer came through an Offsite Ad:
etsyFees({ price: 25, shipping: 5, fromOffsiteAd: true }).total; // 7.8 Fees jump to $7.80 (26% of revenue) and profit drops to $9.70. Same product, same buyer, one third less profit. That's why it's worth modelling Offsite Ads as a scenario, not ignoring it.
Example 2: why cheap items hurt
Look at fees as a share of the sale with free shipping:
| Item price | Total fees | Share of sale |
|---|---|---|
| $10 | $1.40 | 14.0% |
| $25 | $2.83 | 11.3% |
| $100 | $9.95 | 10.0% |
The percentages are the same at every price; the $0.45 of fixed fees is what pushes the share up for low prices. Stickers, digital downloads and small accessories feel this the most. Bundling ("set of 3") is often the easiest fix.
Example 3: solving for the price you need
The more useful question is usually the reverse: what should I charge to make $X? With free shipping, no tax and no ads, fees are 0.095 × price + 0.45, so:
price = (costs + targetProfit + 0.45) / (1 - 0.065 - 0.03) function priceForProfit(costs, target, adsRate = 0) { const pct = RATES.transaction + RATES.processing + adsRate; const fixed = RATES.processingFixed + RATES.listing; return Math.ceil(((costs + target + fixed) / (1 - pct)) * 100) / 100; } priceForProfit(12.5, 10); // 25.36 priceForProfit(12.5, 10, 0.15); // 30.4 (if the sale comes from an Offsite Ad) So to keep $10 on an item that costs you $12.50 including shipping, list it at about $25.36, or $30.40 if you want the same profit even on ad-driven sales. (The ad cap of $100 only kicks in for orders above roughly $667, so it's safe to ignore here.)
What this model leaves out
To keep it honest, it doesn't include income tax, VAT on Etsy's own fees, regulatory operating fees in some countries, Etsy Ads (on-site), subscriptions or shipping label costs. Payment processing rates also differ by country: for example 4% + £0.20 in the UK.
Try it without code
If you sell on Etsy and don't want to maintain a script, the Etsy fee calculator on Fee Math does all of the above, shows every fee as a separate line, supports other countries and Offsite Ads, and gives you a shareable link or PDF. There are also calculators for Amazon FBA, eBay, TikTok Shop and PayPal. The sources and "last checked" dates for every rate are on the methodology page.
Which marketplace has the most confusing fee structure in your experience? I'm deciding what to model next.
