Convert BAI to CSV: BAI to Excel Converter for BAI2 Bank Files
Dec 13, 2025 · Updated Aug 21, 2026
Convert your BAI2 file to Excel or CSV now
BAI2 to Excel and CSV converter
Pick your BAI2 file and get one row per transaction with the balances broken out. Nothing is uploaded: it converts in this browser tab.
| Date | Account | Type | Description | Direction | Amount | Bank Ref | Text |
|---|
Account numbers and bank references can start with a zero. Import the CSV with those columns set to Text so Excel keeps them intact.
Last updated August 2026.
Short answer: a BAI file (almost always BAI2) is a plain-text bank reporting file where the first two digits of every line define the record, so it will not open as a table in Excel. To convert BAI to CSV or Excel you have three routes: upload it to a BAI converter, build an Excel Power Query, or write a parser. Whichever you pick, the conversion has to do four things or the data will be wrong: merge the 88 continuation lines into their 16 transaction records, divide the amounts by 100 because BAI2 stores them in cents with no decimal point, read the funds type field before you read the reference fields (S, V and D push every later column along the record), and check your totals against the 49, 98 and 99 trailer records before you export.
The fastest route is the BAI to Excel converter at the top of this page. Drop in a .bai, .bai2 or .txt file and it returns clean Excel or CSV with the continuation lines stitched back together, the implied decimals applied and the control totals reconciled. The rest of this article is the reference you need if you would rather build the conversion yourself, or if you want to check that whatever tool you use is handling BAI2 correctly.
Convert BAI to CSV or Excel: the three routes compared
Pick the route by how often you do this and how much a wrong number costs you. A one-off file for a single account is genuinely fine in Power Query. A daily multi-account file feeding an ERP is not, because every bank quirk becomes your maintenance problem.
| Route | Setup time | Best for | What you own | Main risk |
|---|---|---|---|---|
| BAI converter (upload) | Under a minute | Daily or weekly files, multi-account, ERP feeds | Nothing, the parser is maintained for you | You are trusting a third party with statement data, so check retention terms |
| Excel Power Query | 2 to 5 hours the first time | An occasional single-account file | The whole transform, forever | Continuation lines and implied decimals are easy to get subtly wrong |
| Custom parser (Python, C#) | 1 to 3 days plus tests | High volume, strict internal data rules | Code, tests, and every bank dialect change | Silent breakage when a bank adds an optional field |
One number is worth putting in front of whoever approves the budget: a single misposted bank file that reaches the general ledger usually costs more in investigation and rework than a year of converter fees. The conversion is a control, not a file chore.
Is BAI the same as BAI2?
In practice, yes. When someone says "BAI file" today they nearly always mean BAI2, the second version of the Cash Management Balance Reporting Specifications published by the Bank Administration Institute. BAI2 is what US banks actually send for previous-day and intraday reporting. The original BAI version 1 is effectively retired, so a file your bank delivers in 2026 will be BAI2 even when the extension is just .bai.
This matters when you go looking for a converter, because tools are listed under both names. A BAI to Excel converter and a BAI2 converter are the same product. What you should check is whether the tool handles the specific dialect your bank sends, since banks vary in which optional fields they populate.
BAI2 record types: what each line in the file means
Every line in a BAI2 file starts with a two-digit record code. Read that code and the file stops looking like noise. There are eight you will ever see.
| Code | Record | What it carries |
|---|---|---|
| 01 | File header | Sender and receiver IDs, file creation date and time |
| 02 | Group header | Ultimate receiver, originator, as-of date, and often the currency |
| 03 | Account identifier | Account number plus summary balances such as opening and closing ledger |
| 16 | Transaction detail | One transaction: type code, amount, bank reference, customer reference, text |
| 88 | Continuation | Overflow text from the record above it, usually long remittance detail |
| 49 | Account trailer | Control total and record count for that account |
| 98 | Group trailer | Control total, account count and record count for the group |
| 99 | File trailer | Control total, group count and record count for the whole file |
The three-digit type codes that sit inside the 03 and 16 records are a separate reference, and there are hundreds of them. Those are covered in the BAI2 record codes and type codes reference.
How to convert a BAI2 file to Excel step by step
This is the sequence that produces a spreadsheet you can reconcile against, whether a tool does it for you or you build it yourself.
- Load the file and split on record code. Read the first two characters of each line. Everything else depends on getting this right.
- Attach each 88 to the record above it. Continuation lines belong to the preceding 16 or 03 record. Join the text with a visible separator such as a pipe so a human can still read it later.
- Apply the implied decimals. BAI2 amounts are integers in the currency minor unit. For USD, divide by 100. An amount of 1234 is $12.34, not $1,234.
- Set the sign from the type code, not from a minus. BAI2 does not write negative numbers. Direction comes from the transaction type code, so map credits and debits explicitly.
- Carry the account down every row. One file often holds several 03 blocks. Without an Account column the rows are unusable once they are flattened.
- Reconcile against 49, 98 and 99. Sum your parsed rows per account and compare to the 49 trailer, then group and file level. If they do not match, do not export.
- Export to CSV for systems and XLSX for people. CSV for the ERP import, a filtered workbook with a totals tab for whoever reviews it.
The converter above runs all seven steps and shows you the control-total check before you download anything, so a truncated file gets caught at upload instead of at month end.
How do I convert a BAI2 file exported from SAP, Oracle Fusion, or Dynamics 365?
The same way as any other BAI2 file, because the format is the bank's, not the ERP's. What changes is why you are converting. Teams running SAP Electronic Bank Statement, Oracle Fusion Cash Management, Microsoft Dynamics 365 Finance or NetSuite usually convert to Excel for one of two reasons: to investigate the lines the ERP failed to auto-match, or to prepare a corrected import after a mapping change.
Microsoft documents BAI2 as one of the three bank statement formats Dynamics 365 Finance imports, alongside ISO 20022 and MT940, and the same trio shows up across most enterprise finance systems. If your ERP rejected the file outright, convert it to Excel first and read the 49 and 99 trailers. A count mismatch there usually means the file transferred incompletely, which is a much more common cause than a genuine mapping error.
For the lines that imported but did not match an open item, the useful column is the remittance text you rebuilt from the 88 records. That is the invoice reference your cash application needs, and it is the reason to merge continuation lines rather than drop them. Teams that spend a lot of time on that matching step usually end up automating it in their receivables workflow rather than in the spreadsheet.
Why do my BAI2 amounts come out 100 times too large?
Because BAI2 stores amounts as whole minor units with no decimal point, and your import treated them as dollars. A $4,182.55 deposit appears in the file as 418255. If you opened the file directly in Excel or parsed it without dividing by 100, every amount is inflated by exactly 100 and your totals will never agree with the 49 trailer.
The fix is to scale at parse time, not with a formula afterwards, so the control-total check runs against corrected numbers. Watch for currencies with a different minor unit if your file is multi-currency, since the divisor is not 100 for all of them.
How do I merge the 88 continuation lines?
An 88 record is pure overflow: it has no meaning on its own and belongs to the last non-88 record above it. Walk the file in order, keep a pointer to the current 16 or 03 record, and append each 88 line's text to that record. Long remittance details often span three or four 88 lines in a row, so keep appending until you hit the next real record code.
The mistake that costs the most time is treating 88 records as their own rows. You end up with a spreadsheet where the transaction count does not match the 49 trailer and half the descriptions are orphaned fragments.
There is a second kind of 88 that catches people out, because it is not text at all. When an 03 account record runs past the line length, the 88 below it continues the balance list in exactly the same repeating shape of type code, amount, item count and funds type. A real pair looks like 03,1430002583,USD,010,152436022,0,,015,60505926,0,,040,152425070,00/ followed by 88,045,60505926,0,,060,60505926,0,,100,888355,0,,400,92818451,0,/. That single 88 carries the closing available balance, the current available balance and the credit and debit totals.
This matters for more than completeness. The specification defines the account control total as the sum of the amount fields in the 03, 16 and 88 records, so if you skip the balances on a continued 03 your total comes up short and the file looks broken when it is fine. Treat an 88 as text when it follows a 16, and as more balance groups when it follows an 03.
Why are my BAI2 bank reference numbers in the wrong column?
Because the funds type field is not always a single field. Most of the time it is one character or empty, so the bank reference is the fifth field of a 16 record. But when the funds type is S, V or D it carries its own subfields, and every field after it shifts right. Split the record on commas, read field five, and those rows come out wrong.
What makes this the expensive bug is that it is silent. The amounts are still in the right place, so the file still foots against the 49 trailer and the totals all agree. Only the reference and description columns are scrambled, which nobody notices until someone tries to match a wire to a confirmation weeks later.
| Funds type | What it means | Extra fields it inserts | Bank reference actually lands at |
|---|---|---|---|
| Empty, 0, 1, 2 or Z | Immediate, one day, two or more day availability, or no distribution detail | None | Field 5 |
| S | Availability split three ways | 3 (immediate, one day, two or more days) | Field 8 |
| V | Value dated | 2 (value date YYMMDD, value time HHMM) | Field 7 |
| D | Distributed availability | 1 count, then 2 per distribution | Field 6 plus twice the count |
Two records make the shift obvious. In 16,475,250000,,CHK001,,CHECK 1001/ the funds type is empty and CHK001 is the bank reference in field 5. In 16,195,500000,S,100000,200000,200000,WIRE55,CUST99,INCOMING WIRE/ the funds type is S, the three availability buckets follow it, and the bank reference WIRE55 has moved to field 8. A parser that hardcodes field 5 reports the bank reference on that second row as 100000, an availability amount, and quietly writes it into your reconciliation.
If you are building this in Power Query, this is the point where the transform stops being a ten minute job, because you cannot express a variable width field with a fixed column split. You have to branch on the funds type value first. The converter at the top of this page reads the funds type before it reads the references, which is why the reference columns line up on files that carry availability detail.
How do I check a BAI2 file converted correctly?
Compare your parsed output to the trailer records the bank already put in the file. The 49 record gives the control total and record count for each account, 98 does the same for the group, and 99 covers the whole file. Sum your rows at each level and compare. If all three agree, the conversion is sound.
The definitions are precise enough to code against, and getting them slightly wrong is why people conclude a good file is corrupt. The 49 account control total is the sum of every amount field in the preceding 03, 16 and 88 records for that account, carrying a minus sign if the result is negative, and its record count includes the 03, all the 16 and 88 records, and the 49 itself. The 98 group control total is the sum of the account control totals beneath it, and its count covers the 02, 03, 16, 49, 88 and 98 records. The 99 file control total is the sum of the group totals, and its count is every record in the file including the 01 and the 99.
Note what the control total is not: it is not the closing balance, and it is not net movement. It adds the balance figures and the transaction figures together, which is why a correct total on a small file often looks like a meaningless number. The converter at the top of this page recomputes all three levels as it parses and tells you which one failed if any do, so you can send the file back to the bank with the discrepancy quoted rather than a vague complaint.
Two extra checks are worth adding. First, confirm that opening balance plus net movement equals closing balance per account, which catches sign-mapping errors that a simple total can hide. Second, count the 16 records in the raw file with a text editor and compare to the row count in your spreadsheet, which catches dropped continuation-line handling immediately.
Which US banks send BAI2 files?
Most large US banks can deliver previous-day and intraday reporting in BAI2 through their treasury portal or over SFTP, including Bank of America, JPMorgan Chase, Citi, Wells Fargo, PNC and U.S. Bank. It is normally a treasury management service rather than something you switch on from retail online banking, so the request goes to your treasury relationship manager.
Expect dialect differences between them. Banks vary in which optional 16-record fields they populate, how much text they push into 88 records, and whether they send one file per account or one file covering the whole group. A converter that handles several banks without reconfiguration saves real time if you bank in more than one place.
BAI2, MT940 and camt.053: which one are you actually holding?
BAI2 is the US bank reporting format, MT940 is the SWIFT flat-text statement used widely outside the US, and camt.053 is the ISO 20022 XML statement that is replacing MT940. All three report the same thing, the entries booked to an account and the balances either side of them, in three incompatible encodings.
Telling them apart takes one second in a text editor. BAI2 lines start with two digits and a comma. MT940 uses colon-delimited tags such as :61: and :86:. camt.053 is XML and opens with an angle bracket. If yours turns out to be one of the other two, use the MT940 to Excel converter instead, and the camt.053 and MT940 comparison covers how the fields line up between them.
Converting BAI2 at volume: batch, SFTP and API
Once you are converting daily across several accounts, the manual upload stops being the bottleneck and file handling does. Three things make it routine. Batch the whole day's files in one run rather than one at a time. Pull them straight from the bank's SFTP drop instead of downloading through a portal. Push the output to your ERP or warehouse over an API on a schedule.
Keep the source file alongside every export, and store a hash of it. When an auditor asks which bank file produced a given reconciliation, that pairing answers it in seconds. Also keep an eye on the Excel sheet limit of 1,048,576 rows: high-volume days should land in CSV first, with a smaller Excel review file built from it if a person needs to look.
Troubleshooting common BAI2 conversion issues
| Symptom | Cause | Fix |
|---|---|---|
| Totals are off by a factor of 100 | Implied decimals not applied | Divide amounts by the currency minor unit at parse time |
| Descriptions cut off mid-word | 88 continuation records dropped | Append every 88 to the record above it |
| Row count higher than the 49 trailer | 88 records parsed as transactions | Exclude 88 from the transaction row count |
| Debits and credits both positive | Sign taken from the amount field | Derive direction from the transaction type code |
| Rows from two accounts mixed together | Multiple 03 blocks flattened without context | Carry the current account number onto every row |
| ERP rejects the file before import | Truncated transfer | Check the 99 record count against the actual line count |
Security and retention when a third party converts your statements
A BAI2 file contains account numbers and full transaction detail, so treat the conversion step as data handling rather than a file utility. The questions worth asking any provider are short: is the upload encrypted in transit, how long is the file retained after conversion, is it deleted on request, and is there a documented compliance posture such as SOC 2.
Internally, archive the original bank file according to your own retention policy rather than relying on the converter to be your record. Our own handling is set out in the privacy policy.
Frequently asked questions
Can I open a BAI file in Excel? You can open it, but you will get one long column of text rather than a table, because BAI2 is fixed-position text with no delimiters that Excel recognizes as columns. To get usable rows you have to parse the record codes first, either with a converter or with a Power Query transform you build yourself.
What is the file extension for a BAI2 file? There is no single one. Banks deliver BAI2 as .bai, .bai2, .txt or with no extension at all. The extension tells you nothing reliable, so identify the file by its contents: a BAI2 file starts with a line beginning 01, followed by comma-separated header fields.
How do I get a BAI2 file from my bank? Ask your treasury management contact to enable BAI2 previous-day reporting on the accounts you need. It is usually delivered through the bank's corporate portal as a daily download or pushed to an SFTP location you nominate. Retail online banking generally does not offer it.
Is there a free BAI to Excel converter? Several tools offer a free tier or a trial that covers a handful of files, which is enough to test whether the output matches your control totals. For recurring multi-account work the practical question is not price but whether the parser reconciles against the 49, 98 and 99 trailers, since an unchecked export is what creates rework.
Can one BAI2 file contain multiple accounts? Yes, and it usually does. Each account is a 03 record followed by its transactions and closed by a 49 trailer, with several of those blocks inside one 02 group. Your output needs an Account column on every row, otherwise the transactions cannot be split or reconciled per account.
What is the difference between BAI2 and MT940? BAI2 is the US bank reporting standard from the Bank Administration Institute and uses numeric record codes. MT940 is the SWIFT statement format used mainly outside the US and uses colon-delimited tags. They carry equivalent information and neither opens as a spreadsheet without conversion.
Does BAI2 include intraday transactions? It can. Banks publish both previous-day reporting, which is the settled position as of the prior close, and intraday reporting, which updates through the day. They arrive as separate files, so check the as-of date and time in the 02 group header before you reconcile against a ledger.
Conversion checklist
- Merge every 88 continuation line into the 16 or 03 record above it.
- Divide amounts by the currency minor unit, normally 100.
- Derive debit and credit direction from the transaction type code.
- Carry Account and Currency onto every exported row.
- Reconcile parsed totals against the 49, 98 and 99 trailers before exporting.
- Keep Posting Date and Value Date as separate columns.
- Store the source file and its hash next to the export for audit.
- Use CSV for volume, XLSX for review.
If you would rather not build any of that, upload your BAI2 file to the bank statement converter at the top of this page and check the control totals it reports against your own. That comparison is the quickest way to find out whether your current process has been quietly getting the decimals wrong.
Ready to convert your bank statement?
Drop the file into the converter above and get clean Excel or CSV in seconds, with the control totals checked for you.
Convert to Excel nowFree to try, no credit card required