Imran Osman · GTM engineer

ImranOsman

GTM engineer. Ex‑copywriter who builds the systems that find buyers.

How a lead rides the line

From a public post to a booked call

Every system on this page follows the same route. The buyer tells you they need help in public, the system finds it, and a person decides what happens next.

Founda job ad, a LinkedIn post, an Instagram caption
Filtered for freeanyone who clearly doesn't fit is out before anything costs money
Read and scoredwith the quote that earned the score
Drafted and checkeda person reads every message before it goes anywhere
Meeting bookedabout 80 in under a month on one pipeline

What the systems did

The numbers

~80
meetings booked from outbound to US founders, in under a month
6 calls
booked by a trade buyer radar in its first two weeks, 2 now in active deals
1–2 → 68
weekly profile views for a solo consultant, 85% of them his target buyers
$0.80
to research and score one LinkedIn profile, scraping included

Four lines, four builds

The work

Live

LinkedIn engine for a solo consultant

For a communications consultant in Malaysia taking his practice public.

A daily Claude prompt I wrote for him drafts posts from the trade press and practitioner forums, with hard rules against inventing a client, a quote or a number. Separately, the Engagement Radar emails him each weekday with the posts worth commenting on and the people worth connecting with. He does all the posting and commenting himself, and we go through his numbers on a call every week. His profile views went from one or two a week to an average of 68. LinkedIn shows him who's looking, and 85% of them are the audience he's after.

1–2 → 68
profile views a week

The kit

Tools

Built live systems with

ClayApollon8n, self-hostedApifyGemini APIClaude CodeGoogle SheetsSyncGTMResend

Used in projects

MakeSupabaseVercelRetellVapiTwilioCal.comHermes agents

Learning

Python, through Harvard's CS50PSQL next

About

Copywriter turned builder

I spent eighteen years as a copywriter, writing to get people to buy. Now I build the systems that find the people worth writing to.

Every build still starts with the buyer, what's going on for them and what they tend to do in the weeks before they buy. Once I know that, I work out how a system can spot it.

I design the systems and write the rules they follow. Claude Code does the coding, and nothing goes out until I've read the output myself. I'm in Colombo, Sri Lanka, and I work remotely.

Last stop

Talk to me

LinkedIn Book a 30-minute call
← Back to the work
GTM Engineer School capstone · 2026

The signal engine

Finds the people close to buying a consulting bootcamp from what's already on their LinkedIn, before they've asked for anything.

~$0.80 a profile4–6× signal in back-test

How it started

This was my capstone for GTM Engineer School, Cohort 4, in 2026. The school handed us a sheet of real companies with real GTM problems, and we each picked one and reached out to the contact. Mine was a training firm in the Middle East that runs bootcamps for people moving into consulting.

What was going wrong

Their biggest problem, the way they put it, was getting qualified leads consistently for expensive courses. Outreach, targeting and follow-up were all being done by hand, in bits and pieces. So they couldn't tell who was actually close to buying, couldn't personalise at any kind of scale, and couldn't see which channels were working.

What I found

I went through 130 LinkedIn profiles of people who'd already paid for the bootcamp. Job title and industry barely came into it. What they had in common was where they were in their careers. They'd been stuck in the same role for years, and lately they'd started looking for a way out.

A filter wouldn't have caught that. You'd have to sit down and sift through someone's profile, and no sales team has time to do that for every name on a list. So I built the engine to do the reading for them.

What I built

The engine reads someone's public profile and posts, then scores how close they are to buying. Every score comes with its reasons. It says what's pushing them to make a move and what's holding them back, and ties each one to something they posted. For the people worth talking to, it writes a short sequence of messages, and every claim in those messages links back to the post it came from.

The first version was an AI agent running on an open-source framework called Hermes. It worked, but it was doing a lot of deciding for itself, wandering off between steps, and every extra step cost money. It felt like a tool I was using for the sake of using it. Then the client's security policy ruled out open-source agent frameworks, which settled it.

So I ditched the agent and rebuilt it as a plain Python program. Claude Code did the coding. I told it exactly what to build. It runs the same steps in the same order every time. The rebuild took three days, and these days I ask about a client's security rules before I pick a single tool.

One lead, start to finishPython pipeline · runs the same way every time
1LinkedIn profilea name and a link
2Free fit checkwrong fit out, $0
3Scrapeprofile and posts
AIRead the personAI call one
5Scoring rulesfixed code
AIWrite messagesAI call two, hot and warm only
7Source checkevery claim traced
✓Review screena person approves
freefreefreefreefree
AI stepfixed rulesa person
The AI is called twice per lead, at most. Everything else is fixed rules.
A batch won't start if it would go over the spend cap.
Nothing gets sent. A person approves every message.

Guardrails

Before anything costs money, a free check throws out anyone who clearly doesn't fit. Every paid call gets logged with what it cost, and a batch won't even start if it would go over the spend cap. If someone swaps in an AI model the system doesn't have a price for, it refuses to run instead of quietly logging the cost as zero.

To stop the AI making things up, a coded check goes through every message before a person sees it and flags any claim that doesn't trace back to a source.

The engine only drafts, it never sends. I wanted someone on the sales side to check every message before it goes anywhere.

What the sales team sees

1 / 3One lead, one screenclick the front screen to open it

There are two tabs the screens above don't show. The board is the full list of leads, which the team can filter by tier, persona, country or status, save as a view, and export to CSV. The status tab follows each lead from contacted through to booked, and if one drops out, the reason goes in there too.

Screens from the running system. Client name and real people replaced with sample data.

What broke

In a live test run, the AI wrote two messages around a "peer" called Loai, with a career story to match. Nobody had given it any of that. The check I had at the time read each message on its own and flagged nothing. I caught it because I read the output myself.

So I added a check that reads the whole sequence together. It stops any named person who isn't backed by the lead's own data, and it catches the same phrase turning up in two different messages. It still doesn't replace a person reading it, though.

What the numbers say

$0.80
to research and score one profile, scraping included
measured across live runs
4–6×
more often among graduates who went on to land consulting work
client's own records, 32 past graduates

I ran the engine against the client's own records for 32 past graduates: 17 who went on to land consulting work and 15 who didn't. People with momentum in their careers, meaning a recent move they'd chosen to make themselves, showed up 4 to 6 times more often in the first group. It's a small sample, so it points in a direction more than it proves anything.

The same test showed one of my rules was backwards. It was about people who'd hit a dead end and then started moving again, and it was pointing the opposite way to what the data said. So I flipped it.

← Back to the work
Ran live · Oct 2026

Trade Buyer Radar

Finds trade buyers abroad for a Sri Lankan gem business, from what designers already post on Instagram.

6 calls in 2 weeks~$30 a month to run

How it started

A family-run gem business in Colombo, three generations in the trade, needed new buyers. Local sales had gone quiet, and the buyers worth chasing were abroad, mostly in the UK and Australia. They're independent designers and jewellers who make custom pieces. You won't find them in Apollo or any database you can buy. But they're all on Instagram, posting their work every day.

What I found

Before building anything, I ran one test scrape, no logins, for about 29 cents. Four days of posts on three hashtags turned up 19 trade buyers across the UK, Australia, the US and Canada. A few said in their captions that their custom books were opening or about to close.

It also showed me where not to look. On colour hashtags like teal sapphire, 85% of the accounts were other dealers selling stones, not designers buying them. The buyers were on the craft tags, engagement rings and bespoke work, and on city tags like the ones a local jeweller in Adelaide or Brisbane would use.

What I built

Every morning at 6:30 it reads the newest posts on those tags and the profiles behind them, then throws out dealers, personal accounts, tiny accounts and anyone outside the target countries. Gemini gives whoever's left a score out of 10, and has to quote the post that justifies it. If it can't quote the evidence, the lead doesn't get scored at all.

The owner gets an email with the five best leads he hasn't seen yet. Each one says who they are, why they're showing up today, how sure we are, and three openers he can use: a comment, a DM and an email. He makes every contact himself, then flips the status in a Google Sheet so the engine knows what happened. Nothing in it likes, follows, comments or sends on Instagram, and it never uses anyone's login.

Once I turned the model's thinking down, the AI scoring for a whole morning's run fell to 27 cents, about a third of what it was, with no drop in quality that I could see. All in, it runs at about $30 a month.

One morning, start to finishn8n, self-hosted · 34 nodes · 6:30 Colombo time
1Newest postscraft and city tags
2Already seen?marked no or skip, dropped
3Read profilesbio, followers, recent posts
4Free gatedealers, personal, tiny, wrong country
AIScoreout of 10, with a quote
6Quote checkword for word against the posts
7Pick fivebest he hasn't seen yet
8Morning emaildrafted openers for each lead
✓Owner reaches outthen flips the status in the sheet
next morning, his status goes back in
freefreefreefreefreefree
AI stepfixed rulesa person
If a quote isn't in their posts word for word, the score gets thrown out.
Each run has a hard spend cap on the scraping.
It only reads Instagram. The owner does all the contacting.
Every run logs what it found, what it threw out and what it cost.

The canvas in n8n. Click to scrub through it.

What the owner gets

1 / 3The morning at a glanceclick the front screen to open it

The radar's own email template, filled with made-up leads.

What the numbers say

6 calls
booked in the first two weeks, four in the UK and two in Australia
reported by the owner
2 buyers
in active deals, both of whom have sent their requirements
reported by the owner
136
trade accounts found, 56 rated serious buyers, across testing and the first three live mornings
counted in the sheet
← Back to the work
Head of Strategy & GTM · 2025–26

Outbound
data pipeline

Found founders who were hiring an assistant, and reached them while the job was still open.

~80 meetings in under a month17% → 95% with a mobile

How it started

An offshore executive-assistant startup brought me in to build and run their outbound to founders in the US. They were the new name in a market the big players had already carved up. So it came down to how a small team finds clients and wins them.

What I found

The target they started with was too wide. So I narrowed it. Too big, and a company wouldn't take a small provider seriously. Too small, and they couldn't afford one. That left founder-led US companies up to about 200 staff, especially ones that had suddenly got busy, like a company that had just raised a round.

Then the question was how to tell who needed help today. The answer was job posts. A company advertising for an assistant is telling you, in public, that it has the problem and has already set aside money to fix it. So we scraped LinkedIn, Indeed and every other board we could reach for anything that looked like an EA, PA, secretary or assistant role.

Reading those posts changed the copy too. The working idea had been to position around "operational" assistants, which came from competitor research. Buyers didn't use that word. 84 of 246 postings asked for an Executive Assistant. Three said Operations Assistant. So the copy led with the words the buyers used.

What I built

Every posting went through the same steps. If the company didn't fit the target, a filter dropped it. Postings put up by recruitment and staffing firms were dropped too, and there were a lot of them. A posting that had been up a long time stayed in but was marked low, because nine times out of ten nobody had taken it down.

If a post got through, an AI column in Clay read it and pulled the detail. The column called Gemini through its API rather than Clay's own AI, because we didn't want to burn credits on it. Who was the assistant for: the CEO, the CFO, the CTO? What was that person's name? Was the workload realistic, or was it three jobs stuffed into one for bad pay? There were loads of those, and we dropped them, because nobody wins pitching a remote assistant into that. Could the work be done remotely? Was pay mentioned, and was the hiring manager named? The column also gave each post a grade, and a score for how stretched the company sounded.

Then came the contact details. Clay found the right person and pulled a verified email. Mobile numbers were only coming back for 17% of contacts, so I switched the mobile step to a SyncGTM waterfall running through LeadMagic and RocketReach. The next pass found mobile numbers for 95% of the contacts it ran on, 282 in all.

Nothing was written to the master list until it was checked. When a batch of 40 was matched by their LinkedIn links, three came back as someone else with the same name at a different company, and those three were thrown out. Every change was snapshotted first, a dated copy of the master file before any script wrote to it, so any step could be rolled back.

Every lead was scored hot, warm or cool. Hot went to a person to call, warm got a lighter touch, and cool went into automated sequences. Gemini drafted the first message too, from everything we'd found. It congratulated them on whatever had just happened, mentioned the role they were hiring for, and offered a trained assistant who could do it remotely for a fraction of the cost. The detail it opened with came from another AI step in Clay that had the founder's posts, the company's site and any news about it in front of it. It picked one thing we could check, and kept the source. A person read every one before it went out. Then we followed up by phone and email.

One job post, start to finishUS founder-led companies · up to 200 staff
1Job boardsLinkedIn, Indeed and the rest
2Fit checkICP, freshness, no recruiters
AIRead the postGemini, via a Clay column
4Find the personin Clay, verified email
5Find the mobileSyncGTM waterfall in Clay
6Check the matchwrong person out, master copied first
7Hot, warm or coolevery lead gets one
AIFirst messageGemini drafts it from the fields
✓Call or sequencehot gets a person, cool gets a sequence
AI stepfixed rulesa person
If the post was three jobs stuffed into one for bad pay, it was dropped once the AI had read it.
Every script saved a dated copy of the master list before writing to it, so any step could be undone.
A person read every Gemini draft before anything went out.

What we knew before the call

Sampleone post, after every step

The post

Company
Example Robotics, 60 staff, Series A
Role
Executive Assistant to the CEO
Found on
LinkedIn Jobs
Posted
4 days ago
Reports to
the CEO
Remote
yes
Experience
mid level, 3 to 5 years
Salary
not listed
From the post
You'll own the calendar, the inbox and the board pack, and keep the CEO's week from falling over.Must be comfortable with ambiguity and able to switch priorities at a moment's notice.

The read

Top duties
calendar and inbox, travel and expenses, board meeting prep
Red flags
defensive wording, the ambiguity line; urgent wording; a 24-bullet post. No boundary flags, no contradictions.
Pain score
11 of 45
Grade
B
Takeaway
A real EA role for a founder who has never had one, written by someone already stretched.

The person

Decision-maker
the founder and CEO
Email
verified
Mobile
found

The call

Tier
Hot, a person calls
Hook
The company announced a Series A three weeks ago. Four roles are open on its careers page, and the Executive Assistant post went up the same week as the two sales roles.
Hook source
the company's funding announcement and its careers page, both from the last month
First message, opening
I saw the Executive Assistant post went up the same week as your two sales roles, three weeks after the round. Congratulations on a month like that, and I'm guessing the calendar stopped fitting in one head somewhere around the second job ad.Gemini draft · a person reads it before it goes

Pain score: how stretched the company sounds, read from the wording of the post alone, out of 45. The tier is scored separately, from the post and everything else known about the company, so the two can disagree.

The company, the post and every value are made up. The fields are real.

What the numbers say

~80
meetings booked in under a month
approximate, from my time there
32 → 453
leads ready to send in one session, each with a named decision-maker and a verified email
counted in the master list
17% → 95%
contacts with a mobile number, on the first pass after the switch, 282 numbers found
measured on the run
84 of 246
postings said "Executive Assistant"
3 said "Operations Assistant"
← Back to the work

This deep dive is being built next.

Screen 1 of 3