Get in touch

Case study · SchoolCost NG

SchoolCost

What university really costs in Nigeria, by course and level, with the source shown for every number.

Role
Designer and builder
Team
Solo, with AI agents
Scope
Product, data, web
Year
2026
243Visitors since launchSource: PostHog, Jul to Oct 2026
2,586Fees, each with its sourceSource: SchoolCost database
₦270,100Missing from a 400L fee, caught and fixed before launchSource: School's official fee PDF
In short
The spark
My younger cousin was heading into SS3, her last year of secondary school. I wanted to find good universities she could go to and put a cost on each one. Most of those costs weren't anywhere I could find.
The problem
Fees are scattered across PDFs, portals and news posts. Blogs copy each other and disagree. The headline fee leaves out acceptance, departmental and hostel charges, and the amount changes every year of the course.
What I did
I made four decisions: show each fee's source, price by course and level, compare schools on the same terms, and let students send corrections with evidence.
My part
All of it. I designed it in Figma, then built it end to end with Claude Code, Cursor and Codex in about two weeks, in July 2026.
The result
Live at schoolcost.ng since the end of July, with 2,586 published fee records. Since then, 243 people have visited and opened 164 school pages and 112 fee breakdowns.
Chapter 01The spark

My cousin's university search started it.

My younger cousin was heading into SS3, her final year of secondary school. I sat down to find good Nigerian universities she could go to and to put a figure on each one. A lot of the costs, and almost all of the breakdowns, weren't anywhere I could find. When I later went school by school, I saw why: old PDFs, portals that wanted a student login, and blogs that each quoted a different amount.

Around then, I finished Dára Sobaloju's Ship With AI cohort. Afolabi Sokeye's Salary Index gave me a starting point: one public table anyone could check. I began building the table I couldn't find and posted about it on LinkedIn two days later.

The question I kept hearing. Under that first post, Faari Joye asked: "how'd you get the data on each school? Is there an API you used?" There isn't one. That question shaped the whole product.

Chapter 02The problem

The fee isn't the cost, and nobody agrees on the fee.

A family choosing a university usually compares one number per school: the tuition. The real cost is spread across acceptance fees, departmental and ICT charges, medical fees and the hostel, some paid once and some every year. And the amount for a first-year student isn't the amount for a final-year one.

Finding even the tuition is hard. Some schools publish an itemised PDF on their own site. Others hide it behind a student portal, mention it in a news post, or don't publish it at all. The gap gets filled by blogs, which copy each other and rarely say where a number came from.

  1. P1Fees are scatteredPDFs, portals, news posts, and blogs that disagree with each other.Solved in Decision 01
  2. P2The fee isn't the costAcceptance, departmental and hostel charges are left out of the headline.Solved in Decision 02
  3. P3One number for every yearFees change by level, and fresh students pay one-time charges.Solved in Decision 02
  4. P4No fair comparisonTwo schools' numbers are rarely for the same course, level and session.Solved in Decision 03
  5. P5Fees go out of dateStudents see a new fee schedule long before anyone updates a website.Solved in Decision 04

Each decision below names the problems it solves.

Chapter 03Where fees come from

Every number says where it came from.

Decision 01P1Fees are scatteredThe problemPDFs, portals, news posts, and blogs that disagree with each other.

Trust before coverage.

Every fee record carries its source, its session, a verification status, how confident we are, and the date it was last reviewed. A fee from a school's own fee schedule is "Official". A fee from a blog can be shown, but it never looks verified and never wins a "lowest cost" label.

Instead of
Copying the blogs. It would have filled every school in a week, with numbers nobody could check.
Trade-off
Fewer prices. 149 schools are listed, but only 31 have fees checked well enough to compare on price.
Proof
1,878 officially verified records and 428 confirmed by students, backed by 3,012 pieces of evidence. 280 more are shown but marked reported or outdated.

To decide where to look, I sorted every school's sources into four tiers, and only the first counts as official.

  1. ACounts as official
    Publish nowThe school's own site, public, current and itemised. Bayero University Kano lists 145 programmes this way.Trust
  2. B
    Official but weakThe school's own site, but an old session, one faculty only, or band totals.Trust
  3. C
    Behind a loginFees exist only inside a student portal or a query form.Trust
  4. D
    Blogs onlyAggregator sites that copy each other. Never published as verified.Trust

From the fee source audit. Along the way I found a "latest" fee PDF that was older than the other one, and a school site serving casino spam, so neither was used.

The same record's verification: officially verified, medium confidence, last reviewed 30 July 2026, the school's own notice as evidence, and a reviewer note.
One record, two viewsThe same record's verification: officially verified, medium confidence, last reviewed 30 July 2026, the school's own notice as evidence, and a reviewer note.
Chapter 04Cost by level

A fee belongs to a course, a level and a student.

A family's first step is search. People type the way they talk, so it forgives small typos ("unilg" still finds the University of Lagos) and matches courses and states as well as school names. From there they land on a school, then a course, and that's where the price lives.

Decision 02P2 P3The fee isn't the costThe problemsExtra charges are left out of the headline, and fees change by level and student type.

Price the course and the level, not the school.

You pick a course, a level and an academic session. The page shows every compulsory charge, which ones you pay once and which every year, and keeps hostel and feeding apart so they never hide inside the total. Fresh and returning students see their own amounts.

Instead of
One headline fee per school. It's what most lists show, and it's the number that surprises families after admission.
Trade-off
Much more data. Every school lays out its fee sheet differently, so each one is read and entered course by course.
Proof
A bug I caught before launch. Every level was showing the Year 1 fee. The fix corrected 243 records across 14 schools.

I checked that bug against Augustine University's own 2026/2027 fee schedule. The seed data was right; the page was reading the wrong column. Try it below.

Estimated fees

₦976,650

Religious Studies at Augustine University, 2026/2027.

Fee itemAmount
School's official PDFPer session, 2026/2027 schedule₦976,650
Shown before the fixThe Year 1 fee, at every level₦976,650
Missing from the total₦0

At 400L the page was ₦270,100 short. Figures from the school's 2026/2027 PDF, kept in the repo as evidence.

Chapter 05Compare fairly

Compare the same course, at the same level, in the same session.

Decision 03P4No fair comparisonThe problemTwo schools' numbers are rarely for the same course, level and session.

Choose the course first, then up to three schools.

The comparison starts from a course, so every column is the same thing: Year 1, each year after, hostel, and the whole programme, followed by where each number came from and how sure we are. "Lowest" only goes to a verified fee, and a note under the table says the cheapest isn't always the best fit.

Instead of
A cheapest-schools ranking. It would mix courses and sessions, and reward whichever blog number was lowest.
Trade-off
Fewer courses to compare. A course only appears once at least two schools have fees for it.
Proof
Plain words for first-time users. I redesigned the page on 19 July for people comparing schools for the first time, so every row reads in plain words, like "What you'll pay in Year 1".
Not yet known
How often people compare. Two people opened the compare page. The same table sits on every fee page, but it never sent an event, so I can't say how often it was used. I've added tracking to the table, and it starts counting once it's live.
Computer Science at 100L in three private universities: what you'll pay, the details, and whether you can trust the numbers.
Comparing three schoolsComputer Science at 100L in three private universities: what you'll pay, the details, and whether you can trust the numbers.
Chapter 06Built with students

The people who pay the fees see them first.

Decision 04P5Fees go out of dateThe problemStudents see a new fee schedule long before anyone updates a website.

Let students correct it, with evidence.

Anyone can submit a new fee, report a wrong one or suggest a school, and attach the receipt, notice or PDF that backs it up. Nothing goes live until it's reviewed. "Something look off?" sits on every fee record, scoped to that one course.

Instead of
Open editing. Fast, but one wrong number could cost a family real money.
Trade-off
Slower updates. Every submission waits for a person to check it.
Proof
4 submissions in the first two weeks: three schools to add, and a University of Ibadan fee with a portal invoice attached as proof.

There are two ways in. When a search finds nothing, the page offers "Suggest a school" instead of a dead end, and the fee form has the same link under its school picker. Anyone who knows a fee can share it, with the document that backs it up.

What I like most is what people send. Four people have used the forms so far. Three suggested schools I hadn't listed: University on the Niger, Miva Open University and Kwara State University. The fourth sent the 2025/2026 Computer Science fee for the University of Ibadan's Postgraduate College, and didn't stop at a number. They attached the invoice from the student portal, every charge itemised, adding up to the ₦246,700 they entered. That's the habit the whole product is built on: a number comes with its proof. All four are still waiting for my review. In the screenshots below I've blurred names, emails, invoice numbers and dates.

Submissions have a rate limit, and the database has row-level security. Each record keeps the date it was last reviewed, which is what the page shows next to every fee.

Suggest a school: its name, type, ownership, state and website. A person checks every suggestion before it's added.
No result, then a suggestionSuggest a school: its name, type, ownership, state and website. A person checks every suggestion before it's added.
The invoice they attached from the Postgraduate College portal, itemised charge by charge. Name, invoice number, application number and date are blurred.
A fee, with its proofThe invoice they attached from the Postgraduate College portal, itemised charge by charge. Name, invoice number, application number and date are blurred.
Chapter 07How I directed the build

I designed it in Figma, then directed AI agents to build it in two weeks.

I designed the two screens everything hangs on first: a homepage built around one search box, and a fee breakdown that lists every charge with when it's due and keeps accommodation out of the total. The trust labels you see live, "Official" or "Community" on every fee and a Verification tab on every record, came during the build. I added them with the agents once Faari's question from chapter 1 made it clear: people care where a number came from as much as the number.

Then I built it end to end with Claude Code, Cursor and Codex: Next.js, a Supabase database and PostHog analytics, deployed on Vercel. 105 commits between 16 and 31 July. The agents wrote most of the code. I set the rules they worked to, and they're written in the project's own files:

  1. No deploying without me. Pushing to the main branch puts the site live, so no agent could push unless I said so in that conversation. "Commit" never meant "deploy".
  2. Never weaken the trust rule. The project notes head it "do not weaken this", and one file in the code holds it, so no screen can restate it differently: unchecked or low-confidence fees can be shown, but never look verified or win a comparison.
  3. Sort every source before using it. Tier A is the school's own current, itemised schedule. Tier D is aggregator blogs, which never get published as verified.
  4. Plain copy. No em dashes in any copy or UI text, set as a rule Cursor always applies.

The QA pass that mattered. Just before launch I ran a full check and found two bugs that showed families the wrong money: 720 records across 25 schools were labelled "verified" when they weren't, and every level showed the Year 1 fee, the bug you tried in chapter 4. I also replaced placeholder comparisons with real schools offering the same course. The fee figures had to be right before launch.

Live at schoolcost.ng: the same layout and skyline, with a sharper headline.
The homepage, designed and liveLive at schoolcost.ng: the same layout and skyline, with a sharper headline.
Live: the same structure, filled from the school's own fee schedule.
A fee breakdown, designed and liveLive: the same structure, filled from the school's own fee schedule.
July 202616 days, first build to launch
  1. First build: homepage, search, the skyline
  2. Fee pages on phones, How It Works
  3. Compare redesigned for first-time users
  4. Submissions, admin publishing, school search
  5. Real fees from the database
  6. Search engine set-up, school stats
  7. QA pass, two money bugs fixed
  8. Security, 116 school crests, launch

Two weeks of commits, from the git history.

Chapter 08Results

2,586 fee records, each with its source.

SchoolCost has been live since the end of July 2026. It lists 149 schools, with published fees for 42 of them and fees good enough to compare on price for 31. Every record shows where it came from and when it was last checked.

Usage, 31 July to 20 October 2026. PostHog counted 243 visitors, not including my own test accounts. They opened 164 school pages and 112 fee breakdowns, and 49 of them searched the directory 333 times. Most of that came in launch week and August. 129 of those searches found nothing, like "heritage" in chapter 6, often a course or school I hadn't priced yet. That's the clearest list I have of what to add next. Compare is the gap I described in chapter 5: I can't yet say how often people use it.

Search has started to send people too. On 26 October 2026 Google Search Console told me schoolcost.ng had reached 40 clicks from Google Search in the past 28 days.

People noticed. My three LinkedIn posts about building and launching it drew 274 reactions and 22 comments. People asked where the data comes from, and one asked for schools abroad too.

This will definitely help a lot of freshers avoid scams when trying to pay for their fees

Mujeeb AzeezComment on my LinkedIn launch post
Chapter 09What I'd do differently

What I'd change if I started again.

  1. Talk to five families before building. I built from my cousin's search and the comments under my LinkedIn posts, and never sat with a student or parent. 129 of 333 searches found nothing, things like "federal universities" or a course I hadn't priced. Five conversations in the first week would have shown me what people look for before I chose what to price.
  2. Launch with fewer schools, fully priced. 149 schools are listed, but only 31 can be compared on price, so many visits land on a school without a usable fee. I'd launch with fewer schools, every one priced in full, and add more as the data is checked.
  3. Design the reviewer's side as carefully as the sender's. I put real care into the forms people use to send fees, but not into the routine behind them. Four submissions came in, one with an invoice as proof, and all four are still waiting. Next time I'd decide who reviews, how fast, and how the sender hears back before opening the forms.

Credits

Design, build and data
Egbemode AbayomiFigma, Claude Code, Cursor, Codex
The reason
My cousin, heading into SS3
The spark
Dára SobalojuShip With AI cohort
The inspiration
Afolabi SokeyeSalary Index
Fee updates
The students who sent them

LiveVisit schoolcost.ng (opens in a new tab)