Case study · Funding Findr
Funding Findr is a programmatic grant intelligence platform I design and build solo on Next.js. One stack serves three customer types (nonprofits, funders, agencies) across marketing site, user app, admin portal, and an agentic ingestion pipeline.
01 · Situation
02 · Task
Marketing site, user app, admin portal, enterprise surfaces, and agentic pipeline on one data model and one design system, priced for a one-person dev shop and built so one person can run it.
03 · Action
External proxies as discipline: competitive teardown, JTBD interviews with real dev directors from week one, and public IRS data as the trust-earning signal.
| What we needed | Precedent I studied | What I kept |
|---|---|---|
| Mission-first discovery | IRS Form 990 Schedule I (recipient grants) | Map a nonprofit's mission to funders whose giving history shows they fund work like it. |
| Trust at low price | Stripe, Aesop, Squarespace | Editorial clarity, no stock imagery, a single accent, a dead-link guarantee. |
| Competitive positioning | Candid, Instrumentl, GrantWatch, GrantStation, Hello Alice | Six dedicated comparison pages, honest trade-offs, "built for the dev director without staff." |
| Multi-model ingestion | OpenRouter, Anthropic batch inference | One AI gateway with model-per-task routing; the right model for the right job without lock-in. |
| Three-sided SaaS | Shopify Partners, HubSpot Solutions Partners | Individual plan, enterprise for funders and agencies, grantee-seat model, inquiry gating for enterprise. |
Marketing site, user app, admin portal, and enterprise surface in one Next.js codebase with shared design system, data model, and pipeline.
Home shipped against an 11-beat B2B sales arc, pricing rebuilt after a HeyCatch audit, six audience and comparison pages, enterprise contact form with pre-filled audience hints, Strapi-powered blog. SEO per route with structured data.
Dashboard lands on mission-matched grants, with Browse (Funders, Funding, Nonprofits), My Radar, and Peer Intelligence sharing one component library. Agency Clients, Funder Grantees, and Funder Contacts (CRM-lite) ride the same shell.
Browse Funders, Browse Funding, Browse Nonprofits all share one table pattern, one filter language, and one card style, so switching surfaces costs no learning.
Each funder surfaces typical award, award count, annual giving, focus areas, and recent recipients. The 990-driven view is what makes "mission-first" real.
Peer Intelligence surfaces funders backing orgs whose work overlaps with the user's, generated by generate-peer-recommendations and refreshed as new 990 data lands.
The system reads the org's programs, cross-references the funder landscape, and produces strategic framings with example funders and language the dev director can walk into an application with.
Review Queue, News Queue, Content Batches, Funder Enrichment, Funders, Grants, Users, and Coverage, designed so one operator supervises a seventy-task pipeline without drowning.
sweep-archetypes orchestrates per-archetype sweeps. sweep-single-archetype and sweep-single-user search both the existing corpus and the open web via lib/ai/web-search.ts.bmf-import, ingest-funders-from-bmf, irs-filing-index-ingest, parse-990-pf, parse-990-schedule-i, parse-990-schedule-i-batch, funder-propublica-enrich, nonprofit-propublica-enrich.discover-funder-portal, discover-funder-portals-all, enrich-funder-from-website, enrich-funders-from-websites-all, suggest-funder-website, tag-funders-from-description, infer-funder-cycle.precompute-match-scores, sweep-paying-users, sweep-user-programs, refresh-archetype-coverage. Scoring runs ahead of time so the dashboard is instant.generate-peer-recommendations surfaces "funders backing orgs like yours."Marketing on Funding Findr is not a side system. It is built into the same Trigger.dev + Resend + Buffer + PostHog stack as the product. One person can run it because it runs itself.
generate-content-batches drafts posts from the latest ingested grants and news. generate-batch-copy writes the social and blog copy. render-batch-carousels and render-batch-reel produce the social assets. publish-batch-blog ships the post. publish-batch-to-buffer queues it on social.poll-news-sources + extract-news-article pull philanthropy news. The admin News Queue approves it, then the content pipeline turns it into blog + social.send-welcome-email on signup. sync-user-to-resend keeps the audience list live. scan-abandoned-signups, trial-expired-sweep, card-expiry-sweep recover revenue. newsletter-nurture-sweep + weekly-briefing-sweep keep paying users engaged with their own grant matches, personalized per org.The whole system was built so one person could run a marketing engine that would normally require a growth team.
One gateway, model-per-task routing: reasoning model for matching, cheap models for classification, long-context for narrative. Swapping a provider is a config change.
Source Serif 4 for headlines, geometric sans for UI, warm monochrome palette with a single indigo accent on the subscribe button. Tokenized in Tailwind so a new comparison page takes a day.
Solo discipline is not multitasking, it is picking which role is in the chair this week. Research weeks run independent of design weeks and build weeks.
Ingestion shipped before UI polish because discovery quality is the thesis. Comparison pages shipped before enterprise because positioning against Candid and Instrumentl is what converts.
Every price string linted against lib/pricing.ts by a prebuild guard. Every ingested item passes a review queue before publish. Every long-running task has retries, observability, and alerting.
04 · Result
End-to-end AI-native build pattern. Figma to Claude Code to shipped Next.js. One designer-builder, one stack, from marketing homepage to enterprise contact form to the agentic pipeline.
Three-sided business model. Individual, enterprise for funders (grantee seats), enterprise for agencies (client management). One data model and one component library serve all three.
Agentic ingestion architecture. Named Trigger.dev tasks, multi-model routing via OpenRouter, review-queue gating before publish, cost reconciliation. The data grows itself and the operator can see every move.
End-to-end marketing automation. Content generated, carousels and reels rendered, blog and social published to Buffer, lifecycle email on Resend, analytics loop on PostHog. One person runs a growth engine that normally needs a team.
Luxury Minimal design system. Documented, tokenized, and tooled with a prebuild pricing guard so one person cannot drift the brand or the price by accident.