Mert Ozcetin
Available for AI roles · Mert’s timePORTFOLIO — 2026

Case study

Nonprofit lead engine

Two free government datasets in, a ranked and evidence-graded shortlist out.

Every organisation in this sector files a public tax return, and almost nobody reads them. The interesting things are not fields on the form. They have to be computed from it.

The engine runs on the US Department of Education's IPEDS and ProPublica's Form 990 API. No paid data vendor, no scraping, no account needed for either. It reads the filed years for an organisation, derives how close to the edge it is running, and ranks what is left.

  • 412organisations read from public filings
  • 43inside the target size band
  • 11with measurable financial distress
  • Derived, not reported

    Nothing useful is a field on a Form 990. Days of operating cover is net assets over functional expenses, annualised. Deficit is revenue minus expenses, carried across every filed year. Capacity is the non-officer payroll line read as a trend. The engine computes what matters from what is published.

  • Gate before you spend

    Distress is arithmetic on filings already in hand and costs nothing. Finding a website, crawling it and extracting a contact is roughly thirty requests per organisation. So the distress test runs first and everything below it is skipped. Ordering those two steps correctly is the difference between a scan that finishes and one that does not.

  • Grade the claim, not just the answer

    Every contact name carries a confidence tier and the URL it came from, and the tier feeds back into the score: a low-confidence name is a lead to verify, not a lead. Names that cannot be grounded are returned as “none” rather than guessed from a staff page.

Of the eleven organisations that survived the funnel, only three had a contact name the engine was willing to stand behind.

That number is unflattering and it ships anyway. Guessingfirstname.lastname from a staff page would have returned eleven, and eight of them would have been wrong in a way nobody could see until an email bounced. The engine returns “none” instead, and the row stays in the list marked as needing a human.

The same rule governs everything else it reports. A verdict it cannot ground in a fetched page is returned as “unclear,” never as a negative, because a silent website is not evidence of anything. A tool that never says “unclear” has stopped checking.

Figures on this page are from a real run and are deliberately anonymised: no organisation names, locations, EINs or exact revenue figures appear here, because a location and an exact filing figure together identify a filer.