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.
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.
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:
- FNB CSV — FNB’s own template, the most common choice.
- 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
- Sign in to OBE / Online Banking Business.
- Payments → Import → choose
.CSVor.ACB. - Name the batch (e.g. "Salaries Oct 2026").
- Upload → FNB processes → sends results to OBE inbox / email.
- Authorise → Accept — usually requires a second signatory.
The two gotchas that catch most teams
-
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
csvmodule, Node’scsv-stringify, or payroll software that produces UTF-8 CSV without BOM). -
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:
- SSV — semicolon-separated values, Standard Bank’s proprietary format.
- Excel-style templates — configured per company.
- 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:
59903is interpreted as R 59 903.0059903.00is 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
- Set up import map (one-time): Admin → Setup Import Files.
- Funds Transfer → Import → pick file.
- BOL validates against the map.
- Release the batch for authorisation.
- 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
- Sign in to Capitec Business.
- Payments → Upload Batch.
- Capitec validates banking details against AVS.
- 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:
- Nedbank CSV — the bank’s own template, column sequence is fixed and configured per company.
- Nedinform ACB — pre-format and free-format variants.
- 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
- Payments → Batches → Import Batch Payments in CSV.
- Choose the file.
- NetBank validates column-by-column.
- Preview the parsed batch.
- 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:
- Headerless CSV — no header row. Column order is fixed and configured in BIO.
- 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:
Most beneficiary accounts are either 1 (current/cheque) or 2
(savings).
Upload flow
- Configure the column mapping in BIO once.
- Payments → Import → pick file.
- BIO debits the funding account as a single consolidated debit and credits each beneficiary individually.
- 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:
- Investec Bulk Payment V2 — the current proprietary format.
- 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
- Investec Online → Pay → Bulk Payments.
- Upload the V2 file.
- 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?
- FNB: Payment CSV Import Guide and ACB File Format SA.
- Standard Bank: BOL Setup Import Files.
- Nedbank: Importing batch payments in CSV.
- Absa: documentation is via internal banker-led setup; AllWage’s ABSA BIO guide is the best public summary.
- Capitec and Investec do not publish CSV specs publicly; use payroll software that ships the correct exporter, or contact your banker for the integration document.
Want to see this in your payroll?
Book a 30-minute working session with your data.