Find the free signups that are about to become customers.

PQL Radar is an open-source product-qualified-lead scorer for small SaaS teams with a free plan or trial. Your app sends product-usage events; it learns from your own past signups which first-week behaviour came before paying, scores every signup that has finished its first week, and tells you which ones look like your best customers, with the reason. It checks itself on signups it has not trained on and shows you the result, including when the answer is "not enough data". First, try it on an export. Everything runs in your browser, so nothing you paste is uploaded.

1. Score your signups

2. Run the radar yourself

git clone https://github.com/Duncan-Haywood/oss-monorepo && cd oss-monorepo/ventures/pql-radar
API_KEY=$(openssl rand -hex 16) ADMIN_KEY=$(openssl rand -hex 16) node server.mjs

curl -X POST localhost:8080/v1/events -H "authorization: Bearer $API_KEY" \
  -d '{"id":"evt_81","account":"acme","type":"import_data"}'
curl localhost:8080/v1/hot-leads -H "authorization: Bearer $API_KEY"

Point a Stripe customer.subscription.created webhook at /stripe/webhook (set STRIPE_WEBHOOK_SECRET) and paid conversions are recorded for you; or call POST /v1/conversions. Set ALERT_WEBHOOK_URL to get a signed alert the first time a signup looks hot. One-click Render deploy and Docker are in the README.

Questions

Why not use MadKudu, Pocus, Endgame or HubSpot lead scoring?

Those are revenue platforms with CRM sync, enrichment and a price that starts in the hundreds or thousands of dollars a month. PQL Radar does one narrow thing for a product-led SaaS with a self-serve signup: learn from your own past signups which first-week behaviour comes before paying, and rank this month's signups by it. It is one dependency-free Node process with a JSON file for state, and your events never leave your server.

How does the scoring work, and how accurate is it?

Each signup becomes one row built only from its first seven days: events, active days, distinct features used, its busiest day, hours to first use and whether it was still active at the end of the week. The row is labelled by whether the account paid within 30 days of signing up. A logistic regression is fitted to that and validated out-of-time (trained on older signups, scored on newer ones), and the AUC and the share of payers found in the top 20% are shown. Accuracy depends entirely on your data; the page says so when there is too little to validate, and it never invents a number.

How much data do I need?

Roughly 20 paying and 20 non-paying signups to train at all, and several times that to validate. Below that you get a plainly labelled engagement index, not a probability. At a few signups a week a person reading the list is as good as a model; this pays off once you have a few hundred signups and a steady paid rate.

What do I do with the list?

Send the hot-lead webhook to something that acts: a personal email from the founder, a Slack message to sales, a Drip Keeper sequence or an in-app offer. The model ranks signups; it does not know who has budget, and a lead that looks engaged may still be a student.

Is it safe to put real customer data in?

Send only account ids you choose, never names or emails. You run the server, so you are responsible for securing the API key, backing up the state file and following the privacy rules where you and your users live.