Case Study Software services 18 min read

Sales Automation in six weeks: 1-hour prep → 10 minutes

Client: Ascendix (internal)

Ascendix internal: pre-call prep ~1 h → ~10 min, follow-up ~45 min → ~15 min. Native Microsoft Teams tab, Dynamics 365 + Microsoft Graph + Fireflies. Six weeks, six people.

Internal-verified. Built by our AI delivery practice for our parent group's own sales team. November 2025 launch. Numbers confirmed against production telemetry as of mid-April 2026.

Executive summary

We built a Sales Automation app for our parent group's own sales organization. It runs as a native Microsoft Teams tab and automates the workflow stages that eat reps' time: lead enrichment and routing, pre-call briefing, meeting summarization, CRM sync, and follow-up email generation. It integrates with Microsoft Dynamics 365, Microsoft Calendar, Outlook, Teams meeting transcripts, and Fireflies.ai.

Kickoff to production took six calendar weeks. The shape of the build matters more than the calendar headline: 578.5 hours across a six-person team, with one primary AI developer carrying roughly 60% of the code-effort using Cursor and Claude Code, the rest split across BA/PM, QA, and a second developer who owned the email-sequence module. The same custom-development team that ships software for external clients shipped this one for an internal customer.

In its first months in production, the system has processed 1,143 meeting analyses and tracked 13,353 meetings on the sales team's calendar. Per-meeting prep time dropped from roughly an hour to about 10 minutes. Per-meeting post-call follow-up activity dropped from about 45 minutes to about 15. Reps arrive at calls prepared. Follow-up emails go out consistently. CRM records update without manual data entry. The reclaimed capacity went into more prospect-facing work, not idle time. Every prospect interaction lands in Dynamics 365 as an audit trail.

The problem

The sales team lived in back-to-back meetings. The workflow had four failure points everyone on the team could name.

Reps arrived at calls unprepared. The CRM had data, but the workflow had no structured way to surface it before a call. Research didn't happen, not because it wasn't worth doing, but because reps didn't have time. You could see the result on the calls. Reps asked prospects questions they could have answered themselves with five minutes of prep.

Lead routing was mechanical. Incoming leads went to reps by product category, and the default routing path sent them to transaction-focused reps regardless of deal complexity or prospect seniority. Leads that needed a solution seller landed with a transactional rep. Time got burned, and conversion suffered.

Follow-up emails were inconsistent. Solution-selling playbooks call them mandatory. In practice, the team treated them as optional, internally calling them "a luxury, not something that was always done." A rep coming off three consecutive calls and walking into a fourth doesn't have the headspace to draft a detailed, action-item follow-up. Prospects often heard nothing after the meeting.

CRM data degraded silently. Meeting notes went unwritten, dates went unrecorded, and the CRM's reliability depended on rep discipline that didn't survive a packed week. Pipeline reviews surfaced leads with the wrong status, and somebody had to chase down what had actually happened.

None of this showed up as a quarterly disaster. It showed up as drift. The gap between what reps did with prospects and what the CRM said had happened widened over time.

The solution

The Sales Automation app automates five stages of the workflow.

Lead enrichment and routing. When a new lead comes in, the system enriches the record with company research (industry, employee count, business model, website data) via web search and appends the result to the CRM. The enriched data surfaces deal-complexity signals that tell us whether a transaction-focused rep or a solution seller should take first contact.

Pre-call briefing. Before each scheduled meeting, the system pulls together a briefing for the rep. Sources are configurable: web search results, the rep's email history with meeting participants (up to the last 50 messages), and CRM timeline notes on the Dynamics 365 contact record. Reps can write a custom prompt for a given meeting type or use the default template. They arrive at calls confirming context, not discovering it.

Meeting analysis and CRM sync. Once a transcript is available, the system generates a structured meeting summary: discussion points, participant analysis, sentiment, decisions, action items, next steps. The summary lands in the Dynamics 365 contact or lead record. The system also flags meeting participants who aren't in the CRM yet and surfaces them as suggested new contacts.

Fireflies.ai transcripts get analyzed automatically. Microsoft Teams transcripts need a manual trigger. That's a deliberate cost choice. We didn't want background analysis chewing through internal meetings; we wanted it scoped to external sales calls.

Follow-up email generation. From the meeting transcript, the system drafts a follow-up email with action items. For a single-touchpoint follow-up, the email lands as a draft in the rep's Outlook inbox. For prospects that need a longer nurture cadence, the system writes a sequence: 2 to 3 emails for a short cycle, up to 4 emails spaced over roughly four months for a long or complex one. Every email lands as an Outlook draft with a calendar reminder. Nothing auto-sends. The rep reviews and approves every outreach before it leaves the inbox.

Conversational CRM agent. A LangGraph state machine lets reps query Dynamics 365 in natural language: leads by status, contacts by company, opportunity history. The agent uses a plan-execute-reflect loop. It builds an execution plan, calls CRM tools to retrieve real data, checks whether the answer is complete, then responds. The reflection step constrains fabrication; the agent can only respond when its answer is anchored to retrieved data. That isn't a hard guarantee — it's a prompt and graph-state convention — but in practice it cuts the kind of hand-wavy answers an LLM gives when it's working from training-data-only context.

What changed

From late November 2025 through mid-April 2026, the system has logged the following telemetry.

  • Meeting analyses performed: 1,143
  • Total meetings tracked: 13,353
  • Active users: Sales team + leadership

What we measured — and what we didn't. This was an internal pilot with a single sales team and no control group. What we DO have measured: per-meeting prep time fell from roughly an hour to about 10 minutes; per-meeting post-call follow-up activity fell from about 45 minutes to about 15. We also tracked engagement volume (analyses run, meetings touched, features used) and collected structured qualitative feedback. What we DON'T have: controlled-comparison data on win rate, sales-cycle length, pipeline coverage, or revenue per rep — those require a defined baseline period and a holdout, which an internal pilot doesn't get. For an external engagement we run a different measurement plan: baseline period, defined holdout, eval datasets for extraction accuracy, and metric agreements signed off by the buyer's sales operations and finance leads. We talk through that plan in a Pulse Check call.

The qualitative outcomes below come from the CEO and members of the sales team, collected through structured feedback sessions and ongoing usage. They're reported as direct usage experience, not projections.

Pre-call prep dropped from ~1 hour to ~10 minutes per meeting. Solution-selling reps use the briefings consistently. The structured pre-call brief replaced a manual research step that previously took roughly an hour per meeting (when reps had time at all) with a 10-minute review of an auto-generated briefing. Leadership has been explicit that the value isn't only time savings: reps weren't doing pre-call research before at all, because back-to-back scheduling didn't leave room.

"It's not time savings — it's an augmentation and an enhancement of their preparedness, because they don't have the time to go in and do that, or they don't have the habit."

— the company's CEO

Meeting summaries became the most-used feature. Leadership describes the meeting summary as the feature that started the whole project. Adoption is broad and consistent among solution-selling reps. The CEO reviews summaries after almost every call. Several team members cite real time savings from no longer reconstructing call notes by hand.

"The meeting summary piece, which was what started this whole thing — I think everybody is extremely dependent on that. It saves colleagues a significant amount of time, and it saves me a significant amount of time. I review it almost every call."

— the company's CEO

Follow-up activity dropped from ~45 minutes to ~15 minutes per meeting. Per-meeting post-call work — drafting the email, capturing action items, updating the CRM — fell from about 45 minutes to about 15. The drafted email also raises the probability that a follow-up goes out at all and the quality of what gets sent. Leadership describes the post-meeting email itself as an accountability tool: a documented record of what was agreed that keeps both rep and prospect honest about what got committed on the call.

"Follow-up emails were a luxury, not something that was always done. There's a huge value in having this follow-up email being sent because it increases — it doesn't guarantee, but it increases — the chance that the follow-up email is going to be sent."

— the company's CEO

"I can't tell you how important it is for that follow-up email to have been sent because it is the anchor point and, candidly, the accountability tool. We had a 30-minute meeting, your time's valuable, my time's valuable, and we came from that with some action items. Let's make sure that 30 minutes isn't wasted by following up on the things we all agreed we would do."

— the company's CEO

CRM data quality improved. A transaction-focused rep handling high lead volume gave us written feedback flagging two concrete wins. Meeting summaries now deposit automatically into contact records, so manual note-taking is gone. The system surfaces contacts present in meetings but missing from CRM, which prompts timely record creation. The rep wrote that "instead of spending time manually updating multiple CRM fields after each call, the AI populates key information automatically," which frees capacity for prospect-facing work. The main limitation is a 24- to 48-hour transcript availability delay on Fireflies meetings, which cuts same-day utility for time-sensitive follow-up.

Audit trail in Dynamics 365. Meeting summaries, follow-up email records, and lead-status changes get systematically captured. Sales leadership now has visibility into pipeline activity, rep follow-through, and deal velocity it couldn't see before.

"All the while, because that data is being deposited into the CRM record, we have a breadcrumb trail of what's been said at a very detailed level, as well as what was communicated to the prospect after the meeting — to show evidence that we didn't just meet and then ghost them, we actually are engaging."

— the company's CEO

A note on adoption. Usage of the enrichment and briefing features is uneven. Transaction-focused reps handling higher lead volume use pre-call briefings less consistently than solution-selling reps do. Leadership treats this as a process question, not a product one.

How the system works

Three microservices run on Azure App Service: a FastAPI REST backend, a LangGraph AI agent service, and a React frontend built on Microsoft's Fluent UI. All three deploy as Docker containers and reach the user as a Microsoft Teams tab. Authentication runs through Azure AD single sign-on.

Meeting sync. A background worker (APScheduler) runs every five minutes per enabled user. It authenticates to Microsoft Graph with app-only Azure AD credentials, so syncs continue even when the user is offline. The worker fetches calendar events for a seven-day rolling window, detects new meetings, and writes them to MongoDB. Transcripts come from Microsoft Teams when available, with a Fireflies.ai fallback. Transcripts get cached to avoid redundant API calls.

Sales analysis pipeline. When a transcript is available, the system runs a multi-step pipeline that streams results progressively to the UI:

  1. Speaker extraction. Identifies which attendee said what.
  2. CRM lookup. Searches Dynamics 365 for each attendee by email.
  3. Company analysis. Extracts company name, searches the web for public data, cross-references with Dynamics accounts.
  4. Contact field extraction. Extracts phone, job title, LinkedIn, business role, interest level, and CRM-relevant fields, with confidence scores (0.0–1.0) mapped to Dynamics 365 picklist values.
  5. Mentioned contacts. Identifies people referenced in the conversation but not in the attendee list, then searches CRM for matches.
  6. Meeting insights. Generates summary, sentiment, decisions, action items, next steps.

The pipeline uses an OpenAI GPT model throughout, at temperature 0.3 for deterministic analysis. Results stream to the frontend as they complete, so reps see partial output in seconds instead of waiting for the full run.

CRM integration. Direct Dynamics 365 API integration, authenticated through Azure AD client credentials. The system can search leads, contacts, and accounts; create new contacts, accounts, notes, and email activities; update existing records; and retrieve picklist field values for accurate extraction mapping. Picklist values cache in MongoDB with a 24-hour TTL, so the analysis doesn't keep hammering slow API endpoints.

Conversational agent. A LangGraph state machine with a four-stage workflow: Plan (interpret intent and build an execution plan), Execute (call CRM tool functions to retrieve real data), Reflect (decide if the answer is complete or needs more data), Respond (generate a final, grounded answer). The reflection step constrains fabrication by tying the response to retrieved data. It's a graph-state convention, not a hard guarantee — but in practice it sharpens what the agent actually does on a query.

Scope and data handling. This is a single-tenant deployment for one Dynamics 365 organization, not a productized multi-tenant platform. Different Dynamics tenants have different picklist schemas, different security postures, and different consent flows; an external engagement requires its own configuration pass. Transcripts contain prospect PII and travel through OpenAI's API; we configure the deployment with conservative data-retention settings and minimum Dynamics scope. We have not published an external eval methodology — see the Pulse Check note above.

How we built it

  • Project kickoff: October 14, 2025
  • Production launch: November 27, 2025
  • Support and iteration phase: Mid-January 2026
  • AI developer (primary): ~348
  • BA / PM: ~65.5
  • QA + additional development: ~165
  • Total: 578.5

A six-person team carrying 578.5 hours over six calendar weeks, with one primary AI developer accounting for roughly 60% of code-effort. Same custom-development practice that ships software for external clients.

Technology stack. React with Microsoft Fluent UI and TypeScript on the frontend, deployed as a Microsoft Teams tab application. FastAPI (Python) backend on Azure App Service. LangGraph state machine orchestrating an OpenAI GPT model (temperature 0.3 for analysis, 0.7 for email generation). MongoDB Atlas for persistence. Microsoft Dynamics 365 via API. Microsoft Graph for Calendar, Outlook, and Teams transcripts. Fireflies.ai as transcript fallback. Turborepo with pnpm workspaces. Langfuse for LLM tracing.

Development approach: AI delivery practice, not advisory. We built the app with Cursor and Claude Code as primary AI coding tools. They give us code completion that reasons across the codebase, which compresses the time a project of this technical breadth would otherwise eat.

This is the differentiator for engagements at our scale. Big-4 advisory ships decks, then hands implementation to a separately scoped systems integrator. We ship working software inside the same engagement window, because our delivery team uses AI to build AI. The Sales Automation project is one demonstration: a six-person team produced a multi-service application with live CRM and Microsoft 365 integration in six calendar weeks. AI coding assistants don't replace engineering judgment — they let an experienced team move at a pace that wouldn't have been on the table a year ago.

Infrastructure cost.

  • Azure App Service: Free tier (current usage)
  • MongoDB Atlas: Free tier (current usage)
  • OpenAI GPT model (per user): ~$6.50/user/month
  • Total per user per year: ~$239

The main variable cost is LLM inference. The figures above reflect internal-deployment economics at low concurrency on free Azure App Service and Atlas tiers. A production-scale, multi-tenant deployment with paid App Service tiers, an Atlas plan that meets a real SLA, and an observability stack would land higher per user and depends on meeting volume per rep. We talk through actual TCO during a Pulse Check, not in a marketing footnote.

Voice of the sales team

The feedback below comes from structured sessions and ongoing usage.

On structured lead data and routing:

"If we start at the very top of the funnel, because of what we've done, there is a much more facts-based and context-based routing of the lead to the appropriate sales rep. In the past there were just — hey, if this is an Ascendix RE lead, you're going to route this to a specific rep. We still do that today. But now when that lead is routed, there's a great deal more information being served up to the individual sales rep so that in advance of the call, they can blaze through a lot of the qualification questions."

— the company's CEO

On pre-call preparedness:

"I don't have to do a blind demo because I didn't have any homework. When we get on the phone with someone and we've got the research — we know how long they've been in the brokerage, what's their title, is it likely this is more than a single user implementation? We can prepare if we know they're an investment sales brokerage."

— the company's CEO

On the follow-up email as anchor point:

"As recently as this morning, as a follow-up to a prospect that I had summarized an email for — I went to the last email I sent and it was a great anchor point for me to use as a follow-up and just grab the action items from that email."

— the company's CEO

From a senior account executive on the solution-selling team:

"Just relishing in the outstanding context our new capability is providing me. I love it and I look forward to it every morning."

From a transaction-focused rep handling high lead volume, in structured written feedback: auto-populated meeting notes and contact suggestions cut manual data entry. "Instead of spending time manually updating multiple CRM fields after each call, the AI populates key information automatically." The suggested-new-contact feature shortens the time it takes to identify and add participants who aren't in CRM yet. The drafted emails improve the consistency and tone of post-meeting outreach. The most-cited friction point is a 24- to 48-hour transcript availability delay on Fireflies meetings, which reduces same-day utility.

What we wouldn't promise

The case study would not be honest without this section. Things this system does not fix:

  • A misaligned ICP. If leads land in the funnel because of bad targeting upstream, better routing only sends bad leads faster. Sales Automation makes the workflow more legible; it doesn't fix the inputs.
  • Upstream lead-data quality. Enrichment depends on a name and email that can be matched. If the lead-source data is inconsistent or fake, enrichment is misleading rather than absent.
  • Coaching for new reps. A briefing helps an experienced rep walk in prepared. It does not teach a junior rep how to qualify, handle objections, or close.
  • The 24-to-48-hour transcript delay on Fireflies. This is the single most-cited friction point inside the team. Same-day follow-up still requires a manual trigger on the Teams transcript or a rep willing to draft on their own.
  • A controlled measurement of conversion or cycle-time impact. This was an internal pilot, not a measurement study. We are honest about what we don't yet have data to claim.

What this pattern unlocks beyond sales

The five-stage workflow redesign — enrich, brief, summarize, sync to system-of-record, draft follow-up — is not a sales-only pattern. The same redesign maps onto any function where a knowledge worker handles back-to-back interactions with external context that lives in a CRM, a ticketing system, or a finance system.

  • Customer Support. Pre-call briefing from the ticket history. Auto-summary into the CRM. Drafted resolution email with action items. Same shape, different system of record (Zendesk / Freshdesk / Dynamics CSC).
  • Finance and procurement. Vendor-call briefing from contract history. Auto-routing of invoice approvals based on enriched supplier context. Drafted approval-and-justification email.
  • HR and recruitment. Interview prep brief from candidate history. Structured debrief into the ATS. Drafted candidate communication.

The architecture changes per function, but the workflow-redesign discipline doesn't. That's what we mean when we say transformation: not adding AI tools to existing tasks, but redesigning the task around what AI is actually good at.

Bottom line

A production system with live CRM integration, multi-service architecture, and Microsoft 365 connectivity, shipped in six calendar weeks by a six-person team. Built by an AI delivery practice that uses AI to build AI, for an internal customer that became our first reference for what we now ship to external sales organizations.

If your sales operation is dealing with the same four failure points — unprepared calls, mechanical routing, inconsistent follow-up, silent CRM degradation — talk to us about a Pulse Check. We'll tell you whether the workflow we built for our own team can compress to a six-week delivery for yours, what the engagement would actually cost, what we'd measure, and what we wouldn't promise.