Founder & Lead Engineer, RAITHub
Property management software for Nigeria must handle rent often paid a year or six months in advance: one large charge per period, service charges kept apart from rent, agents and caretakers who touch money, a numbered receipt for every naira, and Paystack or Flutterwave for cards, transfers and USSD. RAITHub's PropDesk platform, with 1,024 tests, supplies the lease patterns.
This guide is for landlords, estate managers and PropTech founders in Lagos, Abuja, Port Harcourt and across Africa who have outgrown a spreadsheet and a WhatsApp group. Be clear on what is proven: RAITHub has not shipped a Paystack or Flutterwave integration. PropDesk collects rent through Stripe, with leases, 4 roles and 5 scheduled jobs; TheSkinProof, the founder's own marketplace venture, runs bKash, Nagad and SSLCommerz. Everything below about Nigerian rent is engineering guidance adapted from that work. Where tenancy law comes up, it is general information: confirm the current rule with your adviser.
What does property management software need to do differently in Nigeria?
It has to treat rent as a large, infrequent payment and keep many small, separate charges around it. Most off-the-shelf tools assume monthly rent collected by card or bank debit. Nigerian lettings commonly work on a yearly or half-yearly cycle, with the first payment made before the keys are handed over, and with more people between the landlord and the tenant.
| Concern | Typical monthly-rent software | What a Nigerian portfolio usually needs |
|---|---|---|
| Rent cycle | Monthly, auto-charged | Annual or biannual, sometimes quarterly or monthly for some units, set per lease |
| Size of a payment | One month's rent | Six or twelve months at once, often millions of naira |
| Other charges | Late fees | Service charge, caution deposit (often called a caution fee), and any agency or legal fees your market charges at the start of a let |
| Who touches the money | Landlord and tenant | Landlord, estate manager, letting agent and on-site caretaker |
| How money arrives | Card or bank debit through one provider | Bank transfer, card, USSD, and sometimes cash handed to a caretaker |
| Proof of payment | An emailed invoice | A numbered receipt the tenant can show in a dispute |
| Currency | Often USD or GBP | NGN, stored in kobo |
A note on the "often paid a year in advance" claim: it is widely described as the norm in Lagos and Abuja, but we could not find an official national statistic to cite. Treat it as a design assumption, and check it against your own tenants before you hard-code it. That is why the rent period below is a setting on each lease, not a constant in the code.
Should a Nigerian landlord buy property management software or build it?
Buy if your portfolio is small and your leases look like everyone else's. Build when your operating model, your payment rails or your agent network is what makes you different, or when the software itself is your product. The general trade-offs are covered in the property management software guide for small landlords; this table adds the Nigerian angle.
| Your situation | Usually the better fit | Why |
|---|---|---|
| A few units, yearly rent, one agent | A spreadsheet plus a receipt book, or a local tool | Custom software is overhead at this size |
| An estate with a service charge and a caretaker on site | Buy if a tool models both; otherwise build a focused first release | Service charges and cash handed to caretakers are where generic tools fall short |
| Several estates, several agents, tenants paying by transfer | Build, or buy and integrate carefully | Matching transfers to tenants by hand stops scaling |
| You are launching a rent-financing or PropTech product | Build | The software is the product, and the money flow is your business model |
If you do build, the property management software development guide covers the core modules. The rest of this post covers what changes for Nigeria.
How should software model annual and biannual rent?
Make the rent period a property of each lease, store money as integers in kobo, and generate one charge per period with a due date and a "paid through" date. An annual payment is one transaction but twelve months of occupancy, so the ledger has to know both.
// rent/schedule.ts: a minimal sketch written for this post.
export type RentPeriod = 'annual' | 'biannual' | 'quarterly' | 'monthly'
const MONTHS: Record<RentPeriod, number> = { annual: 12, biannual: 6, quarterly: 3, monthly: 1 }
export interface RentCharge { dueDate: string; paidThrough: string; amountKobo: number }
/** Annual rent of NGN 3,500,000 is 350,000,000 kobo. Always integers. */
export function rentSchedule(
startISO: string, termMonths: number, annualRentKobo: number, period: RentPeriod,
): RentCharge[] {
if (!Number.isSafeInteger(annualRentKobo) || annualRentKobo <= 0) throw new Error('rent must be positive kobo')
const step = MONTHS[period]
if (termMonths % step !== 0) throw new Error('term must be a whole number of periods')
const count = termMonths / step
const total = Math.round((annualRentKobo * termMonths) / 12)
const each = Math.floor(total / count)
const start = new Date(startISO + 'T00:00:00Z')
// Same day of month as the start, clamped to short months (31 Jan -> 28/29 Feb).
const addMonths = (months: number) => {
const y = start.getUTCFullYear()
const m = start.getUTCMonth() + months
const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate()
return new Date(Date.UTC(y, m, Math.min(start.getUTCDate(), lastDay)))
}
const day = (d: Date) => d.toISOString().slice(0, 10)
return Array.from({ length: count }, (_, i) => {
const due = addMonths(i * step)
const through = new Date(addMonths((i + 1) * step).getTime() - 86_400_000) // day before next period
// Any leftover kobo from the division goes on the first charge, so the total is exact.
return { dueDate: day(due), paidThrough: day(through), amountKobo: i === 0 ? total - each * (count - 1) : each }
})
}
A worked example: a two-year lease on a flat at NGN 3,500,000 a year, starting 1 March.
| Rent period | Charges | Each charge | First "paid through" date |
|---|---|---|---|
| Annual | 2 | NGN 3,500,000 (350,000,000 kobo) | The last day of February the next year |
| Biannual | 4 | NGN 1,750,000 (175,000,000 kobo) | 31 August |
| Quarterly | 8 | NGN 875,000 (87,500,000 kobo) | 31 May |
Four rules make this hold up in production:
- Arrears are measured against "paid through", not the calendar month. A tenant who paid in March for the year is not in arrears in October, whatever the monthly report says.
- Part-payments are normal. Tenants often pay a large rent in two or three transfers. Allocate each payment to the oldest open charge, and keep the charge open until it is fully covered.
- Renewal reminders start early. With yearly rent, the renewal is the one moment the landlord gets paid. PropDesk runs rent reminders and lease expiry alerts as scheduled jobs; for a yearly cycle, set the reminders months ahead, not days.
- Rent changes apply at renewal. PropDesk supports scheduled rent increases; with annual rent, the new figure normally takes effect on the next period's charge, never halfway through a paid year.
How much rent a landlord may ask for in advance, and what notice applies, depends on the state. Lagos State's Tenancy Law 2011 is published by the Lagos State Ministry of Justice; read the current text with your adviser before you hard-code any limit on advance rent, notice periods or receipts. This is general information, not legal advice.
How should service charges be billed separately from rent?
As their own charge type, on their own schedule, with their own ledger. A service charge pays for what the estate provides in common, such as security, cleaning, waste collection or shared power. It is not rent, it often changes every year, and tenants are entitled to ask what it was spent on.
| Line type | Typical cycle | Who it belongs to | Design rule |
|---|---|---|---|
| Rent | Per lease: annual, biannual, quarterly or monthly | Landlord | Generated from the lease; never edited by hand |
| Service charge | Usually annual, sometimes quarterly | The estate's service charge account | Budgeted per estate, apportioned per unit, reported against actual spend |
| Caution deposit | Once, at the start | Held for the tenant | A liability, not income: record it, hold it, and release or apply it at move-out |
| Agency or legal fee | Once, at the start | The agent or lawyer, if your market charges one | A separate line with its own payee, never merged into rent |
| Utility recharge | Monthly or on meter reading | The estate or landlord | Only if your agreements allow it; keep the reading on the record |
Apportion the service charge the same way every year, by an agreed rule such as equal shares, floor area or unit type, calculate it in kobo, and give any leftover kobo to units in a fixed order so the shares always add up to the budget. The largest-remainder method is the simple way to do that. Mixing service charge into rent is the most common reason a landlord cannot answer "what did my service charge pay for?"
Which roles do landlords, agents and caretakers need?
Separate ones, each with its own view and permissions checked on the server. PropDesk has 4 roles, each with its own portal from one codebase: landlord, tenant, contractor and admin. A Nigerian estate usually adds at least two more: the letting agent and the on-site caretaker. The mapping below is guidance; PropDesk itself was not built for Nigerian estates.
| Role | Sees and does | Must never do |
|---|---|---|
| Landlord or owner | Their properties, leases, income, arrears, service charge reports | See another landlord's estates on the same platform |
| Estate manager | Leases, charges, receipts, approvals for cash and adjustments | Delete a receipt or a payment; corrections are reversals |
| Letting agent | Vacant units, prospects, their own lets, their fee status | Mark rent as paid, or see tenants they did not place |
| Caretaker | Maintenance jobs, visitor notes, a "cash received" form | Edit the ledger; a cash entry stays pending until the manager confirms it |
| Tenant | Own lease, charges, receipts, payment links, maintenance requests | See other tenants' rent or documents |
| Contractor | Assigned jobs and access notes | See anything about money |
| Admin | Users, settings, audit trail | Act without the action being logged |
The caretaker row matters most. Cash handed to someone on site is where money goes missing, so the software should record it the moment it is received, with the amount, the tenant and ideally a photo, and keep it unconfirmed until the estate manager has banked it. The tenant portal features guide covers what tenants use day to day, and the maintenance request system guide covers the caretaker and contractor side.
How should rent receipts work so they hold up in a dispute?
One receipt per confirmed payment, numbered in sequence per estate, never edited and never deleted. If a payment was recorded wrongly, issue a reversal that references the original, and a new receipt for the right amount. That gives the tenant a document they can rely on and gives you an audit trail.
-- One counter per estate, incremented inside the same transaction that
-- confirms the payment, so receipt numbers have no gaps and no duplicates.
CREATE TABLE receipt_counter (
estate_id uuid PRIMARY KEY REFERENCES estate(id),
next_no integer NOT NULL DEFAULT 1
);
CREATE TABLE receipt (
id uuid PRIMARY KEY,
estate_id uuid NOT NULL REFERENCES estate(id),
receipt_no integer NOT NULL,
payment_id uuid NOT NULL UNIQUE REFERENCES payment(id), -- one receipt per payment
amount_kobo bigint NOT NULL CHECK (amount_kobo <> 0), -- negative for a reversal
reverses_id uuid REFERENCES receipt(id),
issued_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (estate_id, receipt_no)
);
-- Inside the payment-confirmation transaction:
UPDATE receipt_counter SET next_no = next_no + 1
WHERE estate_id = $1
RETURNING next_no - 1 AS receipt_no;
Show on every receipt the tenant, the unit, what the payment covered (for example "rent, 1 March to 28 February"), the amount in naira, the method, the provider reference and the receipt number. Send it by email and SMS link the moment the payment is confirmed. Whether a receipt must carry specific details under your state's law is a question for your adviser.
Which payment rails should a Nigerian rent platform support?
Scope them one at a time, starting with how your tenants actually pay. A multi-million-naira yearly rent is more likely to arrive by bank transfer than by card, so design for transfers first and treat card and USSD as conveniences.
| Rail | What the provider documents | Scope note |
|---|---|---|
| Paystack | Payment channels on its initialise-transaction API include card, bank, bank transfer, USSD and QR; amounts are in the smallest denomination of the currency, so kobo for NGN (Paystack OpenAPI specification). Paystack also documents dedicated virtual accounts (Paystack doc snippets). | A dedicated account number per tenant lets transfers match to the right lease automatically; check eligibility with Paystack |
| Flutterwave | Nigerian payment methods listed as card, USSD, bank transfer, account, internet banking, NQR, eNaira and OPay (Flutterwave: payment methods). Its hosted checkout takes amounts in naira, not kobo. | Convert at the adapter, never in business logic |
| Direct transfer to the landlord's account | No provider; the tenant sends from their bank app | Needs a matching step: the manager ties a bank statement line to a charge |
| Cash to a caretaker | No provider | Recorded as pending; confirmed only when banked |
Put every rail behind one payment interface, so a lease does not care whether rent came by Paystack, Flutterwave or a hand-matched transfer. That is the pattern TheSkinProof uses for bKash, Nagad, SSLCommerz and cash on delivery, described in the bKash and SSLCommerz integration guide. The Stripe version for rent is in the online rent collection guide.
Fees matter at these sizes. Flutterwave publishes 2% per local Nigerian transaction, 4.8% for international cards, and 7.5% VAT on fees (Flutterwave Nigeria pricing, checked 30 September 2026). Paystack publishes its rates at paystack.com/pricing, which refused our automated check on the same day, so we do not quote a figure here. Check both, including any caps, against a real annual rent before you choose.
How do you confirm a rent payment safely?
On your server, by asking the provider, never by trusting the browser redirect. Both providers say so: Flutterwave's docs tell you to "always verify the final state of the transaction" on your server (Flutterwave Standard), and Paystack exposes a verify endpoint by reference, GET /transaction/verify/:reference.
- Create the charge first in your database, with a unique reference, the amount in kobo and the lease it belongs to.
- Send the tenant to the provider's checkout with that reference.
- On the webhook, check the signature: Paystack signs the raw body with HMAC SHA512 using your secret key, in the
x-paystack-signatureheader; Flutterwave sends the secret hash you set in averif-hashheader (Flutterwave: webhooks). - Verify with the provider's API, and check status, amount, currency and reference against your charge.
- Mark it paid once, in one transaction that also allocates the payment and issues the receipt, so a duplicate webhook changes nothing.
The failure cases worth testing before launch, such as duplicate webhooks, a transfer that arrives short, and a payment for a lease that was cancelled, are in testing payments and webhooks end to end. If landlords are paid out from money you collect, that is a split-payment or marketplace flow; split payments and escrow covers the ledger side, and holding other people's money may need licensing advice first.
What does Nigeria's data protection law mean for tenant data?
Tenant records are personal data: names, phone numbers, IDs, employer letters and payment history. The Nigeria Data Protection Commission was established under the Nigeria Data Protection Act 2023 and enforces it (NDPC). What the Act requires of your business, including registration and transfers of data outside Nigeria, is a question for your adviser. On the engineering side, collect only the documents you need, restrict them by role, log who viewed them, and delete them on a schedule. RAITHub signs DPAs and follows your controls; it does not give legal advice.
What does custom property management software cost for a Nigerian portfolio?
A focused first release, one audience and one money flow, typically takes 4 to 6 weeks at fixed scope with RAITHub. A platform with leases, annual rent, service charges, agent and caretaker roles and two payment providers is several releases. The MVP cost estimator gives a first range for your feature list, and the free 15-minute technical audit turns it into a fixed written quote. Deliver it as a responsive web app or a PWA (a web app tenants can add to their home screen), which reaches every phone without app-store releases.
How do working hours line up between Lagos and Dhaka?
Lagos is UTC+1 and Dhaka UTC+6, with no daylight saving in either, so Dhaka is 5 hours ahead. That gives about 4 shared working hours: a Lagos morning from 09:00 is Dhaka's afternoon from 14:00. The working week is agreed per client, and everything outside the overlap runs on written daily handoffs.
Why RAITHub for this
- The lease and rent engine is built and tested. PropDesk has Stripe rent collection, leases, 4 role-based portals, 5 daily jobs (rent reminders, late fees, lease expiry alerts, maintenance auto-closure and scheduled rent increases) and 1,024 automated tests (PropDesk case study). Annual periods, service charges and new roles extend those patterns.
- Multi-rail checkouts have shipped. TheSkinProof, the founder's own venture, runs bKash, Nagad, SSLCommerz and cash on delivery behind one interface, with 750+ tests. Mobile-money and local-gateway markets are familiar ground.
- Honest scope. Paystack and Flutterwave have not been shipped by RAITHub, so they are quoted as new work, built against each provider's test mode with the failure cases above.
- Clear terms. Fixed scope or a dedicated monthly team, you own the IP, and an NDA is standard. See SaaS development for what a build includes, and the real estate industry page for the wider PropTech work.
When you don't need us
- You have a handful of units and one agent. A spreadsheet, a receipt book and your bank app will do.
- A local tool already models your rent cycle and service charge. Buy it and spend the budget on filling units.
- You need a native iOS or Android app. RAITHub builds web apps and PWAs only.
- You need tenancy, tax or licensing advice. That is a job for a Nigerian adviser; RAITHub builds the rules they give you into software.
- You need a team that has already shipped Paystack or Flutterwave in production and can show it.
If you already have a property app that breaks under real tenants, start with a fix rather than a rebuild.
Sources checked on 30 September 2026. Tenancy, tax and data protection points are general information only; confirm the current rule with your adviser.
If yearly rent, service charges or cash collected on site are what your current setup gets wrong, book the free 15-minute technical audit. Bring one lease, one service charge budget and a month of payments.
Frequently asked questions
What should property management software for Nigeria include?
Leases with a configurable rent period (annual, biannual, quarterly or monthly), rent and service charges as separate ledgers, caution deposits held as liabilities, roles for landlords, estate managers, agents, caretakers and tenants, numbered receipts, and payment through Paystack, Flutterwave, bank transfer and recorded cash.
How do you handle rent paid a year in advance in software?
Generate one charge per rent period from the lease, store the amount in kobo, and record a "paid through" date. Measure arrears against that date rather than the calendar month, allow part-payments against the open charge, and start renewal reminders months before the period ends.
Can Paystack or Flutterwave be used for rent collection in Nigeria?
Both list card, bank transfer and USSD among their payment channels, according to their documentation. Paystack takes amounts in kobo and signs webhooks with HMAC SHA512; Flutterwave's hosted checkout takes naira and sends a secret hash header. Either way, verify every payment with the provider's API before marking rent paid.
Should service charges be billed with rent?
No. Keep the service charge as its own charge type with its own budget, apportionment rule and ledger. Tenants can then see what they paid for, and landlords can report service charge spend separately from rental income.
How do you stop cash payments to caretakers going missing?
Record cash the moment it is received, with amount, tenant and a photo, as a pending entry the caretaker cannot edit. The estate manager confirms it only when it is banked, and only then does the system issue a receipt.
Has RAITHub built property management software with Paystack or Flutterwave?
No. RAITHub has not shipped either provider. It built PropDesk, a property management platform with Stripe rent collection, leases, 4 roles, 5 scheduled jobs and 1,024 tests. Annual rent periods, service charges, agent and caretaker roles, and Paystack or Flutterwave would be new work built on those patterns.
Related posts
Ready to discuss your project?
Book a free 15-minute technical audit with our engineering team.