Client
M.F. Engineering Services
Role
Designer, developer, operator
Status
Live in production
Stack
Python, Django, MySQL

01The challenge

A growing solar company sells systems, installs them and then maintains them for years. Each of those stages lived somewhere different. Complaints came in by phone, engineer visits were arranged by message, maintenance contracts sat in a spreadsheet, and every proposal was rebuilt by hand from a cost sheet, which meant prices and layouts drifted from one customer to the next.

02What I built

A single Django application with two parts: customer operations and quotations.

03How it is run

A live system with real customers and real prices changes carefully:

04Outcome

One systemComplaints, visits, contracts and proposals share one customer record.
Consistent proposalsEvery quotation comes from the same templates and approval path, and prints the same way.
Customers self-serveStatus tracking and complaint registration no longer need a phone call.

05What I would tell another business

Put the approval rule in the software, not in the process document.

The single most valuable control in this system is also the simplest: nobody except the approver can finalise a price, and a final price cannot be edited. It removed a whole category of disagreement between sales and management.

PythonDjangoMySQLCustomer portalWorkflow and approvalsPDF proposalsManaged hosting

Visit the live system →

Facing something similar?

Tell me what you are trying to achieve and where it is stuck.

Start a conversation