Client Project
Hereafter Ghana: Nonprofit Website, Donations & Admin CMS
Public website and admin CMS for a Ghanaian nonprofit: online and recurring donations, a Zakat calculator, blog, newsletters, careers, and a no-code back office.
Overview
The public face of a Ghanaian nonprofit and the CMS that runs it, built end to end as a Next.js 16 frontend and an Express API over PostgreSQL. Supporters read programs and reports, follow the blog, apply for jobs or volunteering, subscribe to a newsletter, calculate their Zakat, and donate. Staff manage every piece of content from a 75-screen dashboard without touching code.
The Problem
The organisation needed far more than a brochure site: online and recurring mobile-money giving, newsletters to thousands of subscribers, stories and reports published weekly, job and volunteer applications, and a trustworthy Zakat calculator for Muslim supporters. All of it had to be run by a small non-technical team. Off-the-shelf tools could not tie those pieces together, and hand-editing the site for every update was not sustainable.
The Solution
- 39 data models and 234 REST endpoints behind a role-based dashboard where staff manage posts, programs, reports, gallery, team, newsletters, jobs, and volunteers. - Server-rendered public pages with on-demand revalidation, so content is live the moment it is published. - Newsletter delivery on a pg-boss background worker with per-recipient logging, bounce detection, suppression lists, double opt-in, and one-click unsubscribe. - Zakat Nisab recomputed weekly from the live silver price. - Donations delegated to the Donor Management System, with mobile-money channels detected at checkout. - Public forms hardened with rate limiting, Cloudflare Turnstile, profanity filtering, and honeypots.
Outcome
The nonprofit runs its entire online presence in-house with no developer in the loop. Supporters give once or set up recurring mobile-money donations and calculate Zakat against a current Nisab. Bulk email runs off the request path, keeping the site fast under load. The backend ships with about 220 integration tests against a real PostgreSQL database, gated by CI on every push.