Why most Nigerian SMEs will fail at NRS compliance — and how to avoid it.
The 2026 schedule isn't a paperwork problem. It's an infrastructure problem hiding inside a paperwork problem, and the businesses that treat it as the former will run out of runway before the latter.
The 2026 Nigerian Revenue Service schedule arrived with the same energy as every compliance change before it — a flurry of LinkedIn explainers, an even larger flurry of WhatsApp forwards, and a lot of quiet dread. Our argument is that most Nigerian SMEs will not struggle with NRS compliance because the rules are hard. They will struggle because the systems underneath the rules were never built to support them.
The common instinct is to treat NRS as a form‑filling exercise — find the templates, copy the figures across, hand it to the accountant before the deadline. That instinct is understandable, because that is what every previous filing obligation actually was. It is also, under this schedule, wrong, and the gap between those two things is where businesses will get caught.
The shape of the actual problem
Filing under the 2026 schedule requires a clean ledger. A clean ledger requires invoices that match payments that match expenses that match receipts, continuously, rather than assembled in the week before a deadline. That is a much stronger requirement than anything the previous regime enforced, and it is not a requirement a spreadsheet plus a folder of photographed receipts can meet — which is what a great many Nigerian SMEs are currently running on.
The actual problem is not the form. The actual problem is the six months of unreconciled transactions that have to be sorted out before the form is fillable at all. The deadline is a paperwork deadline. The work is an infrastructure project.
For a deeper read on what the schedule itself requires, see our primer on the 2026 NRS changes — it is long, but it is also the shortest version of this story we have managed to write.
The deadline is a paperwork deadline. The work is an infrastructure project — and the businesses that don’t see this will run out of runway before the form is fillable.
What the failing businesses have in common
If you want to know whether this applies to you, the diagnostic is short. Four traits travel together, and none of them are about effort — all of them are about systems:
- Sales recorded in one place, payments confirmed in another, and no automatic link between the two.
- Receipts collected as photos on a personal phone, with no naming convention and no backup.
- An accountant who shows up in the last week of each quarter and leaves a list of questions nobody has time to answer.
- A founder who can quote the monthly revenue figure to the nearest hundred thousand naira, but cannot tell you the gross margin on any single product line.
The businesses doing well share the inverse. Their books are not perfect; their books are queryable. A founder who can answer a question in five minutes has built an asset. A founder who needs three days has built a liability and is paying interest on it every quarter.
Most businesses in this position do not have a tax problem. They have a not‑knowing‑where‑the‑money‑went problem, and tax is just where it becomes visible.
— How we'd put it to anyone treating this as a filing deadline
What to do about it before the deadline
There is a version of this essay that ends with a product pitch. This is not that version. For most businesses in this position the fix is sequencing, not software. Get the ledger clean once, with whatever tool feels least painful, and then choose the system that keeps it clean. In that order, every time.
If you want a working starting point, the minimum viable reconciliation is below. It is not glamorous. It pairs two CSVs — bank statement on one side, invoices on the other — and flags anything that does not match within a 48‑hour window. That is the whole job. The rest is discipline.
1import pandas as pd2from datetime import timedelta3 4# Pair bank credits with invoices inside a 48h window.5def reconcile(bank, invoices, window=48):6 matched = []7 for _, credit in bank.iterrows():8 candidates = invoices[9 (invoices.amount == credit.amount) &10 (invoices.issued >= credit.date - timedelta(hours=window))11 ]12 if not candidates.empty:13 matched.append((credit.id, candidates.iloc[0].id))14 return pd.DataFrame(matched, columns=["credit_id", "invoice_id"])
The honest answer
Compliance is a problem you can solve once and then maintain for a small monthly cost — in attention, software, or someone’s salary. It becomes catastrophic only when it is treated as a deadline rather than a system. The earlier in the cycle you start, the more of it is a bookkeeping exercise rather than an emergency.
We are not going to tell you which tool to use. We will, however, tell you that the answer is almost never a new spreadsheet.
By Yusuf Tahir, PhD, founder of Fattahlabs. Based in Kaduna, Nigeria.
hello@fattahlabs.com