Available for projects & agency overflow · Quick reply, from the person who does the work

Selling cosmetics online: INCI, sizes and batch numbers

A cosmetic product sells with its label. Online, that label has to become queryable, translated, exportable fields, without the INCI nomenclature ever being altered.

Describe my issue Send a message

The label becomes a data structure

Regulation (EC) No 1223/2009 on cosmetic products requires, in its Article 19, a set of particulars on the labelling: the name and address of the responsible person, the nominal content, the date of minimum durability or the period after opening shown by the PAO symbol, particular precautions for use, the batch number, the function of the product and the list of ingredients in INCI nomenclature.

In distance selling the buyer must be able to consult this information before purchase. The consequence for the shop is immediate: these are distinct product fields, translated language by language, not a photograph of a label. An image reads poorly on mobile, cannot be searched, cannot be indexed and exports to no feed. On a perfumery or soap catalogue that moves with reformulations, it also becomes impossible to maintain.

Requests I get from cosmetics brands and artisan soap makers very often turn on exactly this: taking over a catalogue where regulated information sits inside images or a free-text description.

INCI is not translated, and that is a tooling problem

The INCI list is a standardised nomenclature, written in descending order of concentration, identical across every language of the site. It must stay strictly the same in French, English and Turkish. That requirement collides head-on with two very common mechanisms.

The first is machine translation: applied without a field exclusion it turns Aqua into water, mangles Latin names and leaves the list unusable. The second is CSV import: an ingredient list carries a comma after every term, often brackets and sometimes asterisks marking organic origin. A badly escaped file shifts the columns and lands half the ingredients in the next field. So I lock the INCI field upstream, on both the translation and the import side.

Constraints that rarely show up in a mockup

  • Multiple sizes, 30, 50 or 100 ml, require a unit price calculated per combination rather than per product.
  • A price per litre or per kilo set on the whole page becomes wrong the moment two formats coexist.
  • The batch number printed on the tube has no equivalent in the platforms: no order line carries it without development.
  • Without that link, a batch withdrawal means handling every buyer of a reference instead of only those affected.
  • Perfumes and aerosols contain alcohol or a propellant gas and fall under dangerous goods transport rules.
  • Some destinations, air freight and sometimes pickup-point delivery are excluded for those items: the rule belongs in the carrier calculation, product by product.
  • Free samples and miniatures create a zero-price line that must still reduce stock, appear on the picking slip and stay out of revenue.

How I rework a cosmetics catalogue

  1. I pull regulated information out of the images

    Each Article 19 particular becomes a dedicated field: responsible person, nominal content, PAO or durability date, precautions, function, ingredients. The page shows them before the add-to-basket, and an export to a feed or marketplace carries them as they are rather than a badly sliced description.

  2. I shield the INCI field from any transformation

    The field is excluded from machine translation routines and copied identically into each language. On import I force the file’s delimiter and escaping, then check after loading that the number of terms matches, which catches a column shift immediately.

  3. I compute unit pricing per combination

    Size becomes an attribute holding a usable numeric value, and the price per litre or kilo is derived from it for each combination. A price change on one format then leaves no stale figure on the others.

  4. I carry the batch through to picking

    The batch is entered or scanned during picking and attached to the dispatched line. A withdrawal becomes a targeted query rather than a mailing to the whole base, which also changes how an isolated complaint can be investigated.

  5. I push transport restrictions down to product level

    Items covered by dangerous goods rules are flagged, and that flag filters both the carriers offered and the collection options. The customer never picks a shipping method that picking will have to refuse afterwards.

Multilingual, imports and product pages

Frequently asked questions

Is a photo of the label enough for ingredients?
Technically it works, but the information becomes unreadable on mobile, unsearchable and impossible to export. A structured field also lets a reformulation be corrected across dozens of references without opening an image editor.
Should the INCI list be translated?
No. It is a standardised nomenclature that must stay identical in every language of the site. The field is excluded from machine translation and copied as is; otherwise the Latin names are altered and the list loses both its regulatory and its informative value.
How do I show a price per litre across several sizes?
By making the size numerically usable at combination level, then deriving the unit price from that value. A calculation set on the whole product goes wrong as soon as one format changes price or a new format is added.
Why do some carriers disappear on a perfume?
Because products containing alcohol or a propellant gas fall under dangerous goods transport. Air freight and some collection options are excluded. If the rule is missing from the carrier calculation, it will eventually surface as a parcel refused at the depot.
How do I find the orders containing a given batch?
The batch has to have been recorded on the order line during picking. No platform does that natively. Without it the search falls back on reference and date range, which widens the number of buyers to contact considerably.

Describe your need in one minute

A few targeted questions so I can reply with an estimate rather than another questionnaire.

type
existant
stack (facultatif)
utilisateurs (facultatif)
echeance (facultatif)
Please provide an email or a phone number so I can get back to you.

Please provide an email or a phone number so I can get back to you.