In short
- Customer: The customer, Norwegian supplier of battery energy storage for electric and hybrid marine propulsion.
- Problem: prospecting was manual. Microsoft's qualification agent does not help, it only grades leads that already exist.
- Solution: an AI agent that scans the market daily, scores against the customer profile and writes qualified leads into Dynamics 365 Sales.
- Status: live in the customer's own production tenant since May 2026.
The problem: the tool that did not exist
The customer supplies battery systems to ferries, offshore vessels, fishing boats and passenger ships being retrofitted or newly built with electric or hybrid propulsion. The market is narrow and technical, which means prospecting is about spotting the right company at the right moment, not about volume.
That work was being done by hand.
The obvious answer is Microsoft's own Sales Qualification Agent. But it solves a different problem: it grades and prioritises leads already in Dynamics 365. It does not go looking. The customer's need was the opposite, proactively scanning for companies that were not in the CRM yet.
The standard agent qualifies what you have. It does not find what you are missing. We built the missing half.
What the agent does, every morning at 06:00
An Azure Function fires, and the agent works through a fixed sequence:
- Searches the web using queries held in configuration
- Identifies candidate companies in the results
- Checks against Dynamics 365 and skips anything already known
- Researches individual companies further where more context is needed
- Scores against the customer profile: High, Medium, Low or Excluded
- Writes High and Medium straight into Dynamics 365 Sales as Leads
A full run takes three to five minutes and costs on the order of a dollar in AI usage. The salesperson arrives to leads that are already found, de-duplicated against existing customers, and reasoned about.
The part that matters: what governs the agent
An agent writing into your CRM is only as good as the rules it follows. The customer's agent is governed by five knowledge files the customer owns:
| File | What it controls |
|---|---|
| Customer profile | Segment, geography, project size, trigger signals and scoring weights |
| Products | What the customer actually sells |
| Competitors | Who to deprioritise where a relationship is already established |
| Existing customers | Avoid duplicates, and find look-alikes |
| Exclusions | Hard rules for what must never become a lead |
This is the part most people skip. An exclusions file is not a detail, it is the difference between an agent you can leave running and one you have to supervise. When the customer's profile changes, the agent's behaviour changes, with nobody writing code.
Where it runs
Everything runs in the customer's own Microsoft tenant, not ours. Configuration lives in Dataverse with version history, every run is logged to its own audit table, and the sales team drives the agent from a wizard built as a PCF control inside Dynamics 365. Releases go through UAT before production, with CI/CD.
We built in our own environment first, to show the concept held. Once accepted, it was rebuilt inside the customer's environment, UAT first, then production in May 2026. The first scheduled production run created three leads with no errors.
What made this work
- Dynamics 365 Sales and Dataverse as the destination, no parallel database
- Azure Functions for scheduled execution, with three modes: bootstrap, ad hoc and scheduled
- Configuration in Dataverse rather than in code, the customer owns the rules
- A full audit trail per run
The interesting part here is not that AI can score a company. It is that the agent runs unattended in the customer's own environment, against rules the customer controls, at a cost per run that is known in advance.