The Community
The Awo Muslim Community is a vibrant organization in Awo - Ekiti, Ekiti State, Nigeria. With over 344 members spread across multiple street mosques, the community manages annual contributions, fundraising campaigns, events, and leadership structures — all previously tracked in spreadsheets and paper records.
I'm a member of this community. When the challenge theme dropped — build something for a community you care about — I knew exactly what to build.
What I Built
A full-stack community management platform that handles everything from member registration to financial tracking, event management, and communication. The platform replaces manual spreadsheets with a professional web application that the community can actually use.
Live site: audawo.org
GitHub: awo-muslim-community
Key Features at a Glance
- Member Management — Registration, approval workflow, profile management with 19 Nigerian/Islamic title options (Alhaji, Alhaja, Imam, Engr, Dr, etc.)
- CSV Member Import — Bulk import 344+ members from existing spreadsheets with smart name parsing and contribution history
- Account Claiming — Public page where imported members can find and claim their accounts
- Annual Contributions — Weekly group system (53 weeks), session tracking (2021/2022 through 2025/2026)
- Payment Processing — Paystack integration with mosque-specific sub-account routing
- Fundraising Campaigns — Create campaigns with progress bars, anonymous donations, and updates
- Events & RSVP — Public event listings with registration for members and non-members
- SMS/WhatsApp Notifications — Twilio-powered contribution reminders and payment receipts
- Blog/News — Community announcements with comments and likes
- PDF/Excel Reports — Export members, transactions, and contribution summaries
- Admin Dashboard — Real-time stats, member approvals, financial overview
The Weekend Sprint: CSV Import + Account Claiming
The most impactful feature I built during this challenge weekend was the member import and account claiming system. Here's the problem it solves:
The community had a CSV file with 344+ members, their weekly group assignments, street mosque affiliations, and 5 years of contribution history. But 96% of these members had no phone numbers on file — and the app requires phone + surname to log in.
The Solution
Step 1: Smart CSV Import Command
python manage.py import_members members.csv --dry-run
The import command handles real-world messy data:
- Parses compound titles: "Chief Mrs. Sinatu Sulaimon (Iyasuna)" becomes title=CHIEF, first=Sinatu, last=Sulaimon
- Strips nicknames in parentheses, trailing commas, extra spaces
- Maps street name variants: "OKE-UBA", "okeuba", "Oke Uba" all normalize correctly
- Creates placeholder credentials for members without phones:
UNCLAIMED-0001 - Imports contribution history across 5 sessions with proper transaction records
- Fully idempotent — safe to run multiple times
Step 2: Account Claiming Page
A public-facing page (no login required) where members can:
- Search for their name
- See their imported record (week group, street mosque)
- Provide their phone number and email
- Claim their account and start using the platform
The admin controls this with a single toggle in Site Settings — turn it on when the CSV is imported, share the link with the community, then turn it off when everyone has claimed their accounts.
Step 3: Model Changes
- Expanded
ContributionGroupfrom 4 weekly slots to 53 weeks (matching the CSV's serial numbering) - Added
sessionfield toAnnualContributionfor accurate "2021/2022" display alongside the numericyearfield - Added
is_claimedflag to the User model - Created safe data migrations that consolidate existing groups and populate session data
Architecture Decisions
Domain-Oriented Apps
Each Django app owns a business domain, not a technical layer:
accounts/ — Members, authentication, profiles
contributions/ — Contributions, donations, payments
campaigns/ — Fundraising campaigns
events/ — Events and RSVP
mosques/ — Mosques and leadership
family/ — Family compounds
core/ — Site settings, newsletters, reminders
Mosque Sub-Account Routing
When a member makes a contribution, the payment is automatically routed to their mosque's Paystack sub-account. Each mosque has its own bank account and settlement percentage — the platform handles the split automatically.
Offline + Online Payment Support
Not everyone pays online. The platform supports:
- Paystack for online card payments
- Cash, Cheque, Bank Transfer, Deposit for offline payments reported by admins
- Admin verification workflow for all payment types
Async Everything
Heavy operations run in Celery:
- Email sending (verification, approval, welcome)
- SMS/WhatsApp delivery via Twilio
- PDF report generation
- Newsletter distribution
- Weekly contribution reminders
Tech Stack
| Layer | Technology |
|---|---|
| Backend | Django 5.2.3, Python 3.12 |
| Database | PostgreSQL |
| Cache | Redis (Upstash) |
| Task Queue | Celery + Celery Beat |
| Frontend | TailwindCSS, jQuery |
| Payments | Paystack |
| SMS/WhatsApp | Twilio |
| Media | Cloudinary |
| PDF Export | ReportLab, WeasyPrint |
| Excel | openpyxl, django-import-export |
What Makes This Different
This isn't a toy project. It serves a real community with real data:
- 344+ members imported from actual community records
- 5 years of contribution history preserved and queryable
- 3 major street mosques with leadership positions tracked
- Nigerian-specific phone number formatting (+234), Naira currency, Islamic titles, Africa/Lagos timezone
- Production deployment with proper security headers, rate limiting, and reCAPTCHA
The account claiming feature is particularly meaningful — it bridges the gap between the community's paper records and the digital platform. Members who've never used a computer can have someone help them claim their account with just their name and phone number.
Demo
Here's what the platform looks like in action:
Login Page — Members log in with surname + phone number. The "Claim your account" banner appears when the admin enables it.
Dashboard — Personalized view showing contribution status, recent transactions, and notifications.
Contribution Groups — All 53 weekly groups with member counts and management tools.
Campaign Page — Active fundraising campaigns with progress bars and donation tracking.
Admin Settings — Feature toggles for registration, donations, contributions, and account claiming.
Lessons Learned
Data migration is the hardest part. The CSV import command took more thought than any other feature — handling name parsing edge cases, phone number normalization, and contribution history import.
Design for the actual users. These are community elders, not tech-savvy users. I set
email_verified=Trueon account claims because asking them to verify an email would be a barrier. Sometimes the pragmatic choice beats the "correct" one.Feature flags save relationships. The
account_claiming_allowedtoggle means I can import members, enable claiming, share the link via WhatsApp, and disable it when done — no code changes needed.
Built with Django, powered by community spirit. If this platform helps one community go from spreadsheets to software, the weekend was worth it.
Top comments (0)