Watch inventory database schema for real dealer stock
Designing a watch inventory database? The fields that survive real dealer stock, the reference and serial traps, and why tools should read one record.


Contentstap to expand
Every dealer who writes their own inventory tool starts with five columns: brand, model, price, status, photo. Six months later there are forty, half of them free text, and nobody trusts the totals. The schema was built for products. A watch is not a product. It is one piece with a history.
These are the decisions that hold up. Most of them are how a watch is modelled in ChronoDesk.
Identity: reference first, model second
The reference is the key. The model name is a label for humans.
- Store the reference as the brand writes it. 126710BLRO, 5711/1A-010, 15500ST.OO.1220ST.01, WSSA0018. Keep the slash, the dots and the suffix. "5711" and "5711/1A-010" are not the same watch and not the same price.
- Keep a normalised copy for matching. Upper case, spaces and dashes stripped, so "126710 blro" finds 126710BLRO. Match on the copy, display the original.
- Allow references you do not know. A catalogue never has everything. Mark them as custom instead of forcing the nearest match. Our watch database has 23,597 references across 27 brands and still gets new ones.
- Model family is derived, not typed. If the reference resolves, the family comes from the catalogue. Typing it twice is how "GMT Master II" and "GMT-Master II" end up as two groups in your report.
How references are built per brand is in how to read a watch reference number.
The piece: serial, year, set, condition
- Serial is private. It identifies one watch and belongs to you and your buyer. It never goes into a public listing or a partner feed.
- Year as a number, with a separate flag for whether it is documented (papers) or estimated.
- Set as structured parts (box, papers, tags, extra links) plus a short label like "Full set". A buyer filters on it. See box and papers.
- Condition on a fixed scale your team agrees on, not free text.
Money: cost lines, not one cost field
One "cost" column is the most expensive shortcut in a dealer tool. Real cost is the purchase price plus every line that lands on the piece afterwards: service, polishing, courier, insured shipping, a commission to whoever brought the deal. Store each as its own line with date and type. Margin is then sale price minus the sum, and it is right.
Store prices per channel too. A B2B price for dealers and a B2C price for clients are normal, and Chrono24 or Shopify may differ again.
Tax scheme per piece
How you bought decides how you sell. A watch bought from a private seller can go out under the margin scheme, one bought with VAT shown cannot. That is a property of the piece, set at purchase, not of the sale. In ChronoDesk it is a fixed field on the watch (regular VAT, margin scheme, intra-community, reverse charge, export, small business), chosen when you buy, and every invoice follows it.
Status is the dealer's vocabulary
"In stock", "Reserved", "In service", "Consignment", "Sold". Every dealer names them slightly differently. Treat status as the dealer's list, not your enum, and keep the history: when it was reserved, for whom, when it sold.
One record, many readers
The biggest mistake is not a field. It is copies. A spreadsheet for stock, another for the shop, a third for the accountant. Each drifts.
If you build tools around your stock, have them read from one record. ChronoDesk exports that record as CSV, JSON or XML, once or as a live URL your tool polls, and the export leaves serials and purchase prices out by design. How that works, and where our API stands (on the roadmap, not available yet), is in connecting your tools to ChronoDesk.
Or skip building the base layer. ChronoDesk keeps this record for you, with invoices and statistics on top, and is free for 60 days. See the plans.


