@wix/agent-skills 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +115 -12
  3. package/skills/wix-app/references/APP_MARKET_REVIEW.md +1 -1
  4. package/skills/wix-app/references/BACKEND_API.md +18 -0
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +6 -0
  6. package/skills/wix-app/references/DASHBOARD_MODAL.md +10 -2
  7. package/skills/wix-app/references/DASHBOARD_PAGE.md +32 -70
  8. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +14 -3
  9. package/skills/wix-app/references/SITE_PLUGIN.md +12 -0
  10. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +74 -68
  11. package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +79 -0
  12. package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +73 -0
  13. package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +52 -0
  14. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +184 -0
  15. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +12 -11
  16. package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +1 -0
  17. package/skills/wix-app/references/editor-react-component/BROWSER-SUPPORT.md +56 -0
  18. package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +16 -8
  19. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +19 -1
  20. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +3 -0
  21. package/skills/wix-base44-connector/SKILL.md +133 -44
  22. package/skills/wix-base44-connector/references/CAPABILITY_MAP.md +78 -0
  23. package/skills/wix-base44-connector/scripts/utils.js +216 -30
  24. package/skills/wix-headless/entry/skill.md +1 -1
  25. package/skills/wix-headless/references/CAPABILITIES.md +9 -1
  26. package/skills/wix-headless/references/DESIGN.md +1 -0
  27. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  28. package/skills/wix-headless/references/IMAGE_GENERATION.md +1 -0
  29. package/skills/wix-headless/references/SDK_HANDOFF.md +4 -1
  30. package/skills/wix-headless/references/SEED.md +2 -1
  31. package/skills/wix-headless/references/SETUP.md +1 -0
  32. package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +2 -2
  33. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +26 -8
  34. package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +26 -10
  35. package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +8 -8
  36. package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +1 -1
  37. package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +1 -1
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-rentals.md +254 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +13 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-rentals.md +254 -0
  41. package/skills/wix-headless/references/non-astro.md +1 -1
  42. package/skills/wix-headless-fast/SKILL.md +166 -0
  43. package/skills/wix-headless-fast/entry/skill.md +99 -0
  44. package/skills/wix-headless-fast/install/deploy.mjs +433 -0
  45. package/skills/wix-headless-fast/install/fast-path.mjs +141 -0
  46. package/skills/wix-headless-fast/references/blog/INSTRUCTIONS.md +137 -0
  47. package/skills/wix-headless-fast/references/blog/app/components/blog/BlogFeedView.tsx +137 -0
  48. package/skills/wix-headless-fast/references/blog/app/components/blog/PostView.tsx +113 -0
  49. package/skills/wix-headless-fast/references/blog/app/components/blog/RichContent.tsx +42 -0
  50. package/skills/wix-headless-fast/references/blog/app/hooks/blog/useBlogFeed.ts +123 -0
  51. package/skills/wix-headless-fast/references/blog/app/hooks/blog/usePost.ts +70 -0
  52. package/skills/wix-headless-fast/references/blog/app/wix/blog/posts.ts +99 -0
  53. package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy.ts +76 -0
  54. package/skills/wix-headless-fast/references/blog/app/wix/blog/types.ts +62 -0
  55. package/skills/wix-headless-fast/references/blog/app-astro/layouts/SiteLayout.astro +40 -0
  56. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog/[...slug].astro +99 -0
  57. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog.astro +24 -0
  58. package/skills/wix-headless-fast/references/blog/lock/astro/package-lock.json +16156 -0
  59. package/skills/wix-headless-fast/references/blog/seed/SEED.md +72 -0
  60. package/skills/wix-headless-fast/references/blog/seed/seed-blog.mjs +287 -0
  61. package/skills/wix-headless-fast/references/bookings/INSTRUCTIONS.md +129 -0
  62. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServiceBookingView.tsx +143 -0
  63. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServicesView.tsx +119 -0
  64. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useBookingFlow.ts +138 -0
  65. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useServices.ts +54 -0
  66. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking.ts +206 -0
  67. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services.ts +96 -0
  68. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/types.ts +70 -0
  69. package/skills/wix-headless-fast/references/bookings/app-astro/layouts/SiteLayout.astro +40 -0
  70. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services/[slug].astro +76 -0
  71. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services.astro +22 -0
  72. package/skills/wix-headless-fast/references/bookings/lock/astro/package-lock.json +11962 -0
  73. package/skills/wix-headless-fast/references/bookings/seed/SEED.md +61 -0
  74. package/skills/wix-headless-fast/references/bookings/seed/seed-bookings.mjs +302 -0
  75. package/skills/wix-headless-fast/references/cms/INSTRUCTIONS.md +179 -0
  76. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useCollection.ts +83 -0
  77. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useItem.ts +57 -0
  78. package/skills/wix-headless-fast/references/cms/app/wix/cms/items.ts +151 -0
  79. package/skills/wix-headless-fast/references/cms/app/wix/cms/types.ts +75 -0
  80. package/skills/wix-headless-fast/references/cms/app-astro/layouts/SiteLayout.astro +41 -0
  81. package/skills/wix-headless-fast/references/cms/lock/astro/package-lock.json +11262 -0
  82. package/skills/wix-headless-fast/references/cms/seed/SEED.md +103 -0
  83. package/skills/wix-headless-fast/references/cms/seed/seed-cms.mjs +324 -0
  84. package/skills/wix-headless-fast/references/events/INSTRUCTIONS.md +149 -0
  85. package/skills/wix-headless-fast/references/events/app/components/events/EventConfirmationView.tsx +66 -0
  86. package/skills/wix-headless-fast/references/events/app/components/events/EventRegistrationView.tsx +176 -0
  87. package/skills/wix-headless-fast/references/events/app/components/events/EventsView.tsx +118 -0
  88. package/skills/wix-headless-fast/references/events/app/hooks/events/useEventRegistration.ts +117 -0
  89. package/skills/wix-headless-fast/references/events/app/hooks/events/useEvents.ts +59 -0
  90. package/skills/wix-headless-fast/references/events/app/wix/events/events.ts +136 -0
  91. package/skills/wix-headless-fast/references/events/app/wix/events/registration.ts +128 -0
  92. package/skills/wix-headless-fast/references/events/app/wix/events/types.ts +61 -0
  93. package/skills/wix-headless-fast/references/events/app-astro/layouts/SiteLayout.astro +40 -0
  94. package/skills/wix-headless-fast/references/events/app-astro/pages/event-confirmation.astro +12 -0
  95. package/skills/wix-headless-fast/references/events/app-astro/pages/events/[slug].astro +80 -0
  96. package/skills/wix-headless-fast/references/events/app-astro/pages/events.astro +21 -0
  97. package/skills/wix-headless-fast/references/events/lock/astro/package-lock.json +11884 -0
  98. package/skills/wix-headless-fast/references/events/seed/SEED.md +86 -0
  99. package/skills/wix-headless-fast/references/events/seed/seed-events.mjs +276 -0
  100. package/skills/wix-headless-fast/references/forms/INSTRUCTIONS.md +150 -0
  101. package/skills/wix-headless-fast/references/forms/app/hooks/forms/useWixForm.ts +317 -0
  102. package/skills/wix-headless-fast/references/forms/app/wix/forms/forms.ts +269 -0
  103. package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions.ts +231 -0
  104. package/skills/wix-headless-fast/references/forms/app/wix/forms/types.ts +135 -0
  105. package/skills/wix-headless-fast/references/forms/lock/astro/package-lock.json +10593 -0
  106. package/skills/wix-headless-fast/references/forms/seed/SEED.md +108 -0
  107. package/skills/wix-headless-fast/references/forms/seed/seed-forms.mjs +320 -0
  108. package/skills/wix-headless-fast/references/members/INSTRUCTIONS.md +63 -0
  109. package/skills/wix-headless-fast/references/members/app/components/members/AccountView.tsx +60 -0
  110. package/skills/wix-headless-fast/references/members/app/components/members/LoginForm.tsx +155 -0
  111. package/skills/wix-headless-fast/references/members/app/components/members/MemberMenu.tsx +78 -0
  112. package/skills/wix-headless-fast/references/members/app/components/members/RequireAuth.tsx +47 -0
  113. package/skills/wix-headless-fast/references/members/app/hooks/members/useMember.ts +66 -0
  114. package/skills/wix-headless-fast/references/members/app/wix/members/auth.ts +88 -0
  115. package/skills/wix-headless-fast/references/members/app/wix/members/client.ts +53 -0
  116. package/skills/wix-headless-fast/references/members/app/wix/members/member-store.ts +122 -0
  117. package/skills/wix-headless-fast/references/members/app/wix/members/members.ts +50 -0
  118. package/skills/wix-headless-fast/references/members/app/wix/members/types.ts +21 -0
  119. package/skills/wix-headless-fast/references/members/app-astro/layouts/SiteLayout.astro +42 -0
  120. package/skills/wix-headless-fast/references/members/app-astro/pages/account.astro +10 -0
  121. package/skills/wix-headless-fast/references/members/app-astro/pages/login.astro +11 -0
  122. package/skills/wix-headless-fast/references/members/lock/astro/package-lock.json +10329 -0
  123. package/skills/wix-headless-fast/references/members/seed/SEED.md +39 -0
  124. package/skills/wix-headless-fast/references/members/seed/seed-members.mjs +94 -0
  125. package/skills/wix-headless-fast/references/portfolio/INSTRUCTIONS.md +134 -0
  126. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
  127. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
  128. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/ProjectDetailView.tsx +115 -0
  129. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollectionProjects.ts +59 -0
  130. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollections.ts +39 -0
  131. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useProjectDetail.ts +58 -0
  132. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio.ts +165 -0
  133. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/types.ts +55 -0
  134. package/skills/wix-headless-fast/references/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
  135. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
  136. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio.astro +21 -0
  137. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/projects/[slug].astro +29 -0
  138. package/skills/wix-headless-fast/references/portfolio/lock/astro/package-lock.json +10197 -0
  139. package/skills/wix-headless-fast/references/portfolio/seed/SEED.md +78 -0
  140. package/skills/wix-headless-fast/references/portfolio/seed/seed-portfolio.mjs +258 -0
  141. package/skills/wix-headless-fast/references/pricing-plans/INSTRUCTIONS.md +133 -0
  142. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +58 -0
  143. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlansView.tsx +126 -0
  144. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +37 -0
  145. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlans.ts +39 -0
  146. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans.ts +75 -0
  147. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase.ts +45 -0
  148. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/types.ts +30 -0
  149. package/skills/wix-headless-fast/references/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
  150. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans/[slug].astro +40 -0
  151. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans.astro +21 -0
  152. package/skills/wix-headless-fast/references/pricing-plans/lock/astro/package-lock.json +11226 -0
  153. package/skills/wix-headless-fast/references/pricing-plans/seed/SEED.md +71 -0
  154. package/skills/wix-headless-fast/references/pricing-plans/seed/seed-pricing-plans.mjs +279 -0
  155. package/skills/wix-headless-fast/references/restaurants/INSTRUCTIONS.md +165 -0
  156. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/MenuView.tsx +142 -0
  157. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
  158. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
  159. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/ReservationView.tsx +155 -0
  160. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useMenus.ts +55 -0
  161. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useOrderCart.ts +43 -0
  162. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useReservation.ts +177 -0
  163. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu.ts +165 -0
  164. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/order-store.ts +103 -0
  165. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering.ts +254 -0
  166. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations.ts +146 -0
  167. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/types.ts +168 -0
  168. package/skills/wix-headless-fast/references/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
  169. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/menu.astro +22 -0
  170. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/reservations.astro +12 -0
  171. package/skills/wix-headless-fast/references/restaurants/lock/astro/package-lock.json +12560 -0
  172. package/skills/wix-headless-fast/references/restaurants/seed/SEED.md +81 -0
  173. package/skills/wix-headless-fast/references/restaurants/seed/seed-restaurants.mjs +479 -0
  174. package/skills/wix-headless-fast/references/shared/CONTENT.md +22 -0
  175. package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +73 -0
  176. package/skills/wix-headless-fast/references/shared/DESIGN.md +26 -0
  177. package/skills/wix-headless-fast/references/shared/app/styles/global.css +52 -0
  178. package/skills/wix-headless-fast/references/shared/app/wix/config.ts +15 -0
  179. package/skills/wix-headless-fast/references/shared/app/wix/media.ts +27 -0
  180. package/skills/wix-headless-fast/references/shared/app/wix/money.ts +24 -0
  181. package/skills/wix-headless-fast/references/shared/app/wix/sdk.ts +76 -0
  182. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
  183. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +46 -0
  184. package/skills/wix-headless-fast/references/shared/seed/images.mjs +145 -0
  185. package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +149 -0
  186. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartButton.tsx +26 -0
  187. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartDrawer.tsx +121 -0
  188. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductCard.tsx +100 -0
  189. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductDetailView.tsx +130 -0
  190. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductGrid.tsx +48 -0
  191. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ShopView.tsx +66 -0
  192. package/skills/wix-headless-fast/references/storefront/app/components/storefront/VariantPicker.tsx +103 -0
  193. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useCart.ts +48 -0
  194. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useProductDetail.ts +140 -0
  195. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +80 -0
  196. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +101 -0
  197. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart.ts +221 -0
  198. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +215 -0
  199. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/types.ts +109 -0
  200. package/skills/wix-headless-fast/references/storefront/app-astro/layouts/SiteLayout.astro +46 -0
  201. package/skills/wix-headless-fast/references/storefront/app-astro/pages/products/[slug].astro +56 -0
  202. package/skills/wix-headless-fast/references/storefront/app-astro/pages/shop.astro +23 -0
  203. package/skills/wix-headless-fast/references/storefront/lock/astro/package-lock.json +12247 -0
  204. package/skills/wix-headless-fast/references/storefront/seed/SEED.md +85 -0
  205. package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +415 -0
  206. package/skills/wix-manage/SKILL.md +18 -2
  207. package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +141 -0
  208. package/skills/wix-manage/references/google-business-profile/connect-google-business-profile.md +134 -0
  209. package/skills/wix-manage/references/google-business-profile/manage-google-business-profile-locations.md +182 -0
  210. package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +3 -0
  211. package/skills/wix-manage/references/stores/create-product-catalog-v3.md +21 -6
  212. package/skills/wix-manage/references/stores/update-product-with-options.md +83 -0
  213. package/skills/wix-vibe-headless/SKILL.md +18 -4
  214. package/skills/wix-vibe-headless/install/deploy.cjs +12 -4
  215. package/skills/wix-vibe-headless/install/pin-agents-md.cjs +2 -1
  216. package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +3 -1
  217. package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +3 -1
  218. package/skills/wix-vibe-headless/platforms/base44.md +23 -61
  219. package/skills/wix-vibe-headless/platforms/generic.md +6 -3
  220. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +43 -0
  221. package/skills/wix-vibe-headless/references/bookings/app/components/RentalDurationPicker.jsx +67 -0
  222. package/skills/wix-vibe-headless/references/bookings/app/hooks/useRentalDuration.js +128 -0
  223. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +5 -3
  224. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-rentals.js +250 -0
  225. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-services.js +12 -5
  226. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +41 -0
  227. package/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.js +267 -0
  228. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +6 -3
  229. package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +470 -0
  230. package/skills/wix-vibe-headless/references/forms/app/hooks/useWixForm.js +425 -0
  231. package/skills/wix-vibe-headless/references/forms/app/lib/wix-form-schema-utils.js +187 -0
  232. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms-submissions.js +238 -0
  233. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms.js +108 -0
  234. package/skills/wix-vibe-headless/references/forms/seed/SEED.md +1762 -0
  235. package/skills/wix-vibe-headless/references/rentals/INSTRUCTIONS.md +13 -0
  236. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +137 -84
  237. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +15 -8
  238. package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +37 -0
  239. package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +18 -6
  240. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +30 -7
  241. package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +46 -10
  242. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +0 -110
  243. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +0 -51
  244. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +0 -49
  245. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +0 -92
  246. package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +0 -139
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: "Manage a Campaign Success Guide"
3
+ description: "Retrieves and manages the campaign success guide for an existing Wix Google Ads Performance Max Leads campaign. Offer it after creating a supported campaign, even while it is learning or has no metrics; that proactive offer requires approval before retrieval. A direct request to improve a campaign, see what to fix next, or show the guide is already approval to retrieve it. Also use when a user reports completing or wants to reopen a guide item. Treat a clear completion report as an actionable update request even when phrased as a statement. Covers campaign selection, prioritized guide retrieval, and suggestion status updates without redundant confirmation. REST base https://www.wixapis.com/pa-platform/suggestions/v1."
4
+ ---
5
+ # RECIPE: Manage a Campaign Success Guide
6
+
7
+ A campaign success guide is a prioritized list of improvements for an **existing** Google Ads `PERFORMANCE_MAX_LEADS` campaign. Offer it as a useful next step after [creating a Performance Max campaign](create-performance-max-campaign.md). Once Create Campaign returns the campaign ID, ask whether the user wants to retrieve the guide; call the API only after they approve. There is no need to wait for the campaign to leave `LEARNING` or generate performance metrics because the guide analyzes the landing page, campaign configuration, and relevant site connections rather than depending on campaign performance data.
8
+
9
+ Also use this recipe for requests such as "How can I improve my campaign?", "What should I fix next?", "Show my campaign success guide", "I made the call-to-action button clearer as the success guide recommended", "Mark this recommendation complete", or "Reopen that guide item."
10
+
11
+ A direct request to improve a campaign, see what to fix next, or show its success guide is itself approval to retrieve the guide once the campaign is identified. Do not ask whether the user wants the guide after they have already made one of those requests. Separate approval is needed only when you proactively offer the guide after campaign creation.
12
+
13
+ This differs from [Get AI Campaign Suggestions](get-campaign-suggestions.md), which generates keywords, budgets, locations, copy, images, and other inputs used while **building** a campaign. Do not route pre-campaign keyword, budget, creative, or targeting generation here.
14
+
15
+ Base URL: `https://www.wixapis.com/pa-platform/suggestions/v1`. `<AUTH>` is the `Authorization` header; body calls also need `Content-Type: application/json`.
16
+
17
+ ## Resolve the campaign
18
+
19
+ The guide endpoints require a campaign UUID, but users often provide only a campaign name or say "my campaign."
20
+
21
+ 1. If the user provides a campaign UUID, use it.
22
+ 2. Otherwise follow [Manage Campaign Lifecycle](manage-campaign-lifecycle.md) and call:
23
+
24
+ ```bash
25
+ curl -X GET 'https://www.wixapis.com/google-ads/v1/campaigns' \
26
+ -H 'Authorization: <AUTH>'
27
+ ```
28
+
29
+ Read each campaign's `id`, `name`, `campaignType`, and `status`.
30
+ 3. Select a campaign only when one result clearly matches the user's wording. If none or multiple plausibly match, show concise choices and ask the user to choose; never guess.
31
+ 4. Continue only for `campaignType: "PERFORMANCE_MAX_LEADS"`. If the selected campaign has another type, explain that campaign success guides currently support Google Ads Performance Max Leads campaigns only. For a supported campaign, do not gate guide retrieval on `status` or query analytics first: `LEARNING` and missing performance metrics are not reasons to wait.
32
+
33
+ The common flow always sends `platformType: "GOOGLE"`; do not ask the user to provide it.
34
+
35
+ ## Retrieve or create the guide
36
+
37
+ ```bash
38
+ curl -X POST \
39
+ 'https://www.wixapis.com/pa-platform/suggestions/v1/campaign-success-guides/get-or-create' \
40
+ -H 'Authorization: <AUTH>' \
41
+ -H 'Content-Type: application/json' \
42
+ -d '{
43
+ "campaignId": "7d4a9c2e-86f1-4b37-a2d5-9e18c6f043ab",
44
+ "platformType": "GOOGLE"
45
+ }'
46
+ ```
47
+
48
+ ```json
49
+ {
50
+ "campaignSuccessGuide": {
51
+ "id": "7d4a9c2e-86f1-4b37-a2d5-9e18c6f043ab",
52
+ "url": "https://www.example.com/request-a-quote",
53
+ "suggestions": [
54
+ {
55
+ "id": "131b82f1-44f5-4f32-8cf1-f783a5f35222",
56
+ "type": "CLEAR_CTA_COPY",
57
+ "status": "OPEN"
58
+ }
59
+ ]
60
+ }
61
+ }
62
+ ```
63
+
64
+ The first call may analyze the landing page, campaign configuration, and relevant site connections and can take up to **120 seconds**. Later calls normally return the saved guide unless campaign changes require another analysis. Wait for the request; do not retry prematurely. If execution times out with an unknown outcome, report the uncertainty and retrieve the guide later instead of immediately triggering another analysis.
65
+
66
+ Present only the suggestions the API returns and preserve their order; `suggestions` is already in priority order. An empty array means no currently detected items need attention, not an API failure. Show `campaignSuccessGuide.url` when it helps identify the analyzed landing page.
67
+
68
+ `OPEN` means pending action. `COMPLETED` means the user marked the item completed; it does **not** mean the API changed the site or campaign for them.
69
+
70
+ ## Translate suggestion types for the user
71
+
72
+ Keep the enum value unchanged in API calls, but use these labels when explaining the guide:
73
+
74
+ | Enum | User-facing meaning |
75
+ | --- | --- |
76
+ | `CLEAR_CTA_COPY` | Clarify the primary call-to-action button's conversion intent. |
77
+ | `ABOVE_THE_FOLD_CTA` | Put a call-to-action where visitors can see it without scrolling. |
78
+ | `HEADER_MATCH` | Align the landing-page heading with the campaign's ad headlines. |
79
+ | `CONVERSION_POINT` | Add a visible lead form or booking action. |
80
+ | `GOOGLE_REVIEWS` | Display Google reviews or ratings. |
81
+ | `TESTIMONIAL` | Add customer testimonials attributed to named people. |
82
+ | `CONTACT_AND_CREDIBILITY` | Display a phone number and email address. |
83
+ | `FAQ_SECTION` | Add a visible FAQ section. |
84
+ | `MINIMIZE_FORM_FIELDS` | Limit the lead form to four visible fields. |
85
+ | `SOCIAL_CHANNELS` | Add a visible social profile link. |
86
+ | `GOOGLE_MERCHANT_CENTER_CONNECTION` | Connect Google Merchant Center. |
87
+ | `GOOGLE_BUSINESS_PROFILE_CONNECTION` | Connect a Google Business Profile. |
88
+ | `GOOGLE_ADS_SEARCH_THEMES` | Configure Google Ads search themes. |
89
+ | `MOBILE_OPTIMIZATION` | Improve mobile optimization. |
90
+ | `SITE_SPEED` | Improve site speed. |
91
+
92
+ ## Mark an item completed or reopen it
93
+
94
+ The update endpoint identifies the suggestion by its **`type`**, not its suggestion `id`. A clear statement that the user completed a specific guide recommendation—for example, "I made the call-to-action button clearer as the success guide recommended"—is an actionable request to mark that item `COMPLETED`, not merely an FYI. Do not require the user to turn it into a question or ask for redundant confirmation.
95
+
96
+ Before executing an update:
97
+
98
+ 1. Identify the campaign and a suggestion `type` currently present in its latest guide.
99
+ 2. Match the user's wording to one returned suggestion and infer the requested status only when it is clear: a statement that they completed the recommendation means `COMPLETED`; a request to reopen it means `OPEN`.
100
+ 3. Execute immediately when the campaign, suggestion, and status are unambiguous. Ask one targeted clarification only when any of them is unclear; never guess.
101
+
102
+ Mark an item completed:
103
+
104
+ ```bash
105
+ curl -X POST \
106
+ 'https://www.wixapis.com/pa-platform/suggestions/v1/campaign-success-guides/7d4a9c2e-86f1-4b37-a2d5-9e18c6f043ab/update-suggestion-status' \
107
+ -H 'Authorization: <AUTH>' \
108
+ -H 'Content-Type: application/json' \
109
+ -d '{
110
+ "type": "CLEAR_CTA_COPY",
111
+ "status": "COMPLETED"
112
+ }'
113
+ ```
114
+
115
+ Reopen the same item by sending:
116
+
117
+ ```json
118
+ {
119
+ "type": "CLEAR_CTA_COPY",
120
+ "status": "OPEN"
121
+ }
122
+ ```
123
+
124
+ The response wraps the updated guide as `{ "campaignSuccessGuide": { ... } }`. Treat that returned guide as the new source of truth: report the changed tracking status and summarize remaining `OPEN` suggestions in priority order. Do not claim the underlying recommendation was implemented. Do not update multiple items unless the user's wording clearly identifies all of them.
125
+
126
+ If a mutation times out with an unknown outcome, do not retry automatically. Retrieve the guide later to determine the current status first.
127
+
128
+ ## Errors
129
+
130
+ | Error | Response behavior |
131
+ | --- | --- |
132
+ | `PLATFORM_NOT_SUPPORTED` | Use `GOOGLE`; do not substitute another platform value. |
133
+ | `CAMPAIGN_TYPE_NOT_SUPPORTED` | Explain that success guides currently support Google Ads Performance Max Leads campaigns only. |
134
+ | `SUGGESTION_NOT_FOUND` | Retrieve the latest guide and choose a `type` actually present; do not keep retrying stale data. |
135
+ | Authentication or permission error | Stop after the first rejected campaign or guide call and explain that the current collaborator cannot access or modify it. Do not try alternate base URLs, infer that Google Ads is not installed, or probe other endpoints to bypass authorization. |
136
+
137
+ ## References
138
+
139
+ - [Suggestions API introduction](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/platform/suggestion-v1/introduction)
140
+ - [Get or Create Campaign Success Guide](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/platform/suggestion-v1/get-or-create-campaign-success-guide)
141
+ - [Update Campaign Success Guide Suggestion Status](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/platform/suggestion-v1/update-campaign-success-guide-suggestion-status)
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: "Connect a Wix Site to Google Business Profile"
3
+ description: Connect the authenticated Wix site to a Google Business Profile account, check whether an existing connection is still usable, recover a connection whose stored credentials are gone, switch to a different Google account, or disconnect. The site owner authorizes in their own browser through a single-use connect URL; the agent never completes the Google authorization itself. Warns before any reconnect that permanently removes the site's imported locations.
4
+ ---
5
+
6
+ # Connect a Wix Site to Google Business Profile
7
+
8
+ Use the public **Google Business Profile Connection API** to link the
9
+ authenticated Wix site to a Google Business Profile account. The REST requests
10
+ do not contain a site ID — the site comes from the caller's authorization
11
+ context. Use the site the environment already supplies; if no site is selected,
12
+ list the user's sites once and auto-select the only one, or ask the user to
13
+ choose by site name when several are available. Never invent a site ID or ask
14
+ the user to type one. A connection is the prerequisite for Google-backed work in the Google
15
+ Business Profile Locations API — establish it before importing or managing
16
+ locations.
17
+
18
+ > **Bounded connect path — read first.** Read the connection once. For
19
+ > `NEVER_CONNECTED`, request one connect URL and hand it to the owner; for
20
+ > `VALID`, stop unless the user asked for other Google-backed work. A `403`,
21
+ > `PERMISSION_DENIED`, or other terminal recovery-rule error ends the flow:
22
+ > the **next action is the final response** explaining the blocker. Make no
23
+ > further tool call: no API probe, documentation search, alternate request
24
+ > shape, or call against another site. Only the explicitly
25
+ > retryable `CONNECTING_USER_LOOKUP_UNAVAILABLE` error permits another connect-URL
26
+ > attempt.
27
+
28
+ Wix stores the Google credentials server-side. The API never returns tokens or
29
+ any Google identity — only whether a connection exists and its dates.
30
+
31
+ ## Direct calls for this flow
32
+
33
+ These are the complete request shapes needed for a fresh connection. Use them
34
+ directly; do not search the API reference before calling them.
35
+
36
+ | Method | Call |
37
+ |---|---|
38
+ | **Get Connection** | `GET https://www.wixapis.com/gbp/v1/connection` — no body or parameters |
39
+ | **Get Connect URL** | `GET https://www.wixapis.com/gbp/v1/connect-url` — no body or parameters |
40
+
41
+ For the common `NEVER_CONNECTED` path the only API calls are one **Get
42
+ Connection**, then one **Get Connect URL**. If either returns `403` or
43
+ `PERMISSION_DENIED`, stop immediately and explain it; do not look for another
44
+ method or request shape.
45
+
46
+ ## Check the status first
47
+
48
+ Always start with **Get Connection** and branch on `status`:
49
+
50
+ | `status` | Meaning | What to do |
51
+ |---|---|---|
52
+ | `VALID` | Wix holds a credential for this site | Proceed with Google-backed work |
53
+ | `NEVER_CONNECTED` | The site has never been connected | Run the connect flow — this is a setup step, not an error |
54
+ | `NEEDS_RECONNECT` | The connection record exists but the stored credentials are gone | Warn the owner (see below), then run the connect flow |
55
+
56
+ `VALID` is not a live health check: **Get Connection** deliberately does not
57
+ call Google, so a connection can report `VALID` and still be refused by
58
+ Google — for example after the owner revoked Wix's access in their Google
59
+ account settings. Treat a Google-side authorization failure on a Locations
60
+ call as the authoritative signal and re-run the connect flow when one appears.
61
+
62
+ ## Run the connect flow
63
+
64
+ 1. Call **Get Connect URL** once and read `connectUrl`.
65
+ 2. Present `connectUrl` to the site owner as a link to open in their own
66
+ browser, where they sign in to Google and grant access. Never fetch or open
67
+ the URL yourself — it is for a human, single-use, and expires after
68
+ 15 minutes.
69
+ 3. Explain that completion is asynchronous: Google redirects the owner's
70
+ browser back to Wix, which finishes the OAuth exchange and stores the
71
+ credentials server-side.
72
+ 4. When the owner reports they have finished (or while waiting, on a modest
73
+ interval of a few seconds), call **Get Connection** and confirm `status` is
74
+ `VALID`. The `status` field is the only source of truth — a returned
75
+ connect URL alone proves nothing.
76
+ 5. If the 15-minute window elapses with `status` unchanged, request a fresh
77
+ URL and let the owner try again.
78
+
79
+ **Get Connect URL is not idempotent, despite its GET route.** Every successful
80
+ call creates a distinct live authorization attempt. Never retry it
81
+ automatically after a timeout or ambiguous response — re-check
82
+ **Get Connection** first and let the owner explicitly start another attempt.
83
+
84
+ ## Warn before a reconnect that replaces the connection
85
+
86
+ Two flows permanently remove every Business Profile location imported into the
87
+ site — the locations created through Wix as well as the imported ones. For
88
+ locations migrated from an earlier Wix integration this cannot be reversed by
89
+ re-importing. Get the owner's explicit confirmation **before** handing them
90
+ the connect URL; there is no confirmation step later:
91
+
92
+ - **Switching to a different Google account.** No Disconnect is needed — the
93
+ new account simply replaces the connection when its authorization completes.
94
+ - **Reconnecting from `NEEDS_RECONNECT`, even with the same Google account.**
95
+ The stored credentials are gone, so there is nothing to match the incoming
96
+ account against and the reconnect is always treated as a replacement.
97
+
98
+ While credentials are still present (`VALID`), authorizing again with the
99
+ **same** Google account heals the connection in place and removes nothing.
100
+
101
+ Also tell the owner that replacing or disconnecting changes nothing inside
102
+ Google Business Profile itself — locations, reviews, and photos stay exactly
103
+ as they are on Google — and does not revoke Wix's access inside their old
104
+ Google account; they remove that from their Google account settings.
105
+
106
+ ## Disconnect
107
+
108
+ Call **Disconnect** only after the owner confirms. It deletes the credentials
109
+ Wix stores; it does not touch the Google Business Profile and does not revoke
110
+ Wix's grant inside the Google account.
111
+
112
+ ## Recovery rules
113
+
114
+ - **`CONNECTING_USER_LOOKUP_UNAVAILABLE`:** the site-owner lookup failed
115
+ temporarily, before any authorization attempt was created. This is the one
116
+ failure of **Get Connect URL** that is safe to retry.
117
+ - **`CONNECTING_USER_NOT_RESOLVABLE`:** Wix could not identify a user to own
118
+ the credential. Stop — this is not retryable until the caller identity or
119
+ site ownership is corrected. Explain the blocker instead of trying other
120
+ request shapes.
121
+ - **Timeout or ambiguous response from Get Connect URL:** do not retry. Call
122
+ **Get Connection** to learn the actual state, then let the owner decide.
123
+ - **`MULTIPLE_CONNECTIONS_NOT_REPRESENTABLE`:** the site holds more than one
124
+ connection and the API will not guess which one is meant. Not a caller error
125
+ and not retryable — report it and direct the user to contact Wix support.
126
+ - **Permission denied:** stop after the first `403` or `PERMISSION_DENIED`.
127
+ Do not retry with another request shape or site, and do not search for an
128
+ alternate API or method. Explain that the current Wix identity is not
129
+ authorized to manage the site's Google connection.
130
+
131
+ The direct calls above are self-contained for the normal connect path. Consult a
132
+ specific public method reference only for an edge case not covered here, and
133
+ only before making a call. Once a status or typed error selects a branch above,
134
+ do not search or browse for an alternate API, method, or request shape.
@@ -0,0 +1,182 @@
1
+ ---
2
+ name: "Manage Google Business Profile Locations for a Wix Site"
3
+ description: Import Google Business Profile locations into the authenticated Wix site, list and query them with or without live Google data, update Wix-side and Google-side details through the correct method for each, create a new Google listing, check whether a profile is actually live on Google, and remove a location from Wix or delete its Google listing. Checks the site's Google connection first and reports a missing one as a setup step, warns before destructive or Google-visible writes, and respects Google's shared rate budget.
4
+ ---
5
+
6
+ # Manage Google Business Profile Locations for a Wix Site
7
+
8
+ Use the public **Google Business Profile Locations API** to manage the
9
+ authenticated Wix site's Business Profile locations — the entries that decide
10
+ how the business appears on Google Search and Maps. The REST requests do not
11
+ contain a site ID — the site comes from the caller's authorization context.
12
+ Use the site the environment already supplies; if no site is selected, list
13
+ the user's sites once and auto-select the only one, or ask the user to choose
14
+ by site name when several are available. Never invent a site ID or ask the
15
+ user to type one.
16
+
17
+ > **Unconnected-site fast path — read first.** Read the connection once. Treat
18
+ > `NEVER_CONNECTED`, `NEEDS_RECONNECT`, or a single
19
+ > `CONNECTION_NOT_FOUND`/not-found response from that connection check as the
20
+ > same setup state. Query Wix-only GBP locations once to answer what the site
21
+ > already has, report the result, explain the connect → account selection →
22
+ > unimported-location selection → bulk-create flow, and stop — after that one
23
+ > query the **next action is the final response**, with no other tool call. Do
24
+ > not call a Google-backed location method, probe for Business Profile
25
+ > accounts, guess an endpoint, or make further API probes or documentation
26
+ > searches until the connection is `VALID`. A `403` or `PERMISSION_DENIED` is
27
+ > terminal: the **next action is the final response** explaining it. Stop
28
+ > without the Wix-only query, documentation search, or any other tool call.
29
+
30
+ The API is a live view onto Google, not a copy: most calls make a real Google
31
+ request, with Google's latency and rate limits. A location's ID is Google's
32
+ opaque location ID and is what identifies it everywhere.
33
+
34
+ ## Direct calls for the unconnected-site path
35
+
36
+ Use these request shapes directly; do not search the API reference before
37
+ calling them.
38
+
39
+ | Method | Call |
40
+ |---|---|
41
+ | **Get Connection** | `GET https://www.wixapis.com/gbp/v1/connection` — no body or parameters |
42
+ | **Query GBP Locations** | `POST https://www.wixapis.com/gbp/v1/locations/query` with body below |
43
+
44
+ ```json
45
+ { "query": { "paging": { "limit": 100 } } }
46
+ ```
47
+
48
+ Make **Get Connection** first, then branch before making any other call:
49
+
50
+ - `403` or `PERMISSION_DENIED` — stop. The next action is the final response;
51
+ explain that the current Wix identity cannot inspect the site's GBP state.
52
+ Do not query locations, inspect installed apps, search documentation, or try
53
+ another endpoint.
54
+ - `NEVER_CONNECTED`, `NEEDS_RECONNECT`, or `CONNECTION_NOT_FOUND` — make one
55
+ **Query GBP Locations** call, report the Wix-stored result, explain the future
56
+ import steps, and stop. The next action is the final response.
57
+ - `VALID` — proceed with the requested Google-backed flow.
58
+
59
+ Do not call **List GBP Accounts** or another Google-backed method until the
60
+ connection is `VALID` — account discovery requires the connection, and its
61
+ request shape is not the locations query. Never guess an endpoint that is not
62
+ in the table above or in the loaded reference.
63
+
64
+ ## Check the connection first
65
+
66
+ Google-backed methods require a Google connection, established through the
67
+ **Google Business Profile Connection API** (see the connect recipe). Before
68
+ Google-backed work, call **Get Connection**:
69
+
70
+ - `VALID` — proceed.
71
+ - `NEVER_CONNECTED` or `NEEDS_RECONNECT` — report a setup step, not an error,
72
+ and offer to run the connect flow. Do not retry location calls until the
73
+ connection is `VALID`.
74
+
75
+ Wix-only reads and deletes still work without active Google credentials:
76
+ **Get GBP Location**, **Query GBP Locations**, **Update Location**,
77
+ **Delete Location**, and **Bulk Delete Locations**.
78
+
79
+ ## Import locations
80
+
81
+ Importing registers listings that already exist at Google; it never creates
82
+ one. Each step narrows the next:
83
+
84
+ 1. Call **List GBP Accounts**. One Google login can hold several Business
85
+ Profile accounts, so present the list and let the owner pick — never assume
86
+ the first one.
87
+ 2. Call **List Unimported Locations** with the chosen `accountId`. It returns
88
+ only what the site hasn't imported yet, so re-running never offers
89
+ duplicates.
90
+ 3. Let the owner select which locations to import, and confirm before writing.
91
+ 4. Call **Bulk Create Locations** with the selected locations, supplying `id`
92
+ and `accountId` on each.
93
+ 5. Inspect every `results[].itemMetadata.error`. The call reports per-item
94
+ failures instead of aborting, so a `200` does not mean every location
95
+ imported. Report failures explicitly.
96
+
97
+ Repeat steps 2–5 per account if the owner wants locations from more than one.
98
+
99
+ ## List and query locations
100
+
101
+ Choose by whether live Google data is needed:
102
+
103
+ - **Just the site's locations:** call **Query GBP Locations**. Wix-stored rows
104
+ only — fast, no Google round-trip, no Google rate limit. Use it for counts,
105
+ ID lookups, and anything driven by `id`, `googleLocationId`, or `accountId`.
106
+ - **Locations with live business details:** call **Query Google Locations**
107
+ (or **Get Google Location** for one). Each row is hydrated with a live
108
+ Google fetch. Check each row for `googleError` — one location failing at
109
+ Google does not fail the request or break paging, so render it as a
110
+ per-location problem, not an empty result.
111
+
112
+ ## Update the correct side
113
+
114
+ Wix stores almost nothing; the method name tells you which side a write
115
+ reaches. Check before calling anything destructive:
116
+
117
+ | Method | Wix row | Google listing |
118
+ |---|---|---|
119
+ | **Create Location**, **Bulk Create Locations** | created | untouched (imports an existing listing) |
120
+ | **Create Google Location** | created | **created** |
121
+ | **Update Location** | updated | untouched (writes Wix-stored fields only) |
122
+ | **Update Google Location** | untouched | **updated** |
123
+ | **Delete Location**, **Bulk Delete Locations** | deleted | untouched |
124
+ | **Delete Google Location** | deleted | **deleted** |
125
+
126
+ - **Update Location** is not the way to edit a Business Profile — it writes
127
+ only Wix-stored fields. To change Google-owned data (title, address, hours,
128
+ categories), call **Update Google Location**, and confirm with the owner
129
+ first: the change is publicly visible on Google.
130
+ - To create a brand-new Google listing, call **Create Google Location** after
131
+ explicit confirmation. Use the API's reference-data methods (address schema,
132
+ category and region suggestions) rather than inventing values.
133
+ - Google allows roughly 10 profile edits per minute per Business Profile, and
134
+ the budget is shared across every write method. Pace the profile as a whole
135
+ and treat a `429` as worth retrying after a delay, not as a rejection.
136
+
137
+ ## Remove a location
138
+
139
+ Decide first whether the owner is removing it from Wix or deleting the real
140
+ Google listing — these are different operations and one is irreversible.
141
+ Confirm which they mean before calling anything:
142
+
143
+ - **Un-import from Wix, leave Google alone:** call **Delete Location**, or
144
+ **Bulk Delete Locations** for several. Inspect every
145
+ `results[].itemMetadata` entry — the bulk call can partially succeed.
146
+ - **Delete the Google listing as well:** call **Delete Google Location** once
147
+ per location; there is no bulk Google delete. Require explicit confirmation
148
+ naming the location — the listing disappears from Google Search and Maps.
149
+ - If **Delete Google Location** returns `LOCATION_DB_PERSIST_FAILED`, Google
150
+ deleted the listing but Wix didn't record it. The error payload carries the
151
+ location ID; call **Delete Location** with it to reconcile.
152
+
153
+ ## Check whether a profile is actually live
154
+
155
+ A location existing in Wix does not mean it appears on Google — verification
156
+ can be pending, the profile suspended, or ownership contested. Call
157
+ **Get Voice of Merchant** for the location and act on what Google reports:
158
+ wait, verify, comply, or resolve the conflict.
159
+
160
+ ## Recovery rules
161
+
162
+ - **`FAILED_PRECONDITION` with `CONNECTION_NOT_FOUND`:** the site has no
163
+ usable Google connection. Report the setup step and offer the connect flow;
164
+ do not retry the same call.
165
+ - **`GOOGLE_API_CALL_FAILED`:** read the carried Google code and description.
166
+ Some failures are permanent (profile suspended, field not editable) —
167
+ retrying will not help; explain instead.
168
+ - **Per-row `googleError` on hydrating reads:** report it per location and
169
+ continue with the rest of the page.
170
+ - **Rate limited (`429`):** wait, then retry; interleaved writes share one
171
+ budget per profile.
172
+ - **Permission denied:** stop after the first `403` or `PERMISSION_DENIED`.
173
+ Do not retry with other locations, request shapes, or sites, and do not
174
+ search for an alternate API or method. Deleting locations requires the
175
+ site's `GBP_ADMIN` role.
176
+
177
+ The same API also covers reviews and replies, photos and bulk media uploads,
178
+ attributes, verification, performance insights, and location admins — load the
179
+ specific public method reference needed before constructing a request so field
180
+ names, filters, permissions, and errors come from the live contract. Once a
181
+ connection state or typed error selects a branch above, do not search or browse
182
+ for an alternate API, method, or request shape.
@@ -359,6 +359,8 @@ Build the request from `item.channel` (`name` + the `accountId` from STEP 4b), `
359
359
  - Otherwise, build it from the STEP 3 table row for your channel + `type`: the text field (`caption` for Instagram/Facebook/LinkedIn/X, `description` for YouTube/Pinterest/GBP/TikTok), the media (`mediaWrapper`, or `imageUrl`/`videoUrl` for a single item), and any channel-specific IDs from the STEP 4b account object, plus `title` where the channel uses one.
360
360
  - Instagram and story types require media.
361
361
 
362
+ **Attribution (always set this).** Set `item.consumerInfo` to `{ "name": "wix-skills-social" }` on **every** create-draft call, for every channel. `consumerInfo.name` identifies what created the post — the Social Media Marketing dashboard sets `social-marketing`, and this recipe sets `wix-skills-social`. Set it on the draft: `name` is applied on creation only, and Update Item ignores it.
363
+
362
364
  **Idempotency (retry safety).** Set a stable, caller-defined `item.referenceId` on the draft. The Publisher enforces its uniqueness — a second item created/published with the same `referenceId` is rejected with `REFERENCE_ID_ALREADY_EXIST` instead of posting a duplicate. So if a create or publish call times out, retry with the **same** `referenceId` rather than risk double-posting.
363
365
 
364
366
  **Example — Instagram image post:**
@@ -368,6 +370,7 @@ Build the request from `item.channel` (`name` + the `accountId` from STEP 4b), `
368
370
  "item": {
369
371
  "channel": { "name": "INSTAGRAM", "accountId": "17841405822304914" },
370
372
  "type": "POST",
373
+ "consumerInfo": { "name": "wix-skills-social" },
371
374
  "instagramPost": {
372
375
  "imageUrl": "https://static.wixstatic.com/media/cf2434_4b3a2d8eb7f54bc89c0d4524430a2af3~mv2.jpg",
373
376
  "caption": "Summer collection just dropped! Shop the look now. #summerstyle #newarrivals"
@@ -65,14 +65,14 @@ If any product is missing a price, **do not call the API**. Ask for the missing
65
65
  - Bulk endpoints accept 1–100 products, so a compatible bulk endpoint is also valid for one product.
66
66
  - For multiple products requested as one batch, send one bulk call. Use the with-inventory endpoint when any product needs inventory; include `inventoryItem` only on tracked variants.
67
67
  - Never send `inventoryItem` to a no-inventory endpoint. Do not invent inventory.
68
- - Digital products normally use a no-inventory endpoint.
68
+ - Digital products use a with-inventory endpoint: an unstocked digital variant is unsellable.
69
69
  - Per bulk request, allow at most 100 products, 100 total options, 100 modifiers, 100 info sections, and 1000 variants. Split larger input into compliant batches.
70
70
 
71
71
  ## Build each product
72
72
 
73
73
  | Concern | Rule |
74
74
  |---|---|
75
- | Type | `PHYSICAL` uses product- and variant-level `physicalProperties`; `DIGITAL` omits physical properties and inventory. |
75
+ | Type | `PHYSICAL` uses product- and variant-level `physicalProperties`; `DIGITAL` omits them and carries `inventoryItem.inStock` plus `digitalProperties.digitalFile` on each variant. |
76
76
  | Variants | Include at least one. Price, SKU, barcode, inventory, and digital file are variant-level fields. |
77
77
  | Price | Use a string in `price.actualPrice.amount`; add `compareAtPrice` only when supplied. |
78
78
  | SKU | Preserve supplied strings exactly, including `#`, punctuation, and leading zeroes. Keep variant SKUs unique unless explicitly requested otherwise. |
@@ -127,9 +127,20 @@ This inventory-aware physical product is the reusable shape. Remove `inventoryIt
127
127
  }
128
128
  ```
129
129
 
130
- For a color option, use `SWATCH_CHOICES`; each choice uses `choiceType: ONE_COLOR` and `colorCode`, and the variant reference uses `renderType: SWATCH_CHOICES`.
130
+ For a color option, use `SWATCH_CHOICES`; each choice uses `choiceType: ONE_COLOR` and `colorCode`, and the variant reference uses `renderType: SWATCH_CHOICES`. For a different **image** per colour (not just the swatch), each choice also carries its own `media`:
131
131
 
132
- A digital product uses the smaller shape below. Add the supplied variant-level digital file only when one was provided.
132
+ ```json
133
+ "choicesSettings": {"choices": [
134
+ {"choiceType": "ONE_COLOR", "name": "Black", "colorCode": "#000000",
135
+ "media": {"items": [{"url": "https://static.wixstatic.com/media/<black>.jpg"}]}},
136
+ {"choiceType": "ONE_COLOR", "name": "White", "colorCode": "#FFFFFF",
137
+ "media": {"items": [{"url": "https://static.wixstatic.com/media/<white>.jpg"}]}}
138
+ ]}
139
+ ```
140
+
141
+ The image must be in the product gallery first, and the id/ordering has a trap — assign per-choice media via **[Update Product with Options](update-product-with-options.md) → Choice & variant fields** (also the full choice-vs-variant field split: choice `media`/`colorCode`; variant `price`/`sku`/`barcode`/stock).
142
+
143
+ A digital variant is **sellable** only when it carries both a digital file and stock; miss either and the product reads back healthy and is rejected at add-to-cart. Upload the file first ([Upload Media to Wix](../media/upload-media-to-wix.md) → Generate Upload URL, then `PUT` the bytes) and send the returned `file.id` to `POST /stores/v3/products-with-inventory`:
133
144
 
134
145
  ```json
135
146
  {
@@ -138,11 +149,15 @@ A digital product uses the smaller shape below. Add the supplied variant-level d
138
149
  "variantsInfo": {"variants": [{
139
150
  "sku": "PDF-FOCUS-01",
140
151
  "price": {"actualPrice": {"amount": "9.99"}},
141
- "visible": true
152
+ "visible": true,
153
+ "inventoryItem": {"inStock": true},
154
+ "digitalProperties": {"digitalFile": {"id": "<FILE_ID>"}}
142
155
  }]}
143
156
  }
144
157
  ```
145
158
 
159
+ With no file supplied, create the product and report it as not sellable until one is attached — [Update Product with Options](update-product-with-options.md) → Attach a digital file.
160
+
146
161
  ### Generated descriptions and SEO
147
162
 
148
163
  - When copy is generated from an image, every factual claim must be user-supplied or directly visible. Preserve user-supplied facts such as a stated material; do not reject them merely because the image alone cannot prove them. Color, shape, and visible decoration may come from the image. Dimensions, capacity, care instructions, durability, compatibility, performance, and any material the user did not identify must be omitted. For example, never write “dishwasher safe” or “microwave safe” unless the user supplied that fact. Omit uncertain claims instead of turning them into marketing language.
@@ -270,4 +285,4 @@ Retry only failed transient items, not successful products. If a requested field
270
285
  - `variantsInfo must not be empty`: include at least one priced variant per product.
271
286
  - Option/variant mismatch: create every requested combination and reference every option once per variant.
272
287
  - Media not visible: use the uploaded `wixstatic.com` URL in `media.itemsInfo.items`; do not set `media.main`.
273
- - Digital product rejected: omit physical properties and inventory; keep price, SKU, and any supplied digital file on the variant.
288
+ - Digital product rejected at add-to-cart: `ITEM_NOT_FOUND_IN_CATALOG` means the variant has no `digitalProperties.digitalFile`; `exceeds available inventory` means it has no `inventoryItem.inStock`. Both read back as a healthy product.
@@ -275,6 +275,8 @@ curl -X POST "https://www.wixapis.com/stores/v3/bulk/inventory-items/create" \
275
275
 
276
276
  ### Update Media Only
277
277
 
278
+ Sets the product-level gallery (`media.itemsInfo.items`). For an image shown per option choice (a swatch's photo), see **Per-choice media** below.
279
+
278
280
  ```bash
279
281
  curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
280
282
  -H "Content-Type: application/json" \
@@ -297,6 +299,56 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
297
299
  }'
298
300
  ```
299
301
 
302
+ ### Choice & variant fields (what you can set)
303
+
304
+ Send these inside the `options` / `variantsInfo.variants` arrays — **both arrays complete, in the
305
+ same PATCH**, with the current `revision`, and **identity-preserving** (see *Update Options and
306
+ Variants*): keep the option's `id` and every `choiceId`, or the ids are re-minted and the existing
307
+ variants no longer resolve (`400 "Variant choice not found in product options"`). Each variant needs
308
+ its `id`, its `choices` (by `optionChoiceIds` — or `optionChoiceNames`, see *Gotchas*) **and** a
309
+ `price` — omitting price is `400 "price must not be empty"`.
310
+
311
+ **Option choice** (`options[].choicesSettings.choices[]`):
312
+ - `name`, `choiceType`, `colorCode` — the choice's identity and swatch colour.
313
+ - `media` = `{ "items": [ { "mediaId" } | { "url" } ] }` — the product photos shown when this choice is picked. `url` is write-only; on read you get `mediaId` (request the `PRODUCT_CHOICES_MEDIA_REFERENCES` mask). Use `media`, **not** `linkedMedia` (a separate display-filter, returned empty when you read `media`).
314
+ - **Gallery-first; the id you link is the gallery item's, not the upload's.** Add the `url` to the gallery, then read the product back and link the id you see there:
315
+
316
+ ```
317
+ GET /stores/v3/products/{id}?fields=MEDIA_ITEMS_INFO
318
+ # → media.itemsInfo.items[].id = "abc~mv2.jpg" ← link THIS as choice media.items[].mediaId
319
+ # the id from POST /site-media/v1/files/import or /files/get-file-by-id 400s as a choice mediaId
320
+ ```
321
+ `{ "url" }` works in place of `{ "mediaId" }` too, but only once the image is already in the gallery.
322
+ - `displayImage` — the image shown on the swatch itself (distinct from `media`).
323
+ - Read-only, don't send: `inStock`, `visible`, `key`.
324
+
325
+ **Variant** (`variantsInfo.variants[]`, by its `id` from Get Product; always send `choices` + `price` with it):
326
+ - `price` = `{ "actualPrice": { "amount" }, "compareAtPrice": { "amount" } }` — set `compareAtPrice` above `actualPrice` for a strikethrough sale; omit it for full price.
327
+ - `sku`, `barcode` — per combination.
328
+ - `visible` — hide a single variant.
329
+ - `revenueDetails` — cost / profit tracking.
330
+ - Read-only, don't send: `media` (derived from the choices' media), `inventoryStatus` (stock — use the Inventory API, see *Set Stock for New Variants*), `subscriptionPricesInfo`.
331
+
332
+ ```bash
333
+ # A choice image + a variant's sale price, one PATCH. Both arrays are complete and keep their ids —
334
+ # this exact shape is the one that succeeds; the two shortcuts (choices by name only, or a variant
335
+ # without its choices/price) each 400.
336
+ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
337
+ -H "Content-Type: application/json" -H "Authorization: <AUTH>" \
338
+ -d '{ "product": { "id": "{productId}", "revision": "{currentRevision}",
339
+ "options": [ { "id": "{optionId}", "name": "Color", "optionRenderType": "COLOR_CHOICES",
340
+ "choicesSettings": { "choices": [
341
+ { "choiceId": "{choiceId1}", "name": "Red", "choiceType": "ONE_COLOR", "colorCode": "#C0392B",
342
+ "media": { "items": [ { "mediaId": "abc~mv2.jpg" } ] } },
343
+ { "choiceId": "{choiceId2}", "name": "Blue", "choiceType": "ONE_COLOR", "colorCode": "#2C3E50" } ] } } ],
344
+ "variantsInfo": { "variants": [
345
+ { "id": "{variantId1}", "sku": "TEE-RED-L",
346
+ "price": { "actualPrice": { "amount": "20" }, "compareAtPrice": { "amount": "30" } },
347
+ "choices": [ { "optionChoiceIds": { "optionId": "{optionId}", "choiceId": "{choiceId1}" } } ] },
348
+ { "id": "{variantId2}", "price": { "actualPrice": { "amount": "20" } },
349
+ "choices": [ { "optionChoiceIds": { "optionId": "{optionId}", "choiceId": "{choiceId2}" } } ] } ] } } }'
350
+ ```
351
+
300
352
  ### Update Variant Price Only
301
353
 
302
354
  Read `{existingVariantId}` off the Get Product response; a Search or Query Products result does not carry it.
@@ -325,6 +377,35 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
325
377
  }'
326
378
  ```
327
379
 
380
+ ### Attach a Digital File
381
+
382
+ A `DIGITAL` product is **sellable** only when its variant carries both a digital file and stock. Upload the file first ([Upload Media to Wix](../media/upload-media-to-wix.md) → Generate Upload URL, then `PUT` the bytes), then send its `file.id` on the variant — `digitalProperties` is a variant field, never a product field.
383
+
384
+ ```bash
385
+ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
386
+ -H "Content-Type: application/json" \
387
+ -H "Authorization: <AUTH>" \
388
+ -d '{
389
+ "product": {
390
+ "id": "{productId}",
391
+ "revision": "{currentRevision}",
392
+ "variantsInfo": {
393
+ "variants": [
394
+ {
395
+ "id": "{existingVariantId}",
396
+ "price": { "actualPrice": { "amount": "9.99" } },
397
+ "visible": true,
398
+ "inventoryItem": { "inStock": true },
399
+ "digitalProperties": { "digitalFile": { "id": "{fileId}" } }
400
+ }
401
+ ]
402
+ }
403
+ }
404
+ }'
405
+ ```
406
+
407
+ Confirm from `product.variantsInfo.variants[].digitalProperties.digitalFile` in the response.
408
+
328
409
  ## Important Notes
329
410
 
330
411
  - A request to hide a product is a `visible: false` update on the product, never a Delete Product call and never a variant-only change.
@@ -348,3 +429,5 @@ curl -X PATCH "https://www.wixapis.com/stores/v3/products/{productId}" \
348
429
  | `variantsInfo is invalid: variants has size 0, expected 1 or more` | Variants were read from a Search or Query Products response, which does not return them | Re-read the product with Get Product and send its `variantsInfo.variants` |
349
430
  | `Missing option choices` or `INVALID_DEFAULT_VARIANT` | Product has options but at least one variant has no matching choices | Rebuild `variantsInfo.variants` so every variant includes choices for all product options |
350
431
  | `DIGITAL_PRODUCT_CANNOT_BE_VISIBLE_IN_POS` | Sent `visibleInPos: true` on a digital product | Digital products can't be visible in POS; leave `visibleInPos` out of the body |
432
+ | `ITEM_NOT_FOUND_IN_CATALOG` at add-to-cart, product exists | A `DIGITAL` variant has no `digitalProperties.digitalFile` | Attach a file — see [Attach a Digital File](#attach-a-digital-file) |
433
+ | `exceeds available inventory` at add-to-cart, product exists | The variant has no stock (`DIGITAL` products included) | Set `inventoryItem.inStock: true` on the variant |