tomwilliamson.id.au
← All work

Brennan Deal Coach

An AI sales agent built in Microsoft Copilot Studio that turns Teams discovery call transcripts into structured deal intelligence for the Account Management and Business Development teams at Brennan. I built the whole thing end to end as a single-builder project: product design, prompt engineering, agent architecture, Power Automate flows, SharePoint persistence, regression testing and pilot readiness.

v1 reached too far and hit a wall. The version that ended up in pilot was the one I rebuilt inside Copilot Studio's actual limits rather than the ones I'd assumed. Adoption and data security shaped almost every design choice. It's the hardest thing I've shipped and the one that's taught me the most about getting an AI agent across the line inside an enterprise.

View demo · opens in a new tabDeal Coach output (demo)The five-section analysis a rep sees after pasting a discovery transcript: CRM Inputs, Presales Request, Qualification Gaps, Follow-up Email and MEDDIC Snapshot. Synthetic deal, fictional names.Open →

The gap

Reps were running discovery calls in Teams and getting the standard Microsoft 365 Copilot recap at the end. Fine as a summary. Not much use as a sales artefact. The recap doesn't know about Brennan's CRM, the Presales practices, MEDDIC or what got said on the previous call.

The result was a familiar gap. A rep would leave a call with a five-minute Copilot summary, then spend 30 to 45 minutes turning it into CRM updates, a Presales request, a follow-up email and a read on whether the deal was actually qualified. Most of that work got skipped under load, with CRM data going stale, Presales requests landing thin and follow-ups going out generic.

Brennan Deal Coach was scoped to do that conversion deterministically. Paste a transcript, get a five-section analysis structured exactly to Brennan's process: CRM Inputs, Presales Request, Qualification Gaps, Follow-up Email and MEDDIC Snapshot. Persistent per-rep deal memory so the second call builds on the first. None of that exists in generic Copilot and none of it can be retrofitted with prompt instructions alone.

V1 set its sights too high

V1 ran the full five-section analysis in a single LLM call against the orchestrator. The agent received the transcript, the system instructions described all five sections at once and Claude Sonnet produced the entire artefact in one pass. Output arrived as a complete document with six markdown tables, eight to ten qualification gaps, a six-row MEDDIC matrix and a drafted follow-up email.

In parallel the agent was meant to:

It was the right product. It was the wrong amount to ship in turn one.

Where it broke

It broke at perceived latency first, then at silent failure.

The full analysis took roughly 110 seconds end to end. Reps drop off at the 15, 30 and 60 second silence cliffs. In test sessions reps were assuming the agent had hung well before the output arrived.

Then a worse failure surfaced. On certain MEDDIC-rich transcripts the agent would think for two minutes and produce nothing at all. No error, no partial output, no signal. Just a stalled thinking indicator and a confused rep. Diagnostics narrowed the root cause to the orchestrator auto-invoking Work IQ Mail mid-analysis on transcripts dense enough to trigger Champion-related tool calls. The tool call would sit waiting, the analysis would never complete, the conversation would die.

Silent failure isn't pilot-acceptable behaviour for a sales tool. That was the moment the v1 architecture stopped being viable.

The Copilot Studio limits I hit

A few of these are worth documenting because most builders find them the hard way.

Character ceilings are hard and silent. Agent Instructions cap at 8000 characters. Topic trigger descriptions cap at 1024. There's no soft warning. Trim happens silently and behaviour drifts without explanation.

No token streaming. Generative output buffers until complete then renders in one go. The 110-second wait wasn't a configuration issue. It was the platform.

The orchestrator can't autonomously produce follow-on responses after a topic ends. Every LLM-generated response has to be tied to a fresh user turn. A two-turn split design (headline now, coaching context after save) was invalidated by this rule.

No AI Builder licence, no Azure OpenAI tenant access for non-admins, no Generative Answers in the Brennan environment. The available LLM primitives reduced to one pattern: a topic with OnRecognizedIntent, the prompt encoded as the topic's modelDescription and the body kept silent on success. Any SendActivity on the executed path suppresses generation. Once that was clear, this became the build pattern for every section topic.

A handful of smaller traps (silent overwrites in SetMultipleVariables, same-turn redirects suppressing chat output, Monaco virtualising long YAML) each cost me half a day to track down the first time. Most platforms have edges like these. Copilot Studio's edges are more numerous than the documentation suggests.

V2 stopped trying to be one big thing

The rebuild swapped the monolith for five smaller things, rep-controlled.

After the rep pastes a transcript, the agent extracts it in 16ms via an Express-mode flow and presents five buttons. The rep clicks the section they need. Each section generates as its own LLM call against its own narrowly scoped topic, returns in 30 to 60 seconds and re-prompts with the remaining buttons. The rep can stop after one section or work through all five.

Work IQ Mail enrichment moved from orchestrator auto-invocation to an explicit button on the deal view. The rep types a subject keyword. The search runs. Only extracted insights (Champion mentions, decision criteria signals, MEDDIC qualification signals) get persisted to the deal record. No more auto-invocation. No more silent failure.

The five-section output shape stayed exactly the same. The data model, archive schema and CRM mappings didn't change. What changed was the delivery model. Reps drive when each section generates instead of waiting on a slow monolith.

Per-rep persistent state continues to sit in SharePoint as JSON, one file per rep, keyed by UPN. Won, lost, switch and resume flows all hang off that single archive.

What it does now

For Sales

A BDM finishes a discovery call with a prospect. Inside Teams, they paste the transcript into Brennan Deal Coach and click "CRM Inputs". 40 seconds later they have an Account, Primary Contact, Opportunity Owner, Practice, Budget, MRR, Set-up Fee, GP% and Target Close, with every "Not discussed" field flagged and a verbatim Problem Statement quote.

They click "Follow-up Email". 50 seconds later they have a draft using the customer's own words on pain and timeline, ready to personalise and send. Total time from end of call to CRM-ready and email-out is under three minutes. The deal saves to their archive. Next time they open Deal Coach they get a Welcome Back card showing the deal context without re-pasting anything.

For Presales

The same rep clicks "Presales Request". The output flags whether Pre-Sales is needed, identifies which specialist Presales team should pick it up and attaches the Problem Statement verbatim, Required Outcomes, Budget, Tech and Skills required, Competitive Landscape and Decision Deadline. Presales receives a request pre-routed to the right specialist team with the customer's actual language attached. Quality of intake jumped, triage time dropped and Presales stopped receiving two-line requests that needed a follow-up call before any work could start.

The MEDDIC Snapshot does adjacent work. It tags every element (Metrics, Economic Buyer, Decision Criteria, Decision Process, Identify Pain, Champion) as Confirmed, Partially qualified, Incomplete or Missing, with customer-verbatim evidence in the Evidence column. If qualification scores below 40% the agent recommends more discovery before raising a Presales request. That single rule does real work. It stops thin deals from consuming Presales capacity.

Adoption and data security as design constraints

A few choices that shaped the product:

Per-rep storage isolation. Each rep's deal archive lives in a folder named by their UPN. One file per rep. A shared service-account SharePoint connection authenticates writes but the file-path keying enforces isolation. No cross-rep data access.

No fabrication discipline at the prompt level. Every section prompt instructs the model to mark unknowns as "Not discussed in this call" or "Inferred from", never to invent values. Customer-verbatim quotes carry Problem Statement and MEDDIC Evidence to keep grounding tight.

Explicit save control. The agent never auto-saves. Every save is a deterministic Yes/No on a Confirm Save topic. Reps can paste a transcript, get the analysis, decide it isn't a real deal and walk away without writing anything to storage.

No customer email retention. When Work IQ Mail is invoked, only extracted insights persist to the archive. Full email bodies stay in Outlook.

Adoption-led surface. The five-button section model is adoption-led, not engineering-led. Reps who only ever want CRM Inputs and a follow-up email get exactly that in 90 seconds. Reps who want full MEDDIC coaching get it on the same surface, in the same conversation, with no different agent to learn. The cognitive cost of using Deal Coach for a quick task is roughly equivalent to dictating into Teams.

What's next

Copilot Studio proved the product. It isn't the right home for what's coming next.

The platform constraints that shaped v2 will keep shaping v3 and beyond. No streaming. The 8000-character Instructions ceiling. The single-LLM-call topic model. No source control, no automated tests, no CI/CD, no structured observability, no environment promotion path. Every change is a manual canvas edit in a web app.

The product itself is outgrowing the surface too. Multi-agent workflows, agent-to-agent handoff, action chains, longer-running tasks that span hours instead of seconds, custom Teams app surfaces, deeper Microsoft Graph integration. None of those are reachable from Copilot Studio. All of them are first-class in the Teams AI Library plus Azure stack.

The plan is to ship the Copilot Studio pilot, get six to eight weeks of real product signal from reps, then make the case for v2 architecture on Teams AI Library plus Azure AI Foundry plus Microsoft Graph plus SharePoint REST. The build work goes to engineering with a proper TypeScript developer. Product ownership stays with me. That's the right shape of investment once there's pilot data to back the platform move rather than a mid-build pivot on a hunch.