AdvancedAction GuideUpdated regularly5 min read

Isolate True Net Processing Fees from Stripe Balance Transactions

Stripe's Payouts export only shows the lump-sum deposit hitting your bank account — it tells you nothing about the per-transaction fee composition. To calculate your real effective processing rate, you need the Balance_Transactions.csv file, but this export dumps charges, refunds, adjustments, dispute reversals, and Stripe billing fees into a single flat table with no hierarchy. The Fee column contains negative values for processing fees, but refund-related fee reversals and dispute charges are interspersed without clear grouping, making a simple SUM() wildly inaccurate. This workflow filters the Type column to isolate charge, payment, refund, and dispute rows separately, recalculates the net fee per original transaction by grouping on Source ID, and produces a clean summary showing your true blended rate.

Why this matters?

A mid-market DTC brand processing $2.1M/month discovered their actual Stripe blended rate was 3.87% — not the 2.9% quoted in their contract — because 22% of their volume came from international cards triggering an additional 1.5% cross-border fee and 1% currency conversion surcharge. This discrepancy was invisible in Payouts reports and went undetected for 14 months, costing roughly $261,000 in unexamined fees. The Balance_Transactions.csv export for a year of activity easily exceeds 400K rows. Attempting to pivot this in Excel's Power Query takes 20+ minutes per refresh, and handing this file to an external analyst means exposing PII to an unvetted third party.

The 3-Step Solution

Follow this streamlined workflow to transform your raw data export into a clean, analysis-ready dataset. Each step leverages our browser-based tools to ensure your sensitive data never leaves your device.

By following these three steps, you eliminate manual data wrangling, reduce human error, and maintain full GDPR compliance throughout the process.

Ready to clean your data?

100% local processing. Zero uploads. Blazing fast.

Recommended Tools

Related Workflows

How to Convert Stripe Payout Reports into QuickBooks Import Format

Stripe's payout CSV has 15+ columns that don't map to QuickBooks' expected schema. This guide shows how to separate gross revenue from processing fees, reformat dates to MM/DD/YYYY, and produce a clean CSV that QuickBooks accepts without manual reconciliation.

How to Query Nested JSON API Responses with SQL Directly in the Browser

Modern APIs return deeply nested JSON that's painful to parse in spreadsheets. This developer-focused guide demonstrates converting API response dumps into queryable tables and running SQL with JOINs, aggregations, and window functions — all without spinning up a local database.

Convert Stripe UTC Export Timestamps to Local Tax Period

Stripe hardcodes all CSV export timestamps to UTC with no option to select your local timezone. For a business operating in US Pacific Time (UTC-8), a customer purchase completed at 5:30 PM PST on March 31st appears as 2024-04-01 01:30:00 in the Created (UTC) column of your Stripe export. This single timestamp shift pushes that revenue into Q2 for tax purposes, creating a discrepancy between your Stripe revenue total and your QuickBooks sales ledger. This SOP detects all timestamp columns (Created (UTC), Available On (UTC)), applies a configurable timezone offset, and rewrites the date in YYYY-MM-DD format aligned to your state's tax jurisdiction.

Reconcile Stripe Disputes and Refunds Against Original Charges

Annual Stripe exports for mid-volume merchants routinely exceed 500,000 rows, mixing successful charges, partial refunds, full refunds, dispute creations, dispute wins, and dispute losses in one monolithic CSV. The Type column uses cryptic values like dispute, dispute_reversal, and refund without linking back to the original charge amount in the same row. You must trace each dispute or refund back to its Source ID to find the original charge row and calculate net revenue impact. This workflow filters the export to only dispute and refund event types, joins them back to original charge rows using Source ID as the foreign key, and computes the net realized revenue per order after all adjustments.

Sample Datasets

Stripe Payout Export Sample

A Stripe payout CSV with 80 transactions including charges, refunds, disputes, and fee breakdowns across USD and EUR. Timestamps are in raw UTC format. Use this to test the Stripe Payout Formatter and validate QuickBooks-compatible output.

Stripe Balance Transactions Export Sample Dataset

Stripe's Balance Transactions export from the Dashboard Reports panel is delivered as a UTF-8 CSV with exact production columns: id, created, currency, amount, fee, net, type, description, source, and reporting_category. This dataset contains 7,500 synthetic balance transaction records spanning charges, refunds, disputes, payouts, and adjustments — mirroring a high-volume SaaS billing environment. The critical Stripe accounting quirk is that all created timestamps are forced to UTC regardless of your dashboard timezone setting, and the amount and fee columns store values in the smallest currency unit (cents for USD). More dangerously, the sign convention inverts depending on type: for charge rows, amount is positive and fee is negative, but for refund and dispute rows, amount becomes negative while fee becomes positive (the fee is returned). Naive SUM aggregation across all transaction types double-counts fee reversals as additional charges. The structural dirty data inventory includes: 1,840 description fields containing unescaped commas that break delimiter-based parsers, 420 rows with embedded CRLF line breaks in multiline dispute descriptions, and missing UTF-8 BOM causing € and £ symbols to render as mojibake. Expected Output: Yields exactly 7,500 valid transactions with accurate net revenue figures. Ideal for: ETL testing, DuckDB demos, Power BI, Excel Power Query, CI pipelines. Load this file into the stripe-formatter tool to correctly net the fee reversals before building your P&L.