Building the Company's First AI-Powered Sales Workflow

Developing Intelligent Lead-to-Revenue Conversion Engine

How a business running on email and spreadsheets came to let a language model draft its price quotes.

Owned RFQ intake and extraction, inventory matching, quote routing, guardrail policy

Worked with sales, engineering, and leadership

The Setup

A wrong quote is not a bad user experience. It is a price commitment, sent to a customer, in writing.

Quote a part the customer did not ask for and you have sold the wrong component. Price confidently on thin information and you have committed below margin. Neither failure announces itself. Both surface weeks later in a sales review, by which point the system has made the same mistake a few hundred times.

That constraint shaped every decision here. Components distribution runs on RFQs: a customer sends a list of manufacturer part numbers, usually pasted into an email, sometimes attached, rarely formatted the same way twice. At 8K requests a month the queue moved at human speed. In-stock quotes took 18 hours. Out-of-stock requests, which need supplier sourcing before anything can be priced, took 15 days.

This was 2023, at a company that ran on email, spreadsheets, and phone calls.

A wrong quote is not a bad user experience. It is a price commitment, sent to a customer, in writing.

Quote a part the customer did not ask for and you have sold the wrong component. Price confidently on thin information and you have committed below margin. Neither failure announces itself. Both surface weeks later in a sales review, by which point the system has made the same mistake a few hundred times.

That constraint shaped every decision here. Components distribution runs on RFQs: a customer sends a list of manufacturer part numbers, usually pasted into an email, sometimes attached, rarely formatted the same way twice. At 8K requests a month the queue moved at human speed. In-stock quotes took 18 hours. Out-of-stock requests, which need supplier sourcing before anything can be priced, took 15 days.

This was 2023, at a company that ran on email, spreadsheets, and phone calls.

The Decision

The obvious build is a pipeline: parse the email, extract the part numbers, match inventory, generate a quote, send it. That is a week of work, and it is unshippable, because nothing in it decides when the model is allowed to commit the company to a price.

So the product was never the pipeline. It was the layer above it. Confidence tiers to separate what the system could send alone from what a person had to see. Price floors so no generated quote could go below margin. Escalation paths for cases it should not attempt at all. Human overrides throughout.

I specified that layer before the automation it governed, rather than shipping the workflow and retrofitting controls after the first bad quote.

The model drafted. The guardrails decided what shipped.

The obvious build is a pipeline: parse the email, extract the part numbers, match inventory, generate a quote, send it. That is a week of work, and it is unshippable, because nothing in it decides when the model is allowed to commit the company to a price.

So the product was never the pipeline. It was the layer above it. Confidence tiers to separate what the system could send alone from what a person had to see. Price floors so no generated quote could go below margin. Escalation paths for cases it should not attempt at all. Human overrides throughout.

I specified that layer before the automation it governed, rather than shipping the workflow and retrofitting controls after the first bad quote.

The model drafted. The guardrails decided what shipped.

What We Got Wrong

The first version treated every RFQ as a fresh, standalone request. It was not.

Follow-ups on an open quote arrived as new queries and got re-quoted from scratch. Sister entities of the same customer submitted the same request separately and received separate answers. Pricing was never a single number, because tiered agreements meant the correct price depended on who was asking. And an NPI order carried different logic entirely from a repeat product order.

The extraction was fine. The system read every document correctly and still produced wrong quotes, because being right required account context that was nowhere in the document.

We fixed it by moving the unit of understanding from the message to the account: threading requests against existing quotes and customer relationships before pricing anything, and adding tiers for the order types the original design had flattened into one.

It is the thing I got most wrong, and the thing I would now check first. When you automate a document workflow, the hard part is rarely the document.

The first version treated every RFQ as a fresh, standalone request. It was not.

Follow-ups on an open quote arrived as new queries and got re-quoted from scratch. Sister entities of the same customer submitted the same request separately and received separate answers. Pricing was never a single number, because tiered agreements meant the correct price depended on who was asking. And an NPI order carried different logic entirely from a repeat product order.

The extraction was fine. The system read every document correctly and still produced wrong quotes, because being right required account context that was nowhere in the document.

We fixed it by moving the unit of understanding from the message to the account: threading requests against existing quotes and customer relationships before pricing anything, and adding tiers for the order types the original design had flattened into one.

It is the thing I got most wrong, and the thing I would now check first. When you automate a document workflow, the hard part is rarely the document.

What Shipped

Pipeline - intent classification on inbound email, manufacturer part number extraction from inconsistent formats, inventory matching against live stock

Guardrails - confidence tiers, price floors, escalation paths, and human overrides, defining where the system acted alone and where it deferred

Account context - request threading against open quotes and customer relationships, with order-type tiers for repeat versus new product introductions

Integration - quote-to-order routing, so an accepted quote became an order without re-keying

Pipeline - intent classification on inbound email, manufacturer part number extraction from inconsistent formats, inventory matching against live stock

Guardrails - confidence tiers, price floors, escalation paths, and human overrides, defining where the system acted alone and where it deferred

Account context - request threading against open quotes and customer relationships, with order-type tiers for repeat versus new product introductions

Integration - quote-to-order routing, so an accepted quote became an order without re-keying

Outcomes

8K+

RFQ Volume (Monthly)

18 hrs to <1 hr

In-Stock Quote

Both numbers moved because the queue was treated as two problems rather than one. In-stock was a lookup, compressible to minutes. Out-of-stock carried a supplier dependency that could never go that fast. Measured together, both wins would have disappeared into a single mediocre average.

What made it adoptable was not accuracy. The sales team could see which quotes the system had handled alone and which it had flagged, and they trusted where that line sat.

Both numbers moved because the queue was treated as two problems rather than one. In-stock was a lookup, compressible to minutes. Out-of-stock carried a supplier dependency that could never go that fast. Measured together, both wins would have disappeared into a single mediocre average.

What made it adoptable was not accuracy. The sales team could see which quotes the system had handled alone and which it had flagged, and they trusted where that line sat.

What I Know Now

In 2023 the interesting question about language models was what they could do. The useful question, in a business where a wrong output is a signed price, was what they should be allowed to do unsupervised.

Every AI product I have worked on since comes back to the same two things: the mechanism deciding which outputs a human needs to see, and the context the model does not have.

In 2023 the interesting question about language models was what they could do. The useful question, in a business where a wrong output is a signed price, was what they should be allowed to do unsupervised.

Every AI product I have worked on since comes back to the same two things: the mechanism deciding which outputs a human needs to see, and the context the model does not have.