Catalogue · creating SKUs

Add a frame in seconds.

Every frame model your shop sells is a SKU. Multiply by colour and size and you have a lot of typing. The form on /catalog/skus/new is built to make that typing disappear.

Who can create SKUs

Org owner and regional manager. Branch managers and below can't add to the catalogue — that's a deliberate guardrail to keep the SKU list from drifting.

The killer feature: 📸 box-label scan

Open /catalog/skus/new. The first panel is Scan box label · AI. Tap it and either pick a photo from your library or use the camera. Within 2-3 seconds the rest of the form fills in.

What it extracts:

FieldWhat we read off the label
BrandManufacturer name (Ray-Ban, Vincent Chase, etc.)
Model name + codeWhat's printed on the label (Wayfarer Classic, RB-3025)
Colour name + codeTypically “Matte Black” / MBK
SizeLens-bridge-temple in mm (54-18-145)
MRPIndian law requires this be printed; we pick it up
BarcodeIf a barcode is printed, we capture the digits
CategoryBest guess: eyeglasses / sunglasses / reading / kids / sports
The model also returns a confidence level — high, medium, or low. Anything below high gets an amber banner asking you to double-check every field. Bad lighting, blurry photos, partial labels = low confidence. Re-take the photo.

Pre-fill only writes to fields you haven't already typed in — your edits always win. Run the scan first, then refine.

Manual entry (the long way)

If you don't have a label or the photo failed, fill the form by hand:

  1. Category — pick a merchandising bucket if you've created any in /catalog/categories. Optional.
  2. Brand — “Existing” picks from the dropdown, “+ New” lets you type a brand name. Brand-dedup AI watches what you type and warns if there's a near-duplicate (“Ray Ban” vs “Ray-Ban”) with a one-click switch to the existing one.
  3. Model — same pattern. New models need a model code (short alphanumeric, e.g. WAY) and a display name (Wayfarer Classic), plus a category enum.
  4. Variant — colour, lens/bridge/temple measurements, and the SKU code itself. The code auto-suggests as {model_code}-{color_code} once you fill both. Edit before saving if you have a supplier-issued code.
  5. Pricing — MRP, default selling price, cost. Cost is owner-only — branch staff never see it. The form blocks selling above MRP (illegal under the Indian Legal Metrology Act) and warns if cost is higher than selling price.
  6. Tax — HSN code + GST rate. Both auto-fill from the category (sunglasses → 9004.10 / 28%, spectacle frames → 9003.11 / 12%, etc). Override if your accountant uses a different mapping.
  7. Barcode — auto-filled from the SKU code at save. You only need to type something here if you want to override with a supplier-issued EAN-13.
  8. Image — optional product photo. Useful for the customer-facing display screen later.

Colour-code normaliser

Type a colour name (“Matte Black”) and tab out. The form fires a small AI call that looks at your organisation's existing colour codes (BLK, TOR, CRY, MBK, etc) and suggests a code that matches the convention. Stops the BLK / BK / BLA / BLACK drift that fragments your reorder reports.

Suggestions never override a code you've typed yourself.

HSN + GST auto-mapping

Static lookup table covering the optical taxonomy:

CategoryHSNGST
Spectacle frame · plastic / acetate9003.1112%
Spectacle frame · metal / titanium9003.1912%
Sunglasses9004.1028%
Reading glasses (pre-made)9004.9012%
Spectacle lens (corrective)9001.4012%
Contact lenses9001.3012%
Accessories (case, cleaner)4202.92 / 340218%
Source: CBIC GST Rate Notification 1/2017-CT plus subsequent rate changes. Current as of FY2026. The mapping shows the rationale (“Auto-filled: spectacle frame · plastic / acetate (HSN 9003.11) · 12% GST”) so your accountant can sanity-check it before you save.

Barcode generation

Every SKU gets a Code-128 barcode automatically. The payload is the SKU code itself (e.g. LL-RB-WAY-BLK-54) — scans on any retail POS gun or phone camera.

Why Code-128 and not EAN-13: EAN/UPC prefixes are owned by GS1 — using a prefix you don't own to resell is illegal. Code-128 is free-form, free of licensing fees, and works perfectly in-store. The catch is your barcode won't validate against a national GS1 lookup — which only matters if you sell through other retailers.

From the SKU detail page (visit /inventory/search?sku=<id> or click any result), click Print labels →. Type how many stickers you need (default 24, max 240) and Generate →.

You land on a print-ready sheet — 24 labels per A4, three columns by eight rows, each label showing brand · model · colour · size · barcode · selling price. Browser print works; cut along the dashed lines.

In the print dialog, pick A4, margins = none, scale = 100%. Anything else and the labels won't line up with standard sticker sheets.

Contact lenses, accessories, services

Frames have their own catalogue surface (/catalog/skus/new) because of the model-variant hierarchy. The other three product types live in flat catalogues:

TypeWhereWhy flat
Contact lenses/catalog/contact-lensesEach box is its own SKU — power, base curve, diameter. No model-variant tree.
Accessories/catalog/accessoriesCases, cleaners, cloths. Brand-optional, no measurements.
Service offerings/catalog/servicesEye-tests, fittings, repairs. No physical inventory.

All four types appear in the same unified search when you build a cart on /sales/new.

Lens packages

A lens package bundles a lens product (CR-39, polycarbonate, high-index 1.67, etc.) with coatings (anti-reflective, blue-cut), tint (clear, photochromic, gradient), and a vision type (single-vision, bifocal, progressive, reading). Create them in /catalog/lens-packages. Counter staff pick from this list when building a cart — they don't mix and match raw lens components.

Next up

Receiving purchases

Once your catalogue has SKUs, the next thing is getting stock onto the shelves.