back to work
Case Study · Donations Platform

Upcurve

Multi-tenant SaaS plus embeddable donation widget — nonprofits spin up branded campaigns, accept Stripe donations, and drop the widget on any site with one script tag.

Role
Feature contributor
Commits
~61 of 1,370 total
Type
Multi-tenant SaaS + embed widget
Status
Live · client production
Upcurve

Nonprofits need a branded donation flow on every surface.

Cause-driven organizations want to spin up a campaign, take Stripe donations, manage donors and team members, and embed a donation widget on third-party sites — WordPress, Shopify, Drupal, plain HTML — without rebuilding their stack each time.

Hybrid auth, embeddable JS, multi-tenant from day one.

Upcurve uses Clerk for user/session identity and Supabase Row-Level Security for data ownership. Middleware bridges Clerk JWTs into Supabase SSR clients on every request — the auth and data layers stay decoupled but enforce together.

The embed surface is a public JS bundle (app/embed.js) that nonprofits drop onto any site with a single script tag to render a Stripe-backed donation widget. Production images are environment-pinned at build time — Stripe/Clerk/Supabase keys pass as Docker build args rather than runtime config.

Honest framing — feature contributor, not lead.

I'm a contributor on this codebase, not the lead engineer. Primary feature ownership belongs to Ashley Brooks, Andrew Thomas, and the broader Banyan team. My role across two identities (~61 of 1,370 commits) was focused features and bug fixes — donor-side flows, dashboard fixes, Stripe integration polish.

  • Donor-flow improvements on a platform that processes real charitable donations.
  • Bug fixes and feature work inside the standard Banyan develop → staging → main PR flow.
  • Production exposure to multi-tenant SaaS architecture, Clerk + Supabase + Stripe + Railway, and the embed-widget pattern.

What it's built on.

Frontend
Next.js 15 · React 19 · Tailwind 4 · Radix · TipTap
Backend
Next.js Route Handlers · middleware-based auth
Database
Supabase Postgres · Row-Level Security
Auth
Clerk · multi-org · magic-link invites
Payments
Stripe · Stripe Elements · Svix webhook verification
Infra
Railway · multi-Dockerfile · GitHub Actions deploy flows

Real donations, real customers, real codebase.

Upcurve is live and processes real charitable donations on a stack of Next.js 15, Clerk, Supabase RLS, Stripe, and Railway, with documented integrations for Shopify, WordPress, Drupal, and a Chrome extension. My contribution sits inside a five-plus-engineer team — that's the honest framing, and it's the version that holds up under reference checks.