I find where a business
loses revenue, then I build the system that fixes it.

AI Growth Lead at Oneday since Feb 2025 · Previously Head of B2G Growth at AiCore · UK-based, fully remote

  • Find the leakI own the funnel numbers for a whole company, from paid lead to cash collected, and report them to leadership.
  • Build the fixI write the production software myself: SMS booking agents, a sales dialer, call scoring and feedback for three teams, pre-call briefs, an application portal, automated onboarding.
  • Prove it97 live services across five teams, from the first text to a lead through to enrolment. Two SMS agents have booked 2,300+ sales calls since April 2026. 17,000+ sales calls scored.
Case studies
Six systems, each with what broke and what changed.
01 — Range

Zoom out to find the leak. Zoom in to build the fix.

A revenue problem looks different from the boardroom, from the service map and from the code. I work at all three. Pick an altitude and follow one real problem through every level.

Click a level, or use the arrow keys.

Business: find the leak, price it, decide.

I own the funnel numbers for the company and report them to leadership. The work is asking the question the dashboard can't answer, getting a clean read on it, and turning it into a decision somebody acts on this week.

What I do here

  • Cost per enrolment by channel, not cost per lead, rebuilt from lead to cash by cohort.
  • Why a cohort is tracking short: volume, conversion or timing, stage by stage, with partial months marked.
  • Who we actually close versus who we think we sell to.
  • Spend forecasts within 4.1% at day 25 of the month, over a 30-month backtest.
weekly memo · leadershipillustrative

Finding. Opt-outs spiked for leads in one US timezone. Lead volume and copy were unchanged.

Cause. The booking agent was offering early-morning slots in the lead's local time. People were being texted a 3am meeting.

Decision. No new copy, no new spend. Fix the slot logic at the source, audit every path that offers a time, and re-contact the affected leads with a human.

Systems: know which service owns the problem.

Each stage of the sale runs on software I built, integrated and operate. When something goes wrong, the question is which service, which rule, and who it touches, before anyone writes a line of code.

What I do here

  • One service map: 97 services across seven stages, 78 of them on a schedule.
  • One data layer every service reports into, so the business view above comes from the same numbers the systems run on.
  • Checks that watch the systems themselves: dead integrations, dropped messages, jobs that report success while doing nothing.
1 · New leadAI text agent qualifies and books the first calloffers time slots
2 · First sales callCalls transcribed, scored, coached weekly
3 · Expert callPre-call brief, quality score, no-show rebooking
4 · Final callSecond agent books the final calloffers time slots
Re-engagementCold leads and missed calls followed upoffers time slots
5 · Application & collegePortal replaces a manual flow, synced to the college

Code: make the wrong thing impossible to compile.

Rules in a document get forgotten. Rules in the type system don't. When a lead was offered a 3am slot, I didn't add a check. I made it so no code path can offer a slot that hasn't passed the daytime filter.

What I do here

  • Guardrails live in types and deploy checks, not in a wiki.
  • Every incident ends with a rule and a query that proves it hasn't come back.
  • Production from day one: opt-outs, timezones, retries and human handover built in.
_shared/slot-picker.tsTypeScript · Deno
// A slot that has passed the lead-local daytime filter. Nothing else can be one.
type DaytimeSlot = Slot & { readonly __daytime: unique symbol };

export function pickOfferSlots(pool: Slot[], lead: Lead): DaytimeSlot[] {
  const tz = resolveLeadTimezone(lead);   // area-code inference when unknown
  return pool
    .filter(s => hourIn(s.start, tz, 8, 21))
    .map(brand);
}

// Every sender takes the branded type. An unfiltered pool is a compile error.
export function sendSlotOffer(lead: Lead, slots: DaytimeSlot[]) { /* … */ }
02 — What's running

One funnel, seven stages, every arrow is software I wrote.

The company sells a degree programme. A lead talks to a salesperson, then an expert, then has a final call, pays, completes an application, and is enrolled with the partner college. Where a dashboard existed I replaced it with a system that acts. Where nothing existed, I built it.

Paid leadMeta · Google → CRM First sales callbooked by AI agent Expert callbriefed · scored Final callbooked by AI agent Paymentconfirmed · chased Application portalmanual → automated College enrolmentsynced, no re-keying human handover · opt-out first · quiet hours · send limits per line attribution · cohort reporting · anomaly detection · daily digests, across every stage
leaddatahuman
Paid leadMeta · Google → CRM
First sales callbooked by AI agent
Expert callbriefed · scored
Final callbooked by AI agent
Paymentconfirmed · chased
Application portalwas manual · now automated
College enrolmentintegrated · no re-keying
Underneathhuman handover · opt-out first · attribution · anomaly detection

Agents that hold the conversation and book the call.

Two agents, two calls. The first texts a new lead and books the first sales call. The second picks up once the lead is accepted and books the final call, across several phone numbers. Before them, 53% of lead messages went unanswered by reps.

2,332sales calls booked · 17 Apr to 1 Nov 2026
14,926leads handled by the first-call agent
4.4%opt-out rate across those conversations
  • Personalised qualification from a knowledge base, with intent classification and a validator on every reply.
  • Time slots in the lead's timezone, daytime only, booked straight into the calendar, with a re-offer when a slot gets taken.
  • Re-engagement for cold leads, deferrals when a lead names a week, morning handover to a named human with the full thread.
  • Compliance as code. Opt-out detection runs before any routing. Quiet hours, dedupe, retries and a firewall so the bot never speaks on a human-owned thread.
Read the case study
send guard · every outboundpass
opt-out checked firstalways
lead-local hour 8am-9pmtz inferred
daytime slots onlytyped
one open offer per leadenforced
per-line send budgetmetered
human thread → bot silentfirewall

Sales calls scored, reps coached from their own calls.

Salespeople, the experts who take the second call, and the finance team each get their own dashboard. Call transcripts are joined to CRM outcomes, scored by an LLM against a rubric I developed on real calls, and turned into specific coaching actions.

17,348calls scored · 8,310 sales · 7,694 expert · 1,344 finance
97people covered · 12 sales reps, 80 experts, 5 finance
12.4% vs 0%win rate, top-tier vs bottom-tier lead score · 784 calls
  • A dashboard per rep with weekly reviews and a manager summary every Monday.
  • Flag emails when a call goes wrong, and a personalised brief to each expert about 30 minutes before their call.
  • The scorer is never told the outcome. Scores that know whether the deal closed are circular, so they don't.
  • Mock-call assessments for sales hiring, built on the same scoring engine.
Read the case study
illustrative call score · advisor · 23 minrubric v3
Discovery depth
8.2
Objection handling
6.1
Programme accuracy
9.4
Clear next step
4.5
coach: no concrete next step agreed before close. Model phrase suggested in rep's cockpit.

A manual application process, replaced with a portal wired into the college.

After payment, every student had to be enrolled with the partner college. That used to mean staff chasing documents over email, re-keying them into the college's system by hand, and nobody knowing where any application stood. I replaced the process end to end.

1,183students onboarded · since 27 Jul 2026
6.7% → 11.5%deals won within 5 days of booking · p = 0.03
27.5 → 17 daysmedian from win to financial-aid confirmation
  • Application portal where the student uploads documents, completes each step and sees their status, instead of emailing a person.
  • Integration with the college so application and enrolment records move between our systems and theirs without re-keying.
  • Automated checks and chasing. Missing documents, transcript evaluation and payment steps are tracked on real status and chased by text and email.
  • Staff see one board of every application and what it is waiting on, so the humans handle exceptions instead of admin.
Read the case study
application flow · before → afterillustrative
Before · manual

Student emails documents to a staff member

Staff re-key details into the college's system

Status chased by email, one student at a time

Missed steps found at enrolment deadline

After · automated

Student uploads and completes steps in the portal

Records sync to the college's system automatically

Status visible to student and staff, chasers automatic

Missing steps flagged the day they are missed

One version of the truth, and an alarm when it breaks.

Reporting rebuilt so lead-to-enrolment is measured one way. Then a layer that watches the systems themselves, because a scheduled job that says "succeeded" can still be doing nothing.

203,521automated emails to 50,829 people · 162 templates
5,755findings from 25 monitors · 286 high severity
216 + 32dropped texts and night-slot offers caught by the first scans, then fixed
  • CRM kept in sync with the operations database and the marketing tool, both ways.
  • Automated checks for dead integrations, dropped messages and silent job failures, with a daily digest to the owner.
  • Leadership reporting and weekly memos: cost per customer by channel, who we actually close, why people miss calls, where to spend next.
  • Every incident becomes a rule. A written guardrail plus a saved check that re-runs daily and fires if the same failure pattern comes back.
Read the case study
illustrative QA sweep · one morning7 detectors
okcalendar webhook · 41 events · 0 unmatched
okinbound texts · 312/312 answered or routed
warnconfirmation coverage 71% · threshold 90%
firenightly sync: 'succeeded' but 0 rows, 3 runs
oknight-send guard · 0 sends outside hours
sentdigest → owner · 2 findings · 1 new
03 — Contact

Hiring for GTM, Growth Engineering or RevOps? Let's talk.

Remote, from the UK. Happy to walk through any of these systems live, architecture and numbers included, in 15 minutes.