How I Went from $90K to $200K in Revenue by Learning to Build the Tools Nobody Gave Me

> Before ChatGPT existed, I taught myself Node.js and Python to scrape leads, structure data, and build outreach systems from scratch. This is the story of how that doubled revenue, and why the process mattered more than the outcome.

How I Went from $90K to $200K in Revenue by Learning to Build the Tools Nobody Gave Me

There’s a version of this story where I say I had a strategy. Where I mapped out a funnel, built a framework, and executed a plan. That version is cleaner. More LinkedIn-friendly.

This version is truer.

I doubled revenue because I got curious about something I didn’t understand, went down a rabbit hole, and refused to stop until the thing worked.


The Problem Nobody Had a Tool For

It was before November 2022. Before ChatGPT. Before AI became the answer to every sales ops question. If you wanted to source leads from a JavaScript-rendered website, you didn’t have a clean no-code solution. You figured it out or you didn’t.

The company had directories. Multiple of them. Spreadsheets. Lists. Data dumps in formats that made no obvious sense together. There was signal buried in there — potential clients, reachable accounts — but nothing structured enough to act on.

My job was to do something with it.

I had no background in engineering. I had a working knowledge of how the web worked and a vague sense that Node.js was how you scraped JS-heavy pages. So I started there.


One Week. Then Four Days. Then a Few Hours.

The first scraper I built took a full week. I was learning the language while building the thing — reading documentation in one tab, writing broken code in another, debugging error messages I didn’t understand at midnight. It was not elegant. It worked.

The second scraper took four days. I already understood the shape of the problem. I copied logic from the first build and adapted it. Fewer dead ends, faster movement.

By the third or fourth build, it was taking me a day. Then a few hours.

That compression — one week to a few hours — was the real product. Not any individual scraper. The pattern recognition, the reusable logic, the reflex for how to structure a fetch and parse a response. That’s what I was actually building.

Once I had a few Node.js scripts running reliably, I started learning Python properly. Specifically for Selenium, which opened up a different class of problem: parallel execution, multi-tab automation, scale. Watching Selenium work across multiple browser tabs simultaneously — doing in seconds what would take a human an afternoon — is still one of the genuinely exciting things I’ve seen a computer do. Depending on the source, a single script would pull 10,000+ leads.


Data Without Structure Is Just Noise

Here’s where most people stop. They get the data, dump it into a spreadsheet, and hand it off. I almost did that too.

But raw lead data at that volume is not useful. It’s a pile. You can’t outreach a pile.

I spent serious time learning data-structuring libraries. How to clean, deduplicate, segment, and shape the output into something that could drive a decision. What industry, what company size, what signals suggested this contact was in-market. What columns mattered, which ones were noise.

The goal wasn’t a database. It was a short list of people I could actually say something specific to.


300–600 Emails. 40% Opens. 1–3% Replies.

The outreach sequences I built from that structured data were small by most standards. 300 to 600 emails per campaign. Tightly scoped to ICP.

The personalization wasn’t “Hi {{first_name}}” personalization. It was personalization grounded in the actual problem profile of the segment — what their business model implied, what friction they were likely experiencing, what a useful solution would look like for them specifically. Each follow-up drilled into that problem a little more. Not louder. Deeper.

The numbers: 40% open rate. 60% click-through. 1–3% replies — with a meaningfully higher share of those replies being genuinely interested rather than “unsubscribe.”

The follow-up emails often outperformed the first touch. If you can structure an email sequence to progressively make a case — surface a problem, offer a frame, demonstrate relevance — the math starts to work in your favor.

This was supplemented with phone outreach. The combination mattered. Email warmed the name. Phone closed the gap.


B2C vs. B2B: Two Different Games

The playbook shifted depending on which client segment we were targeting, and we rotated based on regional strategy.

B2C: Larger send volume, 300–600 per sequence. Each successful campaign would produce $5K–$10K in revenue. Sometimes it produced almost nothing. Variance was real, and you had to make peace with that.

B2B: Completely different math. 100–200 emails per campaign. The target wasn’t conversions at scale — it was 10 accounts. That’s it. Just 10.

For B2B we used Freshsales bulk email, which allowed per-contact personalization at the field level. Every email in the sequence could address something specific about that account’s context. The ICP work done at the data-structuring stage paid off here directly — you can’t personalize what you haven’t defined.

The B2B revenue, when it converted, was recurring. Quarterly for some accounts, monthly for most. One converted B2B account might be worth more over 12 months than an entire B2C campaign. And the whole team knew it — when any single B2B prospect showed genuine interest, everyone oriented around making that relationship succeed.


What Actually Moved from $90K to $200K

It wasn’t one campaign. It wasn’t one scraper. It wasn’t even the outreach metrics.

It was the compounding of systems that shouldn’t have existed. I built tools the company didn’t have because I got curious about a problem. I structured data nobody had structured. I wrote sequences that treated recipients like professionals with real problems rather than names on a list.

The year-over-year jump — $90K to $200K in contributed revenue — came from doing all of it together, iterating fast on what failed, and doubling down on what the data said was working.

The irony is that most of the technology I was using is now either obsolete or replicated by tools with better UIs. But the thinking underneath it — source deliberately, structure before you act, personalize from the problem not the template — that hasn’t changed.

It’s still how the math works.