Skip to content
RS-W02WebsitesDec 2025 to Mar 2026Live

Noor Al Quloob

I built one platform that runs a whole charity's operations, from retreat bookings to donations.

Overview

Noor Al Quloob is an Islamic charity, and before this build its whole operation lived in spreadsheets and direct messages: retreat places tracked by hand, donation totals added up manually, service requests arriving in chat threads. Around March 2026 I built nooralquloob.com to take all of that on as one system. Members hold real accounts, every booking and every pound flows through one backend, and the team runs the entire charity from a single admin panel.

What it handles

The retreat system is the centrepiece. Retreats have hard capacity limits and paid tickets at prices like £320, so each booking page shows live remaining places, a counter like "32 left" that has to actually be true. Alongside that sit course and workshop enrolment, an events section, and bookings for religious services including the Nikah service and the Ghusl and Kafan workshop. Donations get their own treatment: the site shows a live fundraising goal with a running total and donor count, driven by the same records the payments write. The public site rounds out with a gallery, FAQ, about and contact pages, and all of it is managed from the admin backend.

The build

It is a Flask 3 application on Python 3.11, server rendered with Jinja2 templates, styled with Tailwind and given its interactive touches with Alpine.js. I kept the front end deliberately light: no SPA framework, no client-side state to keep in sync, just HTML that reflects the database. Supabase supplies the Postgres database along with auth and file storage, so member accounts and uploads are handled by a managed service while the application logic stays entirely mine. Payments go through Stripe Checkout, which keeps card details off my server completely, and Stripe's webhooks report back to the backend when money actually moves. ReportLab generates PDF receipts and tickets server side, and transactional email runs through Flask-Mail and SendGrid.

Keeping the numbers honest

The rule for the whole platform is that anything displayed as a number must be backed by a payment record. A retreat place only counts as taken when Stripe's webhook confirms the charge, not when a browser returns from checkout, because redirects fail and people abandon payment pages. The same applies to donations: the fundraising total and donor count are computed from confirmed payments, so the figure a visitor sees is the figure the charity actually received. The point of the build was letting the charity stop keeping parallel spreadsheets, and that only works if the site's numbers are never wrong.

How it runs

The app is served by Gunicorn behind an Nginx reverse proxy with Cloudflare in front, and it was deployed to an IONOS VPS. It shares an architecture family with Al-Baqi Academy, another platform I built: both are full-auth, account-based systems with a custom management backend, not brochure sites. Noor Al Quloob is live at nooralquloob.com.

The hardest problem

Retreat capacity against real money was the hardest part. A retreat has a fixed number of places and a ticket can cost £320, so two failure modes are unacceptable: selling the same place twice because two people booked in the same moment, and losing a place to a payment that never completed. Stripe Checkout splits the booking flow across two systems and a redirect, and the browser coming back cannot be trusted as proof of payment. So I built the flow around Stripe's webhooks: the backend treats the webhook event as the confirmation that money actually moved, and the remaining-places count on the booking page is read from the same records those confirmations write. Donations follow the same rule, which is how the fundraising total and donor count on the site stay matched to what was really paid rather than what was merely attempted.

Start a project

Want something built like this?

Everything on this page was designed, built and hosted by one person. Tell me what you need and I reply with scope, cost and timeline, usually within two working days.

Noor Al Quloob · Raafay Siddiqui Projects