Skip to content
Back to work

Alumni association, Ghana · 2026

Live in production

GroupFund

Double-entry finance platform for an alumni association

  • Next.js 15
  • TypeScript
  • tRPC
  • Prisma
  • Neon Postgres
  • Clerk
  • Hubtel
  • Tailwind CSS
  • Zod
  • Recharts
  • Resend
  • Sentry
  • Vitest
  • Vercel
GroupFund cover

Overview

What this is

A finance platform for an alumni association that collects dues, runs merchandise and event ventures, and answers to its members for every cedi. Payments arrive by bank transfer, mobile money and online checkout through Hubtel; the committee records and verifies them, and the system posts each one into a real double-entry general ledger. Treasurers get a trial balance, balance sheet and income statement that agree, instead of a spreadsheet nobody can reconcile.

The problem

What needed solving

  • Money arrived through four separate channels and was tracked in spreadsheets that never agreed with the bank statement.
  • The group collects money it does not own — merchandise paid for in advance, funds raised to pass on to another year group — and counting that as income overstated what the association actually had.
  • Committee roles change every year, so access had to be narrow and auditable rather than one shared login.
  • Members wanted to see where their contributions went without the committee hand-building reports.

The solution

What I built

  • Every payment posts a matching journal entry, so the cash view and the accounting view can never drift apart.
  • Money held on behalf of someone else posts to a liability account instead of income, and only becomes revenue when the obligation is discharged.
  • Nine committee roles with least-privilege access, segregation of duties on every payment, and an audit log on sensitive actions.
  • Reports generated from the ledger itself: trial balance, balance sheet, income statement, debtors and creditors ageing, budget versus actual.

Features

Key features

Double-entry general ledger

21 accounts across assets, liabilities, equity, income and expenses. Every payment, charge and payout posts a balanced journal entry.

Payment drives

Seven kinds of collection — dues, pledges, merchandise, donations, event fees — each with its own target, deadline and posting rules.

Three-step payment approval

Recorded, verified, then acknowledged by three different people. The same person cannot do two of the three.

Bank reconciliation

Payment alerts are parsed from bank emails into a queue, matched to a member and drive, or dismissed with a reason.

Funds held in trust

Money collected to pass on is held as a liability per venture, so the dashboard separates what the group owns from what it holds.

Member ledger and standings

What each member has given and still owes, plus house and class leaderboards generated from the same figures as the reports.

Investor ventures

Members can back a venture; capital and profit share are tracked separately and settled in cash or offset against what they owe.

Reports and exports

Trial balance, balance sheet, income statement, ageing and cash-flow forecast, exportable to CSV, Excel and PDF.

Announcements

Email and SMS to filtered member groups, with personal payment links generated per recipient.

Screens

Treasurer dashboard: cash position, drives and the payments register (sample figures)
Treasurer dashboard: cash position, drives and the payments register (sample figures)
Trial balance in agreement, and funds held for others kept off income (sample figures)
Trial balance in agreement, and funds held for others kept off income (sample figures)
Design system: one token source drives every screen
Design system: one token source drives every screen
Member registration, reviewed by the committee before approval
Member registration, reviewed by the committee before approval
Registration on a phone
Registration on a phone