Case studyInstant Quotation System

From a 20-minute quote to a 2-minute one

Built for an industrial equipment dealer in South India. It replaced hand-typed Word quotations with an instant, accurately priced PDF, and it's now how the business sends every quote.

Customers pick from 379 lifting products, and the system prices them, builds a branded quotation and emails both sides. I scoped it, turned a messy supplier price list into clean data, built it and shipped it.

Live in production
Move your cursor over the map
Role
Product owner and builder
Timeline
Mar to Apr 2026
Users
The sales team and their customers
Status
Live, used for every quote
1,500+quotations generated since launch
2 minper quote, down from 20 minutes by hand
~450hours of sales time saved so far
100%of the business's quotes now go through it
01The problem

Every quote was typed by hand, one product at a time.

Customers asking for a hoist or a pulley block had to wait while someone built the quotation in Word. Each one took about 20 minutes.

The prices lived in a 56-page supplier price list PDF, with a different table layout for almost every product family. Finding the right model meant matching capacity, lift height, suspension type and series by eye, then copying the price, the tax line, the standard terms and the next reference number into a letter.

It was slow, easy to get wrong, and it tied up the people who should have been selling. In a market where the first accurate quote often wins the order, every hour of delay mattered.

02The bet

Speed wins orders. A customer who gets an accurate quote in minutes is more likely to buy.

The goal wasn't a prettier letter. It was to remove the waiting. If the system could find the right product and price it correctly on its own, the team would only need to follow up.

Quotation_draft_final_v3.docx

QUOTATION

REF: QTN/2024-25/???Date: __.__.____

SUB: SUPPLY OF CHAIN PULLEY BLOCK

Sl.Item descriptionQtyPrice
1.Chain pulley block, 1 T, 3 m lift1 NoRs. check p. 34
2.Electric wire rope hoist, 2 T

Prices: GST @18% extra. Validity: 30 days.

Before, about 20 minutesTyped in Word, with each price looked up by hand in a 56-page PDF.
Request a quotation
CategoryChain pulley block Capacity1 tonne Lift3 metres
CategoryWire rope hoist Capacity2 tonnes SuspensionTrolley
2 products priced₹1,84,560

Quotation emailed to customer and sales team

Download PDFSend by email
After, about 2 minutesPick the product, and the price, terms and letterhead are filled in automatically.

Illustrative example. Prices and reference numbers are not real.

03How it works

From a messy price list to a quotation in the customer's inbox.

The hardest part wasn't the form. It was getting clean data to power it.

  1. Input

    A 56-page supplier price list

    Dozens of tables, each with its own column headers, units and footnotes.

  2. 01 Normalise

    Turn the PDF into clean data

    I used an AI extraction agent to map every table to one schema, producing 379 products with a code, capacity, lift height, suspension type and price.

  3. 02 Pick

    Choose products step by step

    Cascading filters narrow the list as you go, so nobody has to know a model number.

  4. 03 Price

    Price it on the server

    The server looks up every price by product code and totals the quote. The browser never sends a price, so nothing can be edited on the way.

  5. 04 Build

    Generate the branded PDF

    The quotation is laid out on the company letterhead with the tax line, standard terms, validity and a sequential reference number.

  6. 05 Send

    Email both sides

    The customer gets their quotation. The sales team gets a copy whose replies go straight to the customer, so the conversation continues in one thread.

Category→Series→Capacity→Suspension→Lift height

Built with Next.js, TypeScript, React Hook Form and Zod, PDFKit, Nodemailer and Firebase, deployed on Vercel.

04Key decisions

Six calls that got it adopted.

01Adoption

Keep the quotation the team already trusted

The generated PDF reproduces the existing letter: the same letterhead, tax line, delivery terms and 30-day validity. Customers saw nothing unfamiliar, and the team didn't need retraining.

ResultEvery quote now goes through the system.

02Data

Treat the price list as the product

A form is only as good as the prices behind it. I spent the most effort normalising the supplier PDF into one clean schema before building any screens.

Trade-offSlower start, but no wrong prices in front of customers.

03Architecture

Ship prices with the site, not a live database

The plan was a live database for prices. Prices only change when the supplier issues a new list, so I bundled them with the site instead. It's faster, has no usage limits and can't go down.

Trade-offA price update needs a redeploy, which happens a few times a year.

04Trust

Never trust a price from the browser

Customers only send product codes and quantities. Every price is looked up and totalled on the server, so a quote can't be altered before it's generated.

Trade-offNone worth mentioning. It's the only safe option.

05Email

Use the inbox they already had

The business had no custom email domain set up, so I sent quotations through its existing mailbox rather than adding a new email service. Replies land where the team already works.

Trade-offA daily sending limit, comfortably above their volume.

06Reliability

A quote should never be blocked

Reference numbers run in sequence from a database counter, matching the business's existing numbering. If the database is ever unavailable, the system falls back to a temporary number so the customer still gets a quote.

Trade-offA rare out-of-sequence number, in exchange for never losing a quote.

05Results

The business now sends every quote this way.

More than 1,500 quotations have gone through the system since launch, at about 2 minutes each instead of 20. That's roughly 450 hours of sales time handed back to the team.

The number I'm proudest of is adoption. Internal tools often get used for a few weeks and then quietly abandoned. This one replaced the old process entirely, because it kept everything the team already relied on and removed only the waiting.

06What I learned

Adoption comes from fitting in, not standing out.

01Workflow

Change the speed, not the habit.

Keeping the familiar letter, terms and numbering is why the team switched completely instead of running both processes side by side.

02Data

Clean data is most of the work.

The form took days. Getting a trustworthy price list out of a 56-page PDF was the real product problem.

03Metrics

Measure in the user's units.

"Minutes per quote" meant more to the business than any technical metric, and it made the value obvious on day one.

04Scope

Pick the simplest thing that works today.

Bundled prices and the existing mailbox let it go live in weeks, without waiting on new accounts or infrastructure.

Thanks for reading.

Built for a real business and used every day. The company name, supplier brand and all customer data are left out on purpose.