24 "decision": "A site-wide singleton imported after notification safety and before every other entity. Payment currency and time zone use Update Business Region. Language and locale use PATCH /site-properties/v4/properties. Every write is preceded by equality checks and followed by a fresh read-back."
25 },
26 "reliability": {
27 "status": "reliable",
28 "flags": []
29 },
30 "pitfalls": [
31 {
32 "code": "the-api-stores-whatever-it-is-sent",
33 "severity": "blocker",
34 "summary": "Update Business Region stored fabricated currency and time-zone strings exactly as sent, and a three-letter language was also stored. Validate currency against ISO 4217, require an IANA-shaped time-zone name of at most 30 characters that Intl accepts, require a two-letter lowercase language and a language-region locale, then read every value back."
35 },
36 {
37 "code": "a-write-is-never-a-no-op",
38 "severity": "warning",
39 "summary": "Sending the value a site already has still increases the properties version. Read, compare exactly, and skip equal values."
44 "summary": "Wix prices carry no currency of their own. A product priced 10 remained 10 after the site currency changed, now interpreted in the new currency. Set locale before entity data. On an existing site with any order or product, ask once; a keep answer holds money-bearing imports while currency differs."
49 "summary": "fields.paths takes top-level names. A nested locale path and an empty mask are refused, and a listed-but-absent field is cleared. Build each mask from the payload keys. Update Business Region rejects language and locale in its mask."
50 },
51 {
52 "code": "language-does-not-move-locale",
53 "severity": "warning",
54 "summary": "Setting language alone leaves locale unchanged. Locale needs its own PATCH with two-letter language and country values."
55 },
56 {
57 "code": "stores-seeds-a-sample-catalog",
58 "severity": "info",
59 "summary": "A fresh Wix Stores installation can contain sample products, but no universal Wix marker for them is verified. Do not infer samples from revision or timestamps; until a verified marker exists, every product makes the site in use and requires the owner's locale decision."
64 "summary": "Fresh-site defaults vary. Never assume them; compare with the values the destination actually holds."
65 }
66 ],
67 "mappingGuidance": [
68 "Every source maps its settings into the neutral discovery/source-locale.json record. Import site/locale after notification safety and before every other public or private entity.",
69 "A site created by this run, or an existing site with no orders and no products, is set directly. Any order or product requires one owner question before a difference is written.",
70 "A keep answer is a passed locale receipt. Neutral entities continue; money-bearing and wall-clock entities remain held while their relevant value differs. Unclassified refs fail closed.",
71 "Compare currency, time-zone spelling, language and locale exactly after validation; never canonicalize a time-zone alias through the runtime.",
72 "Read back with GET /site-properties/v4/properties after every write; a 200 proves only acceptance."
73 ],
74 "setupRequirements": [],
75 "objectPageException": "Site Properties is a property stream with per-group update methods rather than a fetchable object with its own object page. Update Business Region has a method reference; language and locale request shapes are additionally verified through live calls.",
85 "note": "top-level masks and language update recipe"
86 },
87 {
88 "type": "live-verification",
89 "path": "anonymized-live-verification",
90 "note": "All four settings were written and read back on a disposable site; invalid values were retained by some writes, identical writes bumped version, and a priced product kept its amount after currency changed."
91 }
92 ],
93 "notes": "Import before app and entity data. Whether an installed app caches the site currency is not verified; locale-first ordering is the conservative choice."