Back to Portfolio
kaloni.gr — Bilingual Laravel Footwear E-Commerce

kaloni.gr — Bilingual Laravel Footwear E-Commerce

We designed and developed kaloni.gr, a bilingual (Greek/English) Laravel 12 e-commerce store for a Serres-based women's footwear brand. The storefront supports product variants (size + color), color-filtered galleries, wishlist (session for guests, DB for authenticated users with login merge), recently-viewed products, autocompleted search, and real-time shipping zone detection. Payments use a gateway-agnostic abstraction (PaymentGatewayInterface with DTO-backed results) supporting Stripe 3DS, Cardlink hosted-redirect with HMAC-SHA256 digest verification, bank transfer, cash on delivery, and pay-on-pickup. The admin panel covers products/variants/categories, coupons, shipping zones, order lifecycle and payment-status transitions, reviews moderation, newsletter and back-in-stock subscriptions, customer management with GDPR self-deletion (anonymise vs hard-delete), and activity logging. Bilingual content uses dedicated *_translations tables with a smart locale fallback (URL prefix → session → user preference → config), powering /el/ and /en/ SEO-friendly URLs with hreflang alternates and Organization/WebSite JSON-LD on every page. Images are served via Intervention Image v3 with responsive <picture> srcsets and WebP siblings; inline scripts are CSP-compliant via Vite nonces; GA4 e-commerce tracking (view_item, add_to_cart, purchase) is gated on cookie consent. Business logic is isolated in 23 service classes for an API-ready foundation.

Technologies

Laravel 12 PHP 8.3 Alpine.js Custom CSS (BEM) MySQL Intervention Image v3 Stripe (3DS) Cardlink Laravel Breeze + Google OAuth Multilingual (el/en) JSON-LD / SEO Responsive Design GA4 E-commerce Vite

Challenges

Building a multi-gateway payment system that cleanly supports both synchronous (cash, bank transfer) and asynchronous redirect flows (Stripe 3DS, Cardlink HMAC) while keeping the bilingual content model simple and the catalog fast across hundreds of product variants.

Solutions

Designed a PaymentGatewayInterface with DTO-backed results so each gateway slots in behind the same API; used dedicated *_translations tables with a fallback chain (URL prefix → session → user preference → config) so translation lives in one place per entity; cached responsive WebP siblings via Intervention Image v3 and served them through srcset <picture> tags with explicit dimensions to prevent CLS.