To build a school fees payment system in Nigeria, use Paystack or Flutterwave to accept bank transfers, card payments, and USSD. The key differences from standard e-commerce checkout: you need student-invoice mapping (linking each payment to a specific student and fee type), partial payment support (parents often pay in installments), automated receipt generation (schools need official receipts for records), and multi-channel access including USSD for parents who do not use smartphones. Bank transfers are the most popular method for school fee payments because the amounts are large enough that parents prefer the lower friction of transfers over card OTP flows.
Nigeria has over 100,000 primary and secondary schools and several hundred universities and polytechnics. The vast majority of these institutions still collect school fees through manual bank deposits. A parent gets a fee schedule on paper, walks to the bank, fills out a deposit slip, makes the payment, gets a stamped teller, brings the teller back to the school, and the school manually reconciles the teller against their records.
This process is slow, error-prone, and frustrating for everyone involved. Schools spend hours matching bank tellers to student records. Parents stand in bank queues. Reconciliation errors lead to disputes. Some payments get lost in the process.
Digital payment platforms solve this by creating a direct link between the student's invoice and the payment. The parent pays online (via bank transfer, card, or USSD), the system automatically matches the payment to the student, updates the balance, generates a receipt, and notifies the school's admin. No manual reconciliation needed.
Several Nigerian companies have built school payment platforms (Flutterwave for Business offers education-specific features, and there are standalone platforms like SchoolPay and others). But there is still significant room, especially for solutions tailored to specific school types: private primary schools, secondary schools, universities, or vocational training centers. Building a school fees payment system is also a strong portfolio project because it demonstrates real-world payment integration, database design, and multi-user access control.
The core data model for a school fees system has four main entities: students, invoices, payments, and schools (if you are building a multi-tenant platform serving multiple schools).
Students table: Each student record includes a unique student ID, full name, class/level, parent or guardian contact information (phone number and email), and the school they belong to. The parent phone number is critical because it serves as the primary lookup key for payments, especially via USSD.
Invoices table: Each invoice belongs to a student and represents a specific fee: tuition, development levy, sports fee, exam fee, or any other charge. Key fields include the invoice ID, student ID (foreign key), fee type, total amount, amount paid so far, balance remaining, academic session, term, status (unpaid, partial, paid), and due date.
Payments table: Each payment links to an invoice and records: the payment amount, the payment method (card, bank transfer, USSD), the gateway transaction reference (Paystack or Flutterwave reference), the timestamp, and the status (pending, confirmed, failed). A single invoice can have multiple payments (installments), so this is a one-to-many relationship.
Key design decisions:
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
Partial payment support is not optional for Nigerian school fee systems. Many parents cannot pay the full fee at once and make payments in two or three installments. Some schools formally support installment plans. Others tolerate it informally. Either way, your system must handle it.
How partial payments work in practice:
Technical implementation:
School-side controls: Some schools allow registration or exam access only when a certain percentage of fees is paid (e.g., 60% before starting classes, 100% before exams). Your admin dashboard should let the school set these thresholds, and the system should enforce them by flagging students who have not met the minimum payment for each milestone.
The payment integration follows the same Paystack or Flutterwave patterns used in e-commerce, with a few adjustments specific to school fees.
Transaction metadata: When initializing a payment, include the student ID, invoice ID, and fee type in the metadata field. Both Paystack and Flutterwave support custom metadata on transactions. This metadata comes back in the webhook payload, making it easy to match the payment to the correct student and invoice without a separate lookup.
Preferred payment methods: For school fee payments, bank transfers are overwhelmingly preferred because: (a) the amounts are larger than typical e-commerce purchases, making the 1.5% + NGN 100 card fee significant, (b) parents trust bank transfers more for large amounts, and (c) many parents pay from a joint account or have someone else pay on their behalf, which is easier with transfers than with a specific card.
USSD access: To reach parents who do not use smartphones, implement a USSD-based fee lookup and payment initiation. The parent dials a short code, enters the student ID or phone number, sees the outstanding balance, and can initiate a payment. Paystack supports USSD as a payment channel. The flow is: your system generates a payment reference, presents the USSD instructions to the user, and waits for the webhook confirmation.
Reconciliation: Schools need daily or weekly reconciliation reports: total fees collected, payments by method (bank transfer vs card vs USSD), outstanding balances by class, and individual student payment histories. Build these reports into the school admin dashboard. Export to CSV or PDF for school administrators who use spreadsheets.
Receipt generation: After each confirmed payment, generate a receipt with a unique receipt number, the school's name, student name, class, fee type, amount paid, remaining balance, and date. PDF generation (using a library like html-pdf, PDFKit, or jsPDF) allows parents to download and print receipts. Some schools also require that receipts be sent via SMS or WhatsApp to the parent's phone number.
If you are building this as a product (not a custom solution for a single school), you will need a multi-tenant architecture where each school operates independently within the same platform.
Database design: Add a school_id foreign key to students, invoices, and payment tables. Every query should scope to the current school to prevent data leakage between institutions. Use Row-Level Security (RLS) if your database supports it (PostgreSQL does) to enforce this at the database level, not just in application code.
Admin access: Each school has its own admin users who can: create student records, generate invoices, view payments, run reports, and configure fee structures. A super-admin role manages the platform itself (onboarding schools, managing system settings, viewing aggregate data).
Payment gateway configuration: You have two options for handling payments across multiple schools. First, use a single Paystack or Flutterwave account (yours) and handle school-by-school settlement internally. This is simpler to implement but means you are responsible for disbursing funds to each school. Second, use Paystack Split Payments or Flutterwave Sub-accounts, where each school has their own payment sub-account and funds are automatically split at the transaction level. This is more complex to set up but removes you from the money flow, which reduces regulatory and trust concerns.
Pricing model: Most school payment platforms charge a per-transaction fee (on top of the gateway fee) or a monthly SaaS subscription per school. The per-transaction model is easier to sell because the school pays nothing upfront, but it means your revenue scales with transaction volume, which is seasonal (fees are concentrated at the start of each term).
A school fees payment system is a substantial full-stack project. It requires frontend development (parent portal, school admin dashboard), backend development (API, payment integration, webhook handling), database design (students, invoices, payments, multi-tenant scoping), and deployment (HTTPS, environment management, monitoring).
If you are looking to build these skills, McTaba Academy offers structured courses that cover the complete stack.
Start with fundamentals: Tech Foundations (NGN 3,500 to 6,000; exchange rates fluctuate, check current price at checkout) covers what you need to know before writing code.
Full-stack and payment integration: Full-Stack Software & AI Engineering (NGN 140,000 to 220,000; exchange rates fluctuate, check current price at checkout) covers frontend (React), backend (Node.js), databases (PostgreSQL), payment gateway integration (Paystack, Flutterwave), and API design. A school fees system would be an excellent capstone project using these skills.
Deployment: Deployment: Going Live (NGN 6,000 to 10,000; exchange rates fluctuate, check current price at checkout) covers getting your application into production with HTTPS, environment variable management, and server configuration.
Or create a free McTaba Academy account and explore the available courses. A working school fees payment system is exactly the kind of portfolio project that Nigerian employers and school administrators notice.
Create a free McTaba Academy account. Access starter lessons, join the community, and explore at your own pace.
Create Free Account