Why most Nigerian SMEs will fail at NRS compliance — and how to avoid it.
The 2026 schedule is not a paperwork problem. It is an infrastructure problem hiding inside one.
The 2026 Nigerian Revenue Service schedule landed in January with the same energy as every compliance change before it — a flurry of LinkedIn explainers, an even larger flurry of WhatsApp forwards, and a slow, building dread among the founders we work with in Kaduna and Lagos. Two months in, the pattern is clear. Most Nigerian SMEs will not fail at NRS compliance because the rules are hard. They will fail because the systems underneath the rules were never built to support them.
I have spent the last eight weeks auditing the back office of ten businesses ranging from a fashion house in Yaba to a logistics operator in Apapa. The instinct, in each case, was to treat NRS as a form-filling exercise — find the templates, copy the figures across, hand it to the accountant on the 28th. That instinct is wrong, and it is the source of the failure.
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. None of the ten businesses had this. Eight of them ran the books out of two Excel files and a folder of photographed receipts on the founder’s phone. Two of them ran the books out of WhatsApp.
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
The pattern across the ten audits was unmistakable. The businesses that are going to fail share four traits — none of them about effort, all of them 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.
We do not have a tax problem. We have a not-knowing-where-the-money-went problem.
— A founder we audited in February, after three days of reconstruction
What to do about it before September
There is a version of this essay that ends with a product pitch. This is not that version. The fix, for almost every business we have looked at, 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 do want a working starting point, the minimum viable reconciliation script we hand to clients on day one 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. If you are reading this in March, you have time. If you are reading this in August, you have less time than you think.
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