Inspiration

I work in the financial advisory sector, and I keep meeting small business owners who work incredibly hard but can't tell you which part of their business actually makes money.

Picture Sipho. He owns a five-chair barber shop in Soweto. His barbers work on commission, his takings come from a card machine plus cash, and on the 1st of every month he basically guesses whether it was a good month. He knows Saturdays are busy. He doesn't know that a chiskop earns him almost twice as much per minute as a kids cut, or that his electricity bill quietly went up 38%.

That's who I built ProfitPilot Barber for.

What it does

  • Import a month of sales from a CSV (frp or Excel). It's read on the device, andcustomer names and phone numbers are never saved.
  • Money kept: what's actually left afterther cost.
  • Earnings per chair-minute for every service. Chair time is what a barber really sells, so that's the number that matters.
  • Busy hours: a heatmap of when the chairs are full and when they're quiet.
  • Plain-language tips worked out from thor R106 on average, not R120".
  • Cost alerts when a bill jumps, and exact updates: change electricity by R760 and money kept drops by exactly R760.
  • A price planner to try a new price before changing it.
  • Barber commission, reports you canht and dark mode, and a phone layout.

How we built it

I built it plan-first with the Devpost Learnct requirements doc and a technical specbefore any code. Then I built it in nine small slices, testing and committing each one.

  • Plain HTML, CSS and JavaScript, with no framework and no build step, so it loads fast on a phone on mobile data.
  • All the maths and rules live in separate me's built-in test runner).
  • Data is saved in the browser on the device. No account, no server, no AI.
  • Hosted for free on GitHub Pages.

Challenges we ran into

Real-world data is messy. I wrote my ownons, quoted fields, prices like "R 1 200,00"and "(120,00)" for refunds, day-first dates and unknown columns. It passed 40+ tests. Then I fed it a deliberately ugly test file, and it still found a bug: a as a free cut got a R0 price, which blockedthe whole import. That became a new test.

Not trusting bad numbers. One row in my test file was R12 000 for a single haircut, almost certainly an amount in cents. Now the app holds back anything over ms it, so one bad row can't distort the whole month.

Making tips that don't cry wolf. A tip only fires when it really matters: a cost has to rise more than 15% and at least R200 before you get an alert. Everynd just outside its threshold.

Accomplishments that we're proud of

  • Every number adds up. Change a cost orkept changes by exactly that amount, andtests prove it.
  • Privacy by design. The sales sheet nevtomer names and phone numbers are thrown away on import.
  • It feels like a real product: six sectphone layout, and printable reports, all from one sample month on first visit, so it's never an empty screen.
  • It's live: anyone can try it in a brow

What we learned

  • Plan before you build. Writing the scont the hard questions came up on paper, nothalfway through the code.
  • **Keep one ugly, real-looking file next tok the cases you thought of; the ugly filefinds the ones you didn't.
  • Rules beat guesses. Simple, tested rul and trust, without any AI.

What's next for ProfitPilot Barber

Testing it with a real barber shop's sales e the whole month is in one place, and savinga few months of history so owners can see trends over time.

Built With

Share this project:

Updates

Submission history