Project · Fullstack developer

Nonprofit Fundraising Platform

Multi-tenant SaaS platform for universities and nonprofits to run fundraising campaigns with real-time donation tracking, ambassador programs, customisable branding, and enterprise-grade scalability on Kubernetes.

🔒 Private / client work — the live site and code are under NDA. Happy to walk through the architecture and my role on a call.

Nonprofit Fundraising Platform
Tech stack
PythonDjangoWagtailFastAPIRustSSEMySQLRedisCeleryDockerKubernetesHelmTailwind CSSPlaywrightDjango REST Framework

Project Overview

A full-featured fundraising platform that enables organisations to launch and manage fundraising campaigns. The system supports multi-tenant isolation with per-organisation databases, real-time donation feeds via Server-Sent Events, ambassador fundraising pages, configurable challenges, and white-label branding — all managed through a Wagtail CMS admin.

Key Features

  • Multi-tenant architecture with shared main DB and per-org donation databases
  • Real-time donation feed powered by SSE microservices (FastAPI and Rust/Axum) with Redis pub/sub
  • Ambassador program — personal fundraising pages with individual goals and leaderboards
  • Campaign thermometers, time-limited challenges, and cause designations
  • White-label branding per organisation (logos, colours, fonts, custom domains)
  • SSO authentication via OIDC (Google, Azure AD, Okta)
  • Celery background tasks for stats aggregation and cache warming
  • Bot detection and rate limiting on SSE connections
  • Distributed tracing with OpenTelemetry and Jaeger
  • End-to-end test suite with Playwright

Architecture

Multi-service stack: Django/Gunicorn for the web tier, FastAPI/Hypercorn and Rust/Axum for async SSE streaming over HTTP/2, Celery workers for background processing, MySQL for multi-tenant storage, and Redis for caching and pub/sub. Media served from Azure Blob Storage behind a CDN. Deployed to Kubernetes via Helm with auto-scaling, pod disruption budgets, and health probes. Performance-tuned from 70+ queries down to 9 on complex campaign pages through N+1 elimination and multi-layer caching.

Get in touch →