ecommerce
April 2024
Gree Distributor

Commercial Proposal Generator for HVAC Distributor

Automated proposal generation system integrated with OpenCart e-commerce platform. Reduced proposal creation time from 40 minutes to 3 minutes, enabling faster response to customer inquiries during peak HVAC season.

Duration

3 weeks MVP + 2-3 months refinement

Team Size

1

My Role

Full-Stack Developer

Commercial Proposal Generator for HVAC Distributor

Executive Summary

The client, a major HVAC equipment distributor, faced significant bottlenecks in their sales process. Sales managers spent up to 40 minutes creating each commercial proposal manually—looking up prices on the website, formatting documents in Word, and calculating totals. With the peak season approaching in April, this inefficiency threatened to impact conversion rates.

A key constraint: their online store ran on OpenCart 1.5.6.4—a platform over 10 years old. Despite its age, the site had excellent SEO rankings driving substantial organic traffic, making the client understandably reluctant to modify or migrate it.

We built a web application that integrates with their legacy OpenCart database through custom read-only connectors, enabling real-time product search with accurate pricing—all without touching the existing codebase. The system automatically generates professionally formatted PDF proposals with company branding, sequential numbering, and itemized pricing. The solution launched just before peak season and dramatically improved the team's response time to customer inquiries.

Key Metrics

Proposal Creation Time

-92%

Before

40 min

After

3 min

Daily Time per Manager

-91%

Before

3 hours

After

15 min

Calculation Errors

-100%

Before

Manual

After

Automated

Price Accuracy

100%

Before

Manual lookup

After

Real-time sync

Mobile Access

+100%

Before

None

After

Full

The Challenges

Key obstacles that needed to be addressed

1

Time-Consuming Manual Process

Sales managers created proposals manually using Word/Excel templates, requiring 35-50 minutes per proposal

Business Impact

Slow response to customer inquiries led to lost sales opportunities, especially during high-demand periods

2

Outdated Pricing Information

Prices in proposals often didn't match the current website prices, requiring manual lookups and verification

Business Impact

Pricing discrepancies damaged customer trust and required time-consuming corrections

3

Seasonal Capacity Constraints

HVAC sales peak in spring (April-May), overwhelming the sales team with proposal requests

Business Impact

Unable to scale proposal output during critical revenue period, limiting growth potential

4

Legacy E-commerce Platform

The client's online store runs on OpenCart 1.5.6.4 — a version released over 10 years ago. The client was reluctant to migrate due to well-established SEO rankings that drive significant organic traffic

Business Impact

Any new tooling had to integrate with the legacy system without modifications, as changes risked breaking SEO URLs and disrupting revenue-generating search traffic

5

Failed API Approach

Initial plan was to add a simple REST API to the OpenCart installation. After deployment attempts, the legacy codebase proved extremely fragile — even minor modifications caused unexpected issues across the site

Business Impact

Pivot was required mid-project. Needed an alternative integration approach that avoided any code changes to the production e-commerce platform

Our Solutions

How we tackled the challenges and delivered results

Non-Invasive Legacy System Integration

After the API approach failed, pivoted to direct database integration. Built custom read-only connectors for OpenCart 1.5.6.4 without touching the legacy codebase. Zero modifications to the existing e-commerce platform preserved SEO rankings and site stability

Implementation

Dual-database architecture: mysql2 for direct OpenCart DB queries (products, prices, SEO URLs) + Prisma ORM for application data. Carefully mapped legacy table structures including `url_alias` for SEO-friendly links. Created a dedicated MySQL user with read-only permissions restricted to product catalog tables only — ensuring that even in case of credential exposure, no customer data or sensitive information could be accessed (only publicly available product catalog)

MySQLmysql2PrismaNode.js

Server-Side PDF Generation

Professional PDF documents generated automatically with company branding, stamps, and consistent formatting

Implementation

Puppeteer renders HTML templates to PDF on the server, ensuring consistent output across all devices

PuppeteerNext.js API Routes

Manager & Admin Roles

Simple authentication system allowing managers to create proposals while admins have full control

Implementation

Cookie-based auth with role headers, no external auth provider needed

Next.js MiddlewareHTTP-only Cookies

All solutions successfully implemented and deployed

Results & Impact

Measurable outcomes achieved through our solutions

Performance

92% reduction in proposal creation time

Managers can respond to customer inquiries within minutes instead of hours

Business

Improved lead-to-proposal conversion

Faster response during peak season captured more sales opportunities

Technical

Real-time price synchronization

Eliminated pricing discrepancies between proposals and website

Business

Mobile-first field access

Sales team can create proposals during customer meetings

Project delivered on time and exceeded expectations

Technology Stack

Tools and technologies used to build this solution

Frontend

Next.js 15ReactTypeScriptTailwind CSSShadcnUI

Backend

Node.jsPrisma ORM

Database

MySQLPostgreSQL

Infrastructure

GitLab CI/CD

DevOps

PuppeteerDocker

All technologies were carefully selected to ensure optimal performance, scalability, and maintainability

Honestly, I was worried going into April. Our Head of Sales had just left, I was covering his role on top of my own, and we had the busiest season ahead. The sales team was already struggling — creating proposals manually was eating up half their day. This tool was a lifesaver. Proposals that took 40 minutes now take 3. My managers can actually focus on selling instead of copy-pasting prices from the website. We not only survived the season without a sales lead — we beat last year's numbers. One thing that really mattered to me: they didn't touch our website. It's old, I know, but it brings in good traffic and I wasn't about to risk that. They found a way to pull product data directly without changing anything. That's the kind of problem-solving I appreciate.
👤

John S.

CEO / Acting Head of Sales

next.jsreacttypescriptpdf-generationpuppeteerprismaopencartautomationb2bhvace-commerce-integrationsales-toolslegacy-integrationdatabase-integration