Product code scheme — proposal

Status: proposal for approval (T-57, Q-57). Nothing changes on the site until it is approved.

Data: every code, finish, CCT and beam below comes from the master workbook, as parsed by the importer on 27 October 2026. Nothing is invented; where the workbook has a gap, the gap is shown.

1. In short

Today every product has a code like BU121213. It is unique (mostly), but it tells you nothing: you cannot see from it that it is a Lune R 10W downlight in matt black at 3000 K. The proposal adds a second, readable code to every product code.

RLCeiling Recessed trimLess
LNRseries: Lune R
01010 W
MBMatt Black
303000 K

Today's BU121213 becomes RL-LNR010-MB30. Three promises:

  1. Today's codes stay. BU121213 remains the permanent identifier for quote history and the future ERP. Nothing that already points at it breaks.
  2. One to one. Each new code belongs to exactly one of today's codes, and the other way round. The new code is a readable name for the same product, not a new product.
  3. Readable and sortable. The new code always has the same blocks in the same order and width, so a list sorts by category, then product, then wattage, then finish, then light colour.

Look up a code

Type one of today's codes to see the code the scheme would give it, block by block. Every one of today's codes in the workbook is here. The series codes and dictionaries are a draft: they become final only when you approve them, and a code marked pending waits on one of the decisions in §7.

Upper or lower case, with or without spaces. You can also type a product name (for example Lune R 10W) to list its codes, or a proposed code to find today's one.

Draft mapping of every code in the master workbook.

Download the full mapping (CSV)

2. The rule

CCcategory
SSSseries (product line)
NNNwattage, or running number
FFfinish
LLlight: CCT or colour
BBBbeam, only when chosen per code
MMmodel, only when needed

Segment table

#BlockWidthWhat it holdsExamples
1Category2 lettersOne code per website category (16), plus AX for accessoriesRL Ceiling Recessed Trimless, EX Exterior, DR LED Drivers
2aSeries3 charactersThe product line, from a registry: two characters for the collection plus one for the lineLNR Lune R, AGL Aglaia, AGC Aglaia colour (RGB/RGBW), GSD Gisele Diffused
2bWattage3 digitsThe wattage in the product name, whole watts, zero-padded. Products with no wattage get a running number 001–999 within their series010 = 10 W, 060 = 60 W, 001 = first profile
3aFinish2 lettersFrom a finish dictionary: treatment letter + colour letter, or a two-letter colourMB Matt Black, TW Textured White, BK Black, XX none stated
3bLight2 charactersWhite light: Kelvin ÷ 100. Colour: two letters27 2700 K, 30 3000 K, 65 6500 K, RW RGBW, RG RGB, RD Red, XX none
4Beam3 charactersOnly for families where each code has its own beam. Degrees, zero-padded; E elliptical; A asymmetric015 15°, 120 120°, E24 20×40°, A30 asymmetric 30°, XXX none
5Model2 digitsOnly for families where finish, light and beam do not tell the codes apart. A running number until the client names the real difference01, 02 …

Reserved: XX / XXX = "not applicable or not stated"; AX = accessory; Z as the first character of a block = special or project-only version (never used by the catalogue); no new code ever starts with BU, so it cannot be mistaken for one of today's codes.

3. Ten sample families

Chosen to cover every shape the catalogue has. Four are families you named (Lune R 10W, Aglaia 12W IP66, Emergence I, Gisele 10W Diffused); six fill shapes your list did not cover (a beam per code, an optic chosen on the quote line, a colour product, accessories, a family without codes, an LED driver). The other six families you named are in Appendix B.

3.1 Lune R 10W — a simple recessed downlight (finish × CCT)

Ceiling Recessed Trimless · IP20 · one beam for the whole family (24°), so the beam is not in the code. Family code RL-LNR010 · 12 codes.

Today's codeFinishCCT / colourBeamProposed code
BU121198Matt White2700K—RL-LNR010-MW27
BU121201Matt White3000K—RL-LNR010-MW30
BU121204Matt White4000K—RL-LNR010-MW40
BU121210Matt Black2700K—RL-LNR010-MB27
BU121213Matt Black3000K—RL-LNR010-MB30
BU121216Matt Black4000K—RL-LNR010-MB40
BU121222Polish White2700K—RL-LNR010-PW27
BU121225Polish White3000K—RL-LNR010-PW30
BU121228Polish White4000K—RL-LNR010-PW40
BU121234Polish Black2700K—RL-LNR010-PB27
BU121237Polish Black3000K—RL-LNR010-PB30
BU121240Polish Black4000K—RL-LNR010-PB40

3.2 Extense S 7W — the beam is part of each code

Ceiling Recessed Trimless · IP20 · each code has its own beam (15°, 24° or 35°), so the code gets the beam block. This is the longest shape: 18 characters. Family code RL-EXS007 · 9 codes.

Today's codeFinishCCT / colourBeamProposed code
BU114138White body/ Black reflector2700K15°RL-EXS007-WB27-015
BU114139White body/ Black reflector2700K24°RL-EXS007-WB27-024
BU114140White body/ Black reflector2700K35°RL-EXS007-WB27-035
BU114141White body/ Black reflector3000K15°RL-EXS007-WB30-015
BU114142White body/ Black reflector3000K24°RL-EXS007-WB30-024
BU114143White body/ Black reflector3000K35°RL-EXS007-WB30-035
BU114144White body/ Black reflector4000K15°RL-EXS007-WB40-015
BU114145White body/ Black reflector4000K24°RL-EXS007-WB40-024
BU114146White body/ Black reflector4000K35°RL-EXS007-WB40-035

3.3 Martine 8W — the optic is chosen on the quote line

Ceiling Recessed Trimless · IP20 · the workbook lists optics 15°/24°/36° for the family but gives one code per finish and CCT, not one per optic. The code therefore has no beam block; the visitor picks the optic on the quote line, and the quote shows it next to the code (for example RL-MRT008-TW30 · optic 24°). Whether each optic should get its own code is a question for the client (§7). Family code RL-MRT008 · 6 codes.

Today's codeFinishCCT / colourBeamProposed code
BU120276Text White2700K—RL-MRT008-TW27
BU120279Text White3000K—RL-MRT008-TW30
BU120282Text White4000K—RL-MRT008-TW40
BU120288Text Black2700K—RL-MRT008-TB27
BU120291Text Black3000K—RL-MRT008-TB30
BU120294Text Black4000K—RL-MRT008-TB40

3.4 Aglaia 24W RGBW IP66 — a colour product

Exterior · IP66 · one beam for the family (30°). The light block holds the colour (RW = RGBW) instead of a Kelvin value. The white-light Aglaia 24W IP66 also exists at 24 W, so the colour line gets its own series code (AGC, not AGL): that is how the scheme keeps two families with the same name and wattage apart. Family code EX-AGC024 · 2 codes.

Today's codeFinishCCT / colourBeamProposed code
BU115495GreyRGBW—EX-AGC024-GYRW
BU115491BlackRGBW—EX-AGC024-BKRW

3.5 Aglaia 12W IP66 — an exterior IP66 product

Exterior · IP66 · one beam for the family (24°). Family code EX-AGL012 · 6 codes.

Today's codeFinishCCT / colourBeamProposed code
BU115344Black2700K—EX-AGL012-BK27
BU115349Black3000K—EX-AGL012-BK30
BU115354Black4000K—EX-AGL012-BK40
BU115369Grey2700K—EX-AGL012-GY27
BU115374Grey3000K—EX-AGL012-GY30
BU115379Grey4000K—EX-AGL012-GY40

3.6 BU1616T — a profile with accessories

Profile System · the profile itself has no code in the workbook; its two codes are accessories (an end cap and a bracket). Accessories use the reserved category AX, followed by the parent profile's product block and a four-letter block: accessory type (EC end cap, BR bracket) + finish (WH white, XX not stated). Profiles have no wattage, so the number is a running number (001). Family code PR-PRF001 · 2 accessory codes.

Today's codeFinishCCT / colourBeamProposed code
WEC1616TWhite End Cap——AX-PRF001-ECWH
MBracket1616TMetal Bracket——AX-PRF001-BRXX

3.7 Led Track Light Fixed 60W — a family without codes

Industrial · IP20 · 60 W · no codes in the workbook; staff assign the exact code when quoting. The optics (30°/60°/90°/120°/PC Diff/Double Asym) are chosen on the quote line. The family is quoted with its family code ND-LTF060. Its sister, Led Track Light Double 60W, would be ND-LTD060.

No product codes: the family code is the only code.

3.8 Emergence I — an emergency light that needs the model block

Emergency Lights · IP54 · all nine codes are White, 6500 K, with no beam — finish and light cannot tell them apart (the workbook flags this family as ambiguous). The model block keeps every code distinct. Today the difference only lives inside the old code (the "Model" column shows that part); until the client names what LFP, CV, CS, RF, FB and PL03/05/10 mean, the model block is a plain running number. The name has no wattage, so the number block is a running number (001, which also matches the "I" in the name). Family code EM-EMG001 · 9 codes.

Today's codeFinishCCT / colourBeamModelProposed code
BU-EXIUNI2-X1LFPWhite6500K—X1LFPEM-EMG001-WH65-01
BU-EXIUNI2-X1LFP CVWhite6500K—X1LFP CVEM-EMG001-WH65-02
BU-EXIUNI2-X1CSWhite6500K—X1CSEM-EMG001-WH65-03
BU-EXIUNI2-X1CS CVWhite6500K—X1CS CVEM-EMG001-WH65-04
BU-EXIUNI2-X1RFWhite6500K—X1RFEM-EMG001-WH65-05
BU-EXIUNI2-X1FBWhite6500K—X1FBEM-EMG001-WH65-06
BU-EXIUNI2- 1PL03White6500K—1PL03EM-EMG001-WH65-07
BU-EXIUNI2- 1PL05White6500K—1PL05EM-EMG001-WH65-08
BU-EXIUNI2- 1PL10White6500K—1PL10EM-EMG001-WH65-09

3.9 60W IP20 — an LED driver

LED Drivers · IP20 · no codes in the workbook. The family code uses the driver's rated wattage: DR-DRV060. The other drivers would be DR-DRV100, DR-DRV150 and DR-DRV200.

No product codes: the family code is the only code.

3.10 Gisele 10W Diffused — a magnetic-track product with a missing code

Magnetic System · IP20 · one beam for the family (120°). The workbook has a 3000 K row with no code, so today that version cannot be sold on the site. The scheme can name it (MG-GSD010-TB30), but the code stays reserved — not shown — until the client confirms the product exists and gives it one of today's codes (or agrees that the new code is enough). Family code MG-GSD010 · 2 codes + 1 reserved.

Today's codeFinishCCT / colourBeamProposed code
BU114949Textured Black2700K—MG-GSD010-TB27
BU114951Textured Black4000K—MG-GSD010-TB40
none in workbookTextured Black3000K—MG-GSD010-TB30 reserved

4. Edge cases and how the scheme handles them

SituationTodayWith the scheme
Beam: one for the whole family (Lune R 10W, 24°)Shown as a fact on the product pageNot in the code (it never varies inside the family)
Beam: different per code (Extense S 7W)Third picker axisBeam block, e.g. -015
Beam: option list chosen on the quote line (Martine 8W)Optic picked on the quote lineNo beam block; the optic stays on the quote line next to the code
Some codes of a family have a beam, some do not (Aubin XTL 9W: "Diffused glass" versions)Placeholder "—" on the beam axisXXX in the beam block
No finish or no CCT (Terra 48W Adj has no finish)Axis missingXX in that half of the look block (GR-TRA048-XX30)
Colours (RGB, RGBW, RED, BLUE, GREEN)Mixed into the CCT columnTwo-letter colour code in the light block (RG, RW, RD, BL, GN)
Odd colour values (Calypso 3W: "RBG DMXS12", "RBGW DMXS12", "GREEB")Reported as typosThe client confirms what they are first; "DMXS12" (the control type) would go in the model block, not the colour
Accessories (end caps, brackets)Variations of the profile familyReserved category AX + parent product block + type and finish
Families without codes (58, e.g. drivers, many profiles)"Code assigned by Búho"Quoted with the family code (DR-DRV060)
Ambiguous families (16, e.g. Emergence I)Extra "Model" axis showing the old codeModel block -01, -02…; the client is asked for the real difference
The same code in two families (43 codes in the workbook, e.g. BU108764 in Orbit I X, Orbit II Moon S and Orbit II X)All those families are left out of the importNew codes are built from the family's own blocks, so two families can never produce the same new code. Each old code can be linked to only one new code, so a duplicated old code stays unlinked until the client says which family owns it
Same name and wattage, different product (41 groups: Aglaia 24W vs Aglaia 24W RGBW, Solar 25W IP44 vs Solar R 25W, Neo Flex 8W in six sizes, Maigre 40W in seven versions)Told apart only by the titleEach product line gets its own series code (AGL/AGC, SLA/SLR); the registry refuses a family block that already exists
Same title in two categories (Martine 10W and 20W are both recessed and magnetic)The second one is left out of the importDifferent series codes (MRT recessed, MRM magnetic)
Multi-head names ("Lune S II 10W x2", Martine 4W = 2×2 W)—The wattage in the name (010, 004); the series code already tells single and double heads apart
Decimal wattages (Metta I 7.5W, LED strip 4.8W)—Rounded to whole watts (008, 005); the registry guarantees uniqueness
No wattage at all (profiles, emergency lights)—Running number within the series (001, 002…)
Names starting with I or O (Orbit, Industrial)—The series skips those letters: Orbit → RB…, Industrial → ND
Special versions for one project—Reserved: a block starting with Z is never used by the catalogue

5. What would change on the site

Only what people see. Data, links and the ERP key stay as they are.

6. How we would get there

  1. You approve the rule (this page), then the client approves it.
  2. The lead prepares the dictionaries — 16 category codes, one series code per product line, the finish list, the colour list and the beam list — and the client approves them.
  3. The importer generates a new code for every one of today's codes and checks them all: every code unique, every code at most 18 characters, nothing that looks like an old code. Anything it cannot code (an unknown finish, a duplicated old code, a missing code) goes on the client's fix list, like the import issues today.
  4. The approved codes are frozen in a registry file in the repository (old code ↔ new code, plus the family codes). From then on, a re-import never changes an issued code; only new products get new codes.
  5. The site shows both codes (§5). A dry run on staging first, then live.
  6. The client starts using the new codes in its own price lists, datasheets and packaging, at its own pace.
  7. The ERP connects on today's codes. Switching the ERP to the new code as its main key can be decided later; the registry makes that a lookup, not a migration.

7. Decisions needed

For Ibrahim

  1. Approve the shape CC-SSSNNN-FFLL[-BBB][-MM], including the category at the front. Recommended: yes — it makes lists sort by category and reads well on a spec sheet.
  2. Which code leads on the site: the new code large with "Ref. BU…" under it (recommended), or today's code first until the client has adopted the new one.
  3. Accessories: own AX category block (recommended — an accessory code can never be mistaken for a light), or the parent profile's category.

For the client

  1. The finish list: are "Text White" and "Textured White" the same finish (both would be TW)? Same for "Text Black"/"Textured Black". Some finish names also hold an IP rating or a wattage ("… (White Reflector) IP44", "ss316 front cover 36W"), and there are typos ("Snad Grey"). The clean list decides the finish codes.
  2. Optics chosen on the quote line (11 families today, e.g. Martine 8W): keep one code per finish × CCT and the optic on the quote line (recommended — matches today's codes one to one), or give each optic its own code.
  3. The 16 ambiguous families: what really tells their codes apart (e.g. Emergence I: LFP, CV, CS, RF, FB, PL03/05/10)? The answer replaces the running-number model block with a meaningful one.
  4. Missing codes (e.g. Gisele 10W Diffused 3000K): does the product exist, and should it get one of today's codes?
  5. The 43 codes used by two or more families: which family owns each code?
  6. Series codes for products whose name is only a number (drivers "60W IP20", profiles "BU1616T"): accept DRV / PRF with a number, or propose names.
  7. Using the new codes outside the site (datasheets, price lists, packaging) — and from when.

Appendix A — technical details

A.1 Grammar

product code : ^[A-HJ-NP-Z]{2}-[0-9A-HJ-NP-Z]{3}[0-9]{3}-[0-9A-HJ-NP-Z]{4}(-[0-9A-HJ-NP-Z]{3})?(-[0-9]{2})?$
family code  : ^[A-HJ-NP-Z]{2}-[0-9A-HJ-NP-Z]{3}[0-9]{3}$

A.2 Category codes

CategoryCodeCategoryCode
Ceiling Recessed TrimRTTrack LightTR
Ceiling Recessed TrimlessRLExteriorEX
Ceiling SurfaceCSInground LampGR
Wall RecessedWRIndustrialND
Wall SurfaceWSLED StripLS
Profile SystemPRUnderwaterUW
SuspendedSUMagnetic SystemMG
Accessories (any category)AXLED DriversDR
Emergency LightsEM

The category block records the category when the code is issued; moving a product later does not change its code.

A.3 Dictionaries used in the samples

A.4 Checks run on the real workbook (27 October 2026)

A.5 Storage and display (when built)

Appendix B — the other families you named

All codes of the six remaining families from your list, to show the scheme on products you know.

Orbit I Moon S 15W IP65

Wall Surface · family code WS-RBM015

Today's codeFinishCCT / colourBeamProposed code
BU111829White2700K—WS-RBM015-WH27
BU111830White3000K—WS-RBM015-WH30
BU111831White4000K—WS-RBM015-WH40
BU111833Black2700K—WS-RBM015-BK27
BU111834Black3000K—WS-RBM015-BK30
BU111835Black4000K—WS-RBM015-BK40
BU111837Grey2700K—WS-RBM015-GY27
BU111838Grey3000K—WS-RBM015-GY30
BU111839Grey4000K—WS-RBM015-GY40

PCP Profile 30W IP20

Suspended · family code SU-PCP030

Today's codeFinishCCT / colourBeamProposed code
BU20625Text Black2700K—SU-PCP030-TB27
BU20626Text Black3000K—SU-PCP030-TB30
BU20627Text Black4000K—SU-PCP030-TB40
BU20629Text White2700K—SU-PCP030-TW27
BU20630Text White3000K—SU-PCP030-TW30
BU20631Text White4000K—SU-PCP030-TW40
BU20633Text Grey2700K—SU-PCP030-TG27
BU20634Text Grey3000K—SU-PCP030-TG30
BU20635Text Grey4000K—SU-PCP030-TG40

Solar 25W IP44

Industrial · family code ND-SLA025. The three finishes differ only in the reflector, so the finish codes name the reflector (RW, RC, RS).

Today's codeFinishCCT / colourBeamProposed code
BU108373Textured White (White Reflector)2700K—ND-SLA025-RW27
BU108374Textured White (White Reflector)3000K—ND-SLA025-RW30
BU108375Textured White (White Reflector)4000K—ND-SLA025-RW40
BU108377Textured White (Chrome Reflector)2700K—ND-SLA025-RC27
BU108378Textured White (Chrome Reflector)3000K—ND-SLA025-RC30
BU108379Textured White (Chrome Reflector)4000K—ND-SLA025-RC40
BU108381Textured White (Silver Reflector)2700K—ND-SLA025-RS27
BU108382Textured White (Silver Reflector)3000K—ND-SLA025-RS30
BU108383Textured White (Silver Reflector)4000K—ND-SLA025-RS40

Martine 4W

Ceiling Surface · family code CS-MRT004

Today's codeFinishCCT / colourBeamProposed code
BU123922Text White2700K—CS-MRT004-TW27
BU123923Text White3000K—CS-MRT004-TW30
BU123924Text White4000K—CS-MRT004-TW40
BU123934Text Black2700K—CS-MRT004-TB27
BU123935Text Black3000K—CS-MRT004-TB30
BU123936Text Black4000K—CS-MRT004-TB40

Fabio 12W

Track Light · family code TR-FAB012

Today's codeFinishCCT / colourBeamProposed code
BU114013Textured White2700K—TR-FAB012-TW27
BU114014Textured White3000K—TR-FAB012-TW30
BU114015Textured White4000K—TR-FAB012-TW40

Terra 48W Adj

Inground Lamp · family code GR-TRA048. No finish in the workbook, so the finish half is XX. Today's codes end in "-Adj"; the new code does not need it, because every Terra family is adjustable.

Today's codeFinishCCT / colourBeamProposed code
BU119864-Adj—2700K—GR-TRA048-XX27
BU119868-Adj—3000K—GR-TRA048-XX30
BU119872-Adj—4000K—GR-TRA048-XX40