Madhav Sharma
Side
BuildGrow
Type
Product
My role
Founder, designed and built the pipeline
When
Feb 2026 to present
Status
In progress

Morpheus

A seven-stage pipeline that finds companies feeling a specific pain right now, from their job posts and public announcements, and hands sales a ranked list with the evidence quoted.

raw signals to ranked leads in one market run
483 to 48
Checked against the data
stages, each with its own rejection log
7
Checked against the data
how much more often job posts survived scoring than public posts
2 to 6×
Checked against the data
columns per lead, including the quoted pain and an opening line
36
Checked against the data

Stack

  • Python
  • Gemini 2.5 Flash
  • Apify
  • BeautifulSoup
morpheus / run ie-001Mar 2026
  1. 483signals
  2. 65scored
  3. 60companies
  4. 48leads
One real run in Ireland: 483 public signals collected, 65 passed scoring, they clustered into 60 companies, and 48 left as ranked leads. Each square is a signal.

Most outbound lists are built from a filter: finance directors, in Ireland, at companies with 50 to 500 staff. That gives you thousands of names and no reason to contact any one of them today. Morpheus starts from the other end. It looks for public evidence that a company is feeling a specific pain right now, then works out who to talk to and what to say.

I built it to find early European buyers for a finance automation product, one that connects to a company’s financial data and produces the monthly reporting that finance teams still assemble by hand in Excel.

What counts as a signal

A signal is anything public that suggests the pain is current. In practice they fall into a few kinds:

  • A job post for a first FP&A hire, or one that describes a manual month-end close.
  • A post about an ERP migration or a finance systems change.
  • A new CFO or finance director announcing that they have joined.
  • A scale-up talking about a recent funding round and the reporting load that came with it.
  • An outsourced-CFO boutique hiring because it is growing.

Each one is weak on its own. The value comes from scoring them consistently, discounting them as they age, and noticing when several point at the same company.

The pipeline

  1. Job signalsLinkedIn job posts by finance role and market
  2. Public signalsLinkedIn posts and articles on pain, change and growth
  3. ScoreGemini grades each signal 1 to 10 against a fixed rubric
  4. DecayOlder signals count for less; after 90 days, nothing
  5. ClusterMerge signals by company, boost corroborated ones
  6. ValidateCheck fit against the company’s own homepage
  7. ExportRanked sheet with the evidence quoted
Seven stages. Each writes its results to a file and its rejects to a separate log, and any run can resume where it stopped.

The scoring prompt asks for more than a number. For each signal, Gemini returns the pain category, the buying trigger, how urgent it looks, which of three customer profiles it fits (scale-up founder, finance lead at a larger SME, or an outsourced-CFO boutique), a one-line outreach angle, and the exact sentence that shows the pain. That quote stays in its original language, so a French post is quoted in French.

Hard rules come before the score. Listed companies, public-sector bodies and sports organisations are disqualified outright. Very large companies are only kept if they state one of the target pains explicitly, and even then their score is capped.

How a score is built

The final ranking multiplies three things, each easy to explain to the person reading the list.

Factor Rule
Freshness Full weight up to 14 days, then 75% to 30 days and 45% to 60. From 60 to 90 days only signals graded 9 or 10 survive, at 20%. Anything older is dropped, and an unknown date counts as 60%.
Corroboration A company’s signals are averaged, then boosted 1.25× for two signals and 1.5× for three or more, plus 0.2 when both job and public signals exist.
Fit A second Gemini pass reads the company’s homepage and about page. Strong fit multiplies by 1.3, weak fit by 0.6, and no fit removes the company.

Signals must still be worth at least 5 out of 10 after decay to move on. Country targets only reorder the list; a lead scoring 8 or more is never pushed out to make room for a market quota.

A switch that changed the results

The first version found job posts through Google search results, which gave about 150 characters of snippet per post and often no date. The second switched to scraping LinkedIn job listings directly, which returns the full description, the company’s website and its headcount.

Between the first version’s Ireland run and the second version’s Luxembourg run, the share of exported leads with an unknown date fell from half to a quarter, and the share of job posts that passed scoring rose from 18% to 38%. Different markets, so not a controlled comparison, but the direction was clear. The cost was a dependency on a single LinkedIn scraper and the loss of other job boards.

Results

Two complete runs are on record. In Ireland, 483 raw signals became 65 that passed scoring, 60 companies after clustering and 48 ranked leads, 30 of them with a named decision-maker. In Luxembourg, 324 signals, 67 of them from French-language queries, became 32 leads. Job posts consistently survived scoring two to six times more often than public posts, which says where the real buying signals are.

The curated output was 32 leads across the UK, Ireland and Luxembourg, after I removed 17 false positives by hand, mostly recruiters and enterprises that slipped through. The pipeline is configured for six markets, including Germany, France and Switzerland, which haven’t been run yet.

What I’d fix next

  • Scores bunch at the top. Gemini’s raw grades sat between 6 and 9, so the multipliers decided most of the ranking. A wider rubric, or comparing signals in pairs, would separate them better.
  • Rejection reasons are too coarse. Every scoring rejection is recorded with the same generic label, so the log shows how many were dropped but not why. Tuning thresholds needs the specific reason.
  • Config drifted between versions. The second version removed settings the decision-maker stage still reads, so that stage now skips itself, and the company-size bands differ between two prompts.
  • A human pass is still needed. Seventeen false positives and five leads where the contact was the CEO rather than the CFO were caught by review, not by the pipeline.

More work on the same problems