ICFG Donations ApplicationComplete
A donation ledger for a church office
Replaced hand-kept donation records with a web app on Cloudflare. The office enters gifts, the app does the totals, and every correction leaves a record.
My wife runs the office at our church, Renovación, and part of that job is keeping an accurate record of donations. That was being done by hand in tools that were never meant for accounting. Typos were easy to make and hard to fix cleanly, and there was no way to audit a change after the fact. So I built a web app to replace it: a donation ledger in English and Spanish.
The challenge
Donation totals feed reports and giving statements, so a number that’s close isn’t good enough.
The office needed a few things at once:
- Quick entry for everyday giving
- Totals the team could trust without re-checking by hand
- A way to fix mistakes that leaves a trail instead of overwriting history
- English and Spanish, because the congregation is bilingual
- Access limited to the right people, since this is financial data
What I built
A web app for entering donations, viewing totals, and producing reports. The main screen is for the everyday job, recording a gift, and that takes a few seconds. Reports and admin settings sit behind it.
Every screen is in English and Spanish, so whoever is at the desk can use either.
Keeping the numbers correct
Amounts are stored as whole cents rather than floating-point decimals, so nothing gets lost to rounding.
The app calculates the totals the office reports on, including the ICFG extension tithe: ten percent of unrestricted giving (the total minus anything given for a restricted purpose). Nobody types those figures in, so the math comes out the same every time.
Nothing gets deleted. A correction or void is saved as an adjustment, so you can always trace how a total was reached. Each submission also carries an idempotency key, so a double-click can’t create a double entry. Every change goes into an audit log with who made it and when.
Roles and access
There are three roles. Administrators can do everything, including corrections and managing users. Entry users record and manage day-to-day donations. Viewers can read reports and totals but can’t change anything.
Sign-in goes through Cloudflare Access using the church’s Google Workspace accounts. There’s no separate password to manage, and only people who’ve been given access can reach the app.
Architecture
It all runs on Cloudflare:
- React and TypeScript on the front end, styled with Tailwind CSS
- Cloudflare Workers serving the app
- Cloudflare D1 as the database, with Drizzle ORM for typed schema and queries
- Cloudflare Access and Google Workspace for sign-in
The data model is small: donors, donations, authorized users, and the audit log.
Outcome
The office now records donations in the app instead of by hand. It’s in production and used every day at the church. Sign-in is restricted, so there’s no public demo.
Impact
Before: donations were tracked by hand in general-purpose tools, where mistakes were easy to make and hard to correct or audit.
After: the app calculates the reporting totals, records every correction, and keeps an audit trail, so the office can rely on its own numbers.