NACHA File Format Example: Sample NACHA File and ACH File Example Decoded Line by Line

Below is a complete, balanced PPD payroll file in NACHA format, all ten records, every line exactly 94 characters, with the entry hash and the batch totals worked out so the numbers actually foot. Each record is then decoded field by field. If you have a real file rather than an example, the converter above turns it into spreadsheet rows without counting character positions.

Free to try, no credit card
256-bit encryption
Reads .ach, .txt and 94 character fixed width

Last updated August 2026

PDF, JPG, PNG, BMP, HEIC, TIFF, MT940

Upload your bank statement

Extract:

What does a NACHA file look like?

A NACHA file is a plain text file where every line is exactly 94 characters and the first digit of each line says what the record is: 1 is the file header, 5 opens a batch, 6 is a single payment, 7 is optional addenda, 8 closes the batch and 9 closes the file. There are no commas, no column headers and no delimiters of any kind. Fields are found by counting character positions. Numeric fields are right justified and padded with leading zeros, text fields are left justified and padded with trailing spaces, and the file is padded with lines of 9s until the record count reaches a multiple of ten.

Why a NACHA File Is Hard to Read Without an Example

The specification tells you a field sits at positions 55 to 76. It does not show you what that looks like in a real file, which is the part people actually need.

Nothing Marks Where a Field Starts

A CSV has commas. A NACHA file has nothing. The only way to find the amount is to count to character 30 and read ten characters, and one miscount shifts every field after it.

The Amount Has No Decimal Point

A payment of $2,450.00 is written 0000245000. The last two digits are always cents, so reading the number as written overstates every amount by a factor of one hundred.

Bank Specs Show Tables, Not Files

Most published layouts are field grids in a PDF. Very few show a full valid file, so you cannot check your own output against a known good sample.

The Control Totals Have to Foot

The batch and file control records repeat counts, an entry hash and dollar totals. If any one of them disagrees with the entries above it, the bank rejects the whole file rather than the bad line.

Spreadsheets Destroy the File on Open

Open a .ach file in Excel and it guesses at delimiters, drops the leading zeros from routing numbers and reformats the dates. The file is corrupt before you have read it.

The Trailing 9s Look Like Corruption

Files often end with one or more lines of ninety four 9s. That is deliberate padding, not damage, and people delete it and break the block count.

Read an ACH File as Rows Instead of Character Offsets

An example teaches you the layout. A converter saves you from applying it by hand to two thousand entries.

Fixed Width Parsed for You

Record types 1, 5, 6, 7, 8 and 9 are split at the correct positions, so the routing number, account, amount and receiver name land in separate columns.

Amounts Get Their Decimal Back

The implied two decimal places are restored, so 0000245000 arrives as 2450.00 and the sheet totals to the same figure as the batch control record.

Transaction Codes Translated

Codes 22, 27, 32 and 37 become readable credit and debit labels against checking or savings, and prenotes are marked as prenotes rather than zero dollar payments.

Leading Zeros Survive

Routing numbers and account numbers keep every character, which is the single most common thing lost when an ACH file is opened directly in a spreadsheet.

Multiple Batches Kept Straight

Each entry stays tied to its batch header, so the company name, SEC code, entry description and effective entry date follow the payment into the sheet.

Private by Default

ACH files carry account numbers. Uploads use 256-bit encryption and you can delete files from your account whenever you want.

From a 94 Character ACH File to a Spreadsheet in 3 Steps

Nothing to install and no credit card to start.

1

Find the File

Your bank portal, payroll system or ERP will have written it with a .ach, .txt, .nacha or no extension at all. It is plain text either way.

Tip: Open it in a text editor first, never in Excel.

2

Upload

Drag it into the box above. Record types are detected from the first character of each line, so no template or field mapping is needed.

Tip: Several files in one batch are fine.

3

Check the Totals

Save as XLSX or CSV, then total the amount column and compare it against the debit and credit totals in the 8 and 9 records. If they match, nothing was dropped.

Tip: That check takes ten seconds and catches every parsing error.

Who Needs a Worked NACHA Example

Almost everyone who looks for a sample NACHA file is either building one for the first time or trying to work out why the bank rejected the one they already sent. Both jobs need a known good reference to compare against.

Developers and Integrators

Building ACH origination into an ERP or a payments product and needing a valid file to test the parser against.

Treasury and Cash Management

Reviewing what the bank will receive before a payroll or vendor run goes out, and confirming the offset entry is right.

Payroll and AP Teams

Working out which employee or vendor sits behind a rejected entry when the bank quotes a trace number and nothing else.

Accountants and Controllers

Tying an ACH batch back to the general ledger when the bank statement shows one lump sum instead of the individual payments.

Common Search Terms

nacha file format example nacha format sample nacha format example sample nacha file nacha file example nacha formatted file example ach file example sample ach file ach file format example nacha file format example excel sample nacha file with addenda record nacha ach file format sample

Transaction Types We Handle

PPD payroll credits
CCD vendor payments
WEB consumer debits
CTX corporate remittance
Prenotes
Offset entries
Addenda records
Return entries

A complete NACHA file format example

This is a balanced PPD payroll file: three employees paid by direct deposit, plus a single offset debit that pulls the total from the company operating account. It is ten records long, every line is exactly 94 characters, and the control totals and entry hash below are calculated from the entries above them rather than made up.

101 09100001911234567892608170930A094101WELLS FARGO BANK       NORTHWIND TRADING CO           
5200NORTHWIND TRADIN                    1123456789PPDPAYROLL   AUG 17260821   1091000010000001
6221210002481745500219       0000245000EMP00417       MARIA GONZALEZ          0091000010000001
622026009593398210044        0000187550EMP00892       DERRICK OKONKWO         0091000010000002
6220210000210092374115       0000310025EMP01130       SUSAN CHEN              0091000010000003
6270910000194455102388       0000742575OFFSET         NORTHWIND TRADING CO    0091000010000004
820000000400259009860000007425750000007425751123456789                         091000010000001
9000001000001000000040025900986000000742575000000742575                                       
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

Copy it into a text editor with a fixed width font and turn off word wrap. Every line should end in the same column. If one does not, a field has been padded to the wrong length, and that alone is enough for a bank to reject the file.

What each line in the example means

LineRecordWhat it says
1File Header (1)Northwind Trading sends a file to Wells Fargo, created 17 August 2026 at 09:30, file ID modifier A, 94 character records blocked in tens.
2Batch Header (5)Service class 200 (mixed debits and credits, because the batch is balanced), SEC code PPD, entry description PAYROLL, effective entry date 21 August 2026, batch number 1.
3 to 5Entry Detail (6)Three checking credits, transaction code 22, for $2,450.00, $1,875.50 and $3,100.25, each with the employee routing number, account, ID and name.
6Entry Detail (6), offsetOne checking debit, transaction code 27, for $7,425.75 against the company account. This is what makes the file balanced.
7Batch Control (8)4 entries, entry hash 0025900986, total debits $7,425.75, total credits $7,425.75. Debits equal credits, so the batch nets to zero.
8File Control (9)1 batch, 1 block, 4 entries, the same hash and the same dollar totals repeated at file level.
9 and 10Filler (9)Two lines of ninety four 9s. Eight real records is not a multiple of ten, so the file is padded to ten.

The entry detail record, field by field

Take line 3 of the example and split it at the documented positions. This is the record people most often need to read, because it is where the money and the receiver are.

PositionFieldValue in the exampleReading
01Record Type Code6An entry detail record.
02-03Transaction Code22Automated checking credit, so money is going into the receiver account.
04-11RDFI Routing Number12100024The first eight digits of the receiving bank routing number.
12Check Digit8The ninth digit, held separately so transpositions can be caught. Together: 121000248.
13-29DFI Account Number174550021917 characters, left justified and blank filled, so the trailing spaces are padding and not part of the account.
30-39Amount0000245000$2,450.00. Ten digits, no decimal point, last two digits are cents.
40-54Individual Identification NumberEMP00417The originator own reference for the receiver. Optional, and never a Social Security number.
55-76Individual NameMARIA GONZALEZ22 characters. This is the INDN fragment that later shows up on the receiver bank statement.
77-78Discretionary Data(blank)Free for the originator to use.
79Addenda Record Indicator00 means no addenda follows. A 1 means the next line is a type 7 record.
80-94Trace Number091000010000001The originating bank routing prefix 09100001 followed by the sequence number 0000001. This is the reference the bank quotes back to you.

Every other record splits the same way, at its own set of positions. The complete grid for all six record types, including the file header, batch header, addenda, batch control and file control layouts, sits on the NACHA file format reference page.

How the entry hash in the example was calculated

The entry hash is the one control figure people get wrong, because it is not a checksum in the usual sense. You add together the eight digit routing prefixes of every entry in the batch, excluding the check digit, then keep the ten rightmost digits of the result. In the example that is:

EntryRouting prefixRunning total
Maria Gonzalez1210002412100024
Derrick Okonkwo0260095914700983
Susan Chen0210000216800985
Offset debit0910000125900986
Written into the file10 digits, zero filled0025900986

Note that the offset entry counts. That trips people up, because the offset is the company own account rather than a payee, but it is still an entry detail record and it still contributes to the hash, the entry count and the totals. There is a longer walkthrough, including what happens when the sum exceeds ten digits, in the guide to the entry hash in a NACHA file.

Balanced and unbalanced NACHA file examples

The example above is balanced. The distinction decides whether you include that sixth line at all, and banks differ on which one they want.

TypeWhat the file containsService class codeWho asks for it
BalancedThe payments plus an offset entry against the originator own account, so debits equal credits and the batch nets to zero.200Banks that want the funding movement stated explicitly inside the file.
UnbalancedOnly the individual payments. The bank creates the offset against your account itself.220 credits only, or 225 debits onlyBanks that fund the batch from a settlement account they already have on file.

To turn the example into an unbalanced file, delete line 6, change the service class code from 200 to 220 in both the batch header and the batch control record, drop the entry count to 3, recalculate the entry hash without 09100001, and set the total debit amount to zeros. Then repad to a multiple of ten. Sending a balanced file to a bank that expects an unbalanced one usually produces a duplicate debit, which is the sort of error that is noticed on payday.

PPD, CCD, WEB and CTX in the same layout

The record structure does not change between Standard Entry Class codes. What changes is the three characters at positions 51 to 53 of the batch header, and the rules that then apply to the batch.

SEC codeUsed forAddenda allowedTypical entry description
PPDPayments to and from consumer accounts: payroll direct deposit, mortgage autopay, benefit payments.1PAYROLL
CCDBusiness to business: vendor payments, tax payments, sweeps between company accounts.1VENDOR PMT
WEBConsumer debits authorized on a website or in an app, including most subscription billing.1PURCHASE
CTXCorporate payments carrying structured remittance data for many invoices in one entry.Up to 9,999TRADE PMT

Two of those entry descriptions became mandatory rather than conventional on 20 March 2026, when Nacha standardized PAYROLL for PPD credits paying wages and PURCHASE for WEB debits covering consumer e-commerce. If you are generating files, those exact words now belong in positions 54 to 63 for those two cases. The wider set of class codes and the authorization rules behind each one are covered in the ACH SEC codes guide.

A sample entry with an addenda record

Set the addenda indicator at position 79 to 1 and follow the entry with a type 7 record. The addenda carries the remittance text a vendor needs in order to apply your payment to the right invoices.

6220260095933982100440       0000450000INV884120      RIVERBEND SUPPLY CO     1091000010000005
705RMR*IV*INV88412*PO4471\                                                         00010000005

In the addenda record, position 1 is the record type 7, positions 2 to 3 are the addenda type code (05 for the general payment related information used with CCD and PPD), positions 4 to 83 hold the 80 characters of payment related information, positions 84 to 87 are the addenda sequence number and positions 88 to 94 repeat the last seven digits of the entry trace number so the addenda can be matched back to its entry. Note that the entry above now ends in 1 at position 79 rather than 0.

Why the file ends in lines of 9s

The header declares a blocking factor of 10 at positions 38 to 39, which means the file must contain a whole number of ten record blocks. The example has eight real records, so two filler lines of ninety four 9s bring it to ten, and the block count in the file control record is 1. Nine real records would need one filler line. Twenty one real records would need nine. The filler lines are not payments, they are not counted in the entry count, and deleting them to tidy the file up is a reliable way to get it rejected.

Checking an example against a real file

Four checks catch almost every malformed file, and all four can be done before the bank sees it. Confirm that every line is 94 characters with no trailing carriage return oddities. Confirm the record count is a multiple of ten. Confirm the entry count and dollar totals in the 8 and 9 records match the entries you actually wrote. Confirm the entry hash is the sum of the eight digit routing prefixes truncated to ten digits. The NACHA file validator runs those checks against a file you upload, and if you would rather see the data than the diagnostics, the NACHA file to Excel converter turns the entries into rows you can total.

Once an ACH batch has settled, it stops being a file problem and becomes a reconciliation problem, because most banks post the whole batch to your account as one lump sum rather than as individual payments. Matching that single statement line back to the entries means having both sides as data, which is where converting the bank statement converter output alongside the ACH file pays off. The abbreviations the bank uses on those posted lines, including DES, INDN, CO ID and the SEC fragment, are decoded in the bank statement abbreviations reference. If an entry comes back instead of posting, the reason arrives as an R code, and those are listed in the ACH return codes reference.

Why People Convert Instead of Counting Characters

94
characters per record, parsed at the right positions every time
6
record types read: 1, 5, 6, 7, 8 and 9
6
output formats: XLSX, CSV, OFX, QFX, QBO and QIF

Security & Privacy

  • 256-bit encryption on every upload and download
  • Delete uploaded files from your account whenever you want
  • Leading zeros on routing and account numbers preserved
  • No browser extension and nothing to install

NACHA File Format Example: Common Questions

It looks like a block of unbroken digits and capital letters, every line exactly 94 characters long, with no commas and no headers. The first character of each line identifies the record: 1 for the file header, 5 for a batch header, 6 for a payment, 7 for addenda, 8 for a batch control and 9 for the file control. Files usually end with one or more lines of ninety four 9s as padding.

Yes. A NACHA file is plain ASCII text, so it opens in any text editor regardless of the extension. You will see .ach, .txt, .nacha, .dat or no extension at all depending on the system that produced it. Renaming it does not change the contents. What you should avoid is opening it in Excel, which strips leading zeros from routing numbers.

There is none in practice. ACH is the payment network, and Nacha is the organization that writes the rules and publishes the file specification, so people call the same 94 character fixed width file by either name. NACHA formatted file, ACH file and ACH094 all describe the identical layout shown in the example above.

A balanced file includes an offset entry against the originator own account, so total debits equal total credits and the batch nets to zero. The example above is balanced: three credits of $7,425.75 combined, matched by one debit of $7,425.75. An unbalanced file contains only the payments and lets the bank create the offset. Ask your bank which one it expects, because sending the wrong type can produce a duplicate debit.

Add together the eight digit routing prefixes of every entry detail record in the batch, leaving out the ninth check digit, then keep the ten rightmost digits and pad with leading zeros. In the example the four prefixes sum to 25900986, which is written into the file as 0025900986. Offset entries count toward the hash just like payments do.

Because the blocking factor is 10, so the total record count has to be a multiple of ten. The example has eight real records, so two lines of ninety four 9s pad it out. Those filler lines are not transactions and are excluded from the entry count, but removing them breaks the block count and the bank will reject the file.

Do not open it directly, because Excel guesses at delimiters and drops the leading zeros from routing and account numbers. Either import it as fixed width and set the break positions by hand for each record type, or run it through a converter that already knows the layout. Splitting by record type matters, since a type 5 line and a type 6 line use completely different field positions.

The ten line example on this page is a complete valid file you can copy into a text editor and use as test input. It is balanced, the totals foot and the entry hash is correct, so a parser that reads it properly will read a production file too. Replace the routing numbers, accounts and amounts with your own before sending anything to a bank.

They sit at positions 2 and 3 of an entry detail record and say what kind of account movement it is. 22 is an automated checking credit, money going into a checking account. 27 is an automated checking debit, money coming out. The savings equivalents are 32 and 37, and the prenote versions, which carry a zero amount and only verify the account, are 23, 28, 33 and 38.

Yes. A file can hold many batches, each opened by its own type 5 record and closed by its own type 8 record, with batch numbers assigned in ascending order. That is how a payroll run and a vendor run travel in one file: separate batches, different SEC codes and entry descriptions, then a single type 9 file control record summarizing all of them at the end.

Related Resources

Other Bank Statement Converters

ICICI Bank JPMorgan Chase Bank of America Citibank Wells Fargo Goldman Sachs Morgan Stanley U.S. Bank PNC Bank Truist Capital One TD Bank Charles Schwab Fidelity Vanguard E*TRADE TD Ameritrade Bank of New York Mellon State Street BMO USA Ally Financial Regions Fifth Third Bank Huntington KeyBank Citizens Bank First Citizens Synchrony Financial M&T Bank First Horizon Cathay Bank USAA Navy Federal Comerica Zions Bank East West Bank First National of Nebraska Frost Bank BOK Financial Fulton Financial Associated Banc-Corp Valley National Wintrust Financial First Midwest Bancorp Commerce Bancshares UMB Financial Pinnacle Bank Webster Bank Cadence Bank Old National First Interstate BancSystem Umpqua Bank First Hawaiian Bank Prosperity Bank SouthState First Merchants First Bank Holding Glacier Bank First Financial Bancorp Independent Bank Columbia Banking System Western Alliance Pacific Premier Bancorp Bank OZK United Community Banks Customers Bank Texas Capital SVB Financial Group Signature Bank First Republic Bank New York Community Bancorp Sterling Bancorp First Bank Bank United First Commonwealth Financial Flagstar Bank Synovus Bank Santander Bank Commonwealth Bank (CommBank) ANZ Bank Westpac NAB ServisFirst Bancshares Renasant Corporation Simmons First National Trustmark Corporation First Busey Community Bank System First Mid Bancshares Ameris Bancorp Hancock Whitney First BanCorp Third Coast Bancshares Home Bancshares Byline Bancorp Simmons Bank United Bankshares Peoples United Financial American Express HSBC Bank USA