Joyce Zhou

Product, shipped · charitybibs.com · September 2026

Which NYC Marathon charity should I run for? Nothing answered it, so I built the site that does.

A charity bib is a $3,000 to $10,000 fundraising pledge, backed by a credit card you hand over at acceptance. The two things that decide whether you'll make it, the help the charity gives you and what happens if you fall short, are not published where you choose. CharityBibs reads every official charity's pages, quotes them, and turns three questions into a shortlist. It passed 20,000 pageviews in its first 16 days.

Joyce Zhou, soloResearch, PRD, design, pipeline, launch

01

The problem

Most people who want to run the NYC Marathon don't get in through the drawing. The other route is a charity bib: the charity gives you a guaranteed entry, you promise to raise a minimum for them, and you put a card on file that gets charged for whatever you don't raise.

The charity's page advertises one number, the minimum. It usually does not say whether there is a coach, a team, or someone to help you fundraise. It usually does not say what happens if you fall short, when the card is charged, or whether an injury releases you. Those answers live on other pages, in PDFs, or in an agreement you see after you apply. I read all 27 of the partner programs I started with to measure how bad it was.

What I checkedCountWhat it means
Minimum between $3,000 and $5,00022 of 27Price is not the differentiator.
Support offered (coach, group runs, fundraising help, events, gear, logistics)0 to 8 of 10Support is the differentiator, and it's invisible until you dig.
Still accepting runners in mid-September7 of 279 waitlisted, 7 closed, 4 don't say. Without status, half the links are dead ends.
Say what happens if you don't raise it all12 of 27Every one that does: the balance goes on your card.
Publish a date to back out for free3 of 27All three had already passed for 2026.
Publish none of the four key terms15 of 27The terms arrive after you apply.

From the PRD, September 2026. Every count is reproducible from the charities' pages, which the site links to.

The cost on the runner's side is people who never sign up because they aren't sure they can raise the money, and people who sign up with the wrong charity and stall. The cost on the charity's side is contractual: each prepays NYRR for every entry, and unfilled entries are not refunded.

02

Finding the thesis: three PRDs in two days, two of them killed

I wrote the first version of the spec on a Saturday and the version that shipped the next day. The thing I'm proudest of in this project is what got cut.

VersionThesisWhat happened
v1 · Discovery240,000 people were rejected from the drawing. Help them find a charity bib.Dropped Marathon Ballot already lists about 190 charities across the Majors. Building it again would have been a narrower copy.
v2 · Cost transparencyA bib is a financial liability with hidden fees. Show the true cost and rank by it.Killed I pre-registered the kill criterion before testing: if ranking by total exposure moved fewer than 10% of rows, the thesis was dead. 6 of 27 rows moved, mostly by one place. Exposure was the headline minimum plus a near-constant $315 entry fee.
v3 · Support and accessWhat actually varies between charities is support, whether they're still open, and whether they publish the terms. The barrier was never hidden cost. It was fear of not raising the money.Shipped The page's job changed from warning people to enabling them. The cost research became the fine print under every charity instead of the headline.
v3.1 · From list to answerSame data, different shape. A 27-row table still made the reader do the ranking.Shipped After a pass over every other marathon's charity page (all logo grids, name lists or hero photos), the page was rebuilt to ask three questions first and return a shortlist with reasons.

One more base rate I checked. Injury policy felt important, so I weighted it heavily in v3 until I looked at the data: in a 735-runner NYC cohort, 40% got injured in training but only 4.1% were too injured to race. It moved to the fine print.

03

The product

Three questions, a shortlist, and the fine print. You say what you want to run for, what help you want, and how soon you need a spot. The site returns the charities that fit best and says, in plain words, why each one is there and what it doesn't say. The full list sits one click below.

Question 1
Cause
Seventeen causes, each showing how many charities are in it and how many are taking runners today.
Question 2
Help
People to train with, help raising money, both, or just the spot.
Question 3
How soon
Only charities open now, include waitlists, or show everything including closed.
The first question on charitybibs.com: What do you want to run for? with eighteen causes and counts of charities taking runners
StartOne question at a time. The counts next to each cause are live from the data, so you never pick a cause with nobody taking runners by accident.
A shortlist of three cancer charities with their minimums, what each gives you, and what each doesn't say, followed by five more that also fit
ShortlistEach card says what the charity gives you and, in gray, what it doesn't say. Status, minimum and how many of the four fine print questions it answers sit on one line.
The fine print panel for one charity: how much to raise, what they give you, are they taking runners, and four questions marked Not on their page, ask before you sign up
The fine printFour questions under every charity: what if I don't raise it all, what if I get hurt, can I move to next year, until when can I back out for free. "Not on their page. Ask before you sign up." is an honest answer.
The same shortlist on a phone
PhoneThe same shortlist at 390px, no horizontal scroll. The three questions were designed to be answered with a thumb.

Rules I held the page to

  • Never estimate. Every number links to the exact page it came from and the date it was read. "Not published" is a valid value. Nothing is filled in.
  • Plain words, any age. No "shortfall", "deferral" or "disclosed". Say "if you don't raise it all", "move to next year", "they don't say".
  • Show what's missing. The reasons on each card list what the charity doesn't say, not only what it does, because that's what the runner has to ask about.
  • Independent. No affiliate links, no sponsored placement, no affiliation with NYRR or any charity. A correction address on every card.

04

How it works

The site is static. Behind it is a pipeline that reads the charities' pages, extracts a fixed set of fields with a language model, and throws away anything the model says that the page doesn't. That last step is the whole product: a comparison site is only useful if it's right.

  1. SeedCaptured NYRR's official partner list: 655 charities with their Gold, Silver and Bronze tiers, categories and websites. Rebuilding the list is idempotent, so a charity that joins or leaves shows up as a diff.
  2. CrawlHeadless Chromium fetches each charity's marathon page, FAQ, application and any PDF, respecting robots.txt, with a hard cap per charity so one slow site can't stall the run.
  3. ExtractClaude fills a fixed schema through a forced tool call: minimum, fee, status, deadline, support, and the four terms. Every non-null field must come with a verbatim quote and the URL it came from.
  4. VerifyEach quote is searched for in the fetched text. If it isn't there, the field is dropped and flagged. A minimum that was already reviewed only changes when the old figure is gone from the new quote, which caught the model picking a "fundraiser only" tier over the bib tier.
  5. Diff and reviewA GitHub Action runs weekly, re-reads the charities, and opens a pull request with a human-readable change list. Nothing publishes until I read it.
  6. PublishPromote, rebuild, deploy to Cloudflare Pages. Every change to the data is logged in a changelog.
Charities read
282
The rest are listed from the official index and marked "not read yet" rather than left out.
Cost to read them
$8.72
About 3 cents per charity. The run meters its own spend and stops cleanly at a budget or when credit runs out.
Tests
32
Budget stops, the verify rules, cache resume, the seed builder, the render. All pass before any data commit.

Stack. Python, Playwright, the Claude API, pytest, GitHub Actions, Cloudflare Pages, Plausible. One HTML template, no framework, no build step beyond a Python script.

05

Results

Pageviews, first 16 days
20,336
Cloudflare Web Analytics, Sept 15 to Sept 30, 2026, no paid promotion.
Charities compared
655
Every official NYC Marathon partner. The official directories list names and minimums only.
Time to first version
2 days
Research, three PRDs, the site and the pipeline, Sept 13 to 14. Launched Sept 15.

CharityBibs is the only place that compares NYC Marathon charity programs on the things that decide whether a runner succeeds: the support they get, whether the program is still open, and what the terms are. NYRR's directory and the race-day aggregators list names and minimums.

Pageviews are a reach number, not an outcome. The outcome I care about is a runner clicking through to a charity they can actually finish with, so outbound clicks to charity pages and the cause each visitor picks are tracked as goals. The honest next step is to compare those with the charities' own application numbers, which needs the charities' help.

06

What I'd do next

  • Read the remaining 373 charities. They're listed and linked today, but marked as not yet read. Nearly all are Bronze partners with a single page to read.
  • Fix the collapsed FAQ problem. About two dozen charities hide the four terms behind accordions the crawler doesn't expand, so their support fields come back empty. A click-to-expand pass would recover them.
  • Get charities to correct their own rows. Every card has a correction address. Charities with an open program and good support have the most to gain from being accurate here.
  • Boston and Chicago. Same pipeline, new seed lists. London and Berlin run through a different intermediary and need a different seed strategy.