Non-Profit / Operations

HRIS, CRM, forms, mapping, and CMS consolidated into one Next.js app a small ops team can maintain themselves.
Submitted hours flow straight from staff timesheets into payroll, pre-validated against budget rules so exceptions surface before submission.
Little Haiti BK is a Brooklyn-based non-profit preserving Haitian culture and supporting small businesses through a Business Improvement District. What started as a community website grew into the organization's operating platform: staff timesheets with Paychex payroll integration, a form builder for community programs, file management, and a Mapbox-driven CRM for the BID's commercial property roster.
Next.js 15 App Router, Better Auth for staff + community sign-in, Prisma + PostgreSQL, with Mapbox for property mapping and Paychex API integration for payroll.
LHBK runs on tight non-profit margins, so they couldn't afford a five-tool stack (HRIS + CRM + forms + maps + CMS). The goal was to consolidate operations into a single platform the team could maintain themselves, while keeping the public-facing community pages fast and accessible.
Mapbox-driven map of Business Improvement District commercial properties. Staff can browse, filter by status, and update property records inline. Replaces a spreadsheet-and-PDF workflow.
Staff timesheet capture wired into Paychex's payroll API. Submitted hours flow straight to payroll without re-keying, cutting administrative overhead for the small ops team.
Schema-driven form builder for community programs (event signups, BID applications, surveys) that staff can configure without developer involvement. Wraps the public-facing community pages.
Little Haiti BK runs on nonprofit margins, so the win was never the slickest CRM. It was consolidating five SaaS subscriptions into one platform a small team can actually maintain themselves. Once you optimize for whoever keeps the lights on after you leave, you reach for the tool they can run, not the one that demos best.
Paychex's API is a 'submit and hope' integration, and a payroll error in a small org is somebody's rent.
I built a validation layer that pre-checks timesheets against budget rules before anything reaches Paychex.
Validate before the integration, not after. My own pre-submission checks caught more than Paychex's webhook responses did.
One platform had to serve two very different audiences at once: internal staff running operations and community members signing up for programs.
I ran both on a single Better Auth instance and gated every surface by role instead of standing up a second auth system.
When one platform wears two faces, clean role boundaries are what keep the staff tools and the public pages from leaking into each other.
Staff needed to spin up new community forms without me in the loop, but flexible form builders get UX-mushy fast.
I shipped a schema-driven form builder, accepting that it trades polish for staff autonomy.
Schema-driven builders save dev hours and cost UX hours. Worth it for an internal ops team, not for a public-facing product.