Import a Stripe balance report CSV into Xero

In short: Stripe balance reports list every charge, refund, fee and payout in UTC with gross, fee and net amounts, and each payout to your bank bundles many of them into one net deposit. Xero's statement import uses its own CSV template: a Date and a signed Amount on every line, plus Payee, Description, Reference and a cheque number column. Money out is negative. Drop the file below. It is converted on your device and never uploaded.

Convert your file

Stripe to Xero (CSV)

balance_history.csv, or the itemized "Balance change from activity" report

Your file stays on this device

It is read and converted by this page, inside your browser. Nothing from the file is uploaded, and the converter keeps working offline once the page has loaded.

One email when it ships. The address is used for nothing else. Details.

1. Export the file from Stripe

  1. In the Stripe Dashboard open Reports > Balance.
  2. Under "Balance change from activity" click Download.
  3. Choose Itemized and CSV, pick the date range, and download.
  4. The older Transactions > All activity > Export (balance_history.csv) also works; choose "All columns".

Why a raw Stripe export fails in Xero

Xero would treat every charge as a line in a bank account that never received it. Import the Stripe activity into a Stripe clearing account in Xero, where payouts then show as transfers to your bank.

Xero imports the CSV line by line, so title rows above the table, balance rows, currency symbols in the amount, or separate gross, fee and net columns end up rejected or imported as the wrong amount.

What is unusual about the Stripe file

  • Amounts are decimals in the major unit (10.00 = $10). Fees are positive and net = gross - fee.
  • The legacy export lists the raw balance transaction Type (charge, payment, refund, payout, stripe_fee...), the report lists reporting_category.
  • Payouts are not in the "Balance change from activity" report; they are a separate section.
  • Dates are UTC unless you chose your account time zone when exporting; UTC times are converted to your time zone if you choose one.
  • Accounts in Europe can get decimal commas ("104,13").
  • Columns can be reordered or customized, so we read them by name.

What Xero requires

  • Header matches Xero's template: *Date, *Amount, Payee, Description, Reference, Check Number.
  • One signed amount column: money out negative, decimal point, no symbols.
  • Up to 100,000 rows per file.

2. Before and after

Before: the Stripe balance report CSV as downloaded

"balance_transaction_id","created_utc","available_on_utc","currency","gross","fee","net","reporting_category","description"
"txn_8Y1TestAAAA00001","2025-01-23 08:26:29","2025-01-27 00:00:00","usd","12.00","0.65","11.35","charge",
"txn_8Y1TestAAAA00002","2025-01-23 08:26:31","2025-01-27 00:00:00","usd","-0.77","0.00","-0.77","refund","REFUND FOR PAYMENT"
"txn_8Y1TestAAAA00003","2025-01-24 10:00:00","2025-01-28 00:00:00","usd","2500.00","72.80","2427.20","charge","Invoice INV-0007, annual plan"
"txn_8Y1TestAAAA00004","2025-01-25 00:00:00","2025-01-25 00:00:00","usd","-0.50","0.00","-0.50","fee","Card payments (2025-01-24): Transaction netw...
"txn_8Y1TestAAAA00005","2025-01-26 09:00:00","2025-01-26 09:00:00","usd","15.00","0.00","15.00","dispute_reversal","Dispute won"

After: what Xero receives

After: stripe-balance-2025-01-23-to-2025-01-26-xero.csv
*Date*AmountPayeeDescriptionReferenceCheck Number
01/23/202512.00Chargetxn_8Y1TestAAAA00001
01/23/2025-0.65FeeFee: Chargetxn_8Y1TestAAAA00001 fee
01/23/2025-0.77Refund - REFUND FOR PAYMENTtxn_8Y1TestAAAA00002
01/24/20252500.00Charge - Invoice INV-0007, annual plantxn_8Y1TestAAAA00003
01/24/2025-72.80FeeFee: Charge - Invoice INV-0007, annual plantxn_8Y1TestAAAA00003 fee
01/25/2025-0.50Stripe fee - Card payments (2025-01-24): Transaction network coststxn_8Y1TestAAAA00004

Synthetic sample data that follows the real export layout, not a real account. The "after" output was produced from it by the same converter this page runs.

3. Import the converted file into Xero

  1. In Xero open Accounting > Bank accounts and choose the account.
  2. Click Manage account > Import a statement.
  3. Choose this CSV and click Import.
  4. Check the column mapping (Date, Amount, Payee, Description, Reference) and confirm the date format if asked.

Questions

Which Stripe report should I export?
For a Stripe balance account in your books, use the itemized "Balance change from activity" report, or the older balance history export. For one journal entry per payout, use the itemized payout reconciliation report instead; it has its own page here.
Which date format does Xero need?
Xero lists both month-first and day-first dates as accepted and asks you to confirm the format when it is unclear. Choose United States for MM/DD/YYYY or Elsewhere for DD/MM/YYYY, and confirm the same format in Xero if it asks.
Why are some charges on a different day than in my dashboard?
Stripe reports use UTC unless you choose your account time zone when exporting. A charge late in the evening in the United States can carry the next day's date in UTC.
Can I import more than one month at once?
Yes. Xero imports the whole statement file you give it. Keep each file to one bank account in Xero, and avoid overlapping a period you already imported so you do not have to delete duplicate statement lines.

Other ways to convert Stripe

Other exports to Xero (CSV)