Imran Osman · GTM engineer

ImranOsman

GTM engineer & ex‑copywriter. I build outbound systems that catch buyers when they actually need you, and write the copy that gets the reply.

How a lead rides the line

From a public signal to a booked call

Every system on this page follows the same route. Buyers leave public clues when they need help (a live job ad, a stalled career timeline, an open commission book). The system spots the clue, filters out bad fits for free, and hands a rep a researched lead with a draft worth sending.

Spotted in publica live job ad, a LinkedIn post, an Instagram caption
Filtered at $0rule-based checks drop bad fits, recruiters, and dead accounts before we spend a cent on AI
Scored with receiptsAI scores the fit and quotes the exact post that proves it (no quote, no score)
Drafted for a repthe system writes the opener from the evidence; a human checks and sends it
Meeting booked~80 booked in under a month on one pipeline alone

The numbers

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

Four lines, four builds

The work

Live

LinkedIn engine for a solo consultant

Turned a Malaysian communications consultant's quiet LinkedIn profile into an inbound channel without automated spam.

Read how it works ↓

I built a daily Claude workflow that drafts posts from trade press and practitioner forums, using strict rules so it never invents a client, quote, or stat. Alongside it, a weekday Engagement Radar emails him the exact buyer posts worth commenting on and decision-makers worth adding. He handles the posting and replies himself, and we review performance every week. His profile views jumped from 1–2 a week to an average of 68, and 85% of those viewers match his target buyer profile.

1–2 → 68
profile views a week

The kit

Tools

Built live systems with

ClayApollon8n, self-hostedPythonApifyGemini APIClaude CodeGoogle SheetsSyncGTMResend

Used in projects

MakeSupabaseVercelRetellVapiTwilioCal.comHermes agents

Deepening

Computer Science & Python (Harvard CS50P)SQL next

About

Copywriter turned builder

I spent 18 years as a copywriter writing to get people to buy. Now I build the systems that find the people worth writing to in the first place.

Every build starts with the same question I used as a writer: what is happening in a buyer's world in the weeks before they need you? Once I map the real-world triggers (a stalled career timeline, a new job post, an open commission book), I wire up the scrapers, enrichment workflows, and scoring rules to catch them automatically.

I design the system logic, prompts, and verification checks. Claude Code writes the Python and JavaScript, and I test every output by hand before a system goes live. I'm based in Colombo, Sri Lanka, and work with teams worldwide.

Last stop

Talk to me

Available for custom GTM system builds, fractional retainers, or full-time GTM Engineering roles. Bring a live bottleneck to the call and we'll map out which signals to track and what it costs to run.

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

The signal engine

Reads public LinkedIn activity to spot professionals who have stalled in their careers and are ready to pay for a consulting bootcamp.

~$0.80 a profile4–6× predictor of top graduates

The brief

For my GTM Engineer School capstone (Cohort 4, 2026), we were given a list of real companies with live revenue bottlenecks. I partnered with a Middle Eastern training firm that runs high-ticket bootcamps for professionals transitioning into management consulting.

The bottleneck

Their sales team was doing everything by hand: hunting for profiles, guessing who might be interested, and writing cold messages from scratch. Because their courses are expensive, spray-and-pray outreach didn't work. They had no reliable way to tell who was actually ready to make a career move, personalize outreach at scale, or see which angles converted.

Finding the buying signal

I mapped the LinkedIn timelines of 130 alumni, looking at where they were right before they joined and graduated from the bootcamp. Several patterns showed up across their histories, but they all coalesced around one core trigger: their careers had plateaued. They had been stuck in the same role for years and had recently started dropping public hints that they were looking for a way out.

The client had been running searches mapped to a standard set of personas (filtering by static job titles and industries), which left them completely blind to this. Persona-mapped searches can't spot a career plateau. You have to read someone's timeline and post history to see how long they've been stuck, and no sales team has time to do that by hand for hundreds of profiles a week. So I built the engine to do the reading for them.

How the engine works

The pipeline ingests a prospect's public profile and recent posts, then scores how close they are to buying. Every score comes with receipts: it flags what is pushing them to change careers, what is holding them back, and links every claim to a specific post or role. For hot and warm leads, it drafts a three-step outreach sequence grounded in those exact details.

My first prototype ran on an open-source AI agent framework called Hermes. It worked, but the agent kept improvising extra steps between tasks, which drove up API costs and made runs unpredictable. Worse, the client's IT security policy banned open-source agent frameworks.

I scrapped the agent and rebuilt the whole thing in three days as a deterministic Python pipeline with Claude Code. It runs the exact same steps in the exact same order every time. Lesson learned: I now ask about a client's security constraints before picking a single tool.

One lead, start to finishPython pipeline · runs the same way every timeSwipe route →
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 rep approves
freefreefreefreefree
AI stepfixed rulesrep review
The AI runs at most twice per lead. Every other step is deterministic code.
Pre-flight budget checks block any batch that would exceed the spend cap.
Nothing sends automatically. A rep reviews and approves every draft.

Cost & hallucination guardrails

Before spending a cent on scraping or AI, a rule-based filter drops prospects who clearly don't fit. Every paid API call logs its exact cost, and a batch refuses to start if it would breach the budget cap. If someone swaps in a new model without a price table in the config, the script halts instead of quietly logging the cost as zero.

To prevent hallucinations, a verification script checks every drafted message before a rep ever sees it, flagging any claim that doesn't trace back to the prospect's scraped data.

Finally, the engine never sends a message on its own. It hands the sales team a finished brief and a draft so a rep always makes the final call.

Inside the rep dashboard

1 / 3Where the day startsclick the front screen to enlarge

Two additional views run alongside the screens above: a filterable Lead Board (where reps slice the cohort by tier, persona, country, or status and export to CSV) and a Pipeline Status tracker that logs every lead from first touch to booked call, including drop-off reasons.

Screens from the live application. Client name and prospect profiles replaced with sample data.

Catching a multi-touch hallucination

During a live test run, the AI invented a peer named "Loai" across two follow-up messages, complete with a fabricated career backstory. My original verification script checked each message in isolation and missed it. I caught it because I read the test outputs myself.

I upgraded the verifier to audit the entire three-message sequence as a single block. It now blocks any proper noun that doesn't appear in the prospect's raw LinkedIn data and catches repetitive phrasing across touches.

Back-testing the rules

$0.80
total cost to scrape, research, and score a profile
measured across live runs
4–6×
higher occurrence among alumni who landed consulting offers
back-tested on 32 past graduates

To test whether the scoring logic actually predicted success, I ran the engine against 32 past bootcamp graduates: 17 who successfully landed consulting roles and 15 who didn't. Prospects showing active career momentum (a recent self-directed move or public pivot signal) appeared 4 to 6 times more often in the successful group. It's a small sample, but a strong directional signal.

The back-test also proved one of my initial assumptions wrong. I had penalized prospects who stalled and then made a lateral move, when the client's data showed they actually converted well. I inverted that rule before launch.

← Back to the work
Ran live · Oct 2026

Trade Buyer Radar

Scrapes Instagram craft and city tags to find independent UK and Australian jewellers actively commissioning custom stones for a Colombo gem dealer.

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

The brief

A third-generation gem dealer in Colombo needed a pipeline of international trade buyers. Local demand had slowed down, and the highest-margin buyers were independent bespoke jewellers in the UK and Australia. You won't find bespoke bench jewellers in Apollo or ZoomInfo, but they post their custom ring builds on Instagram every single day.

Validating the channel for $0.29

Before building the workflow, I ran a 29-cent test scrape with no Instagram logins. Pulling four days of posts across three hashtags surfaced 19 qualified trade buyers in the UK, Australia, the US, and Canada. Several explicitly mentioned in their captions that their custom commission books were opening for the season.

The test also saved us from targeting the wrong tags. On stone-specific hashtags like #tealsapphire, 85% of the posts came from other gem dealers trying to sell stones. The actual buyers lived on craft tags (#bespokering, #customengagementring) and local city tags used by studio jewellers in places like Melbourne, Brisbane, and London.

How the radar runs

Every morning at 6:30 AM Colombo time, a self-hosted n8n workflow pulls the newest posts from those craft and city tags, enriches the profiles behind them, and filters out gem dealers, personal accounts, micro-accounts, and off-target countries. Gemini scores the remaining studios out of 10 and has to quote the exact caption that earned the score. No verbatim quote, no score.

The business owner wakes up to an email featuring the five best new leads. Each card breaks down who the jeweller is, why they triggered the radar today, a confidence rating, and three tailored openers (an Instagram comment, a DM, and an email). The owner reaches out personally and updates a Google Sheet status column so the radar knows who is in play. The system never likes, follows, or messages anyone automatically, and never touches an Instagram login.

By dialing back Gemini's reasoning token budget, I cut the daily AI scoring cost by two-thirds (down to 27 cents a morning) without losing accuracy. Total operating cost sits right around $30 a month.

One morning, start to finishn8n, self-hosted · 34 nodes · 6:30 Colombo timeSwipe route →
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 rulesowner action
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 public posts. The owner handles all outreach personally.
Every run logs what it found, what it filtered out, and what it cost.

The live workflow in n8n. Click to scrub through all 34 nodes.

What lands in the owner's inbox

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

The radar's production email template, populated with sample studio data.

First two weeks live

6 calls
booked in the first two weeks (four in the UK, two in Australia)
reported by the owner
2 buyers
in active stone sourcing deals with custom requirements submitted
reported by the owner
136
trade accounts surfaced (56 scored as serious buyers) across testing and launch
logged in the master sheet
← Back to the work
Head of Strategy & GTM · 2025–26

Outbound
data pipeline

Tracked live Executive Assistant job ads to reach stretched US founders while the role was still open.

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

The brief

An offshore executive-assistant startup hired me to build their US outbound engine from scratch. They were a new entrant competing against entrenched staffing agencies with massive ad budgets, so we had to win on timing and relevance.

Finding the buying signal

Their initial ICP was way too broad. Enterprise companies wouldn't trust a new provider, and solo bootstrappers couldn't afford the retainer. I narrowed the target to founder-led US companies between 10 and 200 employees, specifically targeting teams that had just raised capital or hit a growth spurt.

Next, we needed proof that a founder needed help right now. Job boards gave us the trigger. When a founder posts an ad for an Executive Assistant, they are publicly announcing the pain and confirming they have budget approved to solve it. We scraped LinkedIn, Indeed, and niche job boards daily for live EA, PA, and administrative roles.

Scraping the job ads also fixed our messaging. The startup originally wanted to pitch "Operations Assistants" based on competitor positioning. When I analyzed 246 live job posts, 84 asked for an "Executive Assistant" and only 3 used "Operations Assistant." We rewrote our outreach to match the exact title founders were actually buying.

How the pipeline works

Every scraped job post ran through a strict multi-stage gauntlet. Rule-based filters immediately dropped companies outside our headcount range and stripped out staffing agencies (which accounted for a huge chunk of listings). Stale listings stayed in the database but were downgraded in priority.

Qualifying posts moved into Clay, where a custom column called the Gemini API directly (bypassing Clay's native AI markup to save credits):

What the Gemini step extracted from every job post

  • Executive mapping: Identified whether the role supported the CEO, CFO, or COO, and extracted the executive's name when listed.
  • Workload sanity check: Flagged whether it was a realistic EA role or three jobs crammed into one for low pay. We dropped toxic listings immediately because no remote placement survives them.
  • Remote & budget signals: Checked if the role allowed remote work, listed a salary band, or named the hiring manager.
  • Pain score & grade: Rated how stretched the founder sounded based on the urgency and language of the post.

For verified roles, Clay identified the decision-maker and pulled their work email. Initially, our setup only found mobile numbers for 17% of leads. I rebuilt the phone enrichment step using a SyncGTM waterfall across LeadMagic and RocketReach, which jumped mobile coverage to 95% (282 verified cell numbers on the very next batch).

To keep the CRM clean, every record went through an identity check before hitting the master sheet. In one batch of 40 leads, the script caught three LinkedIn URL mismatches where common names pointed to the wrong company. Every script also saved a timestamped snapshot of the master file before writing new rows, giving us a one-click rollback if anything broke.

Leads were bucketed into Hot, Warm, or Cool. Hot leads went straight to reps for phone outreach, Warm entered a lighter multi-channel touch, and Cool flowed into automated email sequences. Gemini drafted the opening hook by combining the job post details with a second Clay research step that checked recent company news and founder posts. Every draft was reviewed by a rep before sending.

One job post, start to finishUS founder-led companies · up to 200 staffSwipe route →
1Job boardsLinkedIn, Indeed and the rest
2Fit checkICP, freshness, no recruiters
AIRead the postGemini, via a Clay column
4Find the buyerin Clay, verified email
5Find the mobileSyncGTM waterfall in Clay
6Verify matchwrong person out, master snapshotted
7Hot, warm or coolbucketed by intent
AIFirst messageGemini drafts from live signals
✓Call or sequencehot goes to a rep, cool to sequence
AI stepfixed rulesrep action
Postings that crammed three jobs into one for bad pay were automatically disqualified.
Every script saved a dated backup of the master list before writing a single row.
A rep reviewed every Gemini draft before it entered outreach.

What the rep sees before dialing

Sampleone job post, fully enriched

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 on the ambiguity line; urgent tone; 24-bullet list. No boundary flags or role contradictions.
Pain score
11 of 45 (healthy stretch, not a toxic role)
Grade
B
Takeaway
A genuine EA role for a founder who has never had one, written by someone whose calendar is overflowing.

The buyer

Decision-maker
Founder & CEO
Email
verified
Mobile
verified cell

The call

Tier
Hot: goes straight to a rep to call
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 two sales roles.
Hook source
funding announcement + live careers page (both from the last 30 days)
Drafted opener
I saw the Executive Assistant post went up the same week as your two sales roles, three weeks after the Series A. Congrats on the momentum. I'm guessing the calendar stopped fitting in one head right around the second job ad.Gemini draft · reviewed by a rep before sending

Pain score measures how stretched the company sounds from the job ad wording alone (out of 45). Overall tier combines the post with funding and headcount signals.

Company name and quotes are anonymized; all schema fields are from the production table.

Pipeline results

~80
meetings booked with US founders in under a month
tracked during tenure
32 → 453
qualified, send-ready leads generated in a single session with verified emails
logged in master sheet
17% → 95%
mobile number hit rate on the first batch after switching to the SyncGTM waterfall (282 cells found)
measured on live run
84 of 246
job ads asked for an "Executive Assistant" vs. just 3 asking for an "Operations Assistant"
job board messaging audit
Screen 1 of 3