DL-002 · Desktop Automation
Deeds Leisure — Lead-Gen Tool
ShippedSoftware Engineer InternJan – Mar 2026~75% TIME SAVED
Outcome
Cut the sales team's manual prospecting time by roughly 75% — and handed them a tool they could run without engineering support.



Deeds Leisure's sales team prospected by hand — searching city by city, category by category, copying out contact details one search at a time. As a software engineer intern, I built the tool that replaced that grind: a desktop app that researches outreach targets across 25 Ontario cities and 43 business categories on demand. The people running it weren't technical, so it had to feel like a product, not a script. I sat on the sales team it was built for, which kept the requirements honest and the test loop short.
I was a user of the tool I was building
I sat on the sales team as well as building for it, and that turned out to be the point. I did the manual prospecting myself before I automated it, so I knew which steps were tedious and which fields the team actually used. Outreach research meant working through 25 Ontario cities and 43 business categories, one search at a time. Building for a team I sat on meant I could test a change at my own desk and watch whether it saved real minutes, not hypothetical ones. The estimated ~75% cut in prospecting time came from removing work I had personally felt.
- Built the tool while doing the manual prospecting myself
- ~75% less manual prospecting time (estimated)
A thousand lines of Python, no API to lean on
There was no clean data source to call, so the pipeline assembled one. Roughly a thousand lines of Python: DuckDuckGo Search to surface candidate businesses per city and category, BeautifulSoup to parse the pages it found, and regex to pull contact details out of messy HTML. Each city–category pair fanned out into its own search, then folded back into one lead list. Scraping is brittle by nature — layouts vary, pages break — so much of the work was the unglamorous part: handling the cases where extraction returned nothing useful and keeping the run moving instead of stalling on a bad page.
- ~1,000-line pipeline: DuckDuckGo Search + BeautifulSoup + regex
- Fan-out across 25 cities x 43 categories, merged into one list
Scoring kept the team from chasing dead ends
A raw scrape gives you volume, not quality — and a sales team that wastes calls on bad leads stops trusting the tool. So the pipeline scored every lead 0–100 instead of dumping everything it found. Franchises got filtered out, since national chains weren't the target. A domain blocklist caught directories, aggregators, and other noise that kept resurfacing. The point wasn't a perfect score; it was a list someone could work top-down with reasonable confidence. Ranking changed how the output got used — the team could trust the top of the list and stop second-guessing every row.
- 0–100 lead quality scoring
- Franchise filtering + domain blocklisting
The scraper only counted once someone could double-click it
A Python script is useless to a sales team that won't open a terminal. So I designed a frameless desktop UI in Figma and wrapped the pipeline in an Electron app, with Node bridging the interface to the Python underneath. Then I packaged it as a .dmg and .exe with PyInstaller and electron-builder, so installing it was a double-click on whatever machine someone had. That last mile taught me the most: the engineering was only as valuable as the moment a non-technical colleague could run it alone, without me on a call walking them through Python. Packaging was the feature.
- Frameless desktop UI designed in Figma, wrapped in Electron
- Shipped as .dmg and .exe via PyInstaller + electron-builder
- Credits
- Solo build, embedded on the sales team