All articles
Engineering20 May 202613 min read

How to upload bulk salary payments to FNB, Standard Bank, Capitec, Nedbank, Absa and Investec

The exact upload path for each of the six major South African business banks, the file format they expect, and the half-dozen reasons your payroll CSV gets rejected. Written by the engineer who has fed every one of them.

Kyle McLaren
Kyle McLaren
Founder

A bulk-payment upload is the last 90 seconds of payroll. Your numbers are right, your payslips are signed, and now you need to push a file into your bank’s portal so it can debit one account and credit forty-something employees.

This is the guide I wish I’d had when I started building payloop’s bank-format exporters. Each of South Africa’s six major business banks accepts a different file format, hides the upload behind a different menu path, and breaks on different edge cases. None of them publishes complete public documentation. So here’s the field guide.

First — universal branch codes are not optional any more

Before any bank’s file format matters, get this right: every beneficiary line should use the universal branch code for the beneficiary’s bank, not their physical branch code.

BankUniversal branch code
FNB250 655
Standard Bank051 001
Absa632 005
Nedbank198 765
Capitec470 010
Investec580 105

BankservAfrica routes payments based on the account number alone and strips the branch code to the universal code anyway. But upload files that include the wrong branch code are more likely to be flagged at the validation step in your bank’s portal. Use the universal code, always.

(Building society-style codes and specialty codes like FNB ’s private clients branch still exist, but for receiving salary payments, the universal code is correct in every case.)

FNB — Online Banking Enterprise

Where: Payments tab → Add Table Action → Import → Payments.

Two products: "Online Banking Business" (SME) and "Online Banking Enterprise" (OBE, corporate). Same upload flow, slightly different menus.

Formats accepted:

  1. FNB CSV — FNB’s own template, the most common choice.
  2. ACB (.aca / .acb) — Bankserv fixed-width 181-character records. Used for larger volumes and host-to-host integrations.

FNB CSV layout

A single header row, then one row per payment. Required columns, in this order:

Payment Action Date,Nominated Account Number,Recipient Account Number,
Recipient Name,Amount,Reference

Example payment row:

2026-10-25,62123456789,1234567890,Nia Mokoena,59903.00,SAL-OCT26

Key rules:

  • Decimal separator must be a period. R 59 903,00 will be rejected; R 59 903.00 will not.
  • Reference field maxes out at 20 characters. Anything longer truncates silently — you might not notice until the beneficiary complains they can’t reconcile.
  • Recipient Name is purely for your records; FNB doesn’t validate it against the account holder.
  • Account number max 20 chars.
  • Optional columns: Hash Total (sum of all amounts — useful sanity check), Email Notification, SMS Notification.

FNB ACB layout

Fixed-width 181-character records (Header, Standard Records, Contra Records, Trailer). Maximum 100 000 transactions per file, 200 contra records.

ACB is overkill for most companies — reach for the CSV unless you’re processing more than a few thousand transactions a month.

Upload flow

  1. Sign in to OBE / Online Banking Business.
  2. Payments → Import → choose .CSV or .ACB.
  3. Name the batch (e.g. "Salaries Oct 2026").
  4. Upload → FNB processes → sends results to OBE inbox / email.
  5. Authorise → Accept — usually requires a second signatory.

The two gotchas that catch most teams

  1. Excel strips leading zeros from account or branch numbers. If you generate the CSV manually from a spreadsheet, format the cells as Text before you save. Better: use a real CSV writer (Python’s csv module, Node’s csv-stringify, or payroll software that produces UTF-8 CSV without BOM).

  2. Reference field overflow. The 20-character limit is brutal. "Salary October 2026 — final" becomes "Salary October 2026" silently. Pick a short, stable reference scheme like SAL-202610-EMP123.

Standard Bank — Business Online (BOL)

Where: Funds Transfer → Import (with a one-time setup under Administration → Setup Import Files).

Two products: legacy "Business Online" (BOL) and the newer "Online Banking for Business". Both use the same import logic.

Formats accepted:

  1. SSV — semicolon-separated values, Standard Bank’s proprietary format.
  2. Excel-style templates — configured per company.
  3. CATS (Computerised Auto Transfer System) — fixed-length 144-character ACB layout for legacy/host-to-host. Comes in two variants:
    • FREE-FORMAT: beneficiary banking details included in the file.
    • PRE-FORMAT: beneficiary details pre-loaded at the bank, payments reference only the beneficiary ID.

The one-time setup

You configure your column mapping under Administration → Setup Import Files. Once set, every file uses that map — so if you change your payroll software’s output, you must reconfigure the map first. Many teams forget this step and waste an afternoon.

Amount formatting quirk

Standard Bank’s import accepts amounts with or without the decimal point:

  • 59903 is interpreted as R 59 903.00
  • 59903.00 is also accepted

Mix the two in the same file and BOL throws errors row-by-row. Pick one and stick with it. CATS specifies a fixed 11-digit cents-only field, which is unambiguous.

Upload flow

  1. Set up import map (one-time): Admin → Setup Import Files.
  2. Funds Transfer → Import → pick file.
  3. BOL validates against the map.
  4. Release the batch for authorisation.
  5. Authorisers approve — usually two signatories.

Common errors

  • Detail and contra records don’t balance in CATS — the file rejects outright. Your payroll software should always emit a balanced file; if it doesn’t, that’s a bug.
  • Column reorder. If your payroll software updates and outputs columns in a different order, BOL won’t auto-detect — the import map is positional.

Capitec — Capitec Business

Where: Capitec Business app or web portal → Payments → Upload batch.

Capitec Business is the new business banking offering, distinct from the personal Capitec app. Bulk payments run through it or via host-to-host for larger volumes.

Format accepted: Bankserv ACB (specifically the "Bankserv ACB (Capitec/FNB/Nedbank)" common file). Capitec does not publish a public CSV specification. All technical details have to come from payroll vendors’ integration notes (Sage and SimplePay publish theirs).

What payroll software actually sends

  • Pay Method 03 with account type, universal branch code (470 010), and the beneficiary’s account number.
  • No special characters in the beneficiary reference field. Slashes, dashes and dots are all rejected by Capitec’s validator.
  • Account-Holder Verification (AVS) is run automatically — Capitec is the strictest of the six banks here. If the beneficiary name doesn’t match the account holder on file, the row warns; in some cases it blocks.

Upload flow

  1. Sign in to Capitec Business.
  2. Payments → Upload Batch.
  3. Capitec validates banking details against AVS.
  4. Authorise.

Timing

  • Batch processing: responses (success / failure per row) within about an hour.
  • Real-time (RTC): sub-60-second per-transaction, but at a significantly higher cost per item.

Gotchas

  • The 2024 reference-field change broke older payroll templates. If your payroll software hasn’t been updated since early 2024, regenerate the file from a current version.
  • No public CSV docs means most CSV files generated by hand won’t work. Use payroll software that produces a proper Capitec ACB file.

Nedbank — NetBank Business

Where: Payments → Batches → Import Batch Payments.

Nedbank Business Hub is the analytics shell; NetBank Business is the transactional portal where uploads happen.

Formats accepted:

  1. Nedbank CSV — the bank’s own template, column sequence is fixed and configured per company.
  2. Nedinform ACB — pre-format and free-format variants.
  3. NetBank Secure format — legacy proprietary.

File size limit

Nedbank’s practical limit is ~2 000 transactions per file. Above that, split the run into multiple files. Most companies won’t hit this — but bureaus processing multiple clients at once need to be aware.

Upload flow

  1. Payments → Batches → Import Batch Payments in CSV.
  2. Choose the file.
  3. NetBank validates column-by-column.
  4. Preview the parsed batch.
  5. Authorise.

Common error: leading zeros

Same as FNB — if you produce the CSV from Excel and account numbers start with 0, Excel will eat them. Use Text formatting or a proper CSV writer.

Absa — Business Integrator Online (BIO)

Where: Payments → Import Batch.

Absa runs two business products: "Absa Business Integrator Online" (BIO) for corporates, and "Absa Online Banking for Business" for SMEs. Both accept the same file shape.

Formats accepted:

  1. Headerless CSVno header row. Column order is fixed and configured in BIO.
  2. ACB (Bankserv) — standard fixed-width.

The CSV column order (no header)

Source, Supplier Code, Account Number, Branch, Account Type, Amount, Statement Narration

Account Type is a numeric code:

CodeType
1Current
2Savings
3Transmission
4Subscription Shares

Most beneficiary accounts are either 1 (current/cheque) or 2 (savings).

Upload flow

  1. Configure the column mapping in BIO once.
  2. Payments → Import → pick file.
  3. BIO debits the funding account as a single consolidated debit and credits each beneficiary individually.
  4. Authorise.

Gotchas

  • No header row. A header in the first line will be parsed as a payment and rejected (or worse, processed as garbage).
  • Numeric account type. "Cheque" or "Current" in text will reject. Use the digits 1–4.
  • Single consolidated debit means your bank statement shows one big debit, not one debit per beneficiary. Reconcile against the batch total, not the individual rows.

Investec — Investec Online for Business

Where: Pay → Bulk Payments.

Formats accepted:

  1. Investec Bulk Payment V2 — the current proprietary format.
  2. BTB V1 — legacy, follows Bankserv Magtape fixed-width.

V1 vs V2 — pick V2

The V1 legacy format is aligned to Bankserv Magtape, not to Investec Business Online. Using the wrong template is the single most common reason an Investec upload fails. Your payroll software should default to V2; if it’s producing V1 the support team needs to ship an update.

No public CSV spec

Like Capitec, Investec doesn’t publish public file-format documentation. All Investec V2 generators ship as Excel converters that take payroll net-salary outputs and produce a V2 file. Sage and payloop both bundle this.

Upload flow

  1. Investec Online → Pay → Bulk Payments.
  2. Upload the V2 file.
  3. Dual-authorise (Investec requires two approvers by default).

The six universal mistakes

These break uploads at every bank. Eliminate them once and you’ll save yourself a lot of time.

1. Excel ate your leading zeros

Account numbers starting with 0 get truncated. Branch codes too. Format columns as Text before saving, or generate the CSV with a proper writer that quotes string values.

2. UTF-8 BOM at the start of the file

Some text editors and Excel "Save As CSV" routines prepend a byte-order mark (\xEF\xBB\xBF) to UTF-8 files. The parser sees weird characters in column 1 of row 1 and rejects the first record. Save as UTF-8 without BOM, or use ANSI/Windows-1252.

3. Wrong line endings

ACB files require Windows-style CRLF (\r\n). Unix-style \n will reject. Most code editors are configurable here; payroll software should always emit CRLF for ACB.

4. Reference field overflow

FNB: 20 chars. Capitec: no special characters. Standard Bank: 20 chars on certain rails. Pick a short, machine-parseable reference scheme like SAL-202610-001 (16 chars) and your reconciliation will work everywhere.

5. Wrong account type or column order

Absa BIO is positional. Standard Bank’s import map is positional. If your payroll software changes its output column order, update the import map before the next run.

6. Account-Holder Verification mismatches

Banks run real-time AVS against the Bankserv directory. The beneficiary’s ID number or registered name must match the account holder. Capitec is the strictest; the others warn but don’t block. If you get a mismatch warning, verify with the employee — usually it’s a stale beneficiary name (e.g. married name change).

When does the money actually land?

Three different rails settle on different timelines:

Standard EFT (overnight)

The default for salary payments.

  • Captured & authorised by 16:00 today.
  • Funds debit your account overnight.
  • Beneficiary sees credit by 05:00–08:00 the next business day.

For a payday of Wed 25 Nov 2026, authorise and submit the file by 16:00 on Tue 24 Nov 2026. Cutting it close on the payday itself means employees see the money the day after.

Same-day EFT / Real-Time Clearing (RTC)

Settles in under 60 minutes. Costs R 30–R 50 per transaction, with per-transaction caps (typically R 5 million). Useful for a late or corrective run; punishing for routine payroll.

PayShap

Settles in under 10 seconds. Limit raised to R 50 000 per transaction in October 2024. For payroll, useful for late-add corrections; not the default for bulk runs because the per-transaction cost is higher than overnight EFT.

A note on debit orders

DebiCheck and NAEDO are collection (debit) products, not salary credits. NAEDO is being phased out in favour of DebiCheck. Neither is relevant to outbound salary payments — if your payroll provider mentions them, they’re probably talking about something else.

What payloop does for you

payloop generates the correct bank-import file for every one of the six banks above, in the current format, with universal branch codes and reference fields that fit. Specifically:

  • FNB CSV with the right column order, decimal separator, and a 20-character reference scheme.
  • Standard Bank CATS (or SSV) with balanced detail/contra records and pre-validated cents fields.
  • Capitec Business ACB with no-special-characters references and AVS-friendly beneficiary names.
  • Nedbank CSV within the 2 000-record limit, auto-split into multiple files if needed.
  • Absa BIO headerless CSV with the right numeric account type per beneficiary.
  • Investec V2 generated correctly the first time, with V1 available as a fallback for any legacy integrations.

Every file is generated with CRLF line endings, UTF-8 without BOM, no leading-zero stripping, and a reconciliation totals row so you can sanity-check before upload.

If you’d like to see your next payroll exported to your bank’s exact format, book a 30-minute working session — we’ll do the round-trip with your real employees and your real bank.

Frequently asked questions

Can I split one payroll across multiple banks?

Yes. payloop (and most modern payroll systems) will generate one file per source-bank, even if your beneficiaries are spread across all six. You upload to your funding bank only — the bank handles inter-bank routing via BankservAfrica.

What happens if a beneficiary account is closed?

The bank’s validation usually catches it pre-upload (AVS returns "Account does not exist"). If it slips through, the payment returns to your funding account within 2–3 business days, with the reason code "Account closed". You re-process to the employee’s current account, no extra fee.

Do I need universal branch codes for all banks or just some?

All of them, for outbound EFT. The exception is some legacy inter-bank Stitch-type transfers that still use physical branch codes — but for normal bulk-payment uploads, universal codes everywhere is the right answer in 2026.

What’s the cheapest bulk EFT rail?

Standard overnight EFT is the cheapest per transaction (typically under R 2 per beneficiary at high volumes). RTC and PayShap are faster but per-transaction more expensive. For routine payroll that’s known days in advance, standard EFT is the right answer.

Can I upload via API instead of the portal?

Some banks (Investec, FNB, Standard) expose host-to-host APIs for larger corporates. They require ISO 20022 XML messages and pre-agreed trust setup. For most employers, the file upload via the portal is simpler and just as fast.

Where do I find the exact file format docs?

Try payloop

Want to see this in your payroll?

Book a 30-minute working session with your data.

Book a demo