Inspiration

Freelancers get stiffed all the time. 58% have been hit with non-payment at least once. $26 billion disappears every year. The average invoice delay is 42 days. And most of us only find out a client is bad news after we've already done the work.

There's no Carfax for clients. No quick way to check if a company has a history of ghosting contractors, filing frivolous disputes, or dissolving right before payday. We wanted to build that.

What it does

Stiffed is a payment risk scanner for freelancers. Type in a client's name, company, or LLC -- we run a live web scan across public sources (news, court records, business filings, complaint boards, social media) and return a cited risk report in under 60 seconds.

Every finding links back to a source. We assert nothing; we surface what's already public and let you decide.

Key features:

  • Risk score (0-100) weighted toward payment-specific signals: non-payment complaints, dissolved entities, lawsuits, fraud reports
  • Verdict banner -- actionable output like "Require a deposit before starting" or "Do not work with this client"
  • Tower Watch -- schedule automatic re-checks on active clients so you're alerted if something changes mid-project
  • Scan history -- every report is saved and shareable via link

How I built it

  • Frontend: Next.js 14 (App Router), deployed on Vercel
  • Backend: FastAPI (Python), hosted on Railway
  • Live web data: Nimble SDK -- extracts structured signal from live search results without hitting paywalls or getting blocked
  • AI synthesis: Claude (claude-haiku-4-5) -- disambiguates entity names, scores signals against a weighted rubric, writes the cited summary
  • Scheduled monitoring: Tower -- runs a Python re-check task on a cron schedule; alerts when a client's score changes by 10+ points
  • Database: Supabase (Postgres) -- stores scan results and watched entities

The scoring rubric is baked into the Claude synthesis prompt. Non-payment complaints carry the most weight (+25 each). Dissolved businesses, fraud reports, and lawsuits add progressively less. Positive signals (good BBB rating, long operating history) subtract from the score.

Challenges I ran into

Getting Nimble to return payment-specific signal rather than generic PR noise required careful prompt engineering on the search query side. Early scans for large companies returned mostly news coverage; we had to tune the queries to surface complaint boards and court records.

Tower runs in the cloud, which meant our localhost backend wasn't reachable during development. We set up an ngrok tunnel to expose the backend during testing, then swapped in the production URL for the scheduled tasks.

Entity disambiguation was trickier than expected. "John Smith LLC" might resolve to dozens of entities. Claude does the heavy lifting here -- given the name and location context, it picks the most likely match before scoring.

Accomplishments I am proud of

Every flag in the report is cited. We didn't want to build another black-box risk score with no explanation. Freelancers deserve to know why a client looks risky, not just that they do.

The Tower Watch feature goes beyond a one-time check. Clients can change -- companies dissolve, new lawsuits get filed, new complaints appear. Stiffed keeps watching so you don't have to.

What we learned

Nimble's extraction quality is significantly better than raw scraping for semi-structured sources like complaint boards and business registries. The SDK handles the anti-bot layer so we could focus on what to do with the data rather than how to get it.

Tower's scheduling model -- deploy a Python script as an app, attach a cron trigger -- is clean and simple once you understand it's not a webhook service. The Towerfile pattern makes deployments reproducible.

What's next

  • User accounts with per-user scan history and watched client lists
  • Email alerts when a Tower Watch scan crosses a risk threshold
  • Industry-specific rubrics (e.g., higher weight on licensing issues for construction clients vs. IP disputes for tech clients)
  • API access so agencies can run checks programmatically before onboarding new clients

Built With

Share this project:

Updates

Submission history