35 "note": "Single direction of truth: the field-level facts (required paths, frequency enum, interval/description constraints, readback behavior) live in stores/product fieldContracts[] (live-create-and-readback, verified 2026-07-26). This entity does not restate them; consult stores/product at mapping time."
36 },
37 "reliability": {
38 "status": "partially-reliable",
39 "flags": []
40 },
41 "pitfalls": [
42 {
43 "code": "expiry-signup-trial-reported-loss",
44 "severity": "warning",
45 "summary": "Subscription expiry/length, initial signup price, and free trial have NO product.subscriptionDetails field. Decided by Spec Owner 2026-08-16: these are reported loss — ledger them as fidelity_loss entries in the migration report; they are NOT CMS-carried. Do not invent an extended-field or CMS home for them."
46 },
47 {
48 "code": "rides-product-create",
49 "severity": "info",
50 "summary": "Not a standalone record: subscription settings ride the owning product's Catalog V3 create (product.subscriptionDetails.subscriptions[]). Plan this capability inside the stores/product import pass; there is no separate write surface, and patch/update coverage of subscriptionDetails remains unverified (see stores/product)."
51 }
52 ],
53 "mappingGuidance": [
54 "Mapping confirmed by Spec Owner 2026-08-16: WooCommerce subscription-product settings (e.g. Subscriptions For WooCommerce wps_sfw_* postmeta) land in product.subscriptionDetails.subscriptions[] via Catalog V3 Create Product — source cadence unit -> frequency, cadence count -> interval, per the live-verified field contract on stores/product.",
55 "A product the source sells only as a subscription should set subscriptionDetails.allowOneTimePurchases=false; set true only when the source sells both forms.",
56 "Ledger expiry/length, initial signup price, and free trial as fidelity_loss per record that carries them (see expiry-signup-trial-reported-loss); everything else in the source settings maps or is a plugin-side flag with no Wix meaning."
70 "note": "fieldContracts[] product.subscriptionDetails — live-create-and-readback verified 2026-07-26 (migration-20260726-01); the verification this entity's preferredWrite inherits"
71 },
72 {
73 "type": "review-decision",
74 "path": "signed off by Spec Owner, 2026-08-16",
75 "note": "capability claimed here rather than folded into commerce.catalog-product; expiry/signup-fee/free-trial = reported loss"
76 },
77 {
78 "type": "live-run",
79 "path": "migrations/probe-run-20260812/config/wix.env (target site 00000000-0000-0000-0000-000000000000)",
80 "note": "KB verification probe 2026-08-16 (RE-verification, not inheritance): the inherited stores/product field contract was re-exercised on a second site rather than assumed. POST /stores/v3/products with subscriptionDetails { allowOneTimePurchases: false, subscriptions: [{ title, description, frequency: MONTH, interval: 1, autoRenewal: true }] } → 200 on two probe products; GET readback preserved every sent field, added a server-assigned subscriptions[].id and a server-defaulted visible: true, and kept allowOneTimePurchases: false. Confirms the 2026-07-26 contract still holds on the current Catalog V3 surface. Probe products deleted afterwards."
81 }
82 ],
83 "notes": "Authored 2026-08-16 from the signed-off mapping decision (commerce.subscription-products). preferredWrite.verification is verified-live: the write path and field contract were live-verified on stores/product 2026-07-26 AND independently re-verified under this entity by a create/readback/delete probe on 2026-08-16 (second site, current API) — this file is not relying on inheritance alone. Newly observed 2026-08-16: readback adds subscriptions[].visible (server-defaulted true), which is not in the stores/product fieldContracts readback map."