The Challenge
An international aid nonprofit supports orphanages along the Thai-Myanmar border, providing rice and essential supplies to children who would otherwise go without. The organization had been running on a patchwork of tools: a basic WordPress site, PayPal donation buttons, and spreadsheets to track donations and allocate funds to specific orphanages.
As the charity grew, this approach was failing. Donors had no visibility into where their money went. Campaign management was entirely manual. Recurring donations were unreliable because they depended on PayPal's subscription system, which frequently broke when donors updated their payment methods. And the team had no dashboard — just a shared Google Sheet that was constantly out of date.
They needed a purpose-built donation platform that could handle payments reliably, manage campaigns transparently, and give donors confidence that their contributions were reaching children.
What We Built
Payment Processing
We built a payment system that prioritizes reliability and trust:
- Dual processor integration — both Stripe and PayPal, so donors can choose their preferred method. If one processor has an outage, the other remains available
- Multi-currency support — donations accepted in USD, EUR, GBP, and THB with real-time conversion rates
- PCI compliance — no card data ever touches our servers. Stripe Elements handles the sensitive bits
- Failed payment recovery — automated retry logic for declined recurring payments, with friendly email notifications that include a one-click link to update payment details
- Receipt generation — instant email receipts with transaction details, formatted for tax deduction purposes in multiple jurisdictions
Campaign Management
Each fundraising campaign is a first-class entity in the system:
- Campaign builder — staff can create campaigns with goals, deadlines, descriptions, and photo galleries without developer help
- Progress tracking — real-time progress bars showing amount raised vs. goal, number of donors, and days remaining
- Allocation rules — each campaign specifies which orphanages receive funds and in what proportions. When a donation comes in, the allocation happens automatically
- Campaign pages — each campaign gets its own shareable URL with a tailored landing page optimized for conversion
- Matching campaigns — support for corporate matching, where a sponsor agrees to match donations up to a specified amount
Recurring Donations
The recurring donation system was built to minimize churn and maximize lifetime donor value:
- Flexible scheduling — monthly, quarterly, or annual recurring options
- Smart retry logic — if a payment fails, the system waits 3 days and retries. After three failures, it sends a personalized email rather than silently cancelling
- Easy management — donors can pause, adjust amounts, or cancel their recurring donation from their dashboard without contacting support
- Upgrade prompts — at year-end, donors receive a gentle prompt to consider increasing their monthly contribution, with impact data showing what the increase would fund
Donor Dashboard
Every donor gets a personal dashboard showing:
- Donation history — every transaction with date, amount, campaign, and receipt download
- Impact tracking — where their money went, mapped to specific orphanages and supply deliveries
- Cumulative impact — lifetime giving total with a visual breakdown by category (rice, supplies, education, medical)
- Tax summary — annual giving summary formatted for tax filing
Admin Tools
The nonprofit's team has full operational control:
- Donation management — search, filter, and export all transactions
- Orphanage profiles — manage the list of supported orphanages with photos, descriptions, and current needs
- Supply tracking — log deliveries and connect them to the donations that funded them, closing the accountability loop
- Reporting — monthly and annual reports generated automatically, ready for board meetings and regulatory filings
The Outcome
The platform replaced a fragile collection of disconnected tools with a single, reliable system. Recurring donation failures dropped sharply after launch, directly increasing monthly revenue. Donors now have full transparency into how their contributions are used, which has improved retention and increased average donation size.
The team spends their time on mission work, not spreadsheet maintenance.
Tech Stack
- Next.js (full-stack)
- Stripe + PayPal (dual payment processing)
- PostgreSQL (donation and campaign data)
- Railway (hosting)
- Resend (transactional email)
- Tailwind CSS