All posts
22 May 202612 min read

Google Sheets Accounting for Small Nigerian Businesses: The Complete Setup Guide (and When to Move On)

Thousands of Nigerian small business owners run their entire accounting on Google Sheets. Done right, it works. Done wrong — which is how most people do it — it creates more problems than it solves. Here is the right way, and the honest point at which Sheets stops being enough.

Google Sheets Accounting for Small Nigerian Businesses: The Complete Setup Guide (and When to Move On)

Walk into any co-working space in Lagos, Abuja, or Port Harcourt and ask the person next to you how they track their business finances. Odds are better than even that the answer involves Google Sheets. Sometimes it is a single tab with a running list of amounts received. Sometimes it is a more elaborate setup with separate sheets for income, expenses, and monthly summaries. Sometimes it is a shared sheet that three team members update manually at the end of each day.

All of these approaches have the same core problem: they depend entirely on the discipline of whoever is doing the entry. And discipline, under the daily pressure of running a business, is the first thing to go.

This guide covers how to set up Google Sheets accounting properly for a small Nigerian business — the structure that actually works, the formulas that do the heavy lifting, and the specific point at which Sheets becomes a liability rather than an asset.

Why Google Sheets Makes Sense at the Start

Before we get into the setup, it is worth being honest about why Sheets is a reasonable choice for early-stage businesses, not just a second-rate substitute for "real" accounting software.

It costs nothing. Accounting software in Nigeria costs anywhere from ₦15,000 to ₦150,000 per year depending on the package. When your monthly revenue is ₦200,000 and you are still figuring out product-market fit, spending ₦15,000 on software is a real consideration.

Your accountant can read it. A FIRS-registered tax consultant can open a Google Sheet without installing anything or learning new software. This matters when you hand your records over for VAT filing or annual tax returns.

It is flexible. Accounting software forces you into its categories and workflows. Sheets lets you track exactly what matters to your specific business — a fashion brand needs different columns than a SaaS company.

It integrates with everything. Paystack, Flutterwave, and most Nigerian business tools can export CSV files that paste directly into Sheets. Google's own API means any tool worth using can write to Sheets directly.

The case against Sheets is not that it is a bad tool — it is that manual data entry is a bad process. The goal of this guide is to minimise the manual part.

The Structure That Actually Works

Most merchants who use Sheets for accounting set up one tab and put everything in it. This works until it does not — usually around the time you have 300 rows and need to answer a question like "how much did I make in March from Instagram customers versus my website?"

A properly structured Sheets accounting setup has at minimum four tabs:

Tab 1 — Transactions

This is your raw ledger. Every sale, every payment received, goes here. Do not calculate anything in this tab — just record facts.

Columns:

code
Date | Reference | Customer | Channel | Gateway | Currency | Gross | Fee | Net | VAT | Status | Notes

Date — the date the payment was received, not the date you entered it.

Reference — the transaction reference from your payment gateway. This is what you use to look up a specific transaction if a customer disputes a payment.

Customer — email address or name. Email is better because it is unique.

Channel — where the sale came from. Instagram DM, website, WhatsApp, walk-in, etc. This column is what lets you answer questions like "how much of my revenue comes from Instagram?"

Gateway — Paystack, Flutterwave, Monnify, cash, bank transfer (direct).

Currency — NGN for local sales, USD/GBP/EUR for international sales.

Gross — the amount the customer paid.

Fee — the gateway's processing fee. For Paystack local cards: 1.5% of gross + ₦100, capped at ₦2,000. For direct bank transfers and cash: ₦0.

Net — Gross minus Fee. This is your actual revenue.

VAT — the VAT component, if applicable. For VAT-inclusive pricing at 7.5%: =Gross*(7.5/107.5). For exclusive: =Net*0.075.

Status — success, refunded, pending.

Notes — anything that needs explaining. "Christmas promotion — 20% discount applied."

Tab 2 — Expenses

One row per expense. Do not combine multiple expenses into one row.

code
Date | Category | Description | Vendor | Amount | VAT Paid | Receipt? | Payment Method

Category — use a fixed list and stick to it. Suggested categories for a Nigerian e-commerce or services business:

  • Logistics
  • Marketing
  • Inventory / Cost of Goods
  • Platform Fees (hosting, software subscriptions)
  • Professional Services (accountant, lawyer, designer)
  • Staff / Freelancers
  • Office / Utilities
  • Equipment
  • Bank Charges
  • Miscellaneous

Pick your categories once, write them in a separate "config" tab, and use data validation to restrict the Category column to your list. This prevents "Logistic", "logistics", and "Logistics cost" from appearing as three different categories in your reports.

VAT Paid — if you paid VAT to a registered vendor and have their TIN on the invoice, record it here. This is your input VAT — it reduces what you owe FIRS.

Receipt? — a Yes/No column. Your accountant will thank you and FIRS will thank you if you are ever audited.

Tab 3 — Monthly Summary

This tab pulls from Transactions and Expenses using SUMIFS formulas to produce a clean monthly view. You never edit this tab manually — the formulas do it.

code
Month | Gross Revenue | Gateway Fees | Net Revenue | VAT Collected | Expenses | Profit

A sample formula for Gross Revenue in January 2026:

code
=SUMIFS(
  Transactions!G:G,
  Transactions!A:A, ">="&DATE(2026,1,1),
  Transactions!A:A, "<"&DATE(2026,2,1),
  Transactions!K:K, "success"
)

The status = "success" filter ensures refunded transactions do not count toward revenue.

For VAT liability:

code
=SUMIFS(Transactions!J:J, Transactions!A:A, ">="&DATE(2026,1,1), Transactions!A:A, "<"&DATE(2026,2,1))
- SUMIFS(Expenses!F:F, Expenses!A:A, ">="&DATE(2026,1,1), Expenses!A:A, "<"&DATE(2026,2,1))

Output VAT minus Input VAT equals what you owe FIRS.

Tab 4 — Config

A simple reference tab that lists your fixed values: expense categories, VAT rate, your business name and TIN, your gateway fee formulas. Use named ranges to reference these throughout the workbook.

Centralising these means when the VAT rate changes (as it did when it moved from 5% to 7.5% in 2020), you update one cell and every formula in the workbook adjusts automatically.

The Formulas You Actually Need

Paystack fee calculation

code
=IF(B2<2500, B2*0.015, MIN(B2*0.015+100, 2000))

Where B2 is the gross transaction amount. This correctly applies the 1.5% rate with no fixed component below ₦2,500, adds ₦100 above that threshold, and caps at ₦2,000.

Monnify bank transfer fee

code
=IF(B2<=5000, 10, IF(B2<=50000, MIN(B2*0.005, 250), 125))

VAT — inclusive pricing

code
=B2*(7.5/107.5)

Where B2 is the gross amount the customer paid (VAT already included in the price).

VAT — exclusive pricing

code
=B2*0.075

Where B2 is the base price before VAT. The total charged to the customer would be =B2*1.075.

Monthly P&L

code
=SUMIFS(Transactions!I:I, Transactions!A:A, ">="&DATE(YEAR(A2),MONTH(A2),1), Transactions!A:A, "<"&DATE(YEAR(A2),MONTH(A2)+1,1), Transactions!K:K, "success")
- SUMIFS(Expenses!G:G, Expenses!A:A, ">="&DATE(YEAR(A2),MONTH(A2),1), Expenses!A:A, "<"&DATE(YEAR(A2),MONTH(A2)+1,1))

Where A2 contains any date in the target month.

Running VAT balance (for knowing what you owe this month so far)

code
=SUMPRODUCT(
  (MONTH(Transactions!A:A)=MONTH(TODAY()))*
  (YEAR(Transactions!A:A)=YEAR(TODAY()))*
  (Transactions!K:K="success")*
  Transactions!J:J
)

Put this somewhere visible on your dashboard tab so you always know how much VAT money is sitting in your account that belongs to FIRS.

The Manual Entry Problem

Here is the honest truth about every Sheets accounting setup: it only works if transactions get entered promptly and accurately. Most merchants enter transactions in batches — at the end of the day if they are disciplined, at the end of the week if they are busy, and in a panicked all-nighter at month-end if things got away from them.

Batch entry creates errors. You misread a Paystack reference. You enter ₦15,000 as ₦1,500. You forget a transaction entirely. You enter a refunded transaction as successful because you did not check the status.

The solution most merchants reach for is downloading their Paystack CSV export and pasting it in. This helps with accuracy but creates a new problem: the CSV format does not match your ledger format. You spend 20 minutes reformatting columns every time you do it.

A better approach is to connect your payment gateway directly to your Google Sheet so that rows appear automatically the moment a payment is confirmed. This is what KoboSync does — but before we get to that, let me show you what the bridge looks like if you want to build it yourself.

Building a Basic Paystack-to-Sheets Automation

If you are technical, here is the minimum viable implementation. You need:

  1. A Paystack account with webhook access
  2. A publicly accessible URL (Vercel, Railway, or Render will do)
  3. A Google Cloud service account with Sheets API access

The webhook handler — the part that receives Paystack events and writes to your sheet — is about 50 lines of Node.js:

code
import express from "express";
import crypto from "crypto";
import { GoogleSpreadsheet } from "google-spreadsheet";
import { JWT } from "google-auth-library";
 
const app = express();
app.use(express.json());
 
app.post("/webhook", async (req, res) => {
  // Verify Paystack signature
  const hash = crypto
    .createHmac("sha512", process.env.PAYSTACK_SECRET!)
    .update(JSON.stringify(req.body))
    .digest("hex");
 
  if (hash !== req.headers["x-paystack-signature"]) {
    return res.sendStatus(200); // Return 200 even on failure
  }
 
  res.sendStatus(200); // Acknowledge immediately
 
  const { event, data } = req.body;
  if (event !== "charge.success") return;
 
  const gross = data.amount / 100;
  const fee   = Math.min(gross * 0.015 + (gross >= 2500 ? 100 : 0), 2000);
  const net   = gross - fee;
 
  const auth = new JWT({
    email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
    key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"),
    scopes: ["https://www.googleapis.com/auth/spreadsheets"],
  });
 
  const doc = new GoogleSpreadsheet(process.env.SHEET_ID!, auth);
  await doc.loadInfo();
  await doc.sheetsByIndex[0].addRow({
    Date:      new Date(data.paid_at).toLocaleDateString("en-NG"),
    Reference: data.reference,
    Customer:  data.customer.email,
    Gross:     gross,
    Fee:       fee,
    Net:       net,
    Status:    "success",
  });
});
 
app.listen(3000);

This works. We know because KoboSync started from almost exactly this pattern. But as you add features — duplicate detection, header protection, error recovery, VAT calculation, multi-currency support, refund handling, pending write queues for when Google goes down — the simple 50 lines becomes several hundred lines across multiple files, with Redis, a job queue, and a worker process.

That is why KoboSync exists. Not because the concept is complicated, but because production-grade implementation of this concept is genuinely time-consuming to build and maintain.

When Google Sheets Stops Being Enough

Sheets has real limits. Knowing when you have hit them saves you from a painful surprise.

The capacity limit. Google Sheets supports up to 10 million cells per spreadsheet. A 12-column transaction ledger hits this at roughly 833,000 rows. For a merchant doing 100 transactions per day, that is about 23 years. This limit will not affect most small businesses — but the performance degradation starts much earlier. Sheets with more than 50,000–100,000 rows become noticeably slower to load, filter, and query.

The collaboration limit. When more than one person is editing simultaneously, Sheets introduces version conflicts. For a small team where one person manages accounts and another logs sales, this becomes a real problem. You need a database, not a spreadsheet.

The audit trail limit. Sheets has version history, but it is not an audit trail in any meaningful sense. You cannot easily see who changed a cell, when, and what it was before. For a business facing a tax audit, this matters.

The formula limit. As your Sheets accounting setup becomes more sophisticated, the formulas become fragile. Someone pastes into a cell incorrectly and breaks a range. Someone deletes a row in the Transactions tab and suddenly the monthly summary is wrong. These failures are silent — there is no error message, just a wrong number that you may not notice for weeks.

The reporting limit. SUMIFS and COUNTIFS are powerful, but they are not a reporting engine. When you want to answer questions like "which product category has the highest return rate" or "what percentage of my revenue comes from repeat customers," you need either a pivot table (which has its own limitations) or a proper analytics layer.

The right time to move beyond manual Sheets accounting is when any of these statements are true:

  • You are spending more than 2 hours per week on data entry and reconciliation
  • You have missed a VAT filing deadline because you could not pull the numbers together in time
  • You have discovered a discrepancy between your Sheets balance and your bank account that took more than an hour to resolve
  • You have more than one person who needs to view or enter financial data

The Automated Middle Ground

Moving to full accounting software is a significant jump — cost, learning curve, onboarding your accountant to a new system. For many businesses at the 0–₦10 million monthly revenue stage, there is a middle path: keep using Google Sheets, but automate the data entry.

This means your sheet retains all the flexibility and zero cost of Sheets — your accountant still uses it, you still see your data in the format you understand — but transactions flow in automatically from your payment gateway without any manual work.

This is KoboSync's core proposition. Your Paystack, Flutterwave, or Monnify transactions appear in your Google Sheet automatically, with all the columns filled in correctly — including the fee calculation, net profit, and VAT component. Refunds write a reversal row automatically. The monthly VAT summary is generated and emailed to you on the first of each month.

The sheet you set up using the structure in this guide works directly with KoboSync. The column names match. The formulas in your Summary tab pick up the data that KoboSync writes. The only thing that changes is that you stop entering transactions manually.


KoboSync connects your Paystack, Flutterwave, or Monnify account to your existing Google Sheet and fills it in automatically — fees, net profit, VAT, and all. No manual entry, no missed transactions. Connect your sheet free →