I run a small SaaS called Upwork Scout. It watches Upwork around the clock and emails you only the jobs that actually fit you. The pitch takes one sentence. The engineering is a long argument with your own billing page.

I have written before about the scraping half of that argument. The short version: naive job alert tools scrape once per user, so cost grows linearly with signups and you go broke on your own success. I inverted it into one shared scrape per category per cycle, and scraping cost now tracks the number of active categories instead of the number of users.

Then I added the part people actually pay for, AI matching, and immediately created a second bill with worse scaling properties than the first one. Scraping cost tracks categories. Model calls track jobs times users. That multiplication is where most "we added AI" features quietly die.

Here is the shape I landed on, and the four rules that got me there.

Rule 1: the model never sees a job a boring filter would have rejected