@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.
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +115 -12
- package/skills/wix-app/references/APP_MARKET_REVIEW.md +1 -1
- package/skills/wix-app/references/BACKEND_API.md +18 -0
- package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +6 -0
- package/skills/wix-app/references/DASHBOARD_MODAL.md +10 -2
- package/skills/wix-app/references/DASHBOARD_PAGE.md +32 -70
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +14 -3
- package/skills/wix-app/references/SITE_PLUGIN.md +12 -0
- package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +74 -68
- package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +79 -0
- package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +73 -0
- package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +52 -0
- package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +184 -0
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +12 -11
- package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +1 -0
- package/skills/wix-app/references/editor-react-component/BROWSER-SUPPORT.md +56 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +16 -8
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +19 -1
- package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +3 -0
- package/skills/wix-base44-connector/SKILL.md +133 -44
- package/skills/wix-base44-connector/references/CAPABILITY_MAP.md +78 -0
- package/skills/wix-base44-connector/scripts/utils.js +216 -30
- package/skills/wix-headless/entry/skill.md +1 -1
- package/skills/wix-headless/references/CAPABILITIES.md +9 -1
- package/skills/wix-headless/references/DESIGN.md +1 -0
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/IMAGE_GENERATION.md +1 -0
- package/skills/wix-headless/references/SDK_HANDOFF.md +4 -1
- package/skills/wix-headless/references/SEED.md +2 -1
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +2 -2
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +26 -8
- package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +26 -10
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +8 -8
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +1 -1
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +1 -1
- package/skills/wix-headless/references/inline-recipes/how-to-code-rentals.md +254 -0
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +13 -0
- package/skills/wix-headless/references/inline-recipes/setup-rentals.md +254 -0
- package/skills/wix-headless/references/non-astro.md +1 -1
- package/skills/wix-headless-fast/SKILL.md +166 -0
- package/skills/wix-headless-fast/entry/skill.md +99 -0
- package/skills/wix-headless-fast/install/deploy.mjs +433 -0
- package/skills/wix-headless-fast/install/fast-path.mjs +141 -0
- package/skills/wix-headless-fast/references/blog/INSTRUCTIONS.md +137 -0
- package/skills/wix-headless-fast/references/blog/app/components/blog/BlogFeedView.tsx +137 -0
- package/skills/wix-headless-fast/references/blog/app/components/blog/PostView.tsx +113 -0
- package/skills/wix-headless-fast/references/blog/app/components/blog/RichContent.tsx +42 -0
- package/skills/wix-headless-fast/references/blog/app/hooks/blog/useBlogFeed.ts +123 -0
- package/skills/wix-headless-fast/references/blog/app/hooks/blog/usePost.ts +70 -0
- package/skills/wix-headless-fast/references/blog/app/wix/blog/posts.ts +99 -0
- package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy.ts +76 -0
- package/skills/wix-headless-fast/references/blog/app/wix/blog/types.ts +62 -0
- package/skills/wix-headless-fast/references/blog/app-astro/layouts/SiteLayout.astro +40 -0
- package/skills/wix-headless-fast/references/blog/app-astro/pages/blog/[...slug].astro +99 -0
- package/skills/wix-headless-fast/references/blog/app-astro/pages/blog.astro +24 -0
- package/skills/wix-headless-fast/references/blog/lock/astro/package-lock.json +16156 -0
- package/skills/wix-headless-fast/references/blog/seed/SEED.md +72 -0
- package/skills/wix-headless-fast/references/blog/seed/seed-blog.mjs +287 -0
- package/skills/wix-headless-fast/references/bookings/INSTRUCTIONS.md +129 -0
- package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServiceBookingView.tsx +143 -0
- package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServicesView.tsx +119 -0
- package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useBookingFlow.ts +138 -0
- package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useServices.ts +54 -0
- package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking.ts +206 -0
- package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services.ts +96 -0
- package/skills/wix-headless-fast/references/bookings/app/wix/bookings/types.ts +70 -0
- package/skills/wix-headless-fast/references/bookings/app-astro/layouts/SiteLayout.astro +40 -0
- package/skills/wix-headless-fast/references/bookings/app-astro/pages/services/[slug].astro +76 -0
- package/skills/wix-headless-fast/references/bookings/app-astro/pages/services.astro +22 -0
- package/skills/wix-headless-fast/references/bookings/lock/astro/package-lock.json +11962 -0
- package/skills/wix-headless-fast/references/bookings/seed/SEED.md +61 -0
- package/skills/wix-headless-fast/references/bookings/seed/seed-bookings.mjs +302 -0
- package/skills/wix-headless-fast/references/cms/INSTRUCTIONS.md +179 -0
- package/skills/wix-headless-fast/references/cms/app/hooks/cms/useCollection.ts +83 -0
- package/skills/wix-headless-fast/references/cms/app/hooks/cms/useItem.ts +57 -0
- package/skills/wix-headless-fast/references/cms/app/wix/cms/items.ts +151 -0
- package/skills/wix-headless-fast/references/cms/app/wix/cms/types.ts +75 -0
- package/skills/wix-headless-fast/references/cms/app-astro/layouts/SiteLayout.astro +41 -0
- package/skills/wix-headless-fast/references/cms/lock/astro/package-lock.json +11262 -0
- package/skills/wix-headless-fast/references/cms/seed/SEED.md +103 -0
- package/skills/wix-headless-fast/references/cms/seed/seed-cms.mjs +324 -0
- package/skills/wix-headless-fast/references/events/INSTRUCTIONS.md +149 -0
- package/skills/wix-headless-fast/references/events/app/components/events/EventConfirmationView.tsx +66 -0
- package/skills/wix-headless-fast/references/events/app/components/events/EventRegistrationView.tsx +176 -0
- package/skills/wix-headless-fast/references/events/app/components/events/EventsView.tsx +118 -0
- package/skills/wix-headless-fast/references/events/app/hooks/events/useEventRegistration.ts +117 -0
- package/skills/wix-headless-fast/references/events/app/hooks/events/useEvents.ts +59 -0
- package/skills/wix-headless-fast/references/events/app/wix/events/events.ts +136 -0
- package/skills/wix-headless-fast/references/events/app/wix/events/registration.ts +128 -0
- package/skills/wix-headless-fast/references/events/app/wix/events/types.ts +61 -0
- package/skills/wix-headless-fast/references/events/app-astro/layouts/SiteLayout.astro +40 -0
- package/skills/wix-headless-fast/references/events/app-astro/pages/event-confirmation.astro +12 -0
- package/skills/wix-headless-fast/references/events/app-astro/pages/events/[slug].astro +80 -0
- package/skills/wix-headless-fast/references/events/app-astro/pages/events.astro +21 -0
- package/skills/wix-headless-fast/references/events/lock/astro/package-lock.json +11884 -0
- package/skills/wix-headless-fast/references/events/seed/SEED.md +86 -0
- package/skills/wix-headless-fast/references/events/seed/seed-events.mjs +276 -0
- package/skills/wix-headless-fast/references/forms/INSTRUCTIONS.md +150 -0
- package/skills/wix-headless-fast/references/forms/app/hooks/forms/useWixForm.ts +317 -0
- package/skills/wix-headless-fast/references/forms/app/wix/forms/forms.ts +269 -0
- package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions.ts +231 -0
- package/skills/wix-headless-fast/references/forms/app/wix/forms/types.ts +135 -0
- package/skills/wix-headless-fast/references/forms/lock/astro/package-lock.json +10593 -0
- package/skills/wix-headless-fast/references/forms/seed/SEED.md +108 -0
- package/skills/wix-headless-fast/references/forms/seed/seed-forms.mjs +320 -0
- package/skills/wix-headless-fast/references/members/INSTRUCTIONS.md +63 -0
- package/skills/wix-headless-fast/references/members/app/components/members/AccountView.tsx +60 -0
- package/skills/wix-headless-fast/references/members/app/components/members/LoginForm.tsx +155 -0
- package/skills/wix-headless-fast/references/members/app/components/members/MemberMenu.tsx +78 -0
- package/skills/wix-headless-fast/references/members/app/components/members/RequireAuth.tsx +47 -0
- package/skills/wix-headless-fast/references/members/app/hooks/members/useMember.ts +66 -0
- package/skills/wix-headless-fast/references/members/app/wix/members/auth.ts +88 -0
- package/skills/wix-headless-fast/references/members/app/wix/members/client.ts +53 -0
- package/skills/wix-headless-fast/references/members/app/wix/members/member-store.ts +122 -0
- package/skills/wix-headless-fast/references/members/app/wix/members/members.ts +50 -0
- package/skills/wix-headless-fast/references/members/app/wix/members/types.ts +21 -0
- package/skills/wix-headless-fast/references/members/app-astro/layouts/SiteLayout.astro +42 -0
- package/skills/wix-headless-fast/references/members/app-astro/pages/account.astro +10 -0
- package/skills/wix-headless-fast/references/members/app-astro/pages/login.astro +11 -0
- package/skills/wix-headless-fast/references/members/lock/astro/package-lock.json +10329 -0
- package/skills/wix-headless-fast/references/members/seed/SEED.md +39 -0
- package/skills/wix-headless-fast/references/members/seed/seed-members.mjs +94 -0
- package/skills/wix-headless-fast/references/portfolio/INSTRUCTIONS.md +134 -0
- package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
- package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
- package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/ProjectDetailView.tsx +115 -0
- package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollectionProjects.ts +59 -0
- package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollections.ts +39 -0
- package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useProjectDetail.ts +58 -0
- package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio.ts +165 -0
- package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/types.ts +55 -0
- package/skills/wix-headless-fast/references/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
- package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
- package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio.astro +21 -0
- package/skills/wix-headless-fast/references/portfolio/app-astro/pages/projects/[slug].astro +29 -0
- package/skills/wix-headless-fast/references/portfolio/lock/astro/package-lock.json +10197 -0
- package/skills/wix-headless-fast/references/portfolio/seed/SEED.md +78 -0
- package/skills/wix-headless-fast/references/portfolio/seed/seed-portfolio.mjs +258 -0
- package/skills/wix-headless-fast/references/pricing-plans/INSTRUCTIONS.md +133 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +58 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlansView.tsx +126 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +37 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlans.ts +39 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans.ts +75 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase.ts +45 -0
- package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/types.ts +30 -0
- package/skills/wix-headless-fast/references/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
- package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans/[slug].astro +40 -0
- package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans.astro +21 -0
- package/skills/wix-headless-fast/references/pricing-plans/lock/astro/package-lock.json +11226 -0
- package/skills/wix-headless-fast/references/pricing-plans/seed/SEED.md +71 -0
- package/skills/wix-headless-fast/references/pricing-plans/seed/seed-pricing-plans.mjs +279 -0
- package/skills/wix-headless-fast/references/restaurants/INSTRUCTIONS.md +165 -0
- package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/MenuView.tsx +142 -0
- package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
- package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
- package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/ReservationView.tsx +155 -0
- package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useMenus.ts +55 -0
- package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useOrderCart.ts +43 -0
- package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useReservation.ts +177 -0
- package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu.ts +165 -0
- package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/order-store.ts +103 -0
- package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering.ts +254 -0
- package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations.ts +146 -0
- package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/types.ts +168 -0
- package/skills/wix-headless-fast/references/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
- package/skills/wix-headless-fast/references/restaurants/app-astro/pages/menu.astro +22 -0
- package/skills/wix-headless-fast/references/restaurants/app-astro/pages/reservations.astro +12 -0
- package/skills/wix-headless-fast/references/restaurants/lock/astro/package-lock.json +12560 -0
- package/skills/wix-headless-fast/references/restaurants/seed/SEED.md +81 -0
- package/skills/wix-headless-fast/references/restaurants/seed/seed-restaurants.mjs +479 -0
- package/skills/wix-headless-fast/references/shared/CONTENT.md +22 -0
- package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +73 -0
- package/skills/wix-headless-fast/references/shared/DESIGN.md +26 -0
- package/skills/wix-headless-fast/references/shared/app/styles/global.css +52 -0
- package/skills/wix-headless-fast/references/shared/app/wix/config.ts +15 -0
- package/skills/wix-headless-fast/references/shared/app/wix/media.ts +27 -0
- package/skills/wix-headless-fast/references/shared/app/wix/money.ts +24 -0
- package/skills/wix-headless-fast/references/shared/app/wix/sdk.ts +76 -0
- package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
- package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +46 -0
- package/skills/wix-headless-fast/references/shared/seed/images.mjs +145 -0
- package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +149 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartButton.tsx +26 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartDrawer.tsx +121 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductCard.tsx +100 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductDetailView.tsx +130 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductGrid.tsx +48 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/ShopView.tsx +66 -0
- package/skills/wix-headless-fast/references/storefront/app/components/storefront/VariantPicker.tsx +103 -0
- package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useCart.ts +48 -0
- package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useProductDetail.ts +140 -0
- package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +80 -0
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +101 -0
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart.ts +221 -0
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +215 -0
- package/skills/wix-headless-fast/references/storefront/app/wix/storefront/types.ts +109 -0
- package/skills/wix-headless-fast/references/storefront/app-astro/layouts/SiteLayout.astro +46 -0
- package/skills/wix-headless-fast/references/storefront/app-astro/pages/products/[slug].astro +56 -0
- package/skills/wix-headless-fast/references/storefront/app-astro/pages/shop.astro +23 -0
- package/skills/wix-headless-fast/references/storefront/lock/astro/package-lock.json +12247 -0
- package/skills/wix-headless-fast/references/storefront/seed/SEED.md +85 -0
- package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +415 -0
- package/skills/wix-manage/SKILL.md +18 -2
- package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +141 -0
- package/skills/wix-manage/references/google-business-profile/connect-google-business-profile.md +134 -0
- package/skills/wix-manage/references/google-business-profile/manage-google-business-profile-locations.md +182 -0
- package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +3 -0
- package/skills/wix-manage/references/stores/create-product-catalog-v3.md +21 -6
- package/skills/wix-manage/references/stores/update-product-with-options.md +83 -0
- package/skills/wix-vibe-headless/SKILL.md +18 -4
- package/skills/wix-vibe-headless/install/deploy.cjs +12 -4
- package/skills/wix-vibe-headless/install/pin-agents-md.cjs +2 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +3 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +3 -1
- package/skills/wix-vibe-headless/platforms/base44.md +23 -61
- package/skills/wix-vibe-headless/platforms/generic.md +6 -3
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +43 -0
- package/skills/wix-vibe-headless/references/bookings/app/components/RentalDurationPicker.jsx +67 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useRentalDuration.js +128 -0
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +5 -3
- package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-rentals.js +250 -0
- package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-services.js +12 -5
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +41 -0
- package/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.js +267 -0
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +6 -3
- package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +470 -0
- package/skills/wix-vibe-headless/references/forms/app/hooks/useWixForm.js +425 -0
- package/skills/wix-vibe-headless/references/forms/app/lib/wix-form-schema-utils.js +187 -0
- package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms-submissions.js +238 -0
- package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms.js +108 -0
- package/skills/wix-vibe-headless/references/forms/seed/SEED.md +1762 -0
- package/skills/wix-vibe-headless/references/rentals/INSTRUCTIONS.md +13 -0
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +137 -84
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +15 -8
- package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +37 -0
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +18 -6
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +30 -7
- package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +46 -10
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +0 -110
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +0 -51
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +0 -49
- package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +0 -92
- 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)
|
package/skills/wix-manage/references/google-business-profile/connect-google-business-profile.md
ADDED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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:
|
|
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 |
|