Chicago, IL · GTM Engineering & AI Automation

Most AI projects die in production. Mine don't.

More than 80% of AI projects never reach production. RAND, 2024

150+ in production, still running. The demo is the easy part. Systems die later, on real data, at real volume, on the edge cases nobody thought to test. I build the dedup, the guardrails, and the failure handling nobody films, because that's what decides whether something survives week two.

Lahjat: live and playable ↗ context-kit: clone and run ↗ ~60s: a sentence to a live, deduped campaign
The premise

The model stopped being the hard part a while ago. The hard part is working out what one person does all day, then building something that does it for them and keeps doing it long after launch. I came to this through linguistics, the study of how meaning gets built and how it falls apart. Making an AI system behave is the same problem. Precise language in, predictable behavior out. Plenty of people can write the code. The rare part is taste: knowing what to build, what to keep boring and deterministic, and what to leave alone. Most of my best decisions were things I talked someone out of.

What I work on

Three currents, often running at once

01

AI Automation

Workflows that triage, enrich, decide, and act on real data. I build deterministic systems where reliability is the point, and agentic ones where the reasoning earns its cost. Choosing between the two is most of the work.

n8nLangGraphPythonClaude / OpenRouterRAGSupabase
02

Marketing & RevOps

I close the distance between marketing activity and revenue. I wire the GTM stack end to end and report on what moves the number, not just what's easy to count. Direct-response instincts in the Halbert/Kennedy tradition, applied to systems instead of single letters.

SalesforceActiveCampaignApolloInstantlyDirect response
03

Language & Structure

Trained linguist, phonetics specialization. I write prompts as specifications rather than requests. Precision at that step is what everything downstream depends on.

LinguisticsPhonetics / IPAPrompt architecture
العربية
Arabic→ C1
/ˈʕarabiː/
Deutsch
Germanfluent
/dɔʏtʃ/
Español
Spanishconversational
/espaˈɲol/
Patterns, not promises

What "production-grade" actually means

A demo runs once, on stage. A system runs every day, on real data, when no one's watching. The difference is dedup logic, hallucination checks, brand-voice enforcement, and false-positive reduction.

Time to live
~60s
From a free-text customer description to a live, deduplicated outbound campaign
Signal, not volume
22,191 391
Cold CRM records read against a written ICP, returned as contacts with a verified signal and a named buyer. Every one human-audited before it counted
Volume shipped
150+
Systems in production, doing work every day
The stack I build with
How I think about it

Principles I build by

Specificity beats generality

General-purpose AI rollouts look impressive and go unused. Systems built around one real workflow get used. I'd rather solve one person's task completely than gesture at solving everyone's.

The boring parts are the product

Deduplication, validation, error handling, voice enforcement. Nobody demos these. They're the reason a system survives contact with reality.

Deterministic until proven otherwise

Agentic architecture is a tool, not a default. Most problems want a reliable pipeline. I reach for autonomy last, not first.

Language is the interface

What an AI system produces is capped by the precision of what you feed it. That's a linguistics problem before it's an engineering one, and it's where most implementations bleed.

Selected systems

Four surfaces of a GTM stack, and what I built on each

Pipeline generation, signal and routing, data and context, intelligence and enablement. Each surface gets one system described in full, with the rest of that surface underneath it. All anonymized: no clients, no revenue figures. The logo behind a system is the least interesting thing about it.

01 Pipeline generation

Turning an idea of who you want to reach into contacts a rep can actually work, without a data team standing in the middle of it.

Free-text → live campaign engine

A sentence becomes a deduplicated outbound sequence in about a minute

Multi-stage n8n pipeline
Web frontend
LLM for language
Quality gates ahead of enrichment
Enrichment + CRM dedup

You type a plain-English description of who you want to reach. The system parses it into structured targeting, pulls and enriches matching prospects, writes a multi-step sequence in a defined brand voice, checks its own output for hallucinations, dedupes against the CRM, and pushes it live. Sentence in, campaign out.

The unglamorous middle is where the value sits. Enrichment runs after the filters, not before, so credits only go to prospects that already cleared geography, freemail, and role checks. That cut data cost per campaign by about two thirds. Bad-fit contacts get diverted rather than dropped, because a list you can audit beats a list that looks clean.

This is not an agent, and that was deliberate. The LLM does the language; the orchestration does the thinking. Autonomy would have demoed better and broken more.

Also on this surface

Dormant-database revival

A six-stage pipeline read 22,191 cold CRM records against a written ICP and returned 391 contacts across 72 accounts, each with a verified buying signal and a named buyer, capped at ten per account so no one logo swamps the sequence. A human audited every signal before it counted. The whole run cost under three dollars in model calls. Compute was never the constraint. What matters is whether the CRM holds enough firmographic detail to reason over, and without that you're asking a model to guess and calling it enrichment.

Thin-market sourcing

A scraper CLI with typed, schema-validated extraction for the segments the standard data vendors cover badly. When coverage is the bottleneck, buying more credits doesn't fix it.

02 Signal & routing

Catching buying intent while it's still intent, deciding whether it's real, and putting it in front of a rep before it cools.

Inbound signal → qualified alert

Buying interest gets scored, checked against the CRM, and researched before a rep is ever pinged

Marketing automation as the sensor layer
Weighted scoring with time decay
n8n orchestration, multi-stage
LLM qualification gate, structured output
Enrichment + research, gated on verification

Ten high-ticket industrial product lines, each with its own tells: the spec page read three times in a week, the case study downloaded, the comparison guide opened, the webinar attended. The marketing automation platform already sees all of it and files it as activity. Activity isn't intent. This weights every action by signal strength and by the size of the deal behind it, then decays the scores, so "hot" means hot now and not hot in March.

A score still isn't a lead. Before anything reaches a person, each signal is read against live CRM history: internal traffic, a contact we surfaced last month, an existing customer re-engaging, an open opportunity a teammate is already working, or a real conversation about this exact product in the last ninety days. Only what survives gets enriched, researched against the open web, and assembled into one alert that says who they are, what they're looking at, and why the system thinks it's new.

False alarms cost more than missed leads. Ping a rep about an account a colleague already owns and they stop trusting the system inside a week, and after that every real alert reads like noise. So qualification fails closed, surfacing only on evidence of net-new interest, while enrichment fails open, because a lookup hiccup should never bury a real lead. Research runs only after a contact is independently verified. An unmatched name goes straight to notification rather than handing a guess to a model that would happily invent a biography.

I built this on ActiveCampaign because that's what the stack ran, but nothing in the architecture is specific to it. The platform is a sensor and a tag store; the same wiring sits on HubSpot or Marketo without the logic changing. And it compounds. Every campaign, landing page, and content asset you ship afterwards becomes another sensor feeding the same engine.

Also on this surface

The outbound twin

Same philosophy pointed at correspondence instead of web behavior. An LLM classifier reads inbound mail for expansion signals inside accounts we already serve. Detection is easy. Restraint is the hard part. A classifier that fires on everything is noise wearing a useful costume, so the whole thing is tuned around what it declines to surface.

03 Data & context foundation

The layer every other system reads from. Get it wrong and every tool invents its own version of the truth.

Context infrastructure

A version-controlled context layer injected into every AI call a company makes

GitHub repo, structured markdown
Composable core / catalog / department layers
Slack-native slash command surface
Reviewed like code, because it is

A prompt library collects answers. This holds the source of truth. One repo of structured markdown (ICP, personas, voice, the claims the company never makes) composed in layers and injected into every AI workflow in the org. Anyone can pull it from Slack with a slash command. Nobody can fork it in private.

Hallucination is a context problem before it's a prompt problem. A model fills gaps with plausible fiction when nobody hands it the source of truth. Versioning that truth like code turned drafts that needed three rounds of correction into drafts that come back clean.

The production system stays private, so I rebuilt the architecture in the open. It's a runnable reference with an assembly engine, CI budget enforcement, and a fictional company in place of any client. Clone it and run it.

Inspect the reference build
Also on this surface

A gateway in front of the CRM

Nothing I build writes to Salesforce directly. Reads and writes go through a secured service-account gateway, so access is scoped and revocable in one place instead of scattered across a dozen workflow credentials. Boring, and the reason security signs off.

Lead intake as an application

A spreadsheet template that everyone downloaded, filled in wrong, and re-downloaded whenever it changed, rebuilt as a small web app that validates against live CRM state at entry. Most internal tooling wins are like this. You don't make the tool smarter, you make it harder to use wrong.

04 Intelligence & enablement

Research that arrives before anyone has to go looking for it, in the place they already work.

Account intelligence → sales floor

One Slack command returns an account brief that already knows what you sell them

Slack slash command (async webhook)
n8n parallel fan-out / merge
Version-controlled context, fetched at runtime
Open-web research + CRM state, fused
LLM synthesis, Claude via OpenRouter

A rep types a company name into the channel they already live in and gets a structured brief back seconds later: ICP fit, likely buyers, application match, recommended products, and the thing most research tools skip, the relationship. Net-new or existing? What do they already own? Is a teammate working open pipeline there? The command fans out in parallel, reads the company's public footprint from a live research API, pulls demand-side truth from the CRM, composes both against a version-controlled context layer, and posts back to the same thread.

Most research bots summarize a website. The work here was the join. Supply-side signal from the open web meets demand-side reality from the CRM, so the brief can warn a rep they're about to walk into a deal a colleague already owns. Context files are read from a versioned repo at request time, never pasted into a prompt, so one edit propagates to every brief the team will ever run. Customer data stays walled off from model training by default. Nobody asks for that one, and it's why the system got approved.

Also on this surface

Weekly competitive dossier

Seven sources per competitor (site diffs, newsletters, RSS, and four social surfaces) collected on a schedule and synthesized against our own positioning rather than summarized in isolation. The output is three sections: what's happening, what it means for us, and what to do about it. Competitive intel goes stale because keeping it current is a chore, so I stopped making it one.

Video intelligence

Scrapes the best-performing videos in a niche over the last ninety days, ranked by outlier score against each channel's own baseline rather than raw views. A million views from a channel that always does a million tells you nothing. It pulls the transcripts, writes a breakdown card per video, then synthesizes a winning-formula document across all of them: the hooks, structures, and angles that did the work. Content strategy from evidence rather than instinct.

RAG assistant + AEO/GEO pipeline

Two halves of one problem: getting grounded answers out of a body of source material, and structuring published material so answer engines surface and cite it correctly. Retrieval is where most RAG fails, because a fluent answer over the wrong chunk is the most expensive kind of wrong. So the effort went into grounding and citation rather than the generation layer. The public-facing half turned answer engines into a measurable referral channel that compounds year over year.

Work with me

Working together

I take a small number of engagements. The work is project-based: fixed scope, a shipped system, and documentation so you own what we build. If you're running a B2B sales or marketing motion and the top of your funnel is manual, expensive, or both, that's the problem I solve.

Start with the pipeline diagnostic
A build with my name on it

Everything above is anonymized. This one you can play.

Client work stays private. Lahjat doesn't. I designed and shipped it end to end, and it's the clearest proof I have that the linguistics training does real work.

A GeoGuessr for Arabic speech. Hear a clip, drop a pin, find out where the voice is from.

The interesting decision is in the scoring. Arabic dialects don't follow national borders, so the data model doesn't either. Cities sit in roughly 37 linguistically motivated clusters, so guessing Mosul for an Aleppo clip scores better than guessing Baghdad, even though Baghdad is closer on the map, because Mosul and Aleppo share qeltu features Baghdad lacks. Geography is the obvious model. It's also the wrong one.

Every guess feeds an accuracy-weighted, crowd-tagged corpus of dialect audio as a byproduct. The thing teaches while it collects.

Next.jsSupabaseMapboxVercel
Play Lahjat ↗
lahjat.app
lahjat.app. Live, playable, and mine.
The newsletter

Signal,
Not Noise

One real system per issue: what it does, the architecture decision behind it, and what broke before it worked. If you build automation for a living, or want to, this is tuition I already paid, free. No hype, no headline roundups.

Your information is protected. Unsubscribe at any time.
Get in touch

Say hello

Have a project, a question, or just want to talk shop? Send a message and I'll get back to you personally, usually within a day or two.