‹ Dial Log

Bringing a collection into Dial Log

A JSON file. One object, with a watches array and optionally the three other arrays below. If all you have is watches, an array of them on its own works too.

This page is generated from the importer itself — every field, type and default below is the rule the app actually applies.

The smallest file that works

{ "watches": [ { "brand": "Tudor", "model": "Black Bay 58" } ] }

Brand is the only thing every watch must have. Everything else is optional and takes the default in the tables below.

A fuller one

{
  "watches": [
    { "id": "w1", "brand": "Tudor", "model": "Black Bay 58", "status": "owned",
      "purchasePrice": 3100, "dateAcquired": "2024-03-02", "serial": "SN-12345" }
  ],
  "wearLogs":    [ { "watchId": "w1", "date": "2026-01-14", "hours": 9 } ],
  "straps":      [ { "name": "Oxblood shell cordovan", "material": "leather", "width": 20 } ],
  "serviceLogs": [ { "watchId": "w1", "date": "2025-06-01", "description": "Full service", "cost": 420 } ]
}

Rules that will reject a file

Photos

Photos cannot be imported. They would have to arrive as base64 data URLs, which a spreadsheet cannot produce and which would make the file enormous. Add photos in the app after importing.

What happens to what you already have

An import replaces the collection on the device. If you already have watches, you are asked to confirm first, and the answer names how many will be replaced. Merging was considered and rejected: two rows both saying "Tudor Black Bay 58" may be one watch or two, and there is no way to tell from the outside — guessing either way loses something.

If you have an account, the import lands locally and the ordinary backup carries it to the server a few seconds later. Import never uploads anything itself.

watches

Required. An array of watches.

fieldtyperequirednotes
brandstringyese.g. "Tudor"
modelstringnoe.g. "Black Bay 58"
statusowned / wishlist / previouslyOwnednodefaults to owned
purchasePricenumbernoa number, not "£3,100"
marketValuenumberno
salePricenumbernoonly meaningful for previouslyOwned
currencyUSD / EUR / GBP / CHF / JPY / CAD / AUD / SGD / HKDnoevery price on this watch is in it; USD if absent
serialstringno
referencestringno
dateAcquireddatenoYYYY-MM-DD
yearMadenumberno
countrystringno
lugWidthnumberno
notesstringno
favoritebooleannodefaults to false
privatebooleannonever leaves the device for friends
idstringnogenerated if absent

wearLogs

Optional. An array of wear log entries.

fieldtyperequirednotes
watchIdstringyesmust match a watch id in this file
datedateyesYYYY-MM-DD
hoursnumber or nullnodefaults to 0; null means worn, hours not recorded, and is kept as null
idstringno

straps

Optional. An array of straps.

fieldtyperequirednotes
namestringyes
materialstringno
colorstringno
widthnumberno
idstringno

serviceLogs

Optional. An array of service entries.

fieldtyperequirednotes
watchIdstringyes
datedateyesYYYY-MM-DD
descriptionstringno
costnumberno
idstringno