BakuMebel — made-to-measure furniture catalogue

A trilingual catalogue site for BakuMebel, which builds kitchens, wardrobes and living-room furniture to measure in Baku. Built with Next.js and running on a VPS; a five-step calculator sets the budget expectation and every enquiry continues on WhatsApp with a prefilled message.

Visit live site
Overview
Client
BakuMebel — made-to-measure furniture in Baku: kitchens, wardrobes, living rooms, bedrooms, offices and kids rooms
Role
Frontend and backend development, catalogue structure, the pricing logic behind the calculator, the admin panel, structured data (schema.org) and deployment to a VPS.
Stack
Next.js · TypeScript · Tailwind CSS
Date
September 2026
Languages
3 — AZ / EN / RU
Pages
17 × 3
The problem

Made-to-measure furniture has no fixed price: the same kitchen can cost twice as much depending on dimensions, material and hardware. That boxes the site in — publish no price and the visitor assumes it is expensive and leaves; publish a firm number and you cannot defend it once the workshop has measured on site. The site had to talk about price without staying silent and without promising something the business could not honour.

What the site includes
  • Three languages — AZ, EN, RU — with every page in every language listed as its own URL in the sitemap
  • Six categories: kitchen, living room, bedroom, wardrobes, office and kids room
  • Five core pages — home, catalogue, calculator, about, contact — plus category and product pages
  • Product page with an image gallery, category badge, price, technical description and related models
  • A five-step price calculator: room, size, material, hardware, extras
  • The calculator prices each room type in its own unit — kitchens by running metre, wardrobes and TV walls by facade area, beds as ready-made models
  • Home page with a three-slide hero, advantage blocks, catalogue picks and an offer of the week
  • A protected admin panel, behind email and password, where the products are managed
  • Every call-to-action opens WhatsApp with a message already written for that product
  • Structured data using Organization, Product, Offer, OfferCatalog, ItemList and BreadcrumbList
Technical decisions
01

A calculator instead of a cart

A cart and online payment would not have been technically hard, but they contradicted the product itself: the price of a made-to-measure kitchen is not known until someone measures the room. A cart would promise the visitor a fixed number the workshop could not hold to. Instead the catalogue sets expectations, the calculator gives a budget band and the conversation continues on WhatsApp — at no point does the site make a promise it cannot keep.

02

The calculator prices each room in its own unit

In the furniture trade a kitchen is quoted by running metre, a wardrobe or TV wall by facade area, and a bed as a finished model. Running everything through one formula would have been simpler, but the result would look wrong to anyone who knows the trade. So the calculator switches its pricing basis to match the selected room type — the number comes out of the industry's own logic.

03

The result is a range, not an exact figure

The calculator returns a band rather than a single sum, and states plainly that it is approximate and that the exact price is set only after the craftsman measures on site. This is not a concession that loses visitors — the opposite: when the expectation is set correctly, the conversation after the measurement does not open with "but you said 2000".

04

Three languages on one route tree

Language is a `?lang=` query parameter rather than a separate route segment such as /az or /en. That serves three languages without duplicating the entire route tree three times. To keep it from becoming a real compromise, the essential condition is met: each language has its own address, and those addresses appear both in the sitemap and in the hreflang declaration (with AZ as x-default) — so to a search engine the three versions are distinct pages, not duplicated content.

05

Every product is a Product node with a price

The models in the catalogue are not published as text alone. Each is declared as its own Product and Offer object with its description, category and price, and the categories are tied together as an OfferCatalog. So when someone asks something like "what does an acrylic kitchen cost in Baku", search and AI systems read the page as a list of priced products rather than as marketing copy.

06

Content lives in the admin panel, not in the code

Adding a model, changing an image or adjusting a price does not mean editing code and redeploying — products are managed from the site's own admin panel, which sits behind email and password authentication and does not open without a login. In a furniture catalogue, where prices move with the season and the material, this is what keeps the project alive after handover.

07

Server mode, on its own VPS

The site does not run on shared hosting. It runs as a Next.js server on its own Ubuntu VPS behind nginx. The reason is the admin panel: a statically exported site could hold neither a protected route nor a server-side write. One process carries both the storefront and the panel — there is no separate backend application.

Results

The site is live at bakumebel.az. Each of the three languages has its own address in both the sitemap and the hreflang declaration, so search engines can index the three versions separately. The catalogue is split into six categories, and every model is published not as prose but as its own Product node carrying its price.

Questions about this project
Why is there no cart or online payment?
By design. The price of made-to-measure furniture is not settled until the room is measured, so a cart would promise a number the workshop could not hold to. Instead the calculator shows a budget band and the enquiry moves to WhatsApp with a prefilled message.
Is the price from the calculator exact?
No, and the site says so openly. The calculator gives an approximate range based on the selected room, size, material and hardware. The exact price is set only after the craftsman measures on site.
Is a developer needed to add a new product?
No. Products, images and prices are managed from the site's own admin panel — no code change and no redeploy is required.
How many languages does the site run in?
Three: Azerbaijani, English and Russian. Every page has its own address in each language, and those addresses appear in both the sitemap and the hreflang declaration.
What is the site built with?
Next.js, TypeScript and Tailwind CSS. It runs as a Next.js server on its own Ubuntu VPS behind nginx; the admin panel is not a separate application but part of the same Next.js project.

Tell me about your project — I usually reply the same day.

Nurlan Qadirov — Baku, Azerbaijan