Overview
Victoria Mix is a perfume house with stands in Aley, Mount Lebanon. Its website lets customers browse the catalogue in English or Arabic, build a cart and place their order on WhatsApp, where payment and delivery are agreed. The signature feature, Our Mix, lets customers design their own fragrance from 2 to 5 perfumes and watch it poured, blended, labelled and capped in an animated bottle. Staff run the catalogue, content, orders and messages from a private admin panel and import inventory from spreadsheets.
The problem
The store needed a premium online presence for a large catalogue that customers can search easily in either language, and an ordering flow built around WhatsApp, where payment and delivery are arranged.
What I built
- A bilingual Laravel storefront with a true right-to-left Arabic layout
- Orders saved in the database first, then handed to WhatsApp as a ready-made message
- Our Mix, an interactive blend builder
- An admin panel with role-based access and a queued spreadsheet importer
Key features
- 01Full English and Arabic versions with right-to-left layout, localised URLs and hreflang for search engines
- 02Relevance-ranked search that tolerates accents, partial words and misspellings (for example, "sovage" finds Sauvage), in both languages
- 03Catalogue filters by gender, category, size, price and availability, with sorting and live search suggestions
- 04Checkout that stores the order and its item snapshots in one transaction, then opens WhatsApp with a bilingual order summary
- 05Our Mix: pick 2 to 5 perfumes and watch them poured, blended, labelled and capped in an animated 3D bottle
- 06"More from this house" suggestions, detecting the designer house from each perfume name
- 07Admin panel for products, sizes, categories, locations, content, orders and messages, with bulk actions and CSV export
- 08Queued CSV and Excel import with automatic column mapping, row validation, preview and a per-row report
- 09Stand locations with embedded Google Maps
Architecture
- Browser
- Middleware
- Laravel services
- MySQL
- WhatsApp hand-off
Screens
Decisions & challenges
Trust the server, never the browser
The browser sends only product ids and quantities. Prices, names and stock are always re-read from the database, including in the custom-mix message.
No build step
The front end is one hand-written stylesheet and one script with self-hosted fonts, which keeps pages light and free of external dependencies.
Progressive enhancement
Browsing, search, cart, checkout and contact all work without JavaScript; scripts add suggestions, animation and the blend builder.
Performance & security
Performance
- Server-side pagination and eager loading throughout the catalogue
- Home page data cached per language and cleared automatically when content changes
- Analytics loaded only after the page is idle, and only when configured
Security
- Content Security Policy with a per-request nonce and no inline styles, enforced by a test
- Rate limits on login, checkout, contact, search and cart actions
- Uploaded and remote images fully re-encoded to WebP, with remote fetches protected against SSRF
- Visitor IP addresses stored only as a keyed hash