Rasul Shaikh · Supy GTM Case Study
See the ABM examples →

Built for the Supy GTM Engineer case study

A real system, not a deck.
UK and KSA, side by side.

36 real companies, sourced, gap-handled, enriched, scored, and stored against live data throughout, not mocked. KSA's data coverage measured thinner than the UK's in this exact run, 47% vs. 74% first-pass match, and that finding changed the actual approach for that market, not just the numbers in a slide.

Stack used in this build

ApolloApifyFirecrawlProspeoFindymailBetterContactClaySupabaseSmartleadMiniMax

Real companies

36

19 UK, 17 KSA. 29 with a real waterfall-verified contact.


Send-ready, not sent

18 leads

DRAFTED in Smartlead, every lead also globally unsubscribed. One authorization away from live.

74% / 47%
First-pass match, UK vs KSA
same provider, measurably different coverage
4 signals
Scoring rubric
size fit, multi-brand, data confidence, reachability
29/36
Verified contacts
Prospeo → Findymail → BetterContact waterfall
18
Smartlead leads, DRAFTED
real copy, deliberately not activated

Bonus · 3:10 narrated walkthrough

A narrated tour of this system.

Neural voice narration (MiniMax) over the real screens: the pipeline, the scoring engine, the Supabase system of record, and the honesty boundary around Smartlead. The required Loom still gets recorded separately, in my own voice. This is a bonus asset only.

The pipeline

Source. Handle the gap. Enrich. Score. Route.

TAM definition feeds both markets through Apollo. UK matched clean. KSA didn't, so the pipeline branches: Apify Google Maps and Serper find the company, Firecrawl reads the real site, and Apollo gets retried on the corrected domain before anything is stubbed.

Stage 1

Source
Apollo domain-enrich

UK: 74% first-pass match. KSA: 47% on the same provider, same method, real and disclosed, not smoothed over.

Stage 2

Gap-handle (KSA only)
Apify Maps → Firecrawl → retry

6 of 8 KSA gaps fixed via cross-check: Google Maps finds the company, Firecrawl reads the site, Apollo retries on the corrected domain. What's left gets stubbed and disclosed, not guessed.

Stage 3

Enrich
Prospeo → Findymail → BetterContact

29 of 36 companies land a real verified contact. 2 were recovered mid-build by finding the real mail domain via direct DNS lookup after the .com domain returned no MX record at all.

Stage 4

Score & route
4-signal rubric → Clay → outbound

Size fit, multi-brand complexity, data confidence, reachability, each 0-25. UK routes to email/LinkedIn. KSA routes to WhatsApp/Instagram, a reachability finding, not a stylistic choice.

The finding that changed the plan

Why one playbook doesn't work for both markets.

This isn't a stylistic choice or a hedge, it's what the data actually showed once real sourcing ran against both markets.

United Kingdom
74% first-pass match

Clean data, real names, real emails, high confidence. Efficiency-first tone works: email and LinkedIn-led, 3 real non-template touches.

Saudi Arabia
47% first-pass match

About 43% of sourced companies needed manual verification before they were even workable. Verify-first, relationship-first tone, WhatsApp and Instagram-led, not email.

scoring/score_engine.py

Four dimensions, 0-100, run on all 36 real rows.

Same rubric-and-routing pattern used elsewhere in production, run here against real sourced data instead of a mocked sample.

Size fit (0-25)

Sweet spot: 50-2,500 employees. Too small means no real procurement complexity to solve. Too large (10,000+) usually already runs enterprise procurement software, a much longer sales cycle.

Multi-brand signal (0-25)

Keyword-detected evidence of multiple concepts under one operator ("Zizzi, ASK Italian, ChopHouse"). More brands through one back-of-house means more SKU/vendor complexity, the actual pain the product solves.

Data confidence (0-25)

How the row was sourced: clean Apollo match > corrected-after-gap match > Google-Maps-only fallback > stubbed. A data-quality signal that controls how much outbound effort goes in before further verification.

Reachability (0-25)

Does the row have a real verified contact path at all: LinkedIn URL present (+15), phone present (+10). Zero padding for a row with neither.
Tier routing

75+, Tier 1: priority outbound, verify contact manually first.

55-74, Tier 2: standard outbound sequence.

35-54, Tier 3: nurture / batch outbound, low individual effort.

Below 35: not yet, data too thin, re-source before working.

outbound/intent_signals.md

A contact-led list says "I found you." An intent-led one says "something changed."

Every signal below has a real, dated source from research already run for the contact waterfall, reused for a second purpose, not new fabricated signal. Where nothing real was found, the company is left off this list rather than padded out.

CompanyMarketSignal
Epik FoodsKSA$15.5M raised (Ruya Private Capital, Nov 2024), earmarked for a 20-restaurant Riyadh/Jeddah/Dhahran expansion. Strongest signal in the dataset.
Tasty plc / Bow StreetUK£9.25m raise (Aug 2025) plus a new exec chairman (David Page, ex-PizzaExpress CEO) with a publicly announced expansion strategy.
The Azzurri GroupUKExclusive Dave's Hot Chicken JV, 180 restaurants across 10 countries (Sept 2025), against a £2.7m operating loss from launch costs. Real Head of Purchasing contact found.
Al Hokair Group → BAANKSANew Group CEO (March 2024) plus a full corporate rebrand and a new NEOM food/catering division. Real change-management window.
Honest BurgersUKBad-timing flag: three CEOs in ~18 months. Deprioritized despite a workable firmographic score.
Boparan Restaurant GroupUKBad-timing flag: CEO stepped down, no replacement named. Deliberately not pursued.

The static rubric has no timing dimension. These real signals move Epik Foods and Tasty/Bow Street Group up regardless of score, and move Honest Burgers and Boparan down regardless of score, a manual override applied honestly, not built into the scoring code as false precision.

Proof

The top of the list, unfiltered.

All 36 rows are real, sourced and scored the same way. These are the highest scorers across both markets.

CompanyMarketScoreTier
MJS HoldingKSA100Tier 1
Epik FoodsKSA100Tier 1
Takara Hospitality GroupKSA95Tier 1
MFCKSA95Tier 1
Leylaty Hospitality GroupKSA95Tier 1
Al Khozama Management CompanyKSA94Tier 1
FBH GroupKSA90Tier 1
The City Pub GroupUK87Tier 1
Flat Iron SteakUK87Tier 1
Comptoir GroupUK87Tier 1
Al Hokair GroupKSA85Tier 1
The Azzurri GroupUK79Tier 1

Full 36-company scored list in companies_scored.csv. Static score only, see the intent-signal section above for the timing layer on top.

System of record & the one hard boundary

Real infrastructure, deliberately not activated.

This system would, if activated, send real cold outreach to real UK and KSA companies under Supy's name. That's not a call to make without Supy's own authorization.

Supabase, system of record

companies, company_scores, contacts, outreach_events, sequences. 36/36/29/36, verified clean, plus a live Clay table via webhook.

Smartlead, DRAFTED + unsubscribed

18 real leads, real personalized copy per lead. Kept in DRAFTED status, and every lead is also globally unsubscribed as an independent second safety layer. Even if started, nothing sends.

Clay Workflow, native second build

find-contact → verify-email → draft-opener → push-to-Smartlead as an actual Clay Workflow graph, tested against real companies. Needs one manual trigger + Smartlead account connection in Clay's own UI, not API-accessible, the one genuinely open item.

outbound/reengagement_loop.md

What happens after 3 touches and silence.

The active sequence fires touch 1 (day 0), touch 2 (day 4), touch 3 (day 8), then stops. This is the real cadence for after that, with a genuine stop condition, not an infinite nurture loop.

Day 15
Grace period ends

7 days after touch 3 with no reply. Status moves from sent to no_response.

Day 36
Signal recheck, not a blind resend

21-day cooldown, then a WebSearch for a genuinely new signal, the same method that found Azzurri's and Hickory's real signals. New signal found: one fresh re-engagement touch. Nothing new: status goes to dormant.

The actual stop condition
One retry, not an unbounded loop

A re-engagement touch that gets no reply goes straight to dormant. No second attempt. Permanent suppression protects sender reputation more than a marginal reply rate is worth. Flagged for quarterly manual review only, human-in-the-loop, not an automated re-fire.

Bonus · beyond the brief

Two of the 36 pages, rebuilt in the prospect's own brand.

The 36 static landing pages already exist, sketchnote-styled, one template. These two go further: real brand colors pulled from the prospect's own site, an interactive procurement-savings model, and the real intent signal each company actually has, not a generic stat block.

UK · Tier 1 · Fresh JV signal
The Azzurri Group

Dave's Hot Chicken JV, 180 restaurants across 10 countries, against a real operating loss from launch costs. Real contact: Neil Westley, Head of Purchasing.

Open the example →
KSA · Tier 1 · Strongest signal in dataset
Epik Foods

$15.5M raised, earmarked for a 20-restaurant Riyadh/Jeddah/Dhahran expansion. Real contact: Khaled Fadly, CEO.

Open the example →

Disclosed on purpose

What's incomplete, and why.