Problem
Running a small B2B distribution business on spreadsheets and WhatsApp made it hard to track which customers owed what, which orders were pending, and what stock was actually left. It needed a CRM built around how the business actually operated, not a generic off-the-shelf tool with modules that didn’t match the workflow.
Constraints
- Hosting budget was shared/cheap hosting, not a VPS or cloud platform — the stack had to run comfortably there.
- Built and maintained by one person alongside running the business itself, so boring, well-documented tools (Laravel, Blade) won over anything more novel.
Architecture
A server-rendered Laravel and Blade application, with Alpine.js for the interactive bits — order forms, inline edits — that didn’t justify a separate frontend framework or build step. MySQL for storage, deployed to shared hosting.
Stack
Laravel, Blade, Alpine.js, MySQL.
My role
Built and have run this as the business’s own CRM — requirements, implementation, and ongoing maintenance, wearing both the founder and engineer hats.
Outcome
Still the system of record for the business’s orders and customers.