Premium fragrance retail · E-commerce · Retail back office
Molecion — E-commerce platform with supplier price-list automation for retail
The hard part was never the shop
Molecion sells original designer and niche fragrances in Baku. We built its whole online sales channel around the part that decides whether such a shop can be trusted: the supplier price list. It arrives in dollars against a catalogue of about 1,100 fragrances in about 1,600 sizes, and one sloppy match silently changes the price of the wrong perfume.
The supplier’s line
MAISON DEMONUIT LE PARFUMEDPL90ML
Read this way
One fragrance Locked
- House
- Maison Demo
- Name
- Nuit Le Parfum
- Concentration
- Eau de Parfum
- Gender
- Women
Size 90 ml
Matched on four fields and a size
Cost → price
- Cost •••
- Rate •••
- Coefficient •••
- Margin •••
Shelf price •••
Project facts
- Project type
- Client project
- Industry
- Retail
- Platforms
- Storefront · Installable PWA · Back office
- Languages
- Azerbaijani · English · Russian
Status
Status Built, tested and deployment-ready
molecion.az · launching soon
The catalogue and the pricing engine already run on the business’s own data. The public launch waits on product photography and the domain.
01 The challenge
One wrong match, one wrong price
A fragrance retailer’s catalogue is not a list of products. It is a list of sizes — the same scent as a 30, a 50, a 90 and a tester, and often twice over, because the eau de parfum and the eau de toilette are different fragrances sharing a name. Every line of a new price list must find exactly one of those sizes, or none.
| One line, one string | Cost | Matches |
|---|---|---|
| MAISON DEMO NUIT LE PARFUM EDP L 90ML | ••• | |
| MAISON DEMO NUIT LE PARFUM EDT L 90ML | ••• | |
| ATELIER DEMO VITRINE DEMO EDP L 100ML TESTER | ••• | |
| DEMO NOIR ABSOLU DEMO PARFUM UNISEX 75ML | ••• | |
| MAISON DEMO NUIT LE PARFUM EDP L 90ML+2X30ML SET | ••• |
Which one of about 1,600 sizes is this?
By hand not a job anybody finishes
-
The shelf price is not a markup
Costs arrive in dollars and the shop sells in manat. Repricing is a chain: a rate, a coefficient, then a margin that differs by house, by size and by cost.
-
The catalogue is sizes, not products
About 1,100 fragrances become about 1,600 bottles and testers. A line lands on exactly one of them, or it is something new.
-
The printed name is the only key
The supplier writes what a person can read, in its own spelling. The catalogue writes the same fragrance another way. Nothing between them is a shared code.
-
A wrong match makes no noise
Nothing fails, no error appears. One perfume simply stands in the shop at another perfume’s price until somebody notices.
-
There was no product database
The business had a price list and photographs — no houses, no sizes, no descriptions, nothing a shop could be built on.
Our design rule
No price may change without a person seeing it first. The importer’s job is to prepare a decision, never to make one.
The catalogue we built and loaded
- 125 Brands in the catalogue
- ≈ 1,100 Fragrances
- ≈ 1,600 Sizes and testers
- 1,992 Ingredient note library
- 3 Languages
Every fragrance in it carries a full scent profile: accords, a three-level note pyramid and a when-to-wear profile.
02 Reading the line
The line is read right to left
A supplier line is one string: house, name, concentration, gender, size. Read forwards, it breaks on the first perfume whose own name contains the word Parfum. So the parser starts at the end, where the order of the fields is certain, and peels the line backwards until only the name is left standing.
MAISON DEMO NUIT LE PARFUM EDP L 90ML
- Size 90 ml
- Gender Women
- Concentration Eau de Parfum
Name Nuit Le Parfum
-
Size
90ML 90 ml
The last certain field, and the one that later decides between a price update and a new bottle.
-
Gender
L Women
A letter or a word, always between the concentration and the size. “Pour Femme” belongs to the name and stays in it.
-
Concentration
EDP Eau de Parfum
Exactly one token is removed, and only from the end. A concentration word further left is part of the name.
-
Name
NUIT LE PARFUM Nuit Le Parfum
Whatever survives the peeling is the name — including the Parfum that was always part of it.
Forwards, the same line falls apart
Left to right, the first PARFUM the parser meets is inside the name. It takes it for the concentration, cuts the name short, and two tokens later asks for a price that belongs to nobody.
Left to right
- Name Nuit
- Concentration Parfum
- ? EDP L
A fragrance that does not exist
Right to left
- Size 90 ml
- Gender Women
- Concentration Eau de Parfum
- Name Nuit Le Parfum
Nuit Le Parfum · EDP · Women · 90 ml
Nuit Le Parfum
-
The end of the line is the reliable part
Suppliers vary how they write a name. They do not vary the order of size, gender and concentration.
-
One token, once
A second pass would eat the name, because names legitimately contain concentration words. The parser strips one and stops.
-
Gift sets are not bottles
A line describing two bottles in one box is a different article, not a size. It is set aside and reported.
03 The identity rule
Four fields are one fragrance
The owner dictated the rule and the system has no way around it. House, name, concentration and gender: all four equal and it is the same fragrance. The size then decides between updating this price and adding this bottle. One of the four different, and it is a different fragrance — with no fuzzy fallback to fall back on.
- House
- Maison Demo
- Name
- Nuit Le Parfum
- Concentration
- EDP
- Gender
- Women
Size 90 ml
Four fields decide which fragrance. The fifth decides which bottle.
-
Same size 90 ml
Update this price
The catalogue carries this fragrance in this bottle. The line updates that one variant and nothing else.
-
New size 30 ml
Add this size
The fragrance exists, this bottle does not. It becomes a new size under the same fragrance, inheriting its profile.
Different fragrance
MAISON DEMO NUIT LE PARFUM EDT L 90ML
- Concentration Eau de Toilette
- Size 90 ml
One letter apart, and a different perfume in the bottle
The eau de toilette is never matched to the eau de parfum — not automatically, and not as a suggestion either, because a one-click confirmation is far too cheap a way to be wrong about a price. The near-miss is shown beside the line as information, never as an option.
- For information
- Same house and name in the catalogue, different concentration
- Needs your decision
- Nuit Le Parfum · EDT
No hidden key
Halfway through the build, the supplier code was deleted from the whole system. It matched well and explained nothing: when a price moved, nobody could see why. The key is now only the five fields printed on the page.
The cost is honest: when the supplier renames a fragrance, the line arrives as new and the owner links it once, by hand.
-
Matched by a code nobody can read
-
Matched by the five fields anyone can read
- House
- Name
- Concentration
- Gender
- Size
04 Review, then apply
Nothing is written until you confirm
Upload the list and the system writes nothing. It reads every line, resolves it against the catalogue and lays the change set out in buckets: dearer, cheaper, a new fragrance, a new bottle, or something the catalogue carries that this list no longer mentions. Each matched line shows the shelf price a customer would see, not only the supplier’s figure. A handful are raised for the owner’s decision.
Supplier list received Demo list 07
-
Cost up
Matched, and dearer than last time.
-
Cost down
Matched, and cheaper.
-
New fragrance
Not in the catalogue. Arrives as an unpublished draft.
-
New size
A fragrance the shop carries, in a bottle it does not.
-
Not in this list
In the catalogue, absent from the file. Reported, never touched.
-
Unchanged
Same fragrance, same cost. Listed, not written.
-
Skipped
Gift sets, repeated lines, and lines a rule ignores for good.
| Selected for this run | Line as printed | House · Name | Concentration · Gender | Size | Cost | Shelf price | Status |
|---|---|---|---|---|---|---|---|
| MAISON DEMO NUIT LE PARFUM EDP L 90ML | Nuit Le Parfum Maison Demo | EDP · Women | 90 ml | ••• Up | ••• | Cost up | |
| MAISON DEMO NUIT LE PARFUM EDP L 30ML | Nuit Le Parfum Maison Demo | EDP · Women | 30 ml | ••• | ••• | New size | |
| MAISON DEMO NUIT LE PARFUM EDT L 90ML | Nuit Le Parfum Maison Demo | EDT · Women | 90 ml | ••• | ••• | New fragrance Same name, different fragranceNeeds your decision | |
| ATELIER DEMO VITRINE DEMO EDP L 100ML TESTER | Vitrine Demo Atelier Demo | EDP · Women | Tester | ••• Down | ••• | Cost down Priced by hand — shelf price frozen | |
| DEMO NOIR ABSOLU DEMO PARFUM UNISEX 75ML | Absolu Demo Demo Noir | Parfum · Unisex | 75 ml | ••• | ••• | Unchanged Rounding, not a price move | |
| No line in this file | Vitrine Demo Atelier Demo | EDP · Women | 50 ml | ••• | ••• | Not in this list | |
| MAISON DEMO NUIT LE PARFUM EDP L 90ML+2X30ML SET | ••• | Skipped | |||||
| MAISON DEMO BODY MIST 200ML | ••• | Skipped Always skipped |
-
A stale review cannot write a price
On apply, the server reads the list again, recomputes the difference and writes only the lines you selected. A review left open for an hour cannot carry an old number into the shop.
-
Cents are not a price change
Costs are kept to the cent, and a movement of a few cents against a whole-number cost is labelled as rounding — so the real news is not buried in noise.
-
A hand-set price stays hand-set
Where the owner priced a bottle by hand, an import refreshes what it cost and leaves the shelf price where it was put.
-
Absence is not a decision
A fragrance missing from one list is reported, never delisted and never zeroed. Dropping off a file is not leaving the catalogue.
05 The importer that learns
The same messy line never asks twice
A supplier writes a house name its own way, abbreviates a concentration nobody has met, or prints a line the parser cannot read at all. The owner resolves it once in the review screen. That resolution is stored as a rule, and the next list applies it before anyone sees the line.
Needs your decision
ATELIER DEMO VITRINE DEMO EDP L 100ML TESTER
- Fix this line
- Match with another fragrance
- Always skip this line
- Undo my decision
| What the supplier writes | What the catalogue means | Caught |
|---|---|---|
| House spelling MSN DEMO An abbreviation, a typo or an older spelling. | Maison Demo | 18 lines |
| Concentration wording PARFUM DE NUIT A house wording the parser cannot infer. | Parfum | 7 lines |
| Gender marker F A marker the built-in list lacks. | Women | 4 lines |
| Line correction ATELIER DEMO VITRINE DEMO L Unreadable fields, typed in once by hand. | EDP · 100 ml | 3 lines |
| Link to a fragrance DEMO NOIR ABSOLU 75 “This line is that bottle.” Confirmed by a person, never guessed. | Absolu Demo · Parfum · Unisex · 75 ml | 2 lines |
| Always skip MAISON DEMO BODY MIST 200ML Not a fragrance variant, and never will be. | Never imported | 6 lines |
The counter shows how often a rule has caught a line, so one that never fires can be removed and one that fires too often can be questioned.
-
Fix it where you found it
Every line opens beside whatever it matched. The correction is made there, the same file is re-analysed on the spot, and the answer is kept.
-
A half-fix is still a problem
If a correction still leaves the size or the concentration unreadable, the line goes back to needing a decision.
-
Accuracy that accrues
Because the knowledge lives in data rather than code, the importer is better on its tenth list than its first, with no deployment in between.
-
Every rule is reversible
Delete it and the importer returns to its default reading of that line. A wrong decision costs a click, not a rebuild.
06 Cost becomes price
From a dollar cost to a shelf price
A supplier cost is not a price. It becomes one through a chain the owner controls: a rate, a coefficient, then the most specific margin rule that fits this bottle — its house, its size and the cost band it falls into. The engine computes it for the whole catalogue in front of you before a single price moves.
The chain
-
Supplier cost USD
•••
As read from the list, kept to the cent.
-
Rate ×
•••
The manat rate, set by the owner.
-
Coefficient ×
•••
Everything else between a list price and a Baku shelf.
-
Cost AZN
•••
The figure the margin is measured against.
-
Margin +
•••
From the one rule that fits this bottle best.
-
Shelf price AZN
•••
What the customer sees, rounded to the manat.
The most specific rule wins
A rule is a set of conditions joined by AND: this house, and this size, and this cost band. Several can match one bottle; the rule with the most conditions takes it, and between two equally specific rules the newer one wins.
-
Winning rule Conditions 3/3
- House Maison Demo
- Size 90 ml
- Cost band One band
Margin •••
-
Also matches Conditions 2/3
- House Maison Demo
- Size Any
- Cost band One band
Margin •••
-
Also matches Conditions 1/3
- House Maison Demo
- Size Any
- Cost band Any
Margin •••
-
Also matches Conditions 0/3
- House Any
- Size Any
- Cost band Any
Margin •••
When no rule matches, the catalogue-wide margin applies.
Cost bands
- Band 01
- Band 02
- Band 03 This bottle’s cost lands here
- Band 04
- Band 05
The bands, their edges and their margins are the retailer’s commercial data. They are drawn without values, because the shape is the point.
Preview, then apply
Change the rate, the coefficient or any rule and the table recalculates for every bottle in front of you: cost, the rule that won, the shelf price and what is left in between.
| Fragrance | Size | Cost | Rule | Difference | Shelf price |
|---|---|---|---|---|---|
| Nuit Le Parfum Maison Demo | 90 ml | ••• | House · Size · Cost band | ••• | ••• |
| Nuit Le Parfum Maison Demo | 30 ml | ••• | House · Cost band | ••• | ••• |
| Vitrine Demo Atelier Demo | 100 ml | ••• | House | ••• | ••• |
| Vitrine Demo Atelier Demo | Tester | ••• | House | ••• | ••• |
| Absolu Demo Demo Noir | 75 ml | ••• | Any | ••• | ••• |
Two buttons, because saving a rule and repricing about 1,600 bottles must never be the same click.
Every price has a history
Each price the engine writes leaves a record: what it was, what it became, which run moved it and when. That is what makes changing a margin safe to try.
| When | Fragrance | From | To | Reason |
|---|---|---|---|---|
| 12 Sep | Nuit Le Parfum 90 ml | ••• | ••• | Strategy applied |
| 12 Sep | Nuit Le Parfum 30 ml | ••• | ••• | Strategy applied |
| 11 Sep | Vitrine Demo 100 ml | ••• | ••• | Strategy applied |
| 4 Sep | Absolu Demo 75 ml | ••• | ••• | Strategy applied |
07 The shop and the back office
A shop window in three languages
In front: a catalogue a customer can genuinely browse, with filters, a search that finds a bottle from three letters, and a product page where the scent itself is data rather than a paragraph of marketing. Behind it: fourteen sections that run the shop, each opened to exactly the people who need it.
-
Men -
Women -
Unisex
nui
- Nuit Le Parfum ↵
- Absolu Demo ↵
- Maison Demo Nuit Le Parfum •••
- Demo Noir Absolu Demo •••
- Atelier Demo Vitrine Demo •••
- Maison Demo Nuit Le Parfum •••
M Installable PWA
The storefront
- Catalogue
-
- Filters by house, gender, concentration and price
- Fuzzy search — three letters find the bottle
- Grid and list views
- Filters as a bottom sheet on a phone
- Product page
-
- Size and tester selector
- Main accords
- Three-level scent pyramid
- When to wear
- About the house
- Buying
-
- Favourites
- Cart
- Guest checkout
- Delivery and payment choice
- Order confirmation
- An app, not a narrow page
-
- Installable PWA
- Five-tab mobile shell
- Works on a weak connection
- Blog and information pages
The scent is data, not a picture
Accords, a three-level pyramid of notes and a when-to-wear profile are stored for every fragrance, drawn from a library of 1,992 ingredients. That is what lets a customer compare two bottles instead of reading two paragraphs that both say “elegant”.
Drawn here as type and bars: the profile is structured data, so it can be rendered any way at all.
Scent pyramid
- Top BergamotPink pepperCardamom
- Heart IrisJasmineCinnamon
- Base SandalwoodAmberTonka bean
Fourteen sections, one permission each
Everything the shop needs in order to be run, and nothing reachable by someone who was not given it.
- Products
- A seven-tab editor: basics, sizes and pricing, gallery with a square cropper, notes, accords, when to wear, search copy.
- Brands
- Houses with their own logo, story and page.
- Notes
- The 1,992-ingredient library every pyramid is built from.
- Accords
- The accord vocabulary, each with its own colour.
- Orders
- Web and phone orders in one book, with a status and payment workflow.
- Customers
- A history built from each order’s phone number, mergeable into an account later.
- Messages
- The contact-form inbox: new, read, replied, archived.
- Blog
- Posts with categories and drafts.
- Discounts
- Campaigns by house, gender or bottle, in a date window, with a profit floor.
- Pricing strategy
- The rate, the coefficient and the margin rules, with a live preview.
- Price list
- The importer, its review screen, its rules and every past run.
- Homepage
- Front-page text blocks and image slots.
- Translations
- Product copy and interface wording, in all three languages.
- Settings
- Shop details, delivery fees, payment methods and staff accounts.
One job, one view
Permissions are granted section by section, and the same permission gates the menu and the action behind it. An assistant hired to photograph bottles gets products and nothing else — no costs, no margins, no price list.
The translations belong to the owner
Product copy and interface wording are edited from the back office in two layers, so a fourth language is data entry rather than a release. All 1,992 note names arrived machine-drafted and flagged as drafts, so a person refines instead of types.
- Content
- Fragrance and house copy, per language, over an English base.
- Interface
- Buttons, labels and banner wording, changed without touching code.
- Fallback
- Anything untranslated falls back to English, so nothing is blank.
08 How it is built
One deploy, and nothing to phone home to
Storefront, back office and API are one deployable unit with no third-party service in the request path. Nothing about a customer, a cost or a margin leaves the host it runs on.
- One command, one platform
- Shop, back office and API ship together as a single container image, and one command brings the whole platform up on any ordinary host.
- Data that survives a redeploy
- The catalogue and the uploaded images live outside the application, so rebuilding leaves them exactly as they were. Backups are taken automatically.
- No third-party runtime
- No analytics, no tracker, no external API behind a page load. The privacy story is architectural, not a policy page.
- Tested where it costs money
- Parser, matcher, change set and pricing chain are pure modules with unit tests. The suite was mutation-checked: two rules were deliberately broken to confirm it catches a real regression.
- Images nobody has to think about
- Every upload is validated, rotated, capped and re-encoded server-side into a web-sized WebP, one file per slot.
Security posture
Three kinds of user
-
Owner
Holds every section: the rate, the coefficient, the margin rules, the approval of an import and the last word on a disputed line.
-
Staff
Holds the sections they were granted and sees nothing else — not in the menu, and not through the action behind it.
-
Customer
Browses, searches, saves favourites and checks out as a guest, recognised afterwards by phone number.
Our role
What Atlas BIP did
-
Built the catalogue that did not exist
We turned the business’s own price list into a structured catalogue, then gave every fragrance a full profile from a 1,992-ingredient note library.
-
Engineered the price list
The right-to-left parser, the identity rule, the change set and the review flow — plus the rule store that lets the owner teach the importer instead of asking a developer.
-
Built the pricing engine
Cost to shelf price, compound margin rules, a live preview across the catalogue, a deliberate split between saving and applying, and a record behind every price that moved.
-
Designed and built the storefront
A three-language shop with an app-like mobile shell — black and gold on cream paper — with the scent profile as its centrepiece.
-
Built the back office and packaged the platform
Fourteen permission-gated sections, an owner-editable translation layer, a server-side image pipeline, and a one-command deployment whose data survives every redeploy.
Stack
Built on a modern stack
- Application
-
- TypeScript
- React
- Next.js
- Tailwind CSS
- Storefront
-
- PWA
- Service worker
- Server components
- Data
-
- Prisma
- SQL
- Zod
- Media
-
- Sharp
- WebP
- Quality
-
- Vitest
Questions and answers
What retailers ask us
Can you automate our supplier price list?
Yes, and it is usually the first thing worth building. We start from your real list and your real catalogue, agree in writing what makes two rows the same product, then build an importer that shows what went up, what went down, what is new and what disappeared — and writes nothing until you confirm.
How do you make sure the wrong product’s price never changes?
With an identity rule strict enough to be boring. For Molecion it is house, name, concentration and gender: all four equal or it is a different fragrance, with the size deciding between updating a price and adding a bottle. There is no fuzzy fallback, and on apply the change set is rebuilt on the server so a stale review cannot write a price.
Is the Molecion shop live?
No, and we will not describe it as if it were. Molecion is built, tested and deployment-ready: the catalogue and the pricing engine already run on the business’s own data, and the public launch waits on product photography and the domain, molecion.az.
Can our own staff run the shop without calling us every week?
That is what the back office is for. Product copy, houses, the note and accord libraries, homepage content, delivery and payment settings, campaigns, the pricing rules and all three languages are edited in the panel, with permissions so each person sees only their own job. A new supplier spelling is a rule someone types, not a release.
Can you build something like this for our shop?
Yes. The storefront is the straightforward half; the half that decides whether a shop is trustworthy is the pricing and the intake of supplier data. We start there, agree the money rules with you, and build the shop around them — on infrastructure you own.
Your project
Your system is next
Tell us how orders, money and documents move through your company today. We reply within 24 hours with questions and a concrete plan.
Houses, fragrances and price-list lines on these screens are invented. Costs, margins, rates and prices are the retailer’s own commercial data and are masked throughout.
Back to the start