Overview
ARE Beauty is a Moroccan body-care brand built around a three-step ritual — scrub, serum and cream — formulated with Moroccan plant extracts and oils. The project was delivered with MS Signature, which managed the client relationship. I was responsible for the technical side: I designed and built the platform, a Next.js storefront with its admin dashboard and an Express REST API, and I deployed and host it.
The challenge
- A premium, editorial brand image that had to come through in three languages, including Arabic in right-to-left.
- Moroccan buying habits: most customers pay on delivery and many don’t want to create an account before ordering.
- A marketing strategy built on influencers, where the team needed to know which partner brought which order.
- A small team that had to manage products, bundles, content and orders on its own, in every language.
What I built
Trilingual storefront
A Next.js 15 storefront fully localized in French, English and Arabic with next-intl and locale-prefixed URLs. It has an editorial, magazine-style design (serif headings, a cream, ink, sage and pink palette and Framer Motion animation), along with product pages with variants, an ingredients page, a before-and-after gallery, a “Journal” blog, a Pro & Retail application form and a newsletter with a first-order discount.
Checkout & orders
- A three-step checkout (address, shipping, review), with a dedicated guest checkout that stores the order and its address without creating an account.
- Cash on delivery as the payment method, with the payment model already prepared for card and PayPal gateways.
- Shipping rates calculated by zone, country and city, and shipments pushed to the Speedaf courier API.
- Transactional emails for order confirmation, shipping and delivery, built with Nodemailer and EJS templates.
Customer area
Customers can follow their orders, manage addresses and settings, keep a wishlist, like and review products and request returns online.
Influencer & offer tracking
Coupons can be limited to all products, non-discounted products or a chosen list, and attributed to an influencer. Product bundles (offers) can carry their own coupon, so every order can be traced back to the coupon and influencer behind it. Time-limited flash sales complete the set.
Admin back-office
About twenty-five management screens covering products, categories, orders, returns, refunds, coupons, influencers, offers, flash sales, users, newsletter, hero slides, announcements, the scrolling ribbon, ingredients, content blocks, gallery, before-and-after results, blog, carriers and shipping. It includes a rich text editor and Excel exports. Every piece of content is translated per language from the same screens.
Architecture & security
- Translation-driven data model: almost every content model in Prisma has a paired translation table keyed by language, which is what makes the three-language back-office possible.
- Modular API: an Express 5 REST API in strict TypeScript, organized in 34 domain modules that follow the same routes, controller, service and validation pattern.
- Authentication: short-lived JWT access tokens with a cookie-based refresh token. The frontend refreshes once on a 401 and replays the request, and concurrent requests share a single refresh.
- Hardening: Zod validation on every route, role-based access (customer / admin) with ownership checks, Helmet, an explicit CORS whitelist, a global rate limit and a stricter one on authentication, and image-only uploads.
Tech stack & deployment
- Frontend: Next.js 15 (App Router), React 19, TypeScript, Tailwind CSS v4, SCSS modules, Framer Motion, next-intl.
- Backend: Node.js, Express 5, TypeScript, Prisma, PostgreSQL, Zod, Nodemailer.
- Infrastructure: deployed on a Linux VPS behind Nginx, which I set up and maintain.
Outcome
- A complete online shop for the brand in three languages, with payment and delivery suited to the Moroccan market.
- Influencer marketing that can be measured order by order from the back-office.
- A team that runs its catalogue, content and orders on its own, in every language.
