Khalil Hebachi
Email meGitHubLinkedIn
Selected work

Technical leadership · Storage and logistics

StoragePal: Improving the software behind a storage business.

I lead development of the platform behind a Paris storage business, from staff tools and customer bookings to pricing and payments.

My role
Lead developer, technical direction and implementation
Period
Oct 2024 - present
Core stack
PHP, Neos Flow, MariaDB, JavaScript, Stripe, Gemini
+34%
transport revenue in the year after launch vs the year before
0.884s
median catalog server response, down from 9.1 s
3 → 1
pages in the payment flow

Transport: 12 months after launch vs the 12 months before. Catalog: median of 15 runs per version on a local benchmark. Reviewed September 2026.

The short version

  1. 01RoleLead devI took over a live platform and improve it in stages, with other developers.
  2. 02Staff tools12 pagesBackoffice lists now share one system for filters, sorting, and exports.
  3. 03Catalog9.1 s → 0.884 sMedian server response on a local benchmark, after caching the shared catalog.
  4. 04Payments3 → 1Pages in the payment flow, plus one clear rule for what a customer owes.
  5. 05Transport+34%Transport revenue in the 12 months after launch, compared with the 12 months before.
  6. 06AIRules decideThe assistant suggests items. The catalog and pricing rules decide what is sold.

A business already in operation

StoragePal customers book collection, storage, and return of their things online. I took over the existing platform and improve it in stages.

  1. CustomersBook collection, storage, and return online.
  2. PlatformStaff manage orders, stock, invoices, and payments.
  3. WarehouseThe SPS app receives, places, and returns items.

My part

PrioritiesSpecsCode reviewMajor features

Other developers

ReportingCRM integrationReservations

I also built the SPS warehouse app end to end.

Start where staff were blocked

Staff use the inventory and reservation screens every day. I fixed those first.

Before

  • Filters could take minutes, or time out
  • Big exports could run the server out of memory

After

  • Filtering and paging run in the database
  • Exports run in batches
  • 12 backoffice pages share one system for columns, filters, sorting, and exports

Still open: a few heavy computed columns cannot be sorted, and some exports need a filter to finish in time.

Cache what customers share

The catalog repeated the same database work on every visit. I cut queries and added indexes. Then I built the page on the server from cached data.

Shared by everyone: cached

  • Product data, stored per language
  • Cleared when staff change the catalog
  • Expires after 24 hours to catch anything missed

Some import paths do not clear the cache yet. The 24-hour expiry covers them.

Personal: read fresh

  • Cart quantities, merged in on every request
  • Custom items, kept out of the shared cache
Earlier StoragePal catalog with a dense item list
Before: a dense list that reloaded its data on every visit.
Updated StoragePal catalog with grouped items and product photos
After: grouped products, built from shared cached data.
9.1 s → 0.884 s
Median server response time, not full page load. Local benchmark: 15 runs per version, same database.

Sort out what is owed before charging

Unpaid amounts carried over into later invoices. The system could still treat them as separate debts, so more retries could charge the wrong amount.

  1. Invoice 1Left unpaid.
  2. carried into
  3. Invoice 2Includes the unpaid amount.
  4. carried into
  5. Current invoiceHolds the full amount owed.

One rule: the current invoice, at the head of the chain, is what the customer owes.

StoragePal payment page with all payment details together

Payment rules

  • Charge the current invoice, and nothing else
  • Never start a second payment while one is in progress
  • Retry failed payments, and send blocked ones to a review queue
  • Check the payment state again before each reminder
3 → 1
pages in the payment flow

Price transport by the real job

Quotes used to be flat by region. Now one engine prices each job from its real details. Customer care and logistics helped shape the rules.

Before

One flat price per region, whatever the job.

After: four inputs

Distance
Real driving distance
Vehicle
The size the job needs
Crew
How many people
Access
Floor and elevator

Collections and returns use the same engine.

StoragePal transport form with the collection address, floor, and elevator details

After launch

+34%
transport revenue in the 12 months after launch, compared with the 12 months before

Order volume and customer mix also changed in that time.

Keep AI proposals inside the business rules

The shopping assistant turns a description or a photo into a proposed cart. The model helps. The business rules stay in charge.

  1. DescribeThe customer types or sends a photo.
  2. SuggestThe model proposes items.
  3. CheckThe server rejects unknown items, limits quantities, and sets prices.
  4. EditThe customer adjusts the cart. Every line is priced again.
A cart proposed by the StoragePal assistant, ready for the customer to review and edit

Who decides what

  • The modelHelps the customer describe what they need
  • The catalogDecides what can be sold
  • Pricing rulesDecide the price of every line

Building something similar?

Tell me what you are building. A few lines are enough to start.

hebachikhalil@gmail.com

Ask about my work

AI answers from my CV and case studies. It can make mistakes.

Ask anything about my projects, results, or how I work.