# Bank Statement Transaction Codes: POS, ACH, DD Decoded

- Author: FastBankConvert (https://fastbankconvert.com)
- Published: 2026-10-17
- Category: Bank statements to Excel and CSV
- Canonical: https://fastbankconvert.com/blog/bank-statement-transaction-codes

> What bank statement transaction codes mean: POS, ACH, DD, SO, CHK and more, and how to split the code from the payee in your converted sheet.
Bank statement transaction codes are short labels that say how money moved: POS for a card purchase at a till, ATM for cash, ACH for a US electronic transfer, DD for a UK Direct Debit and CHK for a cheque. In a spreadsheet, split each code into its own column to filter and total by type.

## Card and cash transaction codes: POS, DEB, ATM

Card and cash codes mark money that left through a payment card or a cash machine. POS stands for point of sale and means a card purchase at a merchant's terminal. DEB or DBT is a debit card payment, often online. ATM marks a cash withdrawal or deposit at a machine. All three are usually money out.

### What else sits on the line

Card lines carry more than the code. A typical description holds the merchant name, sometimes a store number, a city or state, a card ending and the date of the purchase if it differs from the posting date. For example, an invented line could read `POS 0614 GREEN LEAF MKT #0412 SPRINGFIELD`. The code is POS, 0614 is the purchase date and the rest is the merchant and location.

### Card refunds

A refund to a card often uses the same code as the purchase, with the amount in the money-in column. Do not rely on the code alone to set the sign. The column the amount sits in, or its minus sign, is what decides direction.

### Cash and fees together

An ATM withdrawal at another bank's machine may come with a separate fee line, sometimes with its own code. Keep both. The withdrawal is cash you took; the fee is a bank cost, and they belong in different totals.

## ACH, DD and SO: transaction codes for automatic payments

ACH, DD and SO all mark payments that happen without you handing over a card or a cheque, but they come from different systems. ACH is the US electronic network; DD and SO are UK terms. An ACH line can be money in or out, a DD is pulled by a company, and an SO is pushed by you.

### ACH in the United States

According to [Nacha's explanation of the ACH Network](https://www.nacha.org/content/what-is-ach), the network reaches all US bank and credit union accounts, and both direct deposit and direct payments travel over it. So a payroll deposit, a utility bill paid from your account and a transfer from a brokerage can all show ACH in the description. The direction comes from the column, and words such as CREDIT, DEBIT, DEPOSIT or PMT nearby usually confirm it.

### Direct Debit and standing order in the UK

The [Bacs site](https://www.bacs.co.uk/) describes Direct Debit as the way companies automatically collect payments from millions of people and organisations, and notes that Bacs is operated by Pay.UK. On a UK statement, DD therefore marks a collection that a company started under your instruction. SO, a standing order, is a fixed payment your bank sends on a schedule you set. The practical difference: a company can change a DD amount, while only you can change an SO.

### Why the difference matters in a sheet

Tagging these separately helps when you review regular outgoings. A filter on DD lists every company that collects from you. A filter on SO lists the payments you control, such as rent to a landlord or a monthly transfer to savings.

## CHK, DEP, XFER and fee transaction codes

Outside card and automatic payments, most remaining codes describe cheques, deposits, transfers, fees and interest. CHK or CHQ marks a cheque, often with its number. DEP marks a deposit. XFER or TFR marks a transfer between accounts. FEE, SVC CHG or similar marks a bank charge, and INT marks interest.

### A reference table

The table below lists codes commonly seen on statements, as a guide. Your bank's statement key is the final word on its own abbreviations.

| Code | Usually means | Usual direction | Suggested sheet type |
| --- | --- | --- | --- |
| POS | Card purchase at a terminal | Out | Card |
| DEB / DBT | Debit card payment | Out | Card |
| ATM | Cash machine withdrawal or deposit | Out or In | Cash |
| ACH | US electronic transfer | Out or In | Electronic |
| DD | UK Direct Debit | Out | Direct Debit |
| SO | UK standing order | Out | Standing order |
| CHK / CHQ | Cheque | Out or In | Cheque |
| DEP | Deposit | In | Deposit |
| XFER / TFR | Transfer between accounts | Out or In | Transfer |
| FEE / SVC CHG | Bank fee or service charge | Out | Bank fee |
| INT | Interest | In on savings, Out on loans | Interest |
| NSF | Returned item for insufficient funds | Out | Bank fee |

### Cheque numbers

Cheque lines are the one place the number after the code really matters. Keep it in a separate Cheque number column. It lets you match the line to your own register and spot a missing number in a sequence.

### Returned items

A returned item, sometimes marked NSF or RETURN, often brings two lines: the reversal of the original payment and a fee. Keep both, and give the reversal the opposite sign of the original so the pair nets correctly.

## Why do transaction codes differ from bank to bank?

There is no single list of statement codes shared by every bank. Payment networks define how money moves between banks, but each bank chooses how to print that movement on its own statements. One bank writes POS, another DEBIT CARD PURCHASE, a third prints only the merchant name with no code at all.

### Practical consequences

Codes are reliable inside one bank's statements and unreliable across banks. If you combine statements from two banks, build a mapping for each bank's codes to your own types rather than assuming the same code means the same thing. Codes can also change when a bank redesigns its statement, so check the first month of each year when working with long histories.

### Where to find your bank's key

Many statements include a short glossary on the back of the first page or at the end. Online banking help pages often explain codes too. If a code appears that you cannot decode, the bank's help line can tell you; guessing risks putting a fee in your spending or a refund in your income.

### Exported histories versus statements

A transaction history printed from online banking may use longer descriptions, or different ones, from the monthly statement for the same rows. The guide to [converting a bank transaction history PDF to Excel](/blog/bank-transaction-history-pdf-to-excel) explains how those printouts differ from statements.

## Splitting transaction codes from the payee in Excel

When the code is the first word of the description, a formula can move it to a Code column and leave the rest in a Payee column. In current Excel versions, TEXTBEFORE and TEXTAFTER do this in one step each. In older versions, LEFT, MID and FIND do the same job with a little more typing.

### With TEXTBEFORE and TEXTAFTER

With the raw description in B2:

```
Code:  =TEXTBEFORE(B2, " ", , , , B2)
Payee: =TEXTAFTER(B2, " ", , , , "")
```

The last argument tells each function what to return when there is no space, so a one-word description does not produce an error.

### With older functions

```
Code:  =LEFT(B2, FIND(" ", B2&" ")-1)
Payee: =TRIM(MID(B2, FIND(" ", B2&" ")+1, 300))
```

### Codes that are two words

Some codes take two words, such as `ACH DEBIT` or `DEBIT CARD`. A first-word split would leave the second word stuck to the payee. Handle these by testing for the longer phrase first, or by running the lookup in the next section on the first two words when the first word alone is not recognized.

### Saving the result

If the workbook goes to someone on an older Excel, newer functions may show as errors on their side. Paste the Code and Payee columns as values before sending, and save in a modern format; the comparison of [XLS and XLSX file formats](/blog/convert-pdf-to-xls-or-xlsx) explains why the newer format is usually the right choice.

## Can a transaction code lookup table label every row?

A lookup table can label every row whose code it knows, and it can flag every row whose code it does not. Put each code and its plain-language type in a small table on a separate tab, then use XLOOKUP to fill a Type column. Unknown codes return a marker you can filter on.

### A worked example

Here is an example lookup table, called Codes, on its own tab:

| Code | Type |
| --- | --- |
| POS | Card |
| ATM | Cash |
| ACH | Electronic |
| CHK | Cheque |
| FEE | Bank fee |

And example rows on the main sheet, with invented payees and amounts:

| A: Code | B: Payee | C: Amount | D: Type |
| --- | --- | --- | --- |
| POS | GREEN LEAF MKT | -54.20 | Card |
| ACH | EXAMPLE PAYROLL | 2,100.00 | Electronic |
| CHK | 1043 | -300.00 | Cheque |
| WIRE | EXAMPLE TITLE CO | -1,500.00 | Unknown |

The Type column uses:

```
=XLOOKUP(A2, Codes[Code], Codes[Type], "Unknown")
```

### Using the unknowns

Filter Type for Unknown and you have a short list of codes to learn. In the example, WIRE is a code the table did not know. Add it once, and every later month picks it up automatically. If you keep a reusable workbook, the lookup tab belongs in it; the [bank statement Excel template](/blog/bank-statement-excel-template) shows how to lay one out with room for it.

### Converting the statements first

All of this assumes the statement is already in rows with the description intact. A converter that keeps wrapped description lines together protects the code at the start of each one, which the guide to [what a bank statement converter does with your PDF](/blog/bank-statement-converter) explains. FastBankConvert is getting ready to open and is designed to keep the description in its own column beside the date and amount; [Get started](/get-started) to join the list.
