38 "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."
39 },
40 "reliability": {
41 "status": "partially-reliable",
42 "flags": []
43 },
44 "pitfalls": [
45 {
46 "code": "expiry-signup-trial-reported-loss",
47 "severity": "warning",
48 "summary": "Subscription expiry/length, initial signup price, and free trial have NO product.subscriptionDetails field. 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."
49 },
50 {
51 "code": "rides-product-create",
52 "severity": "info",
53 "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)."
54 }
55 ],
56 "mappingGuidance": [
57 "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.",
58 "A product the source sells only as a subscription should set subscriptionDetails.allowOneTimePurchases=false; set true only when the source sells both forms.",
59 "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."
73 "note": "fieldContracts[] product.subscriptionDetails — live-create-and-readback verified 2026-07-26; the verification this entity's preferredWrite inherits"
74 },
75 {
76 "type": "review-decision",
77 "path": "anonymized-live-verification",
78 "note": "capability claimed here rather than folded into commerce.catalog-product; expiry/signup-fee/free-trial = reported loss"
79 },
80 {
81 "type": "live-run",
82 "path": "anonymized-live-verification",
83 "note": "Verified live: the inherited stores/product field contract was re-exercised in an independent verification environment 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."
84 }
85 ],
86 "notes": "Authored 2026-08-16 from the approved mapping behavior (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."