Building an eCommerce Platform for a Perfume Brand

A full-stack eCommerce platform with advance features & approaches focus on foundation architecture

Project Overview

RoleFull-Stack Developer
Duration
Nov 24’Present
Team SizeSolo Developer
PlatformsWebsite

Sourena Perfumery Platform is a full-stack eCommerce site I built from scratch for a growing perfume brand. I handled the entire stack — Next.js and React on the frontend, Spring Boot with Kotlin on the backend, and PostgreSQL for the database. The goal was to give the business a flexible, easy to manage platform that could scale internationally without constant developer intervention.

Key features include multi-language and multi-currency support (prices convert automatically based on live rates), a custom rich-text editor that goes beyond standard tools (icons, embedded media, advanced styling), and a proper role-based permission system so different team members can manage content, orders, or catalog safely.

I also set up Redis caching, real-time feedback via WebSockets, and a solid CI/CD pipeline with tests. On the frontend, I built a reusable design system with SCSS mixins and styled components to keep the brand look consistent and easy to evolve.

Technical Overview

A practical overview of the stack and some of the technical decisions that helped keep the product maintainable and fast.

  • Frontend Stack: Next.js, React, TypeScript, SCSS Modules, Motion animations, custom Special Text editor
  • Backend Stack: Kotlin (Spring Boot), PostgreSQL, authentication, and scheduled jobs where needed
  • API Design: REST endpoints with consistent validation and predictable error handling
  • State Management: React Context with targeted optimizations for heavy views
  • Security: HTTPS, input validation, and strict browser policies (e.g. CSP) where applicable
  • Testing & QA: Automated tests where it added value, plus careful manual QA for critical flows
  • Monitoring: Logging and lightweight monitoring to catch issues early
  • Infrastructure: Containerized deployment and a build/release process that supports safe iteration
  • Media: Practical asset handling and optimization for performance and workflow
  • Payments: Payment gateway integration with a focus on a smooth, secure checkout

The Challenge

Building an eCommerce platform that’s easy to manage, scales globally, and stays maintainable as the catalog and content evolve. Below this page, i've explained how i managed the challenges and made solutions for them.

  • Reduce engineering dependency: Make routine content/catalog updates self-serve for non-technical users.
  • Internationalization without duplication: Keep language support scalable without cloning UI logic or creating SEO regressions.
  • Predictable catalog rules: Model variants/pricing clearly so catalog changes don’t ripple into edge-case bugs.
  • Performance budgets: Keep browsing responsive as media and inventory grow.
  • Checkout that’s easy to debug: Keep the flow consistent so issues are diagnosable and fixes are low-risk.
  • Lower release risk: Prefer small changes with automated checks so updates remain reviewable and reversible.
  • Baseline security: Validation, sensible permissions, and strict browser policies where applicable.

Key Decisions

I optimized for three outcomes: maintainability, speed, and clarity. The guiding rule was simple: keep the system predictable and only add complexity when it reduced long-term risk or operational cost.

Frontend decisions (clarity first)

Used Next.js and React with patterns chosen to avoid hidden coupling and reduce UI regressions.

  • Kept routing/data loading predictable to reduce edge cases and debugging time
  • Preferred local, explicit state and fixed re-render hotspots in key flows
  • Standardized component patterns so new screens match existing behavior
  • Used motion only when it communicated state change; avoided decorative animation debt
  • Defined responsive rules early to prevent breakpoint regressions
  • Built structured editing so published content stays consistent and reviewable

Backend decisions (predictable APIs)

Backend built with Kotlin (Spring Boot) with an emphasis on clear contracts, validation, and business rules that are easy to change safely.

  • Defined API contracts with validation and consistent errors to reduce ambiguous edge cases
  • Implemented role-based access where needed to keep staff workflows safe
  • Added caching (Redis) on read-heavy paths to keep browsing responsive
  • Used real-time only where it reduced confusion (e.g., admin feedback loops)
  • Added CI checks and targeted tests around checkout and CMS-critical flows

Internationalization (scales without copy-paste)

Implemented internationalization in a way that stays maintainable as languages and content expand.

  • Centralized translations to avoid drift and duplicated copy
  • Kept localized routes/metadata consistent to preserve SEO fundamentals
  • Made translations part of the publishing workflow so updates remain practical

Data model (reduce surprise bugs)

Used PostgreSQL with explicit catalog rules to keep pricing/variants predictable and reduce data-driven edge cases.

  • Modeled products/variants/orders with clear constraints so rules are enforced in one place
  • Added indexes based on real query paths to keep key pages responsive
  • Used migrations/versioning to keep schema changes safe and repeatable
  • Prioritized data integrity to prevent silent corruption and hard-to-reproduce bugs

Delivery (lower release risk)

Set up a build and release workflow that supports safe iteration.

  • Made lint/typecheck/build part of CI to reduce broken deploys
  • Containerized where it reduced environment differences
  • Added practical logging/monitoring hooks for faster diagnosis
  • Shipped in small steps so changes were reviewable and rollbacks were straightforward

Results & Impact

PerformanceStable

Kept browsing responsive by treating media/animation as a budget and optimizing the critical paths.

Content OperationsSelf-serve

Made routine content and catalog updates practical for non-technical users, reducing back-and-forth with engineering.

Internationalization5 Languages

Shipped language support with a structure that stays maintainable as new languages and content are added.

Release SafetyHigher

Reduced regression risk with CI checks and smaller, reviewable releases.

Checkout FlowClearer

Kept checkout consistent and easier to reason about, which makes issues easier to diagnose and fix.

MaintainabilityImproved

Kept the codebase easier to extend by standardizing patterns and enforcing predictable catalog rules.

Conclusion & Reflection

This project reinforced a simple lesson: the best results come from balancing product needs with engineering discipline. The goal wasn’t to be flashy—it was to build a dependable platform the business can run daily, with a user experience that feels clear and intentional.

Key Takeaways

  • Make content self-serve: Good tooling reduces back-and-forth and keeps teams moving.
  • Keep the model predictable: Clear rules for variants/pricing prevent fragile edge cases.
  • Use performance budgets: Treat animations and media as a cost—add them only when they help.
  • Ship in small steps: Smaller releases are easier to review, test, and roll back.
  • Write for future you: Naming, structure, and constraints matter as the platform grows.

Share this case study