Skip to content
ATLASBIP Business Intelligence Partners
ATLASBIP Business Intelligence Partners

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.

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.

Which one of about 1,600 sizes is this?

By hand not a job anybody finishes

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  1. Size

    90ML 90 ml

    The last certain field, and the one that later decides between a price update and a new bottle.

  2. 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.

  3. 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.

  4. 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.

  • 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.

Four fields decide which fragrance. The fifth decides which bottle.

  1. Same size 90 ml

    Update this price

    The catalogue carries this fragrance in this bottle. The line updates that one variant and nothing else.

  2. 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.

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.

  1. Matched by a code nobody can read

  2. 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

  1. Cost up

    Matched, and dearer than last time.

  2. Cost down

    Matched, and cheaper.

  3. New fragrance

    Not in the catalogue. Arrives as an unpublished draft.

  4. New size

    A fragrance the shop carries, in a bottle it does not.

  5. Not in this list

    In the catalogue, absent from the file. Reported, never touched.

  6. Unchanged

    Same fragrance, same cost. Listed, not written.

  7. Skipped

    Gift sets, repeated lines, and lines a rule ignores for good.

  • 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

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

  1. Supplier cost USD

    •••

    As read from the list, kept to the cent.

  2. Rate ×

    •••

    The manat rate, set by the owner.

  3. Coefficient ×

    •••

    Everything else between a list price and a Baku shelf.

  4. Cost AZN

    •••

    The figure the margin is measured against.

  5. Margin +

    •••

    From the one rule that fits this bottle best.

  6. 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.

  1. Winning rule Conditions 3/3

    • House Maison Demo
    • Size 90 ml
    • Cost band One band

    Margin •••

  2. Also matches Conditions 2/3

    • House Maison Demo
    • Size Any
    • Cost band One band

    Margin •••

  3. Also matches Conditions 1/3

    • House Maison Demo
    • Size Any
    • Cost band Any

    Margin •••

  4. Also matches Conditions 0/3

    • House Any
    • Size Any
    • Cost band Any

    Margin •••

When no rule matches, the catalogue-wide margin applies.

Cost bands

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.

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.

The Molecion storefront: a lit boutique wall of fragrance bottles, the gold monogram and the brand’s own carrier bag on black marble.
  • Men’s fragrances lined up on black marble Men
  • Women’s fragrances lined up on black marble Women
  • Unisex fragrances lined up on black marble Unisex
The real storefront — the brand’s own opening screen and category tiles, the way the shop presents itself.

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.

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

  • Permissions granted per section
  • Sign-in sessions the owner can revoke
  • Server-side validation at every boundary
  • Uploads re-encoded, never trusted
  • Rich text sanitised before storage
  • Every price change recorded
  • No third-party service in the request path

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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