Isolate True Net Processing Fees from Stripe Balance Transactions
Stripe's pricing model is 'interchange ++': the 2.9% headline rate is a blended average. Actual per-transaction fees range from 1.3% (domestic debit) to 3.9% (international Amex corporate). The Payouts export shows the lump-sum deposit—zero visibility into per-transaction fees. The Balance_Transactions.csv dumps charges, refunds, adjustments, and dispute reversals into one flat table. The Fee column contains negative values for processing fees, but refund fee reversals appear as positive values interspersed without clear grouping—making a simple SUM() wildly inaccurate. This workflow filters the Type column, recalculates net fee by Source ID, and produces a clean summary of your true blended rate including hidden 1.5% cross-border fees and 1% currency conversion surcharges.
Why This Matters
A mid-market DTC brand processing $2.1M/month discovered their actual Stripe blended rate was 3.87% (not their 2.9% contract rate) because 22% of volume triggered a 1.5% cross-border fee and 1% currency surcharge. This discrepancy cost them $261,000 in unexamined fees over 14 months. The annual export easily exceeds 400K rows, choking Excel Power Query. Handing it to an external analyst exposes massive PII. Run SQL on your Stripe CSV locally instead.
Why Excel & Python Fail Here
The critical accounting trap: refund fee reversals appear as POSITIVE values in the Fee column (because Stripe returns the fee to you). A naive SUM(fee) double-counts: it subtracts the original fee AND adds the reversal, netting to zero for refunded transactions—but inflating the apparent fee for non-refunded ones. Excel's SUMIF cannot distinguish 'charge fee' from 'refund fee reversal' without multi-column conditional logic that breaks at 400K+ rows.
| Criterion | Excel / Sheets | Python / Cloud | DataPrep (This Page) |
|---|---|---|---|
| Max Rows | ~150K (crashes) | RAM-limited | 1M+ via Wasm |
| Setup Time | Manual formulas | 30–60 min env setup | 0 seconds |
| Data Privacy | Local but fragile | Uploads to cloud | 100% in-browser |
| Cost | License fees | EC2 / SaaS $49+/mo | Free forever |
Step-by-Step Solution
We will use the Stripe Payout Formatter to execute this entirely in your browser.
- 1
Upload Balance_Transactions.csv
Export from Stripe Dashboard → Balance → Transactions → 'Download all'. Upload the file (typically 200K–500K rows for annual data). The tool auto-detects Type, Fee, Source ID, and Created columns.
- 2
Filter and net fees by transaction type
The tool separates charges (negative fee = cost), refund reversals (positive fee = credit), and adjustments. It nets them by Source ID so each original charge shows its true final fee after any partial refunds.
- 3
Generate blended rate report
Download a summary CSV showing: total volume, total fees, effective blended rate, breakdown by card type (domestic/international), and a monthly trend. Flag any months where effective rate exceeded your contract rate by >0.2%.
Privacy Guarantee: Zero Bytes Uploaded
All processing happens in your browser via WebAssembly. Your data never touches a server. Try it: disconnect your Wi-Fi right now—the tool will still work.
Common Errors & Fixes
| Error / Symptom | Root Cause | Fix |
|---|---|---|
SUM(Fee) shows near-zero total | Refund fee reversals (positive) cancel out original fees (negative) in naive summation | Filter by Type='charge' first, THEN sum fees. Handle refunds separately as credits. |
Blended rate appears lower than contract | Including refund reversals as 'negative fees' artificially reduces the total | Only sum fees where Type='charge'. Refund reversals are a separate line item. |
Frequently Asked Questions
Why is my effective rate higher than my 2.9% contract?
Can I export this data via the API instead?
Ready to clean your data?
100% local processing · Zero uploads · Blazing fast
Trusted by 2,400+ data teams · 18M+ rows processed monthly