19 "note": "A fixed bundle (a set list of parts at set quantities). The source adapter emits canonical product.bundle with kind fixed."
20 },
21 {
22 "sourceSystem": "woocommerce",
23 "sourceEntity": "composite-definition",
24 "confidence": "high",
25 "note": "A kit the buyer assembles from component groups. The source adapter emits canonical product.bundle with kind configurable."
26 },
27 {
28 "sourceSystem": "shopify",
29 "sourceEntity": "bundle-variant",
30 "confidence": "medium",
31 "note": "A product variant with requiresComponents true and productVariantComponents. The source adapter emits canonical product.bundle with kind fixed."
32 }
33 ],
34 "dependsOn": [
35 "stores/product"
36 ],
37 "carries": [
38 "product.bundle"
39 ],
40 "preferredWrite": {
41 "surface": "Manual -- no API; the merchant installs a bundle app from the Wix App Market and links the parts in it",
70 "note": "The listing advertises part stock updates, variant mapping and connected inventory. Configurable support is the vendor's claim; check it before recommending it for a kit. Not live-tested with a migration."
71 }
72 ],
73 "pitfalls": [
74 {
75 "code": "no-bundle-product-type",
76 "severity": "warning",
77 "summary": "Wix Stores has no bundle product type: Catalog V3 productType is PHYSICAL | DIGITAL only, with no composed-product entity, child-product reference or component-group field (product-object docs checked 2026-08-16). The bundle imports as a normal product with its own price and stock; the links to its parts are set up in a bundle app by the merchant."
78 },
79 {
80 "code": "mix-and-match-is-not-a-bundle",
81 "severity": "warning",
82 "summary": "Wix's mix-and-match is a category plus an automatic discount on separately purchased products (support docs evaluated 2026-08-16). It has no bundle product and no API. Never replace a bundle with a category discount: it changes what the buyer orders."
83 },
84 {
85 "code": "frozen-derived-price",
86 "severity": "warning",
87 "summary": "A bundle whose source price is derived from its parts imports with the source's current price, frozen. Later price changes of the parts do not change it unless the chosen app re-derives it."
88 },
89 {
90 "code": "never-install-or-buy",
91 "severity": "blocker",
92 "summary": "Never install, buy or configure a bundle app from the migration. The merchant chooses and installs it; the operator checks it like any manual setup."
93 }
94 ],
95 "mappingGuidance": [
96 "A product with canonical product.bundle maps through the normal stores/product route at its source price and its own stock. Never hold, defer or gap it because its parts cannot be linked.",
97 "Never map bundle components or kit groups onto product options, modifiers or variants.",
98 "The bundle's source fields take disposition excluded with policyRef carried-to-cutover, canonicalField product.bundle and carriedBy stores/product-bundle: the contents are carried to the operator, not lost.",
99 "lib/stores-bundle-cutover.js turns the imported bundles into one bundle-app-setup operator action per bundle and the ledger execution/stores/bundle-setup.json. This runbook creates no operator task of its own."
116 "prerequisite": "The bundle and its parts are imported.",
117 "steps": [
118 {
119 "actor": "merchant",
120 "text": "Choose a bundle app that supports the bundle's kind: Product Bundles by PurpleBear (fixed bundles) or Bundles & Connected Inventory by Presto-Changeo (fixed bundles; kits per the vendor)."
121 },
122 {
123 "actor": "merchant",
124 "text": "Install the app from the Wix App Market."
125 },
126 {
127 "actor": "merchant",
128 "text": "For each bundle in the migration's bundle list, link the listed parts and quantities to the bundle product in the app."
129 },
130 {
131 "actor": "merchant",
132 "text": "Check each bundle in the app and on the product page."
133 }
134 ],
135 "mechanism": "Configuration inside a third-party app; there is no Wix API to write bundle links.",