Ifedayo Oluwaseun Hire me
Available for remote work · WAT / UTC+1

I build finance functions from zero, then automate them.

Currently: Accountant

Four years across microfinance, consumer finance and digital assets. At a digital asset exchange I built the accounting function from nothing — chart of accounts, controls, statutory tax — then cut month-end reporting from a full working day to under an hour with Power Query.

4+Years across microfinance, consumer finance & digital assets
87%Reduction in month-end reporting preparation time
₦3.57bnTransaction volume analysed and reconciled
9Downloadable projects across Excel, Power BI and SQL

What I do

Nine disciplines, one throughline

Every engagement comes down to the same thing: make the numbers correct, then make producing them fast.

Financial Reporting

IFRS financial statements, management accounts, P&L, balance sheet and cash flow — built to survive an audit and readable by a non-finance founder.

Management Reporting

Monthly reporting packs with commentary that says what changed and why, not just what the number was. Delivered on a calendar, not on request.

Financial Analysis & Modelling

Budgeting, forecasting, variance analysis and scenario modelling that tells you where money is made and where it leaks.

Excel Automation

Power Query models, pivot architectures and VBA macros that replace a day of manual assembly with a single refresh.

Power BI & Dashboards

Data models and dashboards that give management weekly visibility instead of a monthly surprise.

Data Analysis & Cleaning

Profiling, cleaning and transformation of messy source data — finding the problems, not just formatting the output.

Tax & Payroll Compliance

PAYE administration, VAT computation and filing, Withholding Tax and statutory returns — built from nothing at a company that had none.

Reconciliation & Controls

Multi-source reconciliation design, internal controls, SOP manuals and audit readiness. Including crypto wallets, exchanges and payment platforms.

Crypto & Digital Assets

Wallet, exchange and gift-card reconciliation with automated exception flagging. Most accountants have never done this. I do it monthly.

Selected work

Nine projects across Excel, Power BI and SQL

Every file is downloadable. Open it, click into the formulas, and check the numbers yourself.

Six projects, one dataset

An anonymised extract from a digital asset exchange: 14,450 trades and ₦3.57bn of gross volume in one month. Every figure is a live formula, not a pasted value.

Demonstration projects on an anonymised extract. All customer, representative and account identifiers are replaced with surrogate codes, and settlement references are redacted. Monetary values are unchanged, so the analysis is real.

Business Intelligence

Exchange Performance Dashboard

A single-refresh management reporting pack over 14,450 transactions and ₦3.57bn of gross volume. Replaced a manual month-end assembly that drew on the accounting system, bank statements and exchange exports. Every KPI is a live formula, so a new month drops in and all six sheets recalculate.

  • Power Query
  • Excel
  • Pivot Models
  • SUMIFS

439 live formulas · 7 sheets · 0 errors

Download filexlsx · 927 KB

Data Analytics

Data Cleaning & Control Exception Report

Source-to-report remediation of a 27-column extract. Found a ₦13.8m misstatement in the source summary — a formula pointing at the wrong cell — plus 90 phantom customers created by untrimmed IDs and 9 Bitcoin payouts with no blockchain hash. Ships with an audit-committee memo.

  • Power Query
  • Data Profiling
  • Internal Controls

12 exceptions logged · ₦13.8m misstatement found

Download filexlsx · 53 KB

Financial Analysis

Product Profitability & Concentration Analysis

Full Pareto across 36 products. Gift cards earn a 2.77% spread against 0.73% on crypto — 3.8× the margin on a smaller ticket — while crypto carries 52% of volume for 22% of profit. One product is 63% of total profit. Includes a scenario model for its disruption.

  • Excel
  • Pivot Models
  • Scenario Analysis

Two products = 81% of profit

Download filexlsx · 34 KB

Management Reporting

Representative Scorecard & KPI Framework

Twenty representatives ranked on margin contribution rather than volume — because the two leaderboards are not the same list. The top performer by volume ranks tenth on margin. Segment mix explains most of the 78% margin spread, which changes how you'd set commission.

  • Excel
  • SUMIFS
  • KPI Design
  • Conditional Formatting

78% margin spread explained by mix, not skill

Download filexlsx · 19 KB

Financial Modelling

Daily Trend, Seasonality & Forecast Model

Thirty days of daily performance with a 7-day rolling average, a weekday seasonality index, and a 31-day projection carrying a stated sensitivity band. Sunday runs 60% below Friday — consistently enough to be a staffing question rather than a demand mystery.

  • Excel
  • INDEX/MATCH
  • Seasonality Index
  • Sensitivity

27% coefficient of variation · 60% weekend gap

Download filexlsx · 20 KB

Internal Controls

Payout Reconciliation & Settlement Control

Three-way reconciliation of amount due against amount paid across every settlement account, with a materiality threshold. Every account agrees within tolerance — but 147 of 165 rounding variances fall against the business and one account settles 64% of all value. That is a policy gap and a continuity risk.

  • Excel
  • Reconciliation Design
  • COUNTIFS
  • Risk Analysis

₦24,821 leakage quantified · 779 duplicates flagged

Download filexlsx · 618 KB

Across tools

A Power BI report, an Excel dashboard and a set of SQL queries, each built on a separate practice or public dataset.

Excel DashboardPractice dataset

ChiChi Bites Sales Dashboard

Six months of sales for a small food business — 220 orders, 15 products, five staff. An interactive pivot dashboard with slicers answers the owner's questions: best sellers, most profitable staff, best trading day, payment mix and customer rating by product. A row-by-row check found 15 Total_Sales formulas pointing at the wrong row, understating revenue by ₦15,896. Corrected, May — not January — is the strongest month. The ad-spend correlation had also picked up its own Grand Total row; fixed, it drops from 0.99 to about 0.41, too weak on six months to claim ads drive sales.

  • Excel
  • Pivot Tables
  • Slicers
  • CORREL

₦762,100 revenue · 43% margin · 15 formula errors fixed

Download filexlsx · 79 KB

Power BIGuided learning project

Data Professional Survey Dashboard

A one-page Power BI report on a public survey of data professionals. A treemap of respondents by country cross-filters the whole page: favourite programming language, how hard it was to break into data, respondents by role, a participant count and average age, and salary and management satisfaction gauges on the survey's 0–10 scale.

  • Power BI
  • Power Query
  • Cross-filtering
  • Gauges & Cards

8 visuals · 1 interactive page

Download filepbix · 807 KB · opens in Power BI Desktop

SQL

Sales Orders — Exploratory SQL

Seven queries against a sales orders table: which cities we sell to, orders ranked by unit price, the top five, orders from Lagos, Kano and Kaduna, a ₦10,000–₦20,000 price band, a pattern search for oil products, and a headline summary of order count, revenue and average unit price.

-- Headline summary
SELECT
    COUNT(order_id)            AS total_orders,
    SUM(unit_price * quantity) AS total_revenue,
    AVG(unit_price)            AS average_unit_price
FROM orders;
  • SQL
  • SELECT / WHERE
  • ORDER BY / LIMIT
  • Aggregates

7 queries · commented and runnable

Download filesql · 2 KB

No projects in this category yet.

Capability, demonstrated

What a formula check changes

Two charts drawn from the work above. The first shows why every total gets rebuilt from its source rows before anyone reads it.

ChiChi Bites revenue, recorded and corrected

Fifteen Total_Sales formulas pointed at the wrong row. Fixing them moved the best month from January to May.

Monthly revenue as recorded and as corrected, January to June 2024₦0k₦60k₦120k₦180kJan recorded: ₦158,104Jan corrected: ₦154,100JanFeb recorded: ₦99,200Feb corrected: ₦103,500FebMar recorded: ₦96,100Mar corrected: ₦96,600MarApr recorded: ₦113,500Apr corrected: ₦107,800AprMay recorded: ₦145,400May corrected: ₦160,400MayBest month once correctedJun recorded: ₦133,900Jun corrected: ₦139,700Jun
As recordedCorrected, quantity × unit price
Show the figures as a table
Month 2024RecordedCorrected
Jan₦158,104₦154,100
Feb₦99,200₦103,500
Mar₦96,100₦96,600
Apr₦113,500₦107,800
May₦145,400₦160,400
Jun₦133,900₦139,700
Total₦746,204₦762,100

Month-end reporting pack

Minutes to produce the monthly pack at a digital asset exchange, before and after the Power Query model went live.

Minutes to produce the monthly reporting pack: 480 before automation, 58 after Before, manual assembly480 After, Power Query refresh58 Minutes per month · an 87% cut
Ifedayo Peter Oluwaseun, Accountant and Financial Analyst, Lagos

Lagos, Nigeria

Based inLagos, Nigeria
QualificationICAN (ACA), 2027
SystemsSAP, QuickBooks
AvailabilityImmediate

About me

I build the reporting, then I build the machine that produces it

I'm an accountant and financial analyst with over four years across microfinance, consumer lending, multi-branch healthcare and digital assets. I started inside regulated institutions where the process was rigid and the deadlines were absolute, and I now work in a company that had no accounting structure at all when I arrived.

That second kind of work is where I do my best. At my current employer, a digital asset and gift card exchange, I built the finance function from a blank page — the chart of accounts, the reporting framework, the internal controls, the statutory tax processes. Then I automated the month-end close, cutting the reporting pack from a full working day of manual assembly to under an hour with Power Query.

Building a chart of accounts from nothing teaches you why every control exists. It also teaches you that most reporting problems are not reporting problems — they are capture problems that only become visible at month end. So I tend to work backwards from the report to the point where the data is created, and fix it there.

What I'm most useful for: a finance function that has outgrown its spreadsheets, a month-end that takes too long, a reconciliation nobody trusts, or a management pack that reports the wrong number because a formula points at the wrong cell. I've found and corrected exactly that — a ₦13.8m misstatement sitting in a summary block nobody had reconciled to source.

I'm completing the ICAN (ACA) qualification, expected 2027, and I'm open to remote roles and consulting engagements.

  1. Accountant

    Digital asset & gift card exchange · Lagos

    • Built the entire finance function from inception
    • Automated month-end: a full day to under an hour
    • Reconcile crypto wallets, exchanges and five banking platforms
    • Introduced PAYE, VAT and Withholding Tax compliance end to end
  2. Head Accountant

    Hospital Assist Nigeria

    • Led finance across six branches, team of eight
    • Standardised reconciliation — cash discrepancies down 30%
    • 100% statutory compliance on external audit
  3. Accountant

    Rosabon Financial Services

    • General ledger and daily cash books at high transaction volume
    • Streamlined workflows across QuickBooks and Sage 50
  4. Accountant

    LAPO Microfinance Bank

    • 100% on-time statements across 24 consecutive cycles
    • Budget vs actual variance analysis for management
  5. B.Sc. Accounting

    Edexcel University, Benin Republic

    • National Diploma, Accounting — Rufus Giwa Polytechnic, 2018
    • ICAN (ACA) in progress, expected 2027

Capabilities

What I actually use

Grouped by discipline with years of hands-on use. No percentages — a number like "Excel 95%" invites the question "95% of what?"

Accounting & Reporting

4+ yrs
  • IFRS financial statements
  • Management accounts
  • Month-end close
  • General ledger
  • Consolidation support
  • Audit readiness
  • Fixed asset registers

Analysis & Modelling

4+ yrs
  • Budgeting & forecasting
  • Variance analysis
  • Profitability analysis
  • Scenario modelling
  • Cash flow & liquidity
  • KPI framework design

Excel

4+ yrs
  • Power Query (M)
  • Pivot Tables & slicers
  • Power Pivot
  • Dynamic arrays
  • XLOOKUP / INDEX-MATCH
  • VBA macros
  • Model & template design
  • Conditional formatting

Business Intelligence

2+ yrs
  • Microsoft Power BI
  • Data modelling
  • Dashboard design
  • Data cleaning & profiling
  • Trend & seasonality analysis

SQL

Working level
  • SELECT & filtering
  • WHERE, IN, BETWEEN, LIKE
  • ORDER BY & LIMIT
  • COUNT, SUM, AVG

Systems

4+ yrs
  • SAP ERP
  • QuickBooks
  • Sage 50
  • Microsoft Dynamics

Tax & Compliance

4+ yrs
  • PAYE administration
  • VAT computation & filing
  • Withholding Tax
  • Statutory reporting
  • Internal controls
  • SOP documentation

Specialist

1+ yr
  • Cryptocurrency accounting
  • Wallet & exchange reconciliation
  • Gift card settlement
  • Multi-platform payment reconciliation

Currently developing

In progress
  • DAX
  • SQL joins & GROUP BY
  • Window functions

Writing

Notes from the practice

Ten pieces on problems I actually ran into this year — a misstated summary, a month-end that took a day, a reconciliation with no audit trail. Written from the work, not from theory.

Reconciliation6 min read

The ₦13.8m error hiding in a summary block

A formula pointed one cell too far. Nobody had reconciled the summary to the transaction rows in months. Here is how to catch it in ten minutes.

Excel8 min read

Why your month-end takes a day, and how to make it an hour

The manual steps that eat the time are almost always the same four. A walkthrough of replacing them with one Power Query refresh.

Crypto10 min read

How to reconcile a cryptocurrency wallet as an accountant

On-chain settlement, exchange statements and gift-card logs do not arrive in a format your ledger accepts. A practical method that survives an audit.

Analysis7 min read

Volume is not performance: measuring a sales team on margin

The top performer on our volume leaderboard ranked tenth on margin. What that does to commission design, and how to fix the measure.

Controls9 min read

Building a chart of accounts from a blank page

What to decide first, what to leave flexible, and the three decisions that are painful to reverse later.

Data5 min read

Trim your identifier fields before you count anything

An untrimmed customer ID created 90 customers that did not exist, and quietly distorted every per-customer metric downstream.

Tax8 min read

PAYE, VAT and WHT: a compliance calendar for a Nigerian startup

What is due, when, and the automated schedules that stop you missing it — written for a company that has no finance function yet.

Power BI7 min read

From pivot table to data model: when to stop using Excel

The point at which a spreadsheet stops being the right tool, and what moving to a proper model actually buys you.

Forecasting6 min read

One month of data cannot give you a forecast

What you can honestly extract from a short history, what you cannot, and how to present a projection without implying false precision.

Career5 min read

What an accountant should automate first

Not the hardest task. Not the most annoying one. The one that runs most often and fails most expensively.

Available for work

Let's talk about your numbers.

Open to remote roles and consulting engagements. Based in Lagos on WAT (UTC+1), with comfortable overlap across GMT, CET and US Eastern hours. Happy to be engaged directly, as a contractor, or through an Employer of Record such as Deel or Remote.com — which lets companies hire in Nigeria without setting up a local entity.

  • Accountant
  • Senior Accountant
  • Financial Analyst
  • Management Accountant
  • Financial Reporting Specialist
  • Financial Accountant
  • Excel Automation Specialist
  • Reporting Analyst
  • Data Analyst
Full-time● Open
Contract● Open
Remote● Preferred
Consulting● Open
Freelance● Open

Reconciliation6 min read · July 2026

The ₦13.8m error hiding in a summary block

A formula pointed one cell too far. Nobody had reconciled the summary to the transaction rows in months. Here is how to catch it in ten minutes.

The monthly summary sat at the top of the worksheet, above the transaction ledger. Four figures: total received, total paid, total profit, transaction count. Then a segment split — Bitcoin profit and gift card profit. It had been produced the same way every month, and it had been wrong every month.

Gift card profit was reported as ₦60,892,384. That is the total profit for the period. The actual gift card figure was ₦47,082,842. The formula referenced the total cell instead of the segment cell — a single-cell error, invisible unless you check.

Why nobody caught it

Because the total was right. The summary added up. Gross profit of ₦60,892,384 tied to the transaction rows exactly, and when the number you check reconciles, you stop checking. The error was one level down, in the split, where nothing forced a cross-check.

And the direction of the error made it plausible. Gift cards genuinely are the larger profit segment — 77.8% of it. A figure that overstated gift cards didn't look absurd. It looked like the thing everyone already believed.

Why it actually mattered

This wasn't presentational. The crypto book carries 52% of gross volume at a 0.728% spread, against 2.774% on gift cards. Reported this way, crypto appeared to contribute nothing at all — so the case for repricing it, or capping it, never got made. Management were looking at a number that quietly justified leaving a thin-margin, high-risk book exactly as it was.

Roughly ₦13.8m of profit was attributed to the wrong segment. In a business earning ₦60.9m a month, that is not a rounding difference. It is a fifth of the result pointed at the wrong product line.

The ten-minute check

Take any summary figure and rebuild it from the rows underneath. Not with the same formula — with a different one. If the summary uses SUMIF, rebuild it with a pivot. If it uses a pivot, rebuild it with SUMIFS. The point is to construct the number by a route that cannot inherit the original mistake.

Then check that the parts sum to the whole. Crypto profit plus gift card profit should equal total profit. In the original summary it didn't — gift cards alone equalled the total, which should have been the tell. Nobody tested it because nobody had written the test down.

What I changed

Every figure in the rebuilt reporting pack is a live SUMIFS or COUNTIFS against the transaction sheet. Nothing is pasted. Replace the data with a new month and every KPI recalculates from source.

That doesn't make errors impossible. It makes this particular class of error impossible, because there is no longer a summary layer that can drift away from the detail. The summary is the detail, aggregated.

I also added a reconciliation line: segment profits summed, compared to total profit, difference displayed. If it ever shows anything other than zero, something upstream has broken. That check costs one cell and would have caught this on day one.

The wider lesson

A summary block is not a report. It is a claim about a report. Until someone has tied it back to the rows it claims to summarise, it is unverified — however long it has been produced, and however sensible the numbers look.

The uncomfortable part is that this had been signed off repeatedly. Not through carelessness — through the ordinary assumption that a figure which has always been there is a figure someone once checked.

Excel8 min read · July 2026

Why your month-end takes a day, and how to make it an hour

The manual steps that eat the time are almost always the same four. A walkthrough of replacing them with one Power Query refresh.

Producing the monthly management pack took a full working day. By the end it took under an hour. Nothing about the business changed — only how the numbers got assembled.

Here is where the day actually went, and what replaced each part.

The four thieves

Exporting. Data came from three places: the accounting system, bank statements, and exchange platform exports. Each in a different layout, each downloaded by hand, each dropped into a working file. Perhaps forty minutes, and only if nothing had changed since last month.

Reshaping. Columns in different orders. Dates formatted three ways. Amounts stored as text in one export and numbers in another — which matters, because text-formatted numbers vanish silently from a SUM. This was the longest step and the one most likely to introduce an error nobody would see.

Transcribing. Figures typed from the working file into the reporting template. Every keystroke a chance to transpose a digit. Worse, it created a summary layer disconnected from its source — which is exactly how a ₦13.8m misstatement survived in that pack for months.

Re-checking. Because the first three steps were manual, the fourth had to exist. Tie the totals, check the balance sheet balances, look for anything obviously wrong. Necessary, and entirely a consequence of the process rather than the business.

What replaced them

A Power Query model with the sources staged as connections rather than pasted data. Each source gets its own query: import, promote headers, set types explicitly, trim and case-fold the text fields, then append into one clean transaction table.

Type-setting matters more than it sounds. Declaring a column as decimal means a value that can't be a decimal raises an error instead of silently becoming text and dropping out of your totals. You want the loud failure.

The trim-and-fold step earns its place too. In this dataset, 41 distinct asset labels turned out to be 36 real products — APPLE, APPLE and APPLE were being counted as three. Any pivot built on the raw field misreported the product mix.

Then the reporting sheets sit on top as formulas — SUMIFS and COUNTIFS against the clean table. No pasting. Refresh, and every figure recalculates.

What it actually costs

Building it took about two days. It pays back in the second month and every month after. That maths is worth doing explicitly before you start, because it is the argument you will need to make to whoever is asking why this month's pack is late.

Three things I'd tell you before you start

Fix the process before you automate it. Automating a broken sequence gives you a broken sequence that runs faster. If a step exists because someone once made a mistake, work out whether the mistake is still possible.

Name your queries properly. Bank_Statement_Staging, not Query1. In four months you will not remember, and neither will whoever inherits it.

Keep the exception log. Automation makes bad data invisible, which is worse than slow. My pack has a dedicated sheet listing everything that failed a check — missing rates, unassigned representatives, payouts with no source account. The refresh is fast, and the problems still surface.

The part that isn't about time

The hours saved are real, but they aren't the main benefit. The pack is now reproducible. Anyone can refresh it and get the same answer. Every figure traces to a transaction row. When someone asks why a number moved, the answer takes a minute rather than an afternoon of reconstructing what you did.

A manual pack is a performance you repeat monthly and can never quite replay. An automated one is a document that produces itself.

Crypto10 min read · July 2026

How to reconcile a cryptocurrency wallet as an accountant

On-chain settlement, exchange statements and gift-card logs do not arrive in a format your ledger accepts. A practical method that survives an audit.

Most accountants have never reconciled a wallet. The principles are the ones you already know — match what was owed to what was paid, explain the difference, evidence the settlement. What changes is the nature of the evidence.

Last month that meant 4,370 Bitcoin transactions alongside 10,080 gift card settlements, across three payout accounts. Here is how I approach it.

Start with what the blockchain is actually giving you

A blockchain transaction is not an invoice. It has no counterparty name, no reference, no description. What it does have is a hash — a unique identifier for that transaction, permanently public and independently verifiable by anyone.

That hash is the strongest audit evidence in the whole business. Better than a bank statement, because a bank statement is a claim by a bank and a hash is a fact anyone can check. If your records carry the hash, settlement is provable. If they don't, it isn't.

Which is why the first control test I run is simply: how many crypto payouts have a hash recorded? Last month, nine did not. Nine transactions where the money left and the business cannot independently demonstrate where it went. Not fraud — almost certainly someone busy skipping a field. But it is a genuine control gap, and it goes in the exception report as a High.

Three sources, three shapes

Wallet exports give you the on-chain truth: hash, timestamp in UTC, value in the native unit. Note both problems there. UTC will not match your local trading day, so a transaction near midnight lands in the wrong period unless you convert. And the value is in BTC, not naira — so the recorded rate becomes part of the audit trail, not a detail.

Exchange statements give you the commercial view: what the customer was quoted, what was charged. This is where your margin lives.

Bank statements give you the settlement leg for the fiat side.

None share a common key. That is the actual work of the reconciliation — building one.

Building the matching key

I normalise each source into a common structure: date, customer, asset, amount due, amount paid, settlement reference. Then match on customer plus amount plus date.

That is deliberately imperfect, and it needs a second pass. Last month it flagged 779 transactions sharing a customer, an amount and a date. Most are legitimate — a large order split into several payouts, or a regular customer buying the same denomination twice. But some proportion of those could be a genuine double payment, and you cannot tell which from the data alone.

So they go on a review sheet, not into a total. The reconciliation is not complete until someone has confirmed them against payment records. Writing "779 items requiring confirmation" is a more honest output than a clean tick that quietly assumed they were all fine.

Rounding, and why direction matters

Payouts get rounded. Across the month, 165 transactions showed a difference between amount due and amount paid, netting ₦24,821 against the business.

Against ₦3.55bn settled that is nothing — 0.0007%. I flagged it anyway, because of the direction: 147 of the 165 differences fell against the business and only 18 in its favour. A variance that always lands the same way is not rounding. It is an undocumented policy, and it accrues.

The concentration nobody was looking at

One payout account handled 64% of all settlement value. Not a reconciliation finding exactly — but you only see it when you group payments by source, which reconciliation makes you do.

In a business where a delayed payout becomes a reputational problem within hours, having most of your settlement capacity in a single account that could be frozen or rate-limited is a continuity risk worth naming.

What to hand over

A crypto reconciliation that survives review has four parts: the matched population, the exceptions listed individually with an owner, the settlement evidence rate — what proportion of payouts carry a verifiable hash — and the rounding position with its direction.

The last two are what distinguish it from a normal bank rec. Get those right and the work stands up. Skip them and you have a spreadsheet that balances without proving anything.

Analysis7 min read · July 2026

Volume is not performance: measuring a sales team on margin

The top performer on our volume leaderboard ranked tenth on margin. What that does to commission design, and how to fix the measure.

Two leaderboards, same nineteen people, same month. On volume, one representative sat first with ₦362.8m transacted. On margin, that same person ranked tenth of nineteen.

Neither list is wrong. They measure different things, and only one of them is performance.

The spread

Margin across the team ran from 1.44% to 2.56% — a 78% spread on what is broadly the same product set. The best margin performer generated less than a third of the top volume figure. If you rank on volume, they are unremarkable. If you rank on contribution per naira transacted, they are the best in the team.

The representative with the highest profit per trade — ₦5,608 against a team average of ₦4,214 — simultaneously ran the lowest margin of anyone at 1.44%. Big tickets, thin spread. On three different measures that person looks like a star, a solid performer, and the weakest on the team.

It is mix, not skill

The explanation turned out to be almost mechanical. Crypto earns roughly 0.73%. Gift cards earn roughly 2.77%. A representative's blended margin is largely a function of how much crypto flows through their book.

Which means blended margin is grading people on the book they were allocated, not on how well they worked it. That is unfair in both directions — it punishes whoever handles the crypto desk and flatters whoever happens to sit on gift cards.

The fix is to measure margin within segment. How does this person's crypto margin compare to the team's crypto margin? That question is answerable and actionable. "Whose blended margin is highest?" mostly answers "who was given the better book?"

Why this reaches the P&L

If commission or recognition is driven by volume, you have built an incentive to grow the thinnest-margin, highest-risk part of the business. Every crypto trade adds settlement risk, counterparty risk and price risk, and returns a quarter of the gift card spread. Paying people to grow it is paying to make the business worse while the top line looks excellent.

That is not a hypothetical. Crypto was 52% of volume and 22% of profit. A volume-led team will keep pushing that ratio in the wrong direction, and the volume chart will look like success the whole time.

What I'd actually measure

Four things, in this order.

Gross profit — the contribution measure. This is the one that matters.

Margin within segment — pricing discipline, isolated from allocation.

Profit per trade — distinguishes ticket size from pricing quality. High profit per trade with low margin means big tickets, not good pricing.

Volume — kept, but demoted to context. It tells you how busy someone was, which is worth knowing and is not the same as how much they earned.

The uncomfortable conversation

Publishing a margin leaderboard reorders the room. People who have been top of the volume board for months will drop, and they will not have done anything differently.

Which is why the segment-mix analysis has to go out at the same time. It shows the reordering is mostly explained by book allocation rather than effort, and it turns "you are underperforming" into "the measure was wrong, and here is the one we will use." Those are very different conversations to have with someone who has been doing what they were asked to do.

Controls9 min read · July 2026

Building a chart of accounts from a blank page

What to decide first, what to leave flexible, and the three decisions that are painful to reverse later.

I joined a company with no formal accounting structure. Not a bad chart of accounts — none. Transactions were recorded, money moved, but there was no framework turning that activity into a set of accounts anyone could report from.

Building one from nothing is a rare thing to get to do, and it teaches you why every convention you previously followed exists.

Start from the report, not the accounts

The instinct is to start listing accounts. Cash, receivables, payables, revenue. Resist it.

Start instead with the reports you must produce. Statutory financial statements. A monthly management pack. Tax computations — PAYE, VAT, Withholding Tax. Anything a regulator or a lender will ask for.

Then work backwards. Every line on every one of those reports has to be derivable from the accounts. If it isn't, the chart is wrong — regardless of how tidy it looks.

This ordering matters because a chart of accounts built from first principles will be elegant and will not produce the reports you need. One built backwards from the reports will be slightly less elegant and will work.

The three decisions that are painful to reverse

Segment structure. How you split the business — product line, channel, region, entity. Change this later and every prior period becomes non-comparable, which means either restating history or losing it. Decide it deliberately, and give yourself one more dimension than you currently need.

Here that meant separating crypto from gift cards from the beginning. It looked like unnecessary granularity for a business selling both through one process. It turned out to be the single most important dimension in the entire dataset — the two segments earn wildly different margins, and without the split that is invisible.

The level at which you post cost. Too granular and every posting becomes a judgement call, so people guess and consistency dies. Too coarse and you cannot answer questions. The test I use: could a new joiner post this correctly using only the account name? If it needs tribal knowledge, the account is wrong.

Numbering with room in it. Leave gaps. If revenue accounts run 4000, 4001, 4002, the first new product line forces either a bad number or a renumber. Number in tens, or hundreds. It costs nothing now and saves a migration later.

What to leave flexible

Almost everything else. Sub-accounts, analysis codes, departmental splits — these can be added without disturbing history, so add them when a real question demands them rather than in anticipation.

The commonest failure is building for a business three sizes larger than the one you have. A chart with 400 accounts for a company that needs 60 will be used wrongly, because nobody can hold 400 in their head. Accounts nobody understands become a dumping ground, and the dumping ground becomes the biggest number in the ledger.

Controls belong in the design

The chart is where a lot of control gets designed, quietly.

Suspense and clearing accounts should exist and should be reviewed on a schedule — an unreviewed suspense account is where problems go to become permanent. Anything requiring a specific approval should sit in an account that makes the approval traceable. Anything feeding a tax return should be able to produce that return without manual adjustment, because every manual adjustment is an error waiting for a busy month.

The part I got wrong

I under-specified data capture. The chart was sound; the fields feeding it were not validated. Customer identifiers were entered free-form, so the same customer arrived as several — 3,126 distinct IDs collapsed to 3,036 real customers once trimmed. Asset names were free-form too, splitting single products across categories.

A clean chart of accounts sitting on unvalidated capture gives you well-organised bad data. If I were doing it again, I would design the validation rules at the same time as the accounts, and treat the two as one piece of work rather than two.

Write it down

Every account gets a one-line definition of what belongs in it and what does not. This document is the difference between a chart of accounts and a folk tradition. Without it, the structure survives about as long as the person who built it.

Data5 min read · July 2026

Trim your identifier fields before you count anything

An untrimmed customer ID created 90 customers that did not exist, and quietly distorted every per-customer metric downstream.

The system reported 3,126 customers. There were 3,036.

The gap was 90 records where a customer identifier carried a trailing space, a leading space, or inconsistent capitalisation. PU4630 and PU4630 are different strings to a computer and the same customer to everyone else.

Why this is worse than it sounds

A 3% error in a customer count is not, by itself, a crisis. The damage is in everything computed from it.

Average revenue per customer was understated, because the denominator was inflated by customers who did not exist.

Revenue concentration was understated in a more insidious way. A customer whose transactions split across two identifiers appears as two mid-sized customers rather than one large one. Concentration risk analysis is precisely the thing you cannot afford to have quietly flattened.

Repeat-purchase behaviour was wrong. Someone with twelve transactions split seven and five looks like two moderately loyal customers instead of one very loyal one.

Any review keyed on customer identity — KYC, credit limits, watchlists — has a hole in it. If a customer exists under two IDs, a limit applied to one does not bind the other.

The fix is trivial

=UPPER(TRIM(A2))

In Power Query, it is two clicks: Transform → Format → Trim, then Transform → Format → UPPERCASE. Do it in the staging query, before anything joins or aggregates.

The rule I follow: every text field used as a key gets trimmed and case-folded at the point of import, always, without waiting for evidence that it needs it. It costs nothing when the data is clean and saves you when it isn't.

Where else it was hiding

Same dataset, same problem in the product field. 41 distinct asset labels turned out to be 36 real products. APPLE, APPLE and APPLE were three categories. So were FOOTLOCKER and FOOTLOCKER. ETH and ETHEREUM were the same asset under two names.

Product mix analysis on the raw field would have understated the largest product line and invented several small ones. Given that one product turned out to carry 63% of total profit, getting its size wrong is not a cosmetic issue.

Fix it upstream, not downstream

Cleaning at import means cleaning the same thing every month forever. The real fix is validation at capture — a dropdown instead of a free-text field, a format rule on the identifier, a duplicate check before a new customer record is created.

That is a system change and it takes longer. Until it happens, the import-time clean is your protection, and the exception log is how you keep the pressure on: this month we corrected 106 padded identifiers is a much more persuasive argument for fixing the input form than the data is a bit messy.

The general point

Nothing about this error announces itself. No formula breaks. No total is obviously wrong. The report runs, the numbers look plausible, and every per-customer metric is quietly off.

Those are the errors worth building habits against, because you will not catch them by looking. Trim first, then count.

Tax8 min read · July 2026

PAYE, VAT and WHT: a compliance calendar for a Nigerian startup

What is due, when, and the automated schedules that stop you missing it — written for a company that has no finance function yet.

I joined a company with no formal tax process. Not late filings — no process. Building one from scratch, in the middle of the largest overhaul of Nigerian tax law in decades, was an education.

This is the calendar I work to and the schedules that sit behind it. Nigerian tax law changed substantially with effect from 1 January 2026, so confirm the current position with your adviser before relying on any date below.

What changed

The Federal Inland Revenue Service was replaced by the Nigeria Revenue Service under the Nigeria Revenue Service (Establishment) Act, which took effect on 26 June 2025. Four new tax acts came fully into force on 1 January 2026, replacing much of the previous framework.

If your templates, filing references or internal documentation still say FIRS, they are out of date. That is a small thing that signals a larger one to anyone reviewing your compliance.

The monthly rhythm

10th — PAYE. Employee tax deducted in the prior month is remitted to the relevant state revenue service. In Lagos that is LIRS, through the e-Tax portal.

21st — VAT and Withholding Tax. VAT collected and WHT deducted in the prior month are filed and paid to the Nigeria Revenue Service. Standard VAT remains 7.5%, with zero-rated and exempt categories.

Two deadlines, two authorities, eleven days apart. The commonest failure I have seen is treating them as one event and missing the earlier one.

The annual anchors

31 January — employers' annual return (Form H1) to the state revenue service. Lagos has been explicit about enforcing this date.

31 March — personal income tax returns for individuals.

30 June — companies income tax for entities with a 31 December year end.

The penalties are not trivial

Late VAT filing attracts ₦50,000 for the first month and ₦25,000 for each subsequent month. That accrues quietly and is entirely avoidable.

The reform package also introduced substantially heavier penalties around electronic invoicing obligations. If e-invoicing applies to you, treat it as a first-order compliance risk rather than an administrative detail.

The schedules behind the calendar

A calendar without computation behind it just tells you when to panic. Three automated schedules do the work.

PAYE. Gross pay by employee, reliefs, taxable pay, tax by band, net. Driven off the payroll register so it cannot drift from what was actually paid. Bands are an input cell, not hard-coded in a formula — because bands change, and when they do you want to edit one cell rather than audit a hundred.

VAT. Output VAT from the sales ledger, input VAT from purchases, net position. The value of automating this is not the arithmetic — it is that the return ties to the ledger by construction, so the figure you file and the figure in your accounts cannot diverge.

WHT. The hardest of the three, because the rate depends on the nature of the transaction and the status of the counterparty. I keep a rate table as a lookup rather than embedding rates in formulas, so a rate change is a one-cell edit and the historic computation stays intact.

All three feed a single filing calendar showing what is due, when, the amount, and whether it has been paid. One sheet. That sheet is the process.

If you are starting from nothing

Do it in this order. Register properly and confirm which authority each obligation belongs to — federal and state are different filings to different bodies. Build the three schedules before you need them, not on the 19th. Put the deadlines in a shared calendar with a reminder five days out, not on the day. And keep the evidence: filed returns, payment receipts, computation workings, filed together by month.

The last one matters more than it seems. The question is never only "did you pay?" but "can you show what you paid and how you arrived at it?" A folder per month, closed and complete, is what makes an audit boring — which is the outcome you want.

This is general information from the perspective of an accountant in practice, not tax advice. Nigerian tax law changed materially in 2026; confirm your specific obligations with a qualified adviser.

Power BI7 min read · July 2026

From pivot table to data model: when to stop using Excel

The point at which a spreadsheet stops being the right tool, and what moving to a proper model actually buys you.

Excel gets more criticism than it deserves. The reporting pack I rebuilt handles 14,450 transactions across seven sheets with 439 live formulas, refreshes in seconds, and is genuinely the right tool for that job.

But there is a point where it stops being right, and recognising it early saves an unpleasant migration later.

The signals that actually mean something

Refresh time you notice. Not slow — noticed. The moment you start doing something else while a workbook recalculates, the feedback loop that makes spreadsheets good for exploration has broken.

More than one person editing. Excel has no meaningful concurrency. The instant a file is called Pack_v4_FINAL_JAN_rev2.xlsx, you have a version-control problem wearing a filename.

The same aggregation rebuilt in three places. If revenue-by-product exists in three workbooks with three slightly different definitions, you no longer have three reports. You have three answers, and meetings about which is right.

Questions you cannot answer without rebuilding. "Same view, but only crypto, only weekends, only the top ten customers." If that means restructuring a pivot rather than clicking a filter, the tool is the constraint.

History you keep re-deriving. Twelve monthly workbooks are not a time series. If comparing periods means opening twelve files, you need a model.

What is not a signal

Row count alone. A million rows of simple data is fine in Excel. Fifty thousand rows with heavy array formulas across every column is not. Complexity governs, not volume.

Someone saying Excel is unprofessional. It isn't. Most finance functions in the world run on it, including in institutions with enormous BI budgets.

Wanting nicer charts. That is a formatting problem. Migrating your data layer to fix a formatting problem is an expensive way to change a colour.

What a model actually buys you

One definition of each measure. Gross margin is written once. Every visual using it gets the same answer, permanently. This is the real prize and it is worth more than the visuals.

Relationships instead of lookups. Tables join on keys rather than through nested INDEX/MATCH. Add a dimension and existing measures work against it without rewriting anything.

Filter context. The same measure answers "margin overall," "margin for crypto," "margin for crypto on Sundays" without you writing three formulas. This is genuinely different from what a pivot does, and it takes a while to stop thinking in pivot terms.

Scheduled refresh. The report updates whether or not anyone opens it.

The honest costs

DAX is not harder Excel. Filter context is a different mental model and there is a real learning curve where you will produce measures that give plausible wrong answers. Budget for that.

You also lose the thing Excel is best at: poking at data. Sometimes the right move is to sit in a sheet and look. Keep that ability rather than migrating everything on principle.

A sensible sequence

Clean and shape in Power Query first, in Excel. That work transfers directly — the same queries move into Power BI unchanged. Then build the model, then the visuals. Keep Excel for exploratory work and one-off analysis, permanently.

The end state is not Excel replaced. It is Excel doing what it is good at, with a model underneath it doing what it is good at.

Forecasting6 min read · July 2026

One month of data cannot give you a forecast

What you can honestly extract from a short history, what you cannot, and how to present a projection without implying false precision.

I was asked to forecast next month from one month of data. Here is what that month can honestly support, what it cannot, and how I presented the difference.

What 30 days genuinely gives you

A weekday pattern. Four or five observations of each weekday is thin, but the signal here was strong and consistent. Sunday averaged 47% below the daily mean. Friday ran 32% above. Sunday against Friday is a 60% gap — far too large and too repeated to be noise.

A volatility measure. Mean daily profit ₦2.03m, standard deviation ₦0.55m, coefficient of variation 27.2%. That is a real, useful number. It tells you the range to expect on any given day, which is often more actionable than a point estimate.

A best-to-worst ratio. The strongest day produced 3.1 times the weakest. Useful for capacity planning regardless of what next month brings.

What it cannot give you

Trend. With 30 points you can fit a line, and it will have a slope, and that slope will be meaningless. It reflects where in the weekday cycle the month started and ended. Fitting a trend to one month and extrapolating it is the single most common way short-history forecasts go wrong.

Annual seasonality. Whether June is typically strong or weak is unknowable from June alone. In a business selling gift cards, that is a serious gap — holiday periods and school terms plausibly matter a great deal.

Anything about growth. Growth is a comparison to a prior period. There isn't one.

How I built the projection

Base daily profit from the period mean. Weekday index applied per day. Growth set explicitly to zero — with a note on the assumptions sheet explaining that this is a deliberate choice, not an oversight. A sensitivity band of ±15% around the central case.

The July central case came out at ₦64.2m against June's ₦60.9m — up 5.4%. Almost all of that is arithmetic rather than growth: July has 31 days to June's 30, and the extra day falls on a strong weekday. I said so directly on the sheet, because a reader seeing +5.4% will otherwise read it as momentum.

Presenting it without overclaiming

Three rules I stick to.

Every assumption in one place, in blue. Growth rate, sensitivity range, horizon, base figure. A reader who disagrees with an assumption can change one cell and see the effect, rather than arguing with a black box.

Always show a range. A single number invites false confidence. ₦54.6m to ₦73.8m is less satisfying than ₦64.2m and considerably more honest.

State the limitation in the document, not the meeting. Mine says: one month is too short to separate trend from seasonality with confidence; this is a method and a sensitivity range, not a prediction. That sentence survives being forwarded. Caveats delivered verbally do not.

Why bother at all

Because "I cannot forecast from this" is unhelpful when someone has to plan. The useful answer is a projection with its limits stated plainly, plus a clear note of what would make it better — twelve months of history, and the weekday index recalculated as it accumulates.

That gives the business something to plan against now, and a path to something better. Refusing to model, or modelling with false confidence, both fail. The middle path is transparency about which parts are measured and which are assumed.

Career5 min read · July 2026

What an accountant should automate first

Not the hardest task. Not the most annoying one. The one that runs most often and fails most expensively.

Most people automate the task they dislike most. It is the wrong starting point, and it is why a lot of automation effort produces very little.

The frame I use

Rank every recurring task on three things:

Frequency. How many times a year does this run? Daily beats monthly by a factor of twenty.

Cost of an error. If this goes wrong and nobody notices for a month, what does it cost? Not just money — a misstated management pack costs decisions.

Time per run. The one everybody starts with, and the least important of the three.

Multiply them. Automate the top of the list.

Why time is the weakest input

A four-hour task done monthly is 48 hours a year. A ten-minute task done daily is 43 hours — near enough the same, and the daily one is far likelier to be done carelessly, because familiarity breeds speed and speed breeds error.

The four-hour task also gets your full attention. Nobody is careless with something that takes a morning. The ten-minute task gets done between other things, and that is where mistakes live.

Why cost of error dominates

The strongest case I have seen for automation wasn't about time at all. A monthly summary carried a formula pointing at the wrong cell, misstating a segment split by ₦13.8m. It had been wrong for months.

Rebuilding that pack so every figure calculates from source rows saved time — but the real return was that this class of error became structurally impossible. There is no longer a summary layer that can drift from the detail.

You cannot put a number on the decisions that error influenced. That is exactly why cost-of-error deserves more weight than the hours.

The caveat that matters

Automating a broken process gives you a broken process that runs faster.

Before automating anything, ask why each step exists. Many exist because someone once made a mistake and a check was bolted on. If the mistake is no longer possible, the check is waste and you are about to enshrine it in code.

I have watched people spend a week automating a reconciliation that existed because two systems disagreed — when the actual fix was making the systems agree. The automation worked perfectly and solved nothing.

Start smaller than you think

The first thing worth automating is usually not a whole process. It is the single most error-prone step inside one.

For me it was the import. Not the reporting, not the analysis — just getting data in cleanly and consistently, with types set explicitly and text fields trimmed. That one step eliminated an entire category of downstream error, and it took an afternoon.

Once the input is clean and repeatable, everything built on top gets easier. Start there, then work outward.

The thing nobody tells you

The benefit that lasts is not the time. It is that the work becomes reproducible. Anyone can run it. Every figure traces to a source row. When someone asks why a number moved, you answer in a minute instead of reconstructing what you did three weeks ago.

That is worth more than the hours, and it is the part that compounds.