AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The wix-manage skill provides a structured library of REST API recipes designed to help developers and agents interact with Wix business solutions. It covers a wide range of administrative and configuration tasks, including site setup, entity management, SEO, analytics, accessibility, and dashboard navigation. By providing specific endpoint, method, and payload patterns, it ensures accurate API usage for backend integrations, data synchronization, and automated site management.
What it does
- Provides standardized REST API recipes for configuring Wix business apps like Stores, Bookings, and CMS.
- Facilitates administrative tasks such as bulk updates, contact labeling, and data migrations.
- Offers guidance on managing SEO tags, URL redirects, and Google Search Console connections.
- Enables programmatic accessibility scanning and reporting for Wix sites.
- Generates direct dashboard navigation links for various Wix business solutions.
- Supports backend integrations through server-to-server automations and data synchronization.
When to use it
- When you need to perform administrative or configuration tasks on a Wix site via REST API.
- When you need to retrieve or update business data like products, services, or contacts.
- When you need to provide a user with a direct link to a specific page in their Wix dashboard.
- When you are building backend integrations or automations for a Wix site.
- When you need to audit or manage SEO, accessibility, or analytics configurations.
Advantages
- Reduces errors by providing exact API endpoints, methods, and payload structures.
- Eliminates the need to guess API paths or manually construct dashboard URLs.
- Ensures consistent and reliable interaction with Wix business entities.
- Simplifies complex workflows like multi-step booking service setup or accessibility scanning.
- Provides a clear separation between management operations and frontend display logic.
Usage examples
- “How can I update the SEO title for my homepage?”
- The agent uses the Manage SEO Tags recipe to identify the homepage, retrieve current tags, and apply the requested update via the appropriate API endpoint.
- “Where can I find my site's booking calendar in the dashboard?”
- The agent uses the Bookings Dashboard Navigation recipe to generate a direct link to the calendar page within the user's Wix dashboard.
- “Scan my site for accessibility issues.”
- The agent initiates an accessibility scan using the Accessibility Scans API, polls for completion, and reports findings categorized by severity.
- “List all my installed Wix apps.”
- The agent calls the List Installed Apps API and returns a summary of all apps currently active on the site.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/wix/wix-manage/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip wix-manage.zip -d .agents/skills
Documentation by Wix
Management Recipes Index
Standard call shape for every curl example across these recipes. The
<AUTH>placeholder in example curls is shorthand for theAuthorizationheader only; body-bearing calls also needContent-Type: application/json.
What Are Management Recipes?
Management recipes are for REST API operations that configure, set up, and manage Wix business entities on your site. These recipes use REST API calls and are designed for:
Site setup and configuration — Initial setup of stores, bookings, payments, and other business apps
Entity management — Creating, updating, and deleting products, services, staff members, pricing plans
Administrative operations — Bulk updates, contact labeling, data migrations
Backend integrations — Server-to-server automations, webhooks, data synchronization
These recipes do NOT cover frontend development or SDK usage for displaying data to users.
App Installation
Install Wix Apps
Installs Wix apps on a site using Apps Installer API. Covers enabling Velo (Wix Code), app installation, and common app definition IDs.
List Installed Apps
Lists all apps installed on a site using Apps Installer API. Useful for verifying app installations before making API calls and diagnosing authorization errors.
App Management Dashboard Navigation
"Builds direct links to the app-management dashboard pages on manage.wix.com — the App Market and the installed-apps management page. Pairs installed apps with the List Installed Apps read API. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Custom Apps
Use App Tools
"Discovers and runs app tools, the actions and lookups that apps installed on a Wix site expose to AI agents, for example converting a price with a pricing app or tracking a package with a shipping app. Covers listing the site's app tools, choosing one by its description, and running it with a payload built from its input schema. Use when the user asks for something an installed app provides rather than a built-in Wix feature, asks what their apps can do, or names an app or app tool."
SEO
Manage a Wix Site's SEO Tags
Read and update SEO titles and tags at the right level, and publish static-page SEO changes. "Change my site's SEO title" names no page, so its default is one question and no write, also under instructions to work autonomously or pick defaults: ask whether the user means the homepage, a specific page, or a page-type pattern, with no API call; site-level tags accept meta tags only, never titles. Discover item IDs and pattern variables, preserve existing tags, and report resolved tags with their sources.
Manage URL Redirects on a Wix Site
"Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites, bulk creates of up to 100 and bulk deletes of up to 500, and the change flow for a redirect that already exists. This API has no query, search, or update method: List Redirects is the only read-many. Redirects do not chain, so creating one that points at a path another redirect starts from permanently deletes that other redirect; list and check before every write."
Manage Google Search Console for a Wix Site
"Connect a Wix site to Google Search Console and drive its setup through the public GSC Connection and Site Readiness APIs: check connection and readiness, start the Google authorization, verify ownership, add the property, submit the sitemap, request indexing, read search performance, run URL inspection, recover a stale connection, or disconnect. The site owner authorizes in their own browser via a single-use connect URL."
Generate AI SEO Suggestions for a Wix Site
"Generate AI-written SEO text for a Wix site through the public Tag Suggestions and Page Optimization APIs: title tag and meta description options for a page, alt text for the images of a page, store product, or blog post (one image or up to 20 per call), corrected heading levels for a page's headings, and a whole-page rewrite of title, description, headings, and body text aimed at the page's focus keyword, returned as before/after pairs. Use it when the user asks for SEO title or meta description options or ideas, or wants to improve, optimize, audit, or write the SEO text of a page or the homepage: Wix's AI writes the texts. Suggestions are returned for review; applying one is a separate SEO tags write."
Accessibility
Scan a Wix Site for Accessibility Issues
Run a Wix accessibility scan for a full site, one page, or every page in any supported page collection, including products, blog posts, booking services, events, and restaurant pages. Poll the asynchronous scan to completion, report failed pages separately, retrieve prioritized findings, and use the returned fix guidance to help the user resolve and verify issues.
Analytics
Query Site Analytics
Retrieve a Wix site's analytics through the Semantic Model API. Covers listing semantic models, inspecting a model's schema (measures, dimensions, parameters), and querying model data with a required time interval, filters, sorting, paging, and human-readable formatting.
Analytics Dashboard Navigation
"Builds direct links to Wix Analytics dashboard pages on manage.wix.com — highlights, reports, per-domain overviews (traffic, behavior, sales, marketing), and performance insights/benchmarks. Pairs analytics data with its read API so you can answer a question via API and hand back a 'see it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Blog
How to Create Blog Posts
Creates and publishes blog posts using Blog Posts API. Covers resolving the required author memberId (including creating an author member when the site has none), Ricos rich content format, image upload via Media Manager, category/tag assignment, and bulk post creation.
Find and Update Blog Posts
"Finds a site's live blog posts and changes existing posts and drafts through the Wix Blog REST APIs. Covers looking up published posts by title, publish date, category or tag (including the newest and the first post ever), editing an existing post (adding or changing a sentence, paragraph or link in its text, its cover image, excerpt, categories and tags), publishing a draft, moving a live post back to drafts, and deleting or restoring posts. Use whenever the user names a post that already exists on the blog: to find it, change its content, publish, unpublish or delete it; writing a new post is How to Create Blog Posts."
Blog Dashboard Navigation
"Builds direct links to Wix Blog dashboard pages on manage.wix.com — posts list (published and draft tabs), categories, tags, writers, comment moderation, blog analytics, monetization, and settings. Pairs each main Blog entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Bookings
Booking Service Policy Setup
Sets up booking policies, cancellation rules, and waitlist configuration using the Booking Policies API — query for the (default) bookingPolicy entity, then PATCH it with its revision. Covers cancellationPolicy, reschedulePolicy, booking-notice limits, waitlistPolicy, and participants limits — e.g. "customers can cancel up to 24 hours before".
Bookings Staff Setup
"Creates staff members and configures custom working hours using Staff API + Calendar Events API. Critical two-step process: create staff → assign schedule → create working hours events."
Create and Update Booking Services
"Creates and updates Wix Bookings services of every type — appointments, classes and courses — from a plain request such as 'a 60-minute consultation for $75', 'a yoga class for 12 people every Tuesday' or 'a 6-week photography course'. Covers choosing the service type, defaults for what the request leaves out, pricing (free, fixed, free-to-paid), staff, capacity, duration, categories, visibility, images, scheduling class and course sessions on the calendar, and changing existing services."
Check Bookings Availability (and Diagnose Issues)
"Answers whether an appointment-based Wix Bookings service currently has bookable availability — the primary question — and diagnoses the cause only when there's no availability or the owner asks why. To diagnose, first rules out service-level blockers the availability endpoint can't see (service hidden, online booking off), then runs DiagnoseAvailability for ordered, machine-readable staff/setup reasons, with a manual fallback for booking-policy and capacity causes. Use when someone asks whether a service has availability, or why a service shows no times / customers can't book it."
End-to-End Booking Flow
Books and settles appointments, classes and courses with the site owner's credentials — an operator managing bookings, or server-side code booking as the owner. Covers service discovery, availability with Time Slots V2, creating the booking, and settling it by direct confirmation or by taking payment through eCommerce checkout. A visitor booking for themselves needs a visitor token instead; this recipe links that path.
External Calendar Integration
OAuth-based integration with Google Calendar, Microsoft Outlook, and Apple Calendar. Covers authentication flows, sync configuration, and bidirectional event management.
Multi-Resource Service Creation
Creates resource types and individual resources using Resources API. Enables services that require multiple resources (rooms + equipment + staff) with automatic allocation.
Bookings Dashboard Navigation
"Builds direct links to Wix Bookings dashboard pages on manage.wix.com — services list, edit a specific service, calendar, booking list, staff, availability, resources, and settings pages. Pairs each main Bookings entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Calendar
Configure Default Business Hours
Uses Calendar Events API to create WORKING_HOURS events on the business schedule. Covers the critical distinction between Calendar Events API (correct) vs Site Properties API (incorrect) for setting base availability.
Dashboard links for calendar surfaces (availability, default business hours) are in Bookings Dashboard Navigation.
CMS
CMS Data Items CRUD
"Add, query, update, and delete items in CMS collections, one at a time or in bulk. Also covers counting items, upserting with bulk save, truncating a collection, aggregating data with a pipeline, linking items through single- and multi-reference fields, and reading items with their referenced items expanded."
CMS eCommerce Catalog Integration
The recommended way to sell existing CMS collection items (tickets, bookings, memberships) through Wix checkout. Add the CATALOG plugin to convert any CMS collection into purchasable products with cart and payment integration.
CMS Schema Management
Create and modify CMS collection structures. Covers listing collections, creating collections with fields, adding/removing fields (including single- and multi-reference fields that link two collections), and updating collection settings.
CMS Draft & Publish Workflow (Draft Items plugin)
"Interact with CMS collections that gate their items behind a draft/publish workflow via the Draft Items plugin. Covers detecting the plugin, locating the paired drafts collection, reading published vs draft items, authoring/editing drafts, and publishing, unpublishing, reverting, and deleting items. Key endpoints: /wix-data/v2/items/publish-draft, /wix-data/v2/items/unpublish, /wix-data/v2/collections/add-draft-items-plugin, and the paired drafts collection referenced by draftItemsPluginOptions.draftsCollectionId."
CMS Dashboard Navigation
"Builds direct links to the Wix CMS (Content Manager) dashboard pages on manage.wix.com — the collections list and a specific collection's items view. Pairs collections and data items with their read APIs so you can fetch data and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Contacts
Site members (is someone a member, list or count members, approve a join request, block or unblock a member, change the name a member shows on the site, add a member) → use Find and Manage Site Members. A contact is not always a member: for people who are not members, use the contacts recipes below.
Bulk Delete Contacts
Deletes multiple contacts using filter-based bulk delete. Covers safe deletion patterns, GDPR compliance, soft delete alternatives, and batch processing strategies.
Bulk Label and Unlabel Contacts
Creates contact label definitions or adds/removes labels from matching contacts. Use Find or Create Label for label creation alone; use bulk labeling only when the user requests contact assignments.
Create a Contact
Creates a contact with the Contacts API. Covers the minimum identifying fields, the single-object shape of email and phone, and adding a physical address with the ISO 3166-2 subdivision format required for state, region, and province codes.
Update a Contact
Updates an existing contact's email, phone, name, or address with the Contacts API. Covers locating the contact when the user identifies it by name, passing its current revision, and the ISO 3166-2 subdivision format required for state, region and province codes.
Find Contacts
"Finds a site's contacts and answers questions about them: one contact by name, email or phone, contacts in a city, state or country, contacts with a label, birthdays, site members or email subscribers among the contacts, how many contacts match, every contact for an export, and possible duplicate contacts. Covers which contact fields can be filtered, how name matching works, paging through every result, and which fields the answer reads. Use when the user asks to find, look up, list, count or export contacts, wants a contact's details such as their address, or needs a contact's ID for another task such as their bookings or orders."
Find and Manage Site Members
"Finds a site's members and manages their access: one member by login email or name, the list of members with their emails, status and join dates, how many members a site has, pending, approved and blocked members, approving a pending member, blocking or unblocking a member, adding a member, and changing the name a member shows on the site. Covers which member fields can be filtered, the fieldsets that return email and status, and the member ID other tasks need. Use when the user asks whether someone is a member, wants to see or count their site members, approve a join request, block or unblock someone, add a member, or needs a member's ID for a task other than writing a blog post."
Contacts Dashboard Navigation
"Builds direct links to Wix Contacts (CRM) dashboard pages on manage.wix.com — the contacts list, a specific contact's view page, contact import, and the segments page. Pairs each main contacts entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Dashboard Navigation
Dashboard URLs are recipe data, not general knowledge. A manage.wix.com route is an app-registered slug that appears in no API reference and cannot be derived from the entity's name or its API path (Forms pages live under wix-forms, not contacts/forms; Stores products under wix-stores/products). So for every request for a dashboard link — even one that needs no API call, and even when a route feels obvious — open the solution's dashboard-navigation recipe below and copy the route from its table. Answering from memory is the one failure mode these recipes exist to prevent.
Dashboard Navigation
"Entry point for building direct links into a site's Wix dashboard (manage.wix.com). Documents the shared URL structure for all dashboard pages (site and account level, app-ID fallback, entity deep links, machine-readable routes.json) and routes to a per-business-solution recipe for every covered solution — bookings, stores/ecommerce, events, blog, pricing plans, restaurants, CMS, contacts, forms, marketing, get paid, analytics, google ads, app management, site settings, sites, and domains. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Domains
Analyse Domain
Report on the domains in the user's own Wix account — what kind a domain is, which site it is on, when it expires and whether it renews — for one domain, or by listing and filtering the account's domains.
Assign Domain
Connect a domain the user already owns to one of their Wix sites, as its primary domain or as a redirect — the starting point for every "connect my domain to my site" request, whether or not a domain is named; change which of a site's domains is primary; move a domain from one site to another; or take a domain off its site.
Check Domain Availability
Answer whether a domain name, or several at once, is available to register through Wix — a stand-alone "is example.com available?" question with no request to buy or connect.
Domain Search, Purchase and Connect
Buy a domain through Wix — intent, suggestions, site resolution, registration, privacy, cart and checkout — or bring a domain registered elsewhere into the Wix account with the dashboard connect link, once Assign Domain finds it is not there yet. A request to connect a domain the user owns to their site starts at Assign Domain. Availability checks are not done here: they all use Check Domain Availability.
Domains Dashboard Navigation
"Builds direct links to the domain-management pages on manage.wix.com — the site-level domain settings page and the account-level My Domains page. Pairs domain search/purchase with its read APIs. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
eCommerce
Routing — pick the right entry point:
Any sales/business improvement request (boost sales, promotions, help my business, holiday deals, improve revenue, discounts, shipping, coupons, clearance, gift cards) → use Recommend: eCommerce Strategy. This is the default entry point — it analyzes ALL domains (discounts, shipping, gift cards) and generates cross-domain recommendations. Do NOT ask clarifying questions.
Traffic acquisition is NOT an eCommerce-strategy request ("grow my traffic", SEO, ads, social, content) → do NOT use Recommend: eCommerce Strategy; it only converts visitors a store already has. Route these to marketing.
Pricing & promotions (coupons, discount rules, ribbons, sales) → use the Pricing & Promotions dispatcher.
Shipping setup (rates, regions, pickup, free shipping, fix coverage) → use the Shipping dispatcher.
Orders (find an order by its number, order history, what a customer bought, unpaid or unshipped orders, units sold, sales reports and exports) → use Find and Report on Orders. Totals and trends that are already aggregated (revenue over time, order count, AOV) → use Query Site Analytics.
Gift cards ("should I sell gift cards", "add a gift card", "what amounts should my gift card have") → these are recommendations, so they go through Recommend: eCommerce Strategy, which activates its GIFT_CARDS domain and loads the gift-cards goal itself. Issuing/redeeming an individual gift card is the Gift Cards API, not a recommendation.
eCommerce: Load Context
L1 loader — loads general site data (siteId, country, currency, industry, catalog analytics) needed by every eCommerce category. Each category dispatcher loads this before tag-matching; runs once per session.
Recommend: eCommerce Strategy
Entry point for all eCommerce recommendation requests. Unified skill that analyzes site data across ALL domains (discounts + shipping + gift cards), generates up to 5 cross-domain recommendations, and persists them to the tracking database. Covers discount strategies (seasonal, upsell, stock mover, bundling), shipping optimization (coverage gaps, free shipping, rate strategy, carrier backup), AND selling gift cards (denominations sized from the site's own AOV and catalog prices). Use this for business improvement requests about earning more from existing visitors. Traffic acquisition (SEO, ads, social, content) is out of scope — route "grow my traffic" to marketing.
Pricing & Promotions
Routes discounts, coupons, sales and bundles to promotion recipes, and visual product ribbons to the Catalog Ribbons API. Load this dispatcher for mixed pricing/refund/payment/product-price/shipping requests to choose the appropriate APIs.
Shipping
Dispatcher — routes shipping-setup requests (rates, regions, pickup, free shipping, fix coverage, optimize rates) to the right leaf recipe. The Shipping Options + Delivery Profiles APIs have no public docs page; ecom-shipping-api.md is the authoritative inline reference.
Find and Report on Orders
"Finds a Wix site's eCommerce orders and turns them into answers and reports: one order by its number, orders in a date range, the orders of one buyer, orders that contain a product, unpaid or unfulfilled orders, and sales totals such as units sold per product or revenue for a period. Covers which order fields can be filtered, paging through every result, and which fields a report reads. Use when the user asks about a specific order, their order history or what customers bought, or wants a sales report or an export built from their store's orders."
<details> <summary>Internal skills (loaded automatically by the dispatchers / orchestrator above — do NOT use directly)</summary>
Pricing & promotions leaves (loaded by the Pricing dispatcher or by the strategy orchestrator)
Goals: Increase AOV, Clear Inventory, Seasonal Revenue, Drive Cross-Sells
Flows: Upsell Boost, Bundle and Save, Stock Mover, Seasonal Promotion
Gift-cards leaf (loaded by the strategy orchestrator when it activates the GIFT_CARDS domain)
Goal: Sell Gift Cards — existing-product gate (one per site), eligibility, denomination sizing from AOV / catalog prices, no-expiry-by-default policy, and the mapping onto Create Gift Card Product
Shipping leaves (loaded by the Shipping dispatcher)
API Reference — inline spec for Shipping Options + Delivery Profiles
Cross-cutting tracking
API: Recommendation Tracking — load BEFORE generating any recommendation; persists PROPOSED state and tracks MarkExecuting → MarkDone/MarkFailed.
</details>
Dashboard links for eCommerce surfaces (orders, abandoned checkouts, gift cards, shipping, tax, checkout settings) are in Stores Dashboard Navigation.
Donations
Create and Update Donation Campaigns
Create, inspect, update and archive Wix Donations campaigns, including suggested amounts and impact text, custom limits, giving frequencies, goals, donor notes, fee coverage and imagery.
Events
Create an Event with the Wix Events API
"Creates an event with the Wix Events V3 API — one-off or recurring, RSVP, ticketed, registration-free or with external registration — including date and time, venue or online location, guest limit, description and ticket tiers. Covers the exact field shapes and the API's misleading validation messages. Use when the user wants to create or set up an event, an information-only event, or a repeating event — including a weekly workshop, class or meetup series held on set dates at a venue or online; a Bookings class or course is booked per session instead."
Manage Wix Events — Publishing, Cancelling, Cloning and Counting
"Operates on Wix events that already exist with the Wix Events V3 API — finding (by name or date), updating (date, venue, main image, description, page settings), controlling registration (close, reopen, registration-free, external, members-only, limits), switching between RSVP and ticketed (a new event — ask before creating it), publishing, cancelling, deleting, cloning and counting, including single occurrences of a recurring event. Use to close registration, move or cancel an event, or change how guests register."
Manage Event Tickets
"Manages the ticket types of a ticketed Wix event with the Ticket Definitions V3 API — adding, editing, repricing, hiding, reordering and deleting tickets, scheduling or ending ticket sales, and changing the ticket currency. Use when the user wants to add early-bird, VIP, child or donation tickets to an existing event, change a ticket's price or quantity, or set when tickets stop selling."
Manage Event Guests
"Manages the people registered for a Wix event — RSVPs on RSVP events, and orders, tickets and ticket holders on ticketed events: listing and counting guests for one event or across all events, new registrations since a date, attendee lists to export, adding or removing a guest, changing an RSVP, checking guests in, and marking orders paid. Use when the user asks who is coming or how many registered, or wants to add, remove or check in a guest. Notes what the API can't do, such as refunds and resending emails."
Events Dashboard Navigation
"Builds direct links to Wix Events dashboard pages on manage.wix.com — the published and draft event lists, a new event, categories, staff, a recurring series' occurrences, and one event's pages: overview, edit, tickets, guests (RSVP or ticketed), orders, schedule, registration settings and form, and policies. Pairs each Events entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Event Registration Form
"Customizes the registration form of a Wix event with the Events Form API — adding, editing, reordering and removing questions, the additional-guests field, and the messages guests see after registering or when registration is closed. Use when the user wants to add or require a question on an event's RSVP or checkout form, let guests bring a plus-one, or reword a confirmation message."
Event Schedule, Policies and Categories
"Configures what appears around a Wix event on its page — the schedule or agenda, the policies guests accept (terms, refunds), and event categories. Use when the user wants to add an agenda or timetable to an event, add terms or a refund policy, or group events into categories such as workshops or concerts."
Forms
Create Form
"Creates a visitor-fillable Wix form with Form Schemas v4 — a contact or enquiry form, a signup or waitlist, an application, a survey, a quote request, and forms whose submissions create a contact. Ships a complete create request and the field table for the common kinds, with the value each one submits — dropdown, single and multi choice, date and time, number, consent and email-subscription (GDPR marketing) checkboxes — plus multi-page forms and the silent breakers that produce an empty or invisible form. Changing a form that already exists is Update Form."
Update Form
"Changes a Wix form that already exists, with Form Schemas v4 PATCH — add a field to my form, add a dropdown or a consent checkbox, make a field required or optional, rename a label, reorder, remove or retire a question. Covers reading the form back for its revision (and the required namespace query parameter), the whole-form body that a PATCH needs, the wholesale formFields replace that silently soft-deletes anything you omit, changing a field's component type in place, removing a field or hiding one from visitors, and the read-back that proves what was stored. Use whenever the form exists and the request changes what it collects; use Create Form when there is no form yet."
Read Forms and Submissions
"Reads a site's Wix forms and the submissions visitors sent to them — what forms do I have, find a form by name, show the latest submissions, who filled in my contact form, how many submissions did I get last week, submissions from one contact, unread submissions. Covers finding the form's namespace instead of guessing it, where that namespace goes on each read, the Form Schemas and Form Submissions endpoints (and the look-alike URLs that 404), forms hidden from a default listing, the closed list of submission fields you can filter and sort by, date ranges, cursor paging, totals per form, and reading answers by field. Read-only; changing a form is Update Form, building one is Create Form."
Forms Dashboard Navigation
"Builds direct links to Wix Forms dashboard pages on manage.wix.com. The paths are not guessable and appear in no API reference, so take them from here: under https://manage.wix.com/dashboard/{metaSiteId}/, the forms list is wix-forms, a form's builder is wix-forms/form/{formId}, and that form's submissions are wix-forms/form/{formId}/submissions — there is no site-wide submissions page, and nothing lives under contacts/forms, forms, form-builder or wix-forms-and-payments (the legacy app). Also standalone forms, and the dashboard link for each Forms entity; reading forms and submissions is Read Forms and Submissions."
Get Paid
Create Payment Links
Creates payment links for collecting payments without a checkout flow. Covers store products (catalog items), custom line items, variants, due dates, and sending links via email.
How to Setup Wix Payments
Configures Wix Payments as the payment provider. Covers eligibility checking, business verification, bank account setup, and payment method configuration (cards, PayPal, Apple Pay).
Payment Links for Bookings
Creates payment links for unpaid bookings using Payment Links API. Links booking IDs to payment requests with proper redirect handling.
Get Paid Dashboard Navigation
"Builds direct links to Wix payments and invoicing dashboard pages on manage.wix.com — payment links, invoices (list, create, settings), recurring invoices, and the accept-payments settings page. Pairs each main get-paid entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Google Ads
Routing — Google paid-advertising campaigns for a site (Smart & Performance Max). All flows require a Google Ads account, created once via the setup recipe. Budgets are in micros (1,000,000 = 1 currency unit). REST base: https://www.wixapis.com/_serverless/pa-google/v1.
First-time setup / "connect Google Ads" /
ACCOUNT_NOT_FOUND→ Install and Create an Account (do this before anything else).Suggested keywords / geo / budget / ad copy / images → Get AI Campaign Suggestions.
Improve an existing campaign / see what to fix next / Campaign Success Guide / mark or reopen a recommendation → Manage a Campaign Success Guide.
Create a multi-channel / lead-gen / Shopping campaign → Create a Performance Max Campaign.
Pause / resume / launch / update budget / delete / history → Manage Campaign Lifecycle.
Performance, conversions, search terms, per-product / per-asset metrics → Query Campaign Performance Analytics.
Ad spend, fees, upcoming charges, credit balance → Retrieve Billing and Payment Details.
Install Google Ads and Create an Account
"One-time setup for running Google paid ads on a Wix site: install the Wix Google Ads app, then create the Google Ads account that every campaign, suggestion, and analytics call depends on. Covers checking whether an account already exists, choosing a currency, optionally attaching a promotional incentive (credit offer), linking a Google Merchant Center account, and deleting an account. Use when the user wants to 'set up Google Ads', 'connect Google Ads', 'start advertising on Google', 'create a Google Ads account', or hits an ACCOUNT_NOT_FOUND / app-not-installed error before creating a campaign. Google Ads REST API, base https://www.wixapis.com/_serverless/pa-google/v1."
Get AI Campaign Suggestions for Google Ads
"Reference for the Google Ads Suggestions API on a Wix site: AI/Google-generated inputs that help build effective campaigns — keyword themes (from a URL or autocomplete), geo-target options, low/recommended/high daily-budget tiers with estimated clicks, PMAX budget recommendations, text assets (headlines/descriptions), AI image assets (auto-uploaded to Wix Media), search themes, promotional incentive offers, and complete AI-generated campaign configurations from a campaign brief. Use when the user asks 'suggest keywords for my ads', 'what budget should I use', 'where should I target', 'generate ad copy/headlines', 'generate ad images', 'suggest a whole campaign', or when a create-campaign flow needs suggested values. REST base https://www.wixapis.com/_serverless/pa-google/v1."
Create and Launch a Performance Max Campaign
"Creates and launches a Google Ads Performance Max (PMAX) campaign for a Wix site — a goal-based campaign that runs across all Google channels (Search, Display, YouTube, Gmail, Discover, Maps) from an asset group of headlines, descriptions, images, and (for PMAX Leads) search-theme signals. Covers generating AI text and image assets, generating search themes, getting a Google budget recommendation, assembling the asset group with the required minimum assets, choosing PERFORMANCE_MAX vs PERFORMANCE_MAX_LEADS (leads: phone/form goals, negative keywords, 28-day learning) vs retail/Shopping (Merchant Center feed), creating in PAUSED, and launching. Use for 'create a Performance Max campaign', 'PMAX', 'run ads across all of Google', 'lead-gen Google campaign', or 'Google Shopping ads'. Requires an existing Google Ads account. REST base https://www.wixapis.com/_serverless/pa-google/v1."
Manage Campaign Lifecycle
"Manages existing Google Ads campaigns on a Wix site: list/get, launch (first activation) vs resume (reactivate after a pause), pause a running campaign — optionally with a scheduled auto-resume date — update name/budget/targeting, change the daily budget, delete permanently, and read status history / change log. Use when the user wants to 'pause my Google ad', 'resume my campaign', 'stop the campaign', 'change my daily budget', 'rename the campaign', 'delete this campaign', 'list my Google Ads campaigns', or 'why did my campaign status change'. Requires an existing Google Ads account and campaign. REST base https://www.wixapis.com/_serverless/pa-google/v1."
Manage a Campaign Success Guide
"Campaign Success Guide for existing Wix Google Ads Performance Max Leads campaigns. Use after creating a supported campaign, even while it is learning or has no metrics, and whenever users ask how to improve a campaign, what to fix next, to view the guide, or to mark or reopen a recommendation. Covers campaign and site selection; prioritized actionable recommendations; deduplicated, destination-specific Editor and Google Ads navigation; offers to perform supported work after approval; Merchant Center and Business Profile connection follow-ups; and suggestion-status tracking."
Query Campaign Performance Analytics
"Reads performance analytics for a Google Ads campaign on a Wix site: daily performance metrics (impressions, clicks, CTR, cost, leads, phone calls) with optional previous-period comparison and trends; conversion metrics from Wix Analytics (orders, revenue, leads, CPL, ROAS); the search terms that triggered a campaign's ads; per-product shopping performance for retail campaigns; and per-asset performance (headlines, descriptions, images) for PMAX Leads. Explains when to use campaignResourceName vs the Wix campaignId, the dateRange shape, field enums, sorting, and paging. Use when the user asks 'how is my campaign doing', 'show ad performance', 'what search terms triggered my ads', 'which products/assets perform best', 'campaign ROI/ROAS', or 'conversions from my Google ads'. REST base https://www.wixapis.com/_serverless/pa-google/v1."
Retrieve Google Ads Billing and Payment Details
"Retrieves billing and payment details for a Wix site's Google Ads account: the current billing period's ad spend (usage), the Wix service fee, the total charge, any promotional coupon adjustment, the billing period dates, and the account's credit balance (positive = available credits, negative = outstanding debt not yet charged). Also explains reading current vs remaining budget from the account object. Use when the user asks 'how much have I spent on Google Ads', 'what's my next Google Ads charge', 'show my ad billing', 'do I have ad credits left', 'why was I charged', or 'upcoming Google Ads payment'. Requires an existing Google Ads account. REST base https://www.wixapis.com/_serverless/pa-google/v1."
Google Ads Dashboard Navigation
"Builds a direct link to the Wix Google Ads dashboard page on manage.wix.com, where campaigns created via the Google Ads API recipes are managed. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Google Business Profile
Routing — how a business appears on Google Search and Maps. A Google connection is the prerequisite for all Google-backed location work: check it first, and route "connect / reconnect / disconnect Google" to the connection recipe.
Connect a Wix Site to Google Business Profile
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.
Manage Google Business Profile Locations for a Wix Site
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.
Marketing
Create and Publish a Social Media Post
"End-to-end flow to create a social media post, with its text written for you or your own, and publish or schedule it to a site's connected channel (Instagram, Facebook, LinkedIn, X/Twitter, TikTok, Pinterest, YouTube, Google Business Profile) using the Wix Publisher API. Can write a full per-channel post from a free-text idea or from the site's own assets (products, blog posts, events, bookings, coupons, categories), with your own image, and suggest captions and titles. Settles the post content with you first, then confirms the channel is connected, checks premium quota, creates a draft, and publishes now or schedules it. Use for 'create a post', 'generate a post from my product/idea', 'write a caption', 'caption ideas/suggestions', 'post to Instagram/Facebook/TikTok', 'connect my Instagram/Pinterest/LinkedIn', or 'schedule a post'."
Generate a Marketing Plan and Schedule Its Posts
"End-to-end flow to generate a site's social media marketing plan with the Wix Marketing Plan API and schedule the post drafts it returns. Recommends configuring marketing settings (goal, tone, cadence, content pillars) before the first generation, generates the plan asynchronously, polls until it's ready, then schedules the DRAFT posts. Includes generating posts for additional activities. Use for 'generate a marketing plan', 'create a social media plan/calendar', or 'schedule my plan's posts' requests."
Review and Send Email Campaigns
"Reads a Wix site's email marketing campaigns and reports on them: which campaigns were sent and when, drafts and scheduled campaigns, the subject and content of a campaign (for example whether one mentions a discount code, or its word count), delivery and engagement results, the contacts who received, opened or clicked a campaign, and the site's monthly email quota. Also creates a draft campaign from text and sends or schedules a draft once the user confirms. Use when the user asks about their email campaigns or newsletters, how a campaign performed or who it reached, or wants a campaign drafted or a draft sent."
Marketing Dashboard Navigation
"Builds direct links to Wix marketing dashboard pages on manage.wix.com — the social posts hub (drafts, scheduled and published posts across connected channels), post design templates, saved designs, and the email marketing pages (campaigns list, campaign templates, campaign analytics). Pairs each main marketing entity (social post item, connected social account, marketing-plan post, email campaign) with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Media
Upload Media to Wix
Uploads images and files to the Wix Media Manager using the Import File API. Covers importing from external URLs, checking file status, and using the returned wixstatic.com URL in other APIs.
Generate an Image with AI
Generates an image from a text prompt with the Wix AI APIs (Runware). Returns a short-lived URL that must be imported to be kept — importing is Upload Media to Wix's job, and this recipe hands off to it. Covers choosing a model and its cost/latency/content-filter trade-off, the accepted output sizes, per-model batching limits, the AI credit each call spends, and why a content refusal arrives as a success response with no image.
Online Programs
Manage Online Program Categories
Lists, creates and renames the categories of a Wix site's Online Programs, shows which programs a category holds, and adds a program to a category, removes it, or moves it from one category to another. Use when the user wants to see, create or rename a program category, or change which categories a program is in.
Pricing Plans
Create and Update Pricing Plans
"Creates, finds and changes Wix Pricing Plans with the Plans API. Covers pricing models (recurring, one-time, free), trial periods, perks and plan visibility; finding a plan by name and listing the plans a site sells; and renaming, repricing, hiding and archiving a plan."
Pricing Plans Bookings Integration
Links Pricing Plans to Bookings services using the Benefit Programs API. Enables package deals and memberships that grant booking access.
Find and Manage Pricing Plan Orders
"Finds and manages the orders of a site's Wix Pricing Plans: the purchases and subscriptions that buyers hold. Covers who bought a plan and when, new purchases in a period, how many active subscribers a plan has, memberships that end or renew soon, the names and emails of current and former buyers, and changes to an order: pausing, resuming, cancelling, extending it, marking an offline order as paid, and recording a manual (offline) order for a member. Use when the user asks about their plan subscribers or members' subscriptions, wants a report or an export of plan purchases, or wants to change or add a plan order."
Pricing Plans Dashboard Navigation
"Builds direct links to Wix Pricing Plans dashboard pages on manage.wix.com — plans list, create a plan, edit a plan, record a manual order, and settings. Pairs each main Pricing Plans entity (plan, order) with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Restaurants
Wix Restaurants Setup
Configures restaurant menus, sections, and items using Menus API. Covers menu structure (Menu → Section → Item), the two-step item modifier / modifier group flow, pricing, availability schedules, and ordering settings.
Restaurants Dashboard Navigation
"Builds direct links to Wix Restaurants dashboard pages on manage.wix.com — menus, menu items, the online orders board, online-ordering fulfillment settings (pickup, delivery, dine-in), the reservations list, floor plans, and reservation experience settings. Pairs each main Restaurants entity (menu, section, item, order, reservation) with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Rich Content
Routing rule (READ FIRST). For every request to hand-author, output, or return Ricos /
richContentJSON (nodestree) for Blog, Stores, Events, or CMS, use the available full-documentation reading capability to retrieve and read the canonical Author Ricos Rich Content recipe before using API schema search, convert/validate APIs, or memory. This also applies when the user asks for JSON only.
Ricos Converter Service
Validates and converts content between Ricos documents and HTML/Markdown/plain text using the Ricos Documents API. Covers plugin configuration, format conversion in both directions, and document validation.
Author Ricos Rich Content
Authoritative recipe for hand-authoring valid Ricos rich-content JSON (the richContent/nodes tree) used across Wix Blog posts, Stores product descriptions, Events, and CMS rich-text fields. Use whenever a user asks to create, output, or return Ricos, richContent, or nodes-tree JSON; retrieve and read this full recipe before API schema search or constructing the JSON. Covers paragraphs, headings, lists, blockquotes, dividers, tables, code blocks, images, buttons, audio, video, galleries, collapsible lists, HTML embeds, inline decorations, and nesting rules.
Site Properties
RECIPE: Change a Site's Regional Properties (Currency, Time Zone, Language, Region) via Site Properties API
"Updates the site-level payment currency (store billing currency) using Site Properties API, including the required request body shape and field mask. Covers the site time zone, primary language, and site region (locale country); field masks name top-level properties."
Show and Update Business Info
"Shows and changes a site's business info through the Site Properties API: the business name, description and company ID, the public contact email, phone, fax and address, and the opening hours the site shows. Covers changing one detail while keeping the others, removing a detail, and adding, changing or removing business hours and holiday closures. Not for Wix Bookings availability (default bookable hours) or the site's currency, time zone, language or region."
Site Settings Dashboard Navigation
"Builds direct links to the site-settings dashboard pages on manage.wix.com — the settings hub, website settings, and language & region. Pairs site properties with the Site Properties read API. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Collaborators
Manage Site Collaborators
Manages who has access to a Wix site as a collaborator (contributor) — finds the site's current collaborators, invites someone, removes a collaborator, and resends or revokes a pending collaborator invite. Use when the user wants to give someone access to the site, take it away, or follow up on an invitation that has not been accepted.
Sites
Create Site from Template
Creates new Wix sites from templates using account-level APIs. Covers template search, site creation, and publishing. Not for headless sites.
Create Headless Site
Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs. The site is created and its pages put live by Upload a Website or HTML Files; a Wix Business Solution (a store, blog, bookings and more) is then integrated into it by the Wix Headless kit, from its cold start.
Manage OAuth Apps
Create, read, update, and query OAuth apps for a Wix headless site. Each OAuth app's id is the client_id a frontend uses to mint anonymous visitor tokens and call Wix APIs.
Query Sites
List, count, and find the sites in a Wix account. Covers the namespace filter for headless sites, counting before enumerating, cursor pagination, and resolving a site by name.
Read Account or Site Context
Probe a Wix site or account for full context in one call — installed apps by display name, locale, currency, timezone, and status. Account token + siteId targets one site; account token alone returns up to 10; site-scoped token alone returns the site it is scoped to.
Send Feedback to Wix
Relay the user's feedback about building with Wix — the APIs, docs, recipes, Wix MCP and tooling — to Wix, attributed to the authenticated user. Covers when to offer it, how to compose a message Wix can act on, and the call that sends it. Use when the user asks to report something to Wix, is frustrated with a Wix API or flow, or a recipe's flow fell short. Not a support channel, and not for the user's own site content.
Site Import
Drive the Wix Site Import agent to migrate an existing store or site from another platform (Shopify, WooCommerce, Magento, or any URL) into Wix — as a brand-new site or into the user's existing one — or to import from CSV/TSV export files with no source site. Use this skill whenever the user wants to import, migrate, or clone a store/site into Wix, mentions moving off Shopify/WooCommerce/Magento, or gives a source store URL and asks to bring it into Wix. Covers starting the import, polling progress, answering the agent's mid-import questions, handling deploy/failure/auth-expiry states, and sending post-deploy follow-up changes.
Sites Dashboard Navigation
"Builds direct links to the account-level sites pages on manage.wix.com — the My Sites list (all sites in the account) and each site's own dashboard. Pairs the site list with the Query Sites read API. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
Upload a Website or HTML Files
Publish HTML, CSS, JavaScript or a static build as a Wix Headless website; inspect its deployed files and edit them on the same site and URL. Covers file and ZIP uploads, selective additions, replacements and deletions while preserving other files, full-site replacement, authenticated and anonymous publishing, verification, and connecting a Wix business backend; a Wix Astro build is released as a server-rendered site rather than dropped. Use for files the user supplies or pages you create for them. Not for migrating a live site from another platform by URL or CSV (use Site Import), embedding code in an editor-built Wix site, or uploading assets to Media Manager.
Stores
Change Store Currency
Changes the store's payment currency through Site Properties and explains delayed currency updates in catalog responses.
Create Product (Catalog V1)
Create products using the Catalog V1 Products API. Use this recipe when the site's catalog version is CATALOG_V1. Covers simple product creation, product with options, and key V1 request structure differences from V3.
Create Product (Catalog V3)
Mandatory first recipe for every Wix Stores Catalog V3 create-product request. Before any mutation, require an explicit name and price for every product; an absent price is never 0. If no product is identified, offer both image-upload and text-description paths and stop. If name or price is missing, ask or offer a suggestion and stop. When both are present, create from the supplied details without requiring optional enrichment. Covers single/bulk creation, inventory, physical/digital products, images, options, variants, SKUs, and validation.
Find Products (Query and Search, Catalog V3)
Find, search, query, and list products from a Wix Store using Catalog V3 Search Products, Query Products, Get Product, and Query Inventory Items: by name, SKU, option choice, stock status, or price, with sorting and paging; reading one product's variants and details; and listing products with their variant count and stock.
Query Products (Catalog V1)
Query and list products from a Wix Store using the Catalog V1 Query Products endpoint. Use this recipe when the site's catalog version is CATALOG_V1. Covers basic queries, filtering, sorting, and paging.
Manage Store Categories (Catalog V3)
Organizes a Wix Store's products into categories with the Catalog V3 Categories API. Covers listing the category tree and finding a category by name; creating categories and subcategories; renaming a category or changing its description or URL slug; hiding or showing it; reordering it or moving it under another parent; deleting it; and adding products to a category, removing them, listing what a category holds, or moving all of a category's products to another category. Use when the user wants to see, set up, reorganize or clean up their store categories, or asks which products are in a category.
Update Product Stock and Pre-Order (Catalog V3)
Changes the stock and pre-order settings of existing Catalog V3 product variants through their inventory items. Covers finding a variant's inventory item by product name or SKU, setting a quantity, adding or removing units, marking a variant in or out of stock, starting or stopping quantity tracking, and enabling or disabling pre-orders with a message and a limit.
Update Product with Options (Catalog V3)
Start here for existing Catalog V3 product updates, including digital products that fail at add-to-cart with ITEM_NOT_FOUND_IN_CATALOG. Includes name lookup, Get Product, and PATCH in one flow, plus importing a supplied PDF and attaching it to the existing variant. Covers options, variant prices and SKUs, variant shipping weight in the site's weight unit, product visibility (hide/unhide through visible, never delete), description edits that preserve Rich Content, and revision-based updates. Read another recipe only for a field or operation this flow does not cover.
Stores Dashboard Navigation
"Builds direct links to Wix Stores and eCommerce dashboard pages on manage.wix.com — products list, edit a specific product, categories, inventory, orders list, a specific order, abandoned checkouts, gift cards, shipping and tax settings. Pairs each main Stores/eCommerce entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
<!-- automations-builder-sync:begin -->
Automations
Build and Manage Wix Automations
Create, update, activate or deactivate Wix Automations with app actions, trigger filters, conditions, delays, variables, branches and schedules, and check their current status, using the public Wix Automations APIs.
<details> <summary>Internal skills (loaded on demand by Build and Manage Wix Automations — do NOT use directly)</summary>
Automations API Catalog Discover site-specific triggers and actions, authenticate public Automation API calls, and choose the API for validation, persistence or catalog lookups.
Automations Graph and Data Model Assemble builder-editable automation graphs with valid node relationships, namespaces and ancestor data access.
Automations Trigger Configuration Select and configure automation triggers, trigger filters and event payload schemas using the site catalog.
Automations Action Configuration Configure app-defined automation actions from their input schemas and preserve supported existing action mappings.
Automations Mapping Expressions Write builder-compatible automation mapping expressions, literals and data references.
Automations Conditions Configure visual and code conditions while preserving boolean intent, comparison boundaries and builder editability.
Automations Delays Variables and Branches Configure delay, rate-limit, variable and parallel-branch steps, preserving supported existing step metadata.
Automations Schemas and Scheduling Configure dynamic schemas and scheduled automation triggers with correct timezone and calendar behavior.
Automations Validation and Persistence Validate automation configuration, check builder compatibility, persist changes and verify the saved result.
Automations Activation Status Inspect or change active status with lock checks, revision handling and read-back, without requiring unrelated repairs before deactivation.
</details>
<!-- automations-builder-sync:end -->
Files
- ATTRIBUTION.mdAdded by AutoGineer807 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md66.9 KiB
- references/accessibility/scan-site-accessibility.md5.6 KiB
- references/analytics/analytics-dashboard-navigation.md2.2 KiB
- references/analytics/query-site-analytics.md22.0 KiB
- references/app-installation/app-installation-dashboard-navigation.md1.4 KiB
- references/app-installation/install-wix-apps.md7.6 KiB
- references/app-installation/list-installed-apps.md4.7 KiB
- references/automations/actions.md14.8 KiB
- references/automations/activation-status.md5.6 KiB
- references/automations/api-catalog.md21.7 KiB
- references/automations/automation-model.md22.9 KiB
- references/automations/bracket-expressions.md18.4 KiB
- references/automations/build-and-manage-automations.md14.2 KiB
- references/automations/conditions.md21.6 KiB
- references/automations/schemas-and-scheduling.md18.0 KiB
- references/automations/special-actions.md18.0 KiB
- references/automations/triggers.md20.6 KiB
- references/automations/validation-and-verification.md25.8 KiB
- references/blog/blog-dashboard-navigation.md3.2 KiB
- references/blog/find-and-update-blog-posts.md14.5 KiB
- references/blog/how-to-create-blog-posts.md15.5 KiB
- references/bookings/booking-service-policy-setup.md7.5 KiB
- references/bookings/bookings-dashboard-navigation.md3.7 KiB
- references/bookings/bookings-staff-setup.md16.4 KiB
- references/bookings/create-and-update-booking-services.md27.5 KiB
- references/bookings/diagnose-availability-issues.md31.3 KiB
- references/bookings/end-to-end-booking-flow.md15.7 KiB
- references/bookings/external-calendar-integration.md12.9 KiB
- references/bookings/multi-resource-service-creation.md17.9 KiB
- references/calendar/configure-default-business-hours.md13.7 KiB
- references/cms/cms-dashboard-navigation.md2.4 KiB
- references/cms/cms-data-items-crud.md26.8 KiB
- references/cms/cms-ecommerce-catalog-integration.md3.3 KiB
- references/cms/cms-publishing-flow.md20.5 KiB
- references/cms/cms-schema-management.md7.9 KiB
- references/collaborators/manage-site-collaborators.md10.8 KiB
- references/contacts/bulk-delete-contacts.md3.1 KiB
- references/contacts/bulk-label-and-unlabel-contacts.md5.2 KiB
- references/contacts/contacts-dashboard-navigation.md2.4 KiB
- references/contacts/create-a-contact.md3.3 KiB
- references/contacts/find-and-manage-site-members.md12.2 KiB
- references/contacts/find-contacts.md13.5 KiB
- references/contacts/update-a-contact.md4.7 KiB
- references/custom-apps/use-app-tools.md5.5 KiB
- references/dashboard-navigation/dashboard-navigation.md7.5 KiB
- references/dashboard-navigation/routes.json47.0 KiB
- references/domains/analyse-domain.md13.8 KiB
- references/domains/assign-domain.md25.6 KiB
- references/domains/check-domain-availability.md6.0 KiB
- references/domains/domain-search-purchase-and-connect.md113.9 KiB
- references/domains/domains-dashboard-navigation.md1.8 KiB
- references/donations/create-and-update-donation-campaigns.md8.7 KiB
- references/ecommerce/api-recommendation-tracking.md12.7 KiB
- references/ecommerce/ecom-load-context.md9.2 KiB
- references/ecommerce/ecom-pricing.md10.5 KiB
- references/ecommerce/ecom-shipping.md6.1 KiB
- references/ecommerce/find-and-report-on-orders.md9.9 KiB
- references/ecommerce/gift-cards/ecom-gift-cards-goal-sell-gift-cards.md24.5 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-create-coupon.md12.0 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-create-discount-rule.md19.4 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-flow-bundle-and-save.md9.1 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-flow-seasonal-promotion.md12.2 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-flow-stock-mover.md11.1 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-flow-upsell-boost.md7.9 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-goal-clear-inventory.md6.2 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-goal-drive-cross-sells.md7.1 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-goal-increase-aov.md7.2 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-goal-seasonal-revenue.md7.4 KiB
- references/ecommerce/pricing-promotions/ecom-pricing-troubleshoot-not-applying.md4.0 KiB
- references/ecommerce/recommend-ecommerce-strategy.md27.6 KiB
- references/ecommerce/shipping/ecom-shipping-api.md11.2 KiB
- references/ecommerce/shipping/ecom-shipping-fix-coverage.md10.0 KiB
- references/ecommerce/shipping/ecom-shipping-free-shipping.md10.0 KiB
- references/ecommerce/shipping/ecom-shipping-optimize-rates.md11.3 KiB
- references/ecommerce/shipping/ecom-shipping-setup-pickup.md7.1 KiB
- references/ecommerce/shipping/ecom-shipping-setup-rates.md3.1 KiB
- references/ecommerce/shipping/ecom-shipping-setup-regions.md2.0 KiB
- references/events/create-wix-event.md17.8 KiB
- references/events/event-registration-form.md10.8 KiB
- references/events/event-schedule-policies-and-categories.md11.5 KiB
- references/events/events-dashboard-navigation.md5.5 KiB
- references/events/manage-event-guests.md27.0 KiB
- references/events/manage-event-tickets.md17.2 KiB
- references/events/manage-wix-events.md33.2 KiB
- references/forms/create-form.md34.1 KiB
- references/forms/forms-dashboard-navigation.md4.5 KiB
- references/forms/read-forms-and-submissions.md16.2 KiB
- references/forms/update-form.md16.5 KiB
- references/get-paid/create-payment-links.md5.5 KiB
- references/get-paid/get-paid-dashboard-navigation.md3.2 KiB
- references/get-paid/how-to-setup-wix-payments.md3.4 KiB
- references/get-paid/payment-links-for-bookings.md2.6 KiB
- references/google-ads/billing-and-payment.md4.5 KiB
- references/google-ads/create-performance-max-campaign.md13.7 KiB
- references/google-ads/get-campaign-suggestions.md8.7 KiB
- references/google-ads/google-ads-dashboard-navigation.md3.0 KiB
- references/google-ads/install-and-create-account.md8.4 KiB
- references/google-ads/manage-campaign-lifecycle.md5.2 KiB
- references/google-ads/manage-campaign-success-guide.md25.0 KiB
- references/google-ads/query-campaign-analytics.md9.9 KiB
- references/google-business-profile/connect-google-business-profile.md7.4 KiB
- references/google-business-profile/manage-google-business-profile-locations.md9.5 KiB
- references/marketing/create-and-publish-social-post.md40.8 KiB
- references/marketing/generate-and-publish-marketing-plan.md18.2 KiB
- references/marketing/marketing-dashboard-navigation.md3.7 KiB
- references/marketing/review-and-send-email-campaigns.md15.5 KiB
- references/media/generate-image-with-ai.md3.7 KiB
- references/media/upload-media-to-wix.md6.2 KiB
- references/online-programs/manage-program-categories.md8.6 KiB
- references/pricing-plans/create-and-update-pricing-plans.md15.3 KiB
- references/pricing-plans/find-and-manage-pricing-plan-orders.md15.5 KiB
- references/pricing-plans/pricing-plans-bookings-integration.md8.0 KiB
- references/pricing-plans/pricing-plans-dashboard-navigation.md2.5 KiB
- references/restaurants/restaurants-dashboard-navigation.md4.8 KiB
- references/restaurants/wix-restaurants-setup.md10.3 KiB
- references/rich-content/author-ricos-rich-content.md26.4 KiB
- references/rich-content/ricos-converter-service.md9.0 KiB
- references/seo/manage-google-search-console.md13.5 KiB
- references/seo/manage-seo-suggestions.md21.1 KiB
- references/seo/manage-seo-tags.md29.7 KiB
- references/seo/manage-url-redirects.md12.4 KiB
- references/site-properties/change-payment-currency-site-properties.md7.0 KiB
- references/site-properties/site-properties-dashboard-navigation.md1.5 KiB
- references/site-properties/update-business-info.md11.9 KiB
- references/sites/create-headless-site.md1.6 KiB
- references/sites/create-site-from-template.md4.5 KiB
- references/sites/manage-oauth-apps.md5.4 KiB
- references/sites/query-sites.md4.1 KiB
- references/sites/read-site-context.md4.7 KiB
- references/sites/send-feedback-to-wix.md3.9 KiB
- references/sites/site-import.md19.9 KiB
- references/sites/sites-dashboard-navigation.md1.4 KiB
- references/sites/upload-static-site.md36.4 KiB
- references/stores/bulk-create-products-with-options.md41.8 KiB
- references/stores/change-store-currency.md1021 B
- references/stores/create-product-catalog-v1.md4.5 KiB
- references/stores/create-product-catalog-v3.md22.4 KiB
- references/stores/find-products-query-and-search-catalog-v3.md20.7 KiB
- references/stores/manage-store-categories-catalog-v3.md20.6 KiB
- references/stores/query-products-catalog-v1.md2.3 KiB
- references/stores/stores-dashboard-navigation.md4.1 KiB
- references/stores/update-product-stock-and-pre-order.md15.5 KiB
- references/stores/update-product-with-options.md42.5 KiB
references/domains/domain-search-purchase-and-connect.md
name: "Domain Search, Purchase and Connect" description: "Buy a domain through Wix — intent, suggestions, site resolution, registration, privacy, cart and checkout — or bring a domain registered elsewhere into the Wix account with the dashboard connect link, once Assign Domain finds it is not there yet. A request to connect a domain the user owns to their site starts at Assign Domain. Availability checks are not done here: they all use Check Domain Availability."
Domain Search, Purchase and Connect
One document, four parts. Section numbers carry their part's letter, so every reference names the part it points into — §A4b, §P3, §C1, §R4.3.
| Part | Sections | Covers |
|---|---|---|
| Part A — Entry and Routing | §A1 – §A8 | Intent, the availability step of a buy or connect, suggestions, and the routing decision. Start here. |
| Part P — Purchase Path | §P1 – §P10 | Buying a domain from Wix |
| Part C — Connect Path | §C0 – §C7 | Connecting a domain the user already owns. Putting a domain the account holds on a site is Assign Domain |
| Part R — Reference | §R1 – §R10 | Endpoints, product IDs, URL templates, site resolution, ownership lookup, error handling, currency |
Before any API call, read Part R. It holds every endpoint, product ID, URL template, site-resolution rule and error rule used by all three of the other parts. Do not guess a URL or a field name — look it up there.
Part A — Entry and Routing
Part A takes the conversation from the user's first message to the point where two things are known: which domain, and buy or connect. Then it goes to one of two places:
| Then go to | For |
|---|---|
| §P1 | The user is buying a domain from Wix |
| §C1 | The user already owns the domain and wants it on their Wix site |
Covers US-01 – US-12. §A4b routes US-40 / US-41, and decides whether the connect path hands the domain to Assign Domain (US-42 – US-46) or only hands over a link. §A3.1 handles subdomains (US-48 – US-50), which skip the availability check entirely.
A1. When To Use This Skill
The user wants to:
Buy / purchase / register / get a domain
Look for a domain name to buy
Brainstorm a domain name from a business idea
Connect / assign / add a domain to their Wix site
Connect / assign / add a sub domain to their Wix site
Get a custom domain for their Wix site
Typical openers: "buy me a domain", "I want to purchase a domain", "get me mybusiness.com", "I need to connect coolbrand.com to my site", "I need to connect a domain mybakery.net to my Wix site", "I have coolbrand.com and want to connect it", "I need a domain for my pancakes restaurant"."
⛔ Availability checks are never done by this recipe. Every check of whether a domain is available, taken, free or registered goes through Check Domain Availability — whether the user only asks ("is mybakery.com available?", "can I get mybakery.com?" with no wish to buy yet, a list of domains to check) or the check is a step inside a purchase or a connect. Read that skill, run the check as it describes, then come back with the result: §A4 only decides what happens next. When the user only asked about availability, the answer is given there and ends there; come back here only when the user then wants to buy or connect. Never call the availability endpoints from this recipe.
If the user mentions anything else domain-related, this is the right flow. Asking a clarifying question is expected behaviour, not a dead end — stay here and ask. Only leave for requests that are completely unrelated to domains ("change my site colors", "how do I add a blog"), and for a bare availability question (above).
A question about the state of a domain already in the user's account — when it expires, whether it renews, which site it is on, or which of their domains match a condition — belongs to Analyse Domain. Answer it there; come back here only when the user then wants to buy or connect. A request to change which site a domain already in the account is on, or its role there — "make X the primary domain", "remove X from my site", "move X to my other site" — belongs to Assign Domain. The lookup in §R4.3 stays here: it serves the connect flow and checks whether the domain is assigned to a site or unassigned. Analyse Domain answers a different question, the domain's state (registered or connected, expiry, renewal), from the same domain lists plus the account's Premium purchases. Don't swap one for the other.
UX rule for everything below: keep it natural, never expose internal mechanics, and reveal information only when it changes what the user has to do next. See §R9.
A1.1 ⛔ Out of Scope — Hard Boundary
This skill sells Wix domains and connects domains to Wix sites. That is the whole job. It has
exactly three information sources: check-domain-availability (read Check Domain Availability), suggest-domains, and the
authenticated Wix endpoints in §R4.2. Nothing else.
Never do any of these, even if you have the tools and the user would find it useful:
| ❌ Never | Why |
|---|---|
| WHOIS / RDAP lookups, or any registrant research | Not a source this skill uses. It also surfaces named individuals and addresses into a shopping conversation. |
| Name the owner of a domain, their company, city, or registrar | Same. A taken domain is taken — who holds it is not the user's next step, and it is not yours to publish. |
| Advise buying a domain from its current owner — outreach, brokers, escrow, Sedo/Efty, acquisition emails | Wix does not broker aftermarket sales. This is a different product, and a taken domain is a dead end here, not a negotiation. |
| Estimate what a domain is "worth", or quote four-to-five-figure ranges | Pure invention. The only prices in this skill come from the offering call. |
| Give trademark, legal, or brand-conflict advice | Not this skill's job and not reliable from a domain lookup. |
Hand-write a list of alternative TLDs (.io, .dev, .app, …) | Suggestions come only from suggest-domains. A list you composed yourself is invented data, whatever it happens to score on availability. |
| Read Help Center articles, or hand over generic dashboard steps for connecting a domain | The connect path ends in Assign Domain's offer or §C3's link, both built for this user's site and domain. Generic steps skip the ownership check and the plan check. |
| Search the web, browse the domain, or inspect the site running on it | None of it changes what the user does next: buy an available domain, or connect one they own. |
If the user explicitly asks for one of these — "who owns it?", "can you help me buy it from them?" — decline in one sentence and return to the branch you were in:
I can't help with buying a domain from its current owner — I can only register domains that are available. Want to look at some alternatives?
A taken domain has exactly one shape of answer in this skill: whichever §A4b branch applies. Nothing may be added to it.
The one lookup that is allowed on a taken domain is the ownership check in §A4b — and it asks a single question: is this domain in the user's own Wix account? That is not registrant research. It searches what the user already has, it returns nothing about anyone else, and everything in the response beyond the match and the site name is off limits (§R4.3).
A2. Intent Classification (US-01, US-02)
Two things to establish: the domain and the intent. Take the first row that matches, reading top-down.
| Signal | Intent | Next |
|---|---|---|
| A domain the user has (named, or "my domain", "a domain I own") and a site to put it on, or a change of its role or site: "connect / assign / bind / point / put X on my site", "make X the primary domain", "make X redirect to my site", "remove / disconnect X from my site", "move X to my other site" | CONNECT → a site | Go to Assign Domain and follow it. No availability check first — it reads the account itself, and hands a domain the account doesn't hold back to §A4. No domain named ("I want to connect a domain I already own to my site") is this row too: Assign Domain asks which domain. Send no steps, links or Help Center content first. |
| "buy", "purchase", "get", "register", "new domain" | PURCHASE | §A3 |
| Wanting a domain — indefinite article, no domain named: "I want a domain for my site", "I need a domain for my pancakes restaurant" | PURCHASE | §A3 |
| "connect it to Wix", "add it to Wix", "bring it into Wix", "transfer it over", or "I have" / "I own" with no site in the request | CONNECT → Wix | §A3 |
| A specific domain, no buy/connect word, and no question about whether it is available | UNKNOWN | §A3 — the availability check (run with Check Domain Availability) and §A4 settle it |
| A specific domain, and the only question is whether it is available, taken or free | Not this recipe | Check Domain Availability |
| Neither, and no domain | UNKNOWN | Ask: "Would you like to purchase a new domain or connect one you already own?" |
The two senses of "connect" (US-51)
Both are CONNECT, and they name different targets. Read which one the user said — it is the difference between two different operations:
| The user says | They mean | The operation |
|---|---|---|
| to a site — and assign and bind are the same request in other words | Which site should the domain serve? | The assignment — Assign Domain, which checks the account first |
| to Wix, add to Wix | The domain lives at an outside registrar and is not in the account at all | The connect link — bringing it in, §C3 |
Nothing can be assigned to a site until the domain is in the account, so the second is the precondition of the first, not an alternative to it.
The account decides which one is actually possible, and it overrides the phrasing. To a site goes to Assign Domain, whose read settles it; to Wix goes through §A4b's lookup:
Not in the account — to a site cannot run, however plainly it was asked for. Assign Domain hands the domain back to §A4 with intent CONNECT → a site and ownership already looked up, and the connect link (§A4b-C) is the answer to both phrasings.
In the account, unassigned (§A4b-B) — to Wix is already true. Read it as to a site; the connect path hands it to Assign Domain.
In the account, on a site (§A4b-A) — both phrasings are already satisfied; §A4b-A answers, or hands a change of role or site to Assign Domain.
⛔ Never correct the user's wording. They are describing an outcome, not calling an API. Act on what the account says is possible and say what you did — do not explain that they used the wrong verb.
The article does most of the work: a domain is one the user does not have yet (purchase); my domain, or a named domain plus "I have" / "I own", is one they already hold (connect). Do not fall through to the clarifying question just because the words "buy" or "purchase" are absent — "I want a domain for my site" is a purchase.
An answer of "connect" / "I have one" with no domain named → ask "What domain would you like to connect?", then take the answer through §A3's named-domain row (normalize, subdomain → §A3.1, else §A4) — or to Assign Domain when the user wants it on a site.
Do not ask "do you already own this domain?" — not before the availability check, and not after it either. Asking first produces the awkward case where the user claims to own a domain that is not even registered; asking afterwards is redundant, because §A4b looks the domain up in their account and answers it without a turn of conversation.
A3. Do We Have a Domain? (US-03, US-04)
Take the first row that matches, reading top-down. A domain the user named wins over everything else in this table — including a site they named in the same breath.
| Situation | Action |
|---|---|
| CONNECT intent, no domain named — "I own a domain", "I have a domain", "connect my domain" | The whole reply is: "What domain would you like to connect?" — even when you would otherwise go ahead on assumptions. No site resolution, no suggestions, no link. Then take the answer through the named-domain row below (normalize, subdomain → §A3.1, else §A4), or Assign Domain when the user wants it on a site |
| User named a specific domain — even if they named a site too | Normalize it (§R1). A subdomain → §A3.1. Anything else → §A4, first, before any site work |
| User gave brand/business context but no domain — "My business is called Green Sprout Bakery", "I need a domain for my pancakes restaurant" | Do not ask. Build a query from that context → §A5 |
| No domain, but they pointed at a site — "I want a domain for my wix site", "I need a domain for my site" | Do not ask for a domain yet. The site is the context → §A3.2 |
| Nothing at all — "I want to buy a domain", "help me get a domain" | Ask, verbatim: "What domain do you have in mind?" Then take the answer as either a specific domain (→ §A4) or a description (→ §A5). |
The user answering with a description rather than a domain ("Something with 'cozycuts' in it") is normal — treat it as a query and go to §A5.
⚠️ A named domain is checked before anything else happens, and the answer is the first thing the user hears. No site resolution, no fetching list of sites, no plan check and no list of sites comes in front of it. "I want to buy mybakery.com for my Wix site" names a site, and the site waits its turn: §A4 runs, the user is told "mybakery.com is available!" or "mybakery.com is already registered.", and only then does §P1 resolve the site. Asking which of ninety-three sites to use before saying whether the domain can even be bought answers a question the user has not reached yet.
A3.1 The Domain Is a Subdomain (US-48, US-49, US-50)
§R1.1 identified the host as a subdomain — shop.maximz.fr under maximz.fr.
Do not call the availability endpoint. A subdomain is not separately registrable, so there is no availability answer to be had and §A4 has nothing to do here. Ownership is the only open question, and it is usually already settled by the account.
A3.1a — the two lookups (silent)
Run the §R4.3 pair keyed on the subdomain. Only if neither array holds an exact match, run the same pair again keyed on the root domain.
| Exact match at | State | Next |
|---|---|---|
Subdomain in sites[].primary or sites[].redirects[] | Already connected | §A4b-A, unchanged |
Subdomain in domains[] (unassigned) | Confirmed | Go to Assign Domain and follow it — ownership confirmed |
| Root domain in either array | Confirmed via root | §A3.1b |
| Neither | Root is not in the account | §A3.1c |
| User is logged out, or both calls fail after the silent retry | Unknown | §A4b-C, unchanged |
A root match confirms the subdomain. The account that holds maximz.fr is the account that decides
what sits beneath it — there is nothing left to ask, and nothing to hedge about.
A3.1b — the root is in the account (US-48)
Ownership is confirmed, so the "If it's yours" hedge does not appear. Say why it is confirmed, because the user asked about the subdomain and the account matched something else:
Go to §C1 and follow it — ownership confirmed via root. The opening in §C3 names the root; the link is the whole answer, and no assignment is offered.
q= on that link carries the subdomain. The root is what proved ownership; the subdomain is what
gets connected. The two are never swapped.
Carry the root's site if the account named one, as a candidate and not a decision. A root match
under assigned names the site the root is on — which site should serve the subdomain is a
separate question and this lookup did not answer it. §C1, Case R asks it. Do not resolve it here,
and never let it reach a link unconfirmed.
A3.1c — the root is not in the account (US-49)
Say, verbatim:
{subdomain displayName} sits under {root displayName}, and I don't see {root displayName} in your Wix account. Would you like to connect {root displayName} first?
Yes → treat the root domain as the domain in hand and go to §A4, from the availability check onward. The subdomain comes after, once the root is in the account.
No, or any question about why → §A3.1d.
A3.1d — they ask why, or decline (US-50)
Both reactions get the same answer, once:
Authorization for a subdomain follows its root domain, so having {root displayName} in your account is what lets you control which subdomains are allowed to point at your sites. Connecting it is a formality — you don't have to change any DNS, and nothing about how {root displayName} works today has to change.
Then leave the offer open and say nothing more about it.
They change their mind → §A3.1c's yes branch.
They still decline → go to §C1 and follow it — ownership asserted. Link only, no assignment. Ownership was never established here, so this is the one subdomain branch where the "If it's yours" hedge is correct and stays.
⛔ State the recommendation once. A user who has declined twice has decided. The subdomain link is a working answer without the root, and repeating the case for it turns a recommendation into a pitch — §R9.
A3.2 The User Pointed at a Site but Named No Domain
This section is only for a message that named no domain, with PURCHASE intent. A user who has a domain to connect gets §A3's first row instead: ask which domain, resolve no site. If a domain was named as well — "buy mybakery.com for my wix site" — §A3's named-domain row owns it: §A4 runs first, and the site is resolved afterwards by §P1. Resolving a site here would put a list in front of the availability answer.
"I want a domain for my wix site" names no domain, and it is not nothing. Two things arrive with it, and the old reading of this row threw both away:
The site question is already answered. They want the domain on a site, so §R3's Case D question — "Would you like to connect this domain to one of your Wix sites?" — must not be asked. Asking it back is asking them to repeat themselves.
The site's name is brand context. §A5 takes free text, and a site called Green Sprout Bakery is exactly the query it wants. Never make the user type a business name the account already knows.
So resolve the site now, before the domain, and let it do both jobs:
| Site resolution (§R3) | Then |
|---|---|
Case A — a siteId is in context | Take the site's name as the §A5 query. Suggestions and the site named, one message. |
| Case B — exactly one site | Same. Name the site so a wrong guess is visible. |
| Case B — several sites | Ask which one, with §R3 Case B's copy. That question has to be asked anyway, and its answer is also the query — §A5 runs on the reply. |
| Case C — not logged in | No account, so no site name to read. Do not front-load the login prompt — fall through to the "What domain do you have in mind?" row above. The site intent is remembered, so §R3's Case C prompt lands at its normal time, once a domain is in hand. |
| Case B — no sites at all | Nothing to name and nothing to connect to. Fall through to the bare "What domain do you have in mind?" row above, and treat the purchase as standalone. |
Copy when a single site is resolved — §A5's list with its own opening:
Here are a few available options for {site name}:
greensproutbakery.com
greensproutco.com
sproutbakery.com
Want one of these, or do you have something else in mind? I can also show more options if none feel right.
⚠️ A site name is not always a business name. Auto-generated names (Evl 99faa20b7b2b,
My Site 3, a bare hex string) and placeholders carry no brand signal, and querying §A5 on one
returns noise. When the name has no real words in it, treat it as no context: keep the resolved
siteId, then ask "What domain do you have in mind?" — the site still gets used for the plan check
and the auto-connect line, just not for suggestions.
⚠️ This is the one place the purchase path resolves a site before the domain, and only because the
user put the site in the request. §P1.1's rule — do not fetch list of sites unless the user asked
about a site — is satisfied here, not bypassed. Carry the resolved siteId into §P1; the site is
already settled, so the plan check is the next step and the question is never re-asked.
A4. What the Availability Result Means (US-07, US-08, US-09)
Check the normalized domain silently — no "let me check", no "one moment". This recipe does not run the check: read Check Domain Availability and run it as that skill describes (endpoints, request, response, errors), here as everywhere. This section only decides what happens next. Inside this flow §A4a, §A4b and §A6 decide the reply; the "Reading the result" table in that skill does not apply. Result mapping: §R4.1.
A4a — available: true (US-08)
Say, verbatim:
{displayName} is available!
Then:
Intent is PURCHASE or UNKNOWN → Now go to §P1 and follow it. If a
siteIdis already in context, do not send "…is available!" on its own — continue straight into the site + plan outcome (§P1) in the same message.Intent is CONNECT → the user cannot connect a domain nobody has registered. Say: "{displayName} isn't registered yet — did you mean you'd like to purchase it?"
Yes → go to §P1 and follow it.
No → "Do you own a different domain you'd like to connect?" → back to §A4 with the new domain.
When no siteId is in context but the user did ask for a site, the availability answer and §P1's
site question belong in the same message — the answer first, the question behind it:
mybakery.com is available! You have 93 Wix sites. Which one should it go on?
{site name}
… (§R3 Case B's forms decide how many)
One turn instead of two, and the ordering is still answer-then-question.
⚠️ Suppressing the standalone line is a merge, never a deletion. The user is told in plain language that the domain can be bought — exactly once, in the first message that follows the check. Both continuations carry it, and the merged forms live in §P1.3a and §P2.3, Premium and Free respectively. If you are about to send a message that offers a plan, a price or a bundle and the user has not yet heard "{displayName} is available!", the line was dropped rather than merged. Say it.
A4b — available: false (US-09)
The domain is registered. Registered by whom is the next question, and it decides everything that follows — so answer it before you say a word.
Step 1 — whose domain is it? (silent)
Call both ownership endpoints together, per §R4.3:
GET .../my-domains/v1/domains/assigned?filter.searchTerm={domain}
GET .../my-domains/v1/domains/unassigned?filter.searchTerm={domain}Compare the returned domain strings to {domain} exactly — searchTerm is a substring search
and a partial hit is not ownership.
User is not logged in, or both calls fail after the silent retry → skip to §A4b-C. Ownership is unknown, which is what §A4b-C's copy already assumes.
Handed back by Assign Domain — it found the domain is not in the account, or could not tell (signed out, or its read failed). Skip both calls and go to §C1 with ownership asserted — §A4b-C's CONNECT rule: no suggestions.
This runs before the suggestions call and before any message. Alternatives are only fetched in §A4b-C. Fetching them first — as an earlier version of this skill did — means offering a user replacements for a domain they already own.
| Exact match at | Branch |
|---|---|
sites[].primary.domainName, or sites[].redirects[].domainName | §A4b-A — theirs, already on a site |
domains[].domainName (unassigned) | §A4b-B — theirs, not on a site yet |
| Nowhere | §A4b-C — not in their Wix account |
A4b-A — it is theirs, and already connected (US-40)
Read siteName from the same sites[] entry that matched. One message, then stop:
{displayName} is already connected to {siteName}.
No suggestions. No connect link — there is nothing to connect. No "if it's yours" — the account just said it is. Terminal state.
If the match came from redirects[] rather than primary, the domain is in use as a forward:
{displayName} is yours — it's currently forwarding to {siteName}.
If the user wanted it in the other role on that same site (US-45), or on a different site than the one it is on — a move (US-46) — this is not terminal after all. Ownership is confirmed, so go to Assign Domain and follow it, carrying the domain, the requested site and role, and ownership confirmed. Do not compose the answer here, and do not ask "Want to move it to {requested site}?" on its own — Assign Domain's offer names the site the domain comes off, which may be losing its primary domain.
A4b-B — it is theirs, and not connected to anything (US-41)
Ownership is settled, so there is no question to ask and nothing to hedge. Go to Assign Domain and follow it, carrying the domain, the requested site and role if the user named them, and ownership confirmed. It resolves the site, checks the plan, makes the offer and does the work, or answers a Free site with the upgrade. Do not compose any of that wording here, and do not promise in Part A that the domain will be connected.
Carrying ownership as confirmed is what lets Assign Domain offer to do the work rather than only pointing at the dashboard; carrying it as asserted silently downgrades the user's outcome to a link.
No suggestions, no "do you own this?", no "if it's yours".
A4b-C — not in their Wix account (US-09)
It cannot be purchased here — Wix registers available domains, it does not resell taken ones. This branch is short and closed.
⚠️ This branch is not "someone else owns it". A domain held at an outside registrar and never connected to a Wix site is invisible to the lookup, so the user may well own it. Never say or imply otherwise — see §R4.3.
CONNECT intent first — including every domain handed back by Assign Domain.
Skip everything below: no suggest-domains call, no alternatives. A domain they cannot register is
no use to them. Go straight to §C1 with ownership asserted. If the user is logged out, §C1
Case C asks them to log in; once they do, the ownership check in Step 1 can run and may upgrade the
answer to §A4b-A or §A4b-B.
Any other intent: do exactly two things: call suggest-domains with the SLD only for 3
alternatives (§A5), then send one message containing only this:
{displayName} is already registered. If it's yours — you can connect it to a Wix site. Here are available alternatives that fit your brand:
theetzlenu.com
etzlenu.net
etzlenuco.com
That is the entire response. No registrar, no "someone renewed it six months ago", no valuation, no broker or outreach option, no TLDs you thought of yourself. If your answer to a taken domain is longer than the block above, you have left this skill — see §A1.1.
The "If it's yours" hedge is correct here and only here — either the ownership check found nothing, or it could not run. Ownership is a guess in this branch, and the copy says so honestly.
No connection is performed on this path. §A4b-B can offer to do the work because an account lookup proved the domain is the user's; here nothing proved it. Assign Domain refuses to write an unverified domain onto a live site, so the connect link is the whole of what this branch can offer — no primary-or-redirect question, no assignment, however plainly the user says it is theirs. If they are right and the domain is theirs at an outside registrar, the dashboard is where that gets sorted out.
This holds even when the user asked to connect it "to my site" — or to assign or bind it there (§A2). That request names an assignment, and an assignment cannot run on a domain the account does not hold; bringing it into Wix comes first and the link is what does that. Give the link, and do not promise the site assignment as though it were about to happen. Do not lecture them about the order either: the link goes to the page where both steps are completed, so "you can connect it to a Wix site" is a true and sufficient answer.
The one thing that can change this: the user was logged out, logs in, and the ownership check runs for the first time (§C1, Case C). A match found then is a real §A4b-A or §A4b-B, and the offer comes with it.
The three alternatives are whatever suggest-domains returned, in the order it returned them. For
etzlenu.com that is theetzlenu.com, etzlenu.net, etzlenuco.com — not a .io/.dev/.app
list you assembled. Those may well be available; they are still fabricated output, because no call
produced them.
Then branch on the reply:
Picks an alternative → that is the chosen domain, skip re-checking availability (US-06) → go to §P1 and follow it.
Says it is theirs / wants to connect → go to §C1 and follow it, carrying the domain, the fact that it is already known to be taken, and ownership asserted by the user (not confirmed — the account search did not find it).
Wants something else → back to §A3.
A4c — DOMAINS_UNSUPPORTED_TLD
→ §A6.
A4d — Any other failure
→ §R8. Retry once silently; the user should never learn a first attempt happened.
A5. Suggestions (US-04, US-05, US-06)
First page — exactly 3
GET https://www.wixapis.com/domain-search/v2/suggest-domains?query={query}&paging.limit=3Always paging.limit=3. Three options is the contract — never dump ten.
Query construction:
| Coming from | Query |
|---|---|
| A taken domain | The SLD only — mybusiness.com → mybusiness |
| An unsupported TLD | The SLD only — myshop.ws → myshop |
| A business idea or brand context | The description — pancakes restaurant, Green Sprout Bakery |
Keep the query short — roughly 12–15 characters works best. Drop filler words
(thebestflowershopintown → bestflowers), collapse repetition (gevageva… → geva), abbreviate
(professional → pro).
Present them as a plain bulleted list of suggestions[].domain, then invite both a pick and more:
Here are a few available options that fit your brand:
cozycuts.com
cozycuts.co
cozycuts.net
Want one of these, or do you have something else in mind? I can also show more options if none feel right.
When the suggestions come from business context rather than a typed domain, open with "Here are a few available options based on your business name:" instead.
Rules:
Every suggestion returned is already available. Never re-check one. (US-06)
Never show a "premium" column or flag premium suggestions.
If the user stated a TLD preference, call out the fitting ones (
.comgeneral,.shop/.storee-commerce,.mepersonal branding).No suggestions returned → ask the user for different or broader keywords.
"Show more" (US-05)
Offer more only when pagingMetadata.hasNext is true. To actually fetch them, repeat the same
query and paging.limit=3 and add paging.cursor={pagingMetadata.cursors.next} from the previous
response. hasNext alone does not page — without the cursor you get page 1 again.
Here are more available options:
greensproutbakeryshop.com
gsbakery.com
greensproutco.com
Repeat with each new cursor for as long as the user keeps asking.
After a pick
The picked domain is the chosen domain. Do not check its availability.
Intent PURCHASE or UNKNOWN → Now go to §P1 and follow it.
Intent CONNECT → the user is picking a domain to buy, not to connect. Treat as PURCHASE.
A6. Unsupported TLD — Split by Intent (US-10, US-11, US-12)
Detected as an HTTP 400 body with details.applicationError.code === "DOMAINS_UNSUPPORTED_TLD" —
there is no availability object on this response. See §R4.1.
The message opens the same way for both intents:
We don't currently support .{TLD} domains.
What follows depends on intent — these two branches are different and must not be merged.
A6a — PURCHASE intent (US-11)
Fetch 3 alternatives with the SLD only as the query (§A5) and show them in the same message:
We don't currently support .ws domains. Here are some available alternatives:
myshop.com
myshop.net
myshop.co
User picks one → skip the availability check → Now go to §P1 and follow it.
A6b — CONNECT intent (US-12)
Do not show alternatives — a domain they do not own is no use for connecting. Ask for another domain instead:
We don't currently support .ws domains. Do you have a different domain you'd like to connect?
User gives another domain → normalize → back to §A4.
User has none → offer to buy one instead: "Would you like to look for a domain to purchase instead?" If yes → §A5, then §P1.
A6c — UNKNOWN intent
Treat as PURCHASE (§A6a), and let the alternatives list do the disambiguating.
A7. Routing Summary
Every branch of Part A ends in exactly one of these. Name the destination to yourself, then follow that section — do not improvise the next step from memory.
| State reached | Next |
|---|---|
| Domain available, buying | Go to §P1 and follow it. |
| Suggestion picked | Go to §P1 and follow it. |
| Unsupported TLD, alternative picked | Go to §P1 and follow it. |
| Domain is the user's and already on a site (§A4b-A) | Nowhere — terminal. One message, then stop. Unless the role or the site is wrong: Assign Domain. |
| Domain is the user's and unconnected (§A4b-B) | Go to Assign Domain and follow it — ownership confirmed. |
| A domain to put on a site, or a change of its role or site (§A2, CONNECT → a site) | Go to Assign Domain and follow it. |
| Handed back by Assign Domain — not in the account, or it could not tell | §A4 with intent CONNECT → a site: available → §A4a; taken → §C1 with ownership asserted, no lookup, no suggestions. |
| Domain taken and the user says it is theirs (§A4b-C) | Go to §C1 and follow it — ownership asserted. Link only, no assignment. |
| Subdomain, root domain in the account (§A3.1b) | Go to §C1 and follow it — ownership confirmed via root. Link only, no assignment. |
| Subdomain, root not in the account, user accepts the root offer (§A3.1c) | §A4 with the root domain as the domain in hand. |
| Subdomain, root not in the account, user declines twice (§A3.1d) | Go to §C1 and follow it — ownership asserted. Link only, no assignment. |
| Connect intent, domain not registered, user wants to buy | Go to §P1 and follow it. |
| Persistent failure | §R8 — escalation ladder, then the fallback link |
Both paths restate their own entry preconditions — what has to be true on arrival.
A8. Fallback (US-38, US-39)
A call that fails twice is handled the same way everywhere in this skill — silent retry, then the escalation ladder, then the fallback link. §R8 is the rule, including the verbatim copy at each stage. Never expose an error code, endpoint or tool name in any of it.
Part P — Purchase Path
Entry preconditions — you arrive here from Part A with:
A single chosen domain, already normalized, and
Confirmation it is buyable — either
available: truefrom the availability check, or it came from the suggest endpoint (suggestions are always available, never re-check one).
If either is missing, go back to §A3–§A6 and settle it first.
Terminal states — this path ends in exactly one of:
| Terminal state | Reached when |
|---|---|
| Checkout link | The user completed registration details and the cart is built (§P9) |
| Bundle link | A Free-tier user chose plan + domain together (§P2) |
| Error fallback | Two failed attempts — §R8 |
Read Part R before any call. Endpoints, product IDs and URL templates all live there.
Covers US-18 – US-32.
P1. Site and Plan Outcome (US-18, US-19)
P1.1 Resolve the site
Domain purchase does not require a Wix site. Apply the site-resolution rules in §R3 — Case A (siteId in context), Case B (logged in → fetch list of sites), Case C (not logged in → inline login prompt), Case D (logged in, ask once).
Do not fetch list of sites unless the user asked about a site or answered yes to the question.
No site resolved → skip §P1.2 and §P2 entirely. No premium check, no voucher check, no upgrade pitch. Go to §P3 as a standalone purchase.
Site resolved → keep
siteIdand the site's display name; go to §P1.2.
P1.2 Check the site's plan
GET https://manage.wix.com/_api/premium-store/plans/premiumStatus?metaSiteId={siteId}Read payload.premiumState. allowedDomain = premiumState !== "FREE".
Do this silently. Record whether the site was Premium or Free here — §P7 compares against it.
P1.3a Premium site (US-18)
Say, verbatim:
Great — after purchasing, {displayName} will auto-connect to {site name}.
When the site was already known from context — which is exactly when §A4a suppressed the standalone "is available!" line — merge the two into one message:
{displayName} is available! After purchasing, it will auto-connect to {site name}.
Go to §P3.
P1.3b Free-tier site → §P2.
P2. Free-Tier Offer (US-19, US-20, US-21, US-22, US-23)
The site exists but has no Premium plan. The user gets a real choice: upgrade and take the domain as part of the plan, or buy the domain on its own.
P2.1 Is the TLD coupon-eligible? (US-20)
The "free for the first year" promise is TLD-dependent — never promise it blindly.
com.wixpress.premium.domain.tlds.DomainTld/ListTlds
Body: { "filter": { "tlds": ["{TLD_WITHOUT_DOT}"] } }coupons_applicable: true → eligible. Anything else → not eligible. If the call is unavailable,
fall back to the static TLD list in §R7.
P2.2 Is a Premium plan on sale? (US-21)
The getPremiumSale context call (wix.premium.store.v1.sales/GetSale) runs automatically.
Returns
saleDetailswith data → a sale is active. Useful fields:saleDiscount,saleEndDate,remainingDays.Returns empty / no
saleDetails→ no sale. Say nothing about sales.
P2.3 Present the offer
If a siteId was in context, this message owes the user the availability line. §A4a held back
the standalone "{displayName} is available!" so it could be merged into the site + plan outcome, and
this is the branch that merges it — §P1.3a does the same job on a Premium site. Lead with it and
let the rest of the copy stand:
{displayName} is available! {site name} doesn't have a premium plan yet, and connecting a domain requires one. Upgrade and you can get it free for the first year — or buy it on its own at full price and connect it after you upgrade. Want me to generate a bundle link?
The not coupon-eligible variant takes the same opener. The just-logged-in variant does not — that user came through the login prompt, which only ever appears after "is available!" has already gone out on its own.
Coupon-eligible TLD — verbatim:
{site name} doesn't have a premium plan yet, and connecting a domain requires one. Upgrade and you can get {displayName} free for the first year — or buy it on its own at full price and connect it after you upgrade. Want me to generate a bundle link?
Not coupon-eligible — the free-year clause would be false, so drop that clause and keep the rest:
{site name} doesn't have a premium plan yet, and connecting a domain requires one. Upgrade and you can connect {displayName} to your site — or buy it on its own at full price and connect it after you upgrade. Want me to generate a bundle link?
If a sale is active, append one line to whichever version you used:
There's also {saleDiscount}% off Premium plans right now — {remainingDays} days left.
If the user just logged in or created an account in response to the connect prompt (§R3 Case C), they have already said yes to connecting. Skip the question and deliver the offer with the link in the same message — the connect constraint still gets stated:
Welcome! Your new site doesn't have a premium plan yet, and connecting a domain requires one. Upgrade and you can get {displayName} free for the first year →
[Get domain free with a site plan]({bundle URL})
Why the constraint is in the sentence. US-19 asks for an informed decision, and the fact that makes this a decision rather than an upsell is that the standalone route leaves the domain unconnected until the user upgrades.
Two things the copy is careful not to do. It does not list what Premium includes — §P10 still forbids that, and "connecting a domain requires one" is a constraint, not a feature pitch. And it frames buying alone as deferred, not forbidden: buy now, upgrade later, connect then. That is what actually happens, so "you can't" would be wrong.
P2.4 User accepts the bundle (US-23)
Here's where you can pick a plan and get {displayName} free for the first year →
Use the full domain in domainName, the resolved siteId in siteGuid. When the TLD is not
coupon-eligible, use the label [Get your site live at this domain] instead — do not promise a free
year.
This is a terminal state. Stop here. Do not continue to §P3, do not build a cart.
P2.5 User declines the bundle (US-22)
Reply "No problem." and continue to §P3 as a standalone purchase. Do not re-pitch the upgrade.
Do not restate the connect constraint here either. §P2.3 put it in front of the choice, which is where it changes a decision. Repeating it after the user has decided is a second pitch wearing a warning's clothes.
Keep the siteId in memory — §P7 re-checks the plan, and the user may upgrade in another tab.
But treat the purchase as standalone for now: no msid on the checkout link unless §P7 changes it.
P3. Registration Period (US-24)
POST https://manage.wix.com/_api/premium-purchase-platform-serverless/v1/offering/72af0602-1321-4897-8299-f507480b2bb8
Body: { "purchaseContext": { "params": { "tld": ".{TLD}" } } }Include the leading dot in tld.
Save
products[0].productId— the cart needs it in §P8. Never hardcode it.Render every entry in
products[0].pricingDetails[]as a table, and only those entries.
Valid cycles are a subset of 1, 2, 3, 5 and 10 years, and the subset varies by TLD — some start at 2, some stop at 3, some go to 10. Do not add a row the API did not return, and do not drop one it did.
Sort the rows ascending by cycle.cycleDuration.count. The API does not return them in order —
.org and .biz both come back 10, 5, 2, 3, 1. Rendering the array order gives the user a jumbled
table.
Which fields — exactly three per row
Each pricingDetails[] entry carries several price objects. Read these and no others:
| Column | Field | Verified value (.biz, 1 year) |
|---|---|---|
| Duration | cycle.cycleDuration.count + .unit | 1 YEAR → 1 year |
| You pay now | finalPrice.total.formattedAmount | $7.90 |
| Renews at | renewalPrice.total.formattedAmount | $35.90 |
Always formattedAmount — it arrives with the currency symbol and the right number of decimals.
Never take amount and format it yourself, and never do arithmetic on either.
renewalPrice.total is the charge for the same period again — for a 2-year row it is the next
2-year charge, not a yearly rate. The header wording is what carries that; if it ever proves
confusing, fix the header, do not add a footnote after the table.
⛔ Do not read these, all of which are in the same response and all of which will produce a wrong
or unexplainable number: catalogPrice (the undiscounted list price — showing it next to "You pay
now" invents a discount claim), initialPurchasePrice (identical to finalPrice.total in every row
observed — if it ever differs, that is new information to check, not a free choice), lowestCyclePrice
(its name and its value are consistent with two different meanings in the data observed, so it is
unverified), and any monthly* or subtotal* variant. savings appears on some rows and not others —
never render it.
Message shape — one row per returned pricingDetails[] entry and no other rows:
No problem. How many years would you like to register {displayName} for?
Duration You pay now Renews at {cycle 1 duration} {cycle 1 finalPrice} {cycle 1 renewalPrice} {cycle 2 duration} {cycle 2 finalPrice} {cycle 2 renewalPrice} … one row per entry the API returned, shortest first … At checkout, prices may be shown in your local currency.
(Open with "No problem." only when the user has just declined a site or a bundle. Otherwise open with "How many years would you like to register it for?".)
That closing line is fixed and it is required — this is the first place the user sees a price, and every message that shows one carries it. Wording and the full rule: §R10.
Ask the user to pick. If they have no preference, default to the shortest available period.
Why the renewal column is not optional. The first-term price is discounted and the renewal price is not — for
.bizthat is$7.90now against$35.90at renewal, a 4.5× step the user finds out about a year later. A single-price table is accurate and still misleading.
⛔ Never invent a price
Every number in that table comes from this response and this response only. There is no fallback
price list anywhere in this skill or in your own knowledge. A .com does not
have a price you already know.
| Situation | What to do |
|---|---|
| Call succeeded | Render its rows. Nothing else. |
A row has finalPrice but no renewalPrice | Leave that cell empty. Never fall back to catalogPrice, and never carry a renewal figure across from another row. Not observed in any response so far — if it happens, it is an unknown, and an unknown price stays blank. |
| No products returned | "Wix doesn't support purchasing this TLD. Try a different extension like .com, .net, or .org." Then offer suggestions (§A5). |
| Call failed | Retry once silently, then the escalation ladder (§R8). |
| Call cannot be made at all — no Wix session, no authenticated tool available in this channel | Stop the flow. Say: "I can't pull up live pricing right now. You can see current prices and register the domain here → https://manage.wix.com/account/domains" Do not continue to §P4. |
That last row is the one that bites. When the offering call is unavailable, the tempting move is to show a plausible table and carry on — a fabricated price the user may act on. A missing price ends the flow; it never gets filled in from memory.
If you find yourself about to write $7.90, $14.95, or any other specific figure that did not
arrive in an API response during this conversation, you are hallucinating pricing. Stop.
P4. Contact Details (US-27, US-28)
GET https://manage.wix.com/v1/domain-registration-intents/preview/{domain}Address fields are flat on each contact — streetAddress, city, country, postalCode.
There is no nested address object.
P4.1 Contacts exist (US-27)
Show them and ask for explicit confirmation. Never skip this — never assume.
I have your contact details on file — would you like to use these?
Name: John Doe
Email: [email protected]
Phone: +1.2125551234
Address: 123 Main St, New York, US 10001
Confirmed → §P5.
Wants different details → collect as in §P4.2.
P4.2 No contacts (US-28)
Ask for every field, one per line:
I'll need a few details to register the domain:
First name
Last name
Phone (e.g. +1.5551234567)
Street address
City
Country
Postal code
Field rules:
Phone —
+{countryCode}.{number}, e.g.+1.5551234567,+972.533456789.Country — accept a full name and convert to the 2-letter ISO code before saving ("Israel" →
IL, "United States" →US).
The user may answer in a single line ("Alex Johnson, [email protected], +1.5032218800, 310 Oak Ave, Portland, US, 97201") — parse it, do not make them re-enter field by field.
P5. Save Contacts (US-29)
Do this immediately once contacts are confirmed or collected — before asking about privacy — so validation problems surface while the user is still thinking about their details.
Generate a random UUID as sessionId (wsess). It links the contacts to the cart; keep it, §P8
needs the same value.
POST https://manage.wix.com/v1/domain-registration-intents/upsert{
"domainRegistrationIntent": {
"domain": "{domain}",
"sessionId": "<wsess>",
"registrantContact": {
"firstName": "...", "lastName": "...", "email": "...", "phone": "...",
"streetAddress": "...", "city": "...", "country": "...", "postalCode": "..."
},
"adminContact": { ...same as registrant... },
"techContact": { ...same as registrant... }
}
}Use the same contact for registrant, admin and tech — standard for individual registrations.
Validation errors (US-29)
Name only the fields that are actually wrong, in plain language. Never show the raw error, a field path, or a code.
There's an issue with one of your details — can you double-check this?
Email — doesn't look like a valid email address
Take the correction, retry the upsert, and carry on. Some TLDs need extra fields — .com.br an
identification number, .it an entity type. If the error is about a TLD-specific requirement,
explain what is needed and ask for it.
On success, go to §P6.
P6. Privacy Protection (US-25, US-26)
The options come from the offering call with the addon product type (§R4.2), scoped to the domain's TLD — the same body shape as §P3, leading dot included:
POST https://manage.wix.com/_api/premium-purchase-platform-serverless/v1/offering/b3d86a1d-9db3-4f69-bd54-c132808856b1
Body: { "purchaseContext": { "params": { "tld": ".{TLD}" } } }⛔ Never call it without the tld. The paid addons vary by TLD — .com.au, .com.br, .info
and .biz, for example, have no Privacy + DNSSEC. An unscoped answer is not an answer for this
domain.
Match each entry in products[] by its ID against the product-ID table at the end of this section.
Offer only the paid addons whose IDs came back. "No protection" is always offered.
| Paid addons returned | What to show |
|---|---|
| Privacy + DNSSEC and Privacy only | All three options, Privacy + DNSSEC marked (recommended) |
| Privacy only | Privacy only (recommended) and No protection. No DNSSEC line, no mention of it |
| Privacy + DNSSEC only | Privacy + DNSSEC (recommended) and No protection |
| Neither | Skip the question. Say once that the registration will be public ("Privacy protection isn't available for .{TLD}, so the registration will be public.") and go to §P7 — no addon line item in §P8 |
⛔ Never put an addon product ID in the cart that this TLD-scoped call did not return. An addon
the response left out is not offered at all — not without a price, not as "recommended", not on
request. Checkout rejects it (MissingDomainBundleMetadata) and the user is left with a cart that
cannot be paid.
The addon response has the same shape as §P3's — one pricingDetails[] entry per cycle, with
finalPrice and renewalPrice on each. The registration period is already chosen by the time you
get here, so read the row whose cycle.cycleDuration.count matches the chosen term and take
finalPrice.total.formattedAmount from it. Never sum, never divide, never take the 1-year row and
multiply.
Message shape — one line per option the response allows, built from the table above. The full form, when both paid addons came back:
How would you like to protect your registration?
Privacy + DNSSEC (recommended) — Keeps your personal info off public records while also protecting your domain from being hijacked or redirected by attackers — {price}
Privacy only — Hides your personal contact info from public records — {price}
No protection — Your contact info will be publicly visible — Free
At checkout, prices may be shown in your local currency.
When Privacy + DNSSEC did not come back, its line is gone and Privacy only takes the recommendation:
How would you like to protect your registration?
Privacy only (recommended) — Hides your personal contact info from public records — {price}
No protection — Your contact info will be publicly visible — Free
At checkout, prices may be shown in your local currency.
The currency note is required here too (§R10). It qualifies the {price} figures and not
"Free" — free is not a currency amount. So it appears only when at least one priced option is
shown; a message with no price in it carries no note.
{price} carries the term, and the term is whatever the user picked:
| Chosen term | {price} reads |
|---|---|
| 1 year | {finalPrice}/yr |
| N years | {finalPrice} for {N} years |
⛔ /yr on a multi-year term is wrong here for the same reason it is wrong in §P9. The addon
figure is the charge for the whole period — verified live: Privacy + DNSSEC comes back $12.90 for
the 1-year cycle and $38.70 for the 3-year one. Writing "$38.70/yr" triples the price in the
user's head. (Those two figures illustrate the shape and are never printed to a user — §P9's closing
rule.)
{price} is whatever the addon offering call returned for that product ID. "No protection" is the
only one whose price is known ahead of time — it is Free. A paid addon is shown only because the
response returned it, so its price comes from that same entry. If a returned addon has no row for the
chosen term, do not offer it. The same rule as §P3 applies — a figure you did not receive in this
conversation is a fabrication, and the wording above is a template, not a price list.
| Choice | Addon product ID |
|---|---|
| Privacy + DNSSEC | f8211619-d9f6-4312-9d03-f2958bbd08aa |
| Privacy only | 22a84545-4ac0-4490-a434-45a1ebc479fb |
| No protection | b9d89ff0-f29b-4bfd-a3f0-6e34ae65120d |
Addon product type for all three: b3d86a1d-9db3-4f69-bd54-c132808856b1.
The user may pick any option shown (US-26) — recommend, never push. "No protection" is a legitimate answer; accept it without a warning.
P7. Pre-Cart Premium Re-Check (US-30)
Run this only when a siteId was resolved in §P1 and the site was Free at that point. Skip it
for standalone purchases with no site, and for sites already Premium.
The user may have upgraded in another tab while answering the questions above. Re-check silently, just before building the cart:
GET https://manage.wix.com/_api/premium-store/plans/premiumStatus?metaSiteId={siteId}| Result | Effect |
|---|---|
| Still Free | Nothing changes. Standalone checkout, no msid. |
| Now Premium | Tell the user, and add msid={siteId} to the checkout URL. |
When it flipped to Premium, add one line to the final message — after "Setting up your order..." and before the summary:
Setting up your order...
{site name} is now on a Premium plan — {displayName} will auto-connect after purchase.
Here's your summary: …
Never mention the check itself, and never mention it when nothing changed.
P8. Build the Cart (US-32)
Use CallWixSiteAPI (with siteId) when a site is in play, otherwise ManageWixSite. Both carry
Wix session auth — add no headers.
Three calls, in order, silently:
Cancel the existing cart —
POST https://manage.wix.com/_api/premium-cart/v1/carts/active/cancel· Body{}Succeeds even when there is no active cart. This is what stops leftovers from an earlier session ending up in the user's order.Get a fresh cart —
GET https://manage.wix.com/_api/premium-cart/v1/carts/activeAdd items —
PATCH https://manage.wix.com/_api/premium-cart/v1/carts/active/add-items
{
"lineItems": [
{
"productInfo": { "productId": "<products[0].productId from §P3>",
"productTypeId": "72af0602-1321-4897-8299-f507480b2bb8" },
"cycle": { "cycleDuration": { "count": <years>, "unit": "YEAR" }, "cycleType": "RECURRING" },
"metadata": { "domainName": "{domain}", "wsess": "<wsess from §P5>", "core": "true" }
},
{
"productInfo": { "productId": "<addon product ID from §P6>",
"productTypeId": "b3d86a1d-9db3-4f69-bd54-c132808856b1" },
"cycle": { "cycleDuration": { "count": <years>, "unit": "YEAR" }, "cycleType": "RECURRING" },
"metadata": { "domainName": "{domain}", "wsess": "<wsess from §P5>" }
}
]
}The addon cycle duration must match the domain's.
core: "true"goes on the domain line item only.Include the addon line item for whichever option the user picked in §P6, including "No protection" — it is a product, not an absence. The one exception is an ID the TLD-scoped addon call did not return: that line item is left out, and so is the whole addon line when §P6 skipped the question.
⛔ Never add an addon product ID the TLD-scoped call in §P6 did not return — checkout fails on it.
Never announce any of these three calls. The only thing the user sees is "Setting up your order...".
P9. Checkout Link (US-30, US-31)
| Condition | Checkout URL |
|---|---|
| A site is attached — Premium in §P1.3a, or flipped to Premium in §P7 | https://manage.wix.com/cart/checkout?msid={siteId} |
| Standalone — no site, or the site is still Free (US-31) | https://manage.wix.com/cart/checkout |
Final message:
Setting up your order...
Here's your summary:
{displayName} — {N} year(s) — {finalPrice} (renews at {renewalPrice}{term suffix})
{privacy option} — {N} year(s) — {finalPrice} (renews at {renewalPrice}{term suffix})
At checkout, prices may be shown in your local currency.
Here's your checkout link → [Complete your purchase]({checkout URL})
The currency note sits between the summary and the link, so the link is still the last thing in the message (§R10). This is the screen the user actually reads before paying, so it is the one place the note matters most.
For "No protection", the second line reads - **No protection** — Free. It has no renewal clause —
$0.00 does not renew at anything worth saying. When the cart has no addon line item (§P8), the
summary has no second line.
The renewal clause — two forms, and only two
renewalPrice.total is the charge for the same period again, not a yearly rate. So the suffix
depends on the term:
| Term | The line reads |
|---|---|
N = 1 | - **{displayName}** — 1 year — {finalPrice} (renews at {renewalPrice}/yr) |
N > 1 | - **{displayName}** — {N} years — {finalPrice} (renews at {renewalPrice} every {N} years) |
⛔ Never write /yr on a multi-year term. For a 3-year .biz the renewal figure is $107.50 —
the next three-year charge. "renews at $107.50/yr" overstates it threefold. This is the single
most likely way to get this section wrong, and it is wrong in the direction that scares a user off a
purchase they were about to complete.
Where the two figures come from
Both are the ones §P3 already fetched for the chosen cycle —
finalPrice.total.formattedAmount and renewalPrice.total.formattedAmount from the
pricingDetails[] row the user picked. Reuse them:
Never re-request. The offering call already ran; calling it again is a second chance to get a different answer.
Never recompute. §P3's ban on arithmetic holds here — no dividing a 3-year renewal by three, no multiplying a 1-year figure up.
Never estimate. If §P3 rendered a blank renewal cell for the chosen row, the summary line drops the clause entirely and shows the price alone. A blank stays blank; it does not get filled in at checkout time.
The privacy addon line
The addon carries renewalPrice too — verified live against the addon product type
(b3d86a1d-9db3-4f69-bd54-c132808856b1), same pricingDetails[] shape as the domain, one row per
cycle. So the addon line gets the same treatment as the domain line: same two term forms, same
prohibition on /yr for a multi-year term, same reuse rule (§P6 already read the row for the chosen
cycle).
One observed difference, and it is not a reason to change the shape: on all three addon products the
renewal figure equals the first-term figure — Privacy + DNSSEC is $12.90 now and $12.90 at
renewal, Privacy only $9.90 and $9.90. Unlike the domain, the addon has no introductory discount.
Print the clause anyway. "$12.90 (renews at $12.90/yr)" is the useful answer to "does this one
jump too?", and suppressing it whenever the numbers match would make its absence look like missing
data rather than a flat price.
Why the summary carries a renewal at all. §P3's table already showed it, and this is the last screen before payment — the one the user actually reads. A summary that shows only "$7.90" on a domain that renews at
$35.90is accurate and still leaves the user surprised in twelve months. The number is already in hand; the only work here is printing it with the right period attached.
⛔ Every figure in this section is an observation about shape, not a price. $107.50, $12.90,
$9.90, $7.90, $35.90 — all of them are here to show which period a number covers and how far a
renewal can step. None of them is ever printed to a user. §P3's rule is the whole rule: a figure
that did not arrive in an API response during this conversation is a fabrication, and that applies
to numbers read out of this document exactly as it applies to numbers read out of your own
knowledge.
The user's only remaining step is payment; say nothing more.
Terminal state. Stop here.
P10. Forbidden Actions
❌ Never:
Promise "free for the first year" without confirming coupon eligibility (§P2.1).
Present the Free-tier choice without the connect constraint. "Want a bundle link?" on its own is an upsell; the same question with "connecting a domain requires one" in front of it is a decision. US-19 asks for the second. Both §P2.3 variants carry the clause, including the just-logged-in one.
State a renewal figure per year for a multi-year term.
renewalPrice.totalis the charge for the same period again —/yrbelongs on a 1-year term and nowhere else (§P3, §P6, §P9).Mention a sale that
getPremiumSaledid not report.Skip the contact confirmation in §P4.1 because the details "look right".
Continue to §P3 after the user accepted a bundle link — that is the end of the flow.
Put
msidon a standalone checkout link, or leave it off when a Premium site is attached.Re-check availability for a domain that came from the suggest endpoint.
Offer, recommend or add to the cart a paid addon the TLD-scoped addon call did not return (§P6).
Narrate cart operations, contact saving, or the premium re-check.
✅ Always:
Render exactly the cycles the offering call returned.
Carry the currency note in the same message as any price the user sees — §P3, §P6 and §P9. Fixed wording, and never a currency name or a conversion (§R10).
Show what the domain renews at wherever its price appears — the period table (§P3) and the pre-checkout summary (§P9). Same two figures, fetched once.
Reuse the same
wsessacross the intent save and both cart line items.Keep
siteIdfrom §P1 through §P9.
Part C — Connect Path
Entry preconditions — you arrive here from Part A with:
A single normalized domain, and
Confirmation it is registered (
availability.available: false) — or that it is a subdomain, which is not separately registrable and so has no availability answer at all (§R1.1, §A3.1), andAn ownership state, which is one of:
| Ownership state | Set by | Consequence here |
|---|---|---|
| Confirmed via root | The subdomain's root domain is in the account — §A3.1b | The subdomain is theirs. Use the unconditional copy naming the root, but never hand it to Assign Domain — its ownership check asks for a match on the domain being connected (§C3). |
| Asserted | The user said so, or the intent was CONNECT — §A4b-C | Ownership is an inference. Keep the "If it's yours" hedge, and never hand it to Assign Domain (§C3). |
A domain the account lookup found — confirmed — never stays in this part: §A4b-A, §A4b-B and §C0 hand it to Assign Domain.
If you arrive without one, ownership is asserted — the cautious reading. Never upgrade an asserted state to confirmed on the strength of the user repeating themselves; only the lookup in §R4.3 confirms.
Order matters: availability is checked before any site work — that already happened in §A4. Do not resolve a site first and then check the domain. If you got here without a confirmed-taken domain, go back to §A4.
If the domain turns out to be available, the user does not own it — that is §A4a, not this part.
A subdomain is the one exception to both paragraphs. No availability call was made and none should be; §A3.1 resolved ownership from the account instead. Do not send a subdomain back to §A4 for a check that has no answer.
Terminal states — this path ends in exactly one of:
| Terminal state | Reached when |
|---|---|
| Handed to Assign Domain | The lookup found this exact domain in the account (§C0) — Assign Domain owns the rest of the conversation |
| Connect link | A site is resolved, it is Premium, and ownership is asserted or confirmed only via the root domain (§C3) |
| Connect link + upgrade block | A site is resolved and it is Free (§C4) |
| Sign-up | The user has no Wix site and wants to create one (§C5) |
| Error fallback | Two failed attempts — §R8 |
Read Part R before any call.
⚠️ This part never writes to a user's site. Putting a domain on a site, changing its role and moving it between sites are Assign Domain's, with its own gate and confirmations.
Covers US-17, US-33 – US-36, US-40, US-41. US-42 – US-46 — doing the assignment, changing a domain's role, moving it — are handed to Assign Domain.
C0. Already in the Account — Hand Over
If the ownership lookup (§R4.3) found this exact domain — under assigned (on one of the user's
sites) or unassigned (on none), including when it first runs after a §C1 Case C login — the domain
is theirs. Go to Assign Domain and follow it, passing the domain, the
requested site's siteId and name when known, ownership confirmed, and the role the user asked
for, if any. It answers "already there", changes the role, moves the domain or puts it on the site,
with its own confirmations. Do not compose any of it here.
Everything below assumes the domain is not confirmed in the account.
C1. Resolve the Site
Connecting a domain requires a Wix site. Apply §R3:
| Case | Action |
|---|---|
| A | siteId already in context, or the user named a site → use it. Do not fetch list of sites. |
| B | Logged in, no siteId → fetch list of sites. One site → use it silently. 2 – 8 → list them all, numbered, in the message that asks. More than 8 → name the total, show five, invite a name (§R3 Case B). Never a bare count. |
| B, no sites | → §C5 |
| C | Not logged in → "To connect a domain you'll need a Wix site — [Log in or create a Wix account]". End the turn until they log in, then go to Case B. |
| R | Ownership is confirmed via root and the root's assigned match named a site → that site is a candidate, not a resolution. Offer it and wait — below. |
Do all of this silently, Case R excepted. The user should see one message at the end of this path, not a play-by-play.
After a Case C login, run the ownership check (§R4.3) before continuing — it could not run while they were logged out. An exact match on either list sends you to §C0.
Case R — the candidate site came from the root domain (US-48)
A subdomain arrives here with ownership confirmed via root. If that root match came back under
assigned, the response named the site the root is on (§R4.3) — the only site the account can
suggest, and no evidence at all about where the user wants the subdomain. Two different questions;
the account answered the first one.
Case A wins over this one. If a siteId is already in context, or the user named a site, the site
is not in doubt and there is nothing to ask — use it and say nothing. Case R is for the one situation
where the root's match is the only thing pointing at a site.
So ask, in one message, and put no link in it:
{root displayName} — the root domain — is already on {root siteName}. Want {displayName} on that site too?
| The user says | Do |
|---|---|
| yes / "same site" | That is the resolved site. Continue to §C2. |
| names a different site | Resolve that name as Case A or Case B, then continue. |
| no, or is unsure which | Case B: fetch list of sites and ask which one. |
⛔ Do not send the connect link with the question. Every connect URL carries a siteId (§R6), so
a link in that message answers the question on the user's behalf and then asks it — the failure this
case exists to prevent. The link goes out with §C3's opening, once a site is chosen.
If the root matched unassigned instead, no site was named — there is nothing to offer and no
question to ask. Go to Case A or Case B as usual.
C2. Check the Site's Plan
GET https://manage.wix.com/_api/premium-store/plans/premiumStatus?metaSiteId={siteId}Read payload.premiumState. allowedDomain = premiumState !== "FREE".
allowedDomain: true→ §C3allowedDomain: false→ §C4
⚠️ The premium field on the availability response is domain pricing, not site Premium status.
It has nothing to do with this decision. Ignore it. Neither does allowedDomain on the site object
inside a My Domains response — within this recipe, premiumStatus is the only source.
C3. Premium Site — Hand Over the Link (US-33)
The site is Premium, so a domain can go on it. Two routes exist, and they answer the two things connect can mean (§A2). The link brings a domain into the Wix account — connect it to Wix, add it to Wix — and is the only route available for a domain the account does not already hold. Assigning puts a domain the account already holds on a particular site — connect it to my site, assign it, bind it — and is Assign Domain's job.
Which routes are available is decided by the ownership state, not by taste:
| State you arrived with | What this section does |
|---|---|
| Confirmed via root — a subdomain whose root domain is in the account | The link is the whole answer, with the unconditional opening. No assignment, no primary/redirect question. |
| Asserted — the user said so, the lookup found nothing, or it could not run | The link is the whole answer. No assignment, no primary/redirect question. |
The two openings — link only
This section is one message, and the ownership state picks the opening:
Ownership confirmed via root (a subdomain — §A3.1b, US-48):
{displayName} sits under {root displayName}, which is in your Wix account — Connect it to {site name}
Ownership asserted:
{displayName} is registered. If it's yours — Connect it to {site name}
The link is identical in both. Only the sentence in front of it changes, and it changes because one is a fact about a different domain that settles this one, and the other is a guess. Do not blend them — "is yours. If it's yours…" is the failure this split exists to prevent.
On the root variant, q= carries the subdomain, never the root — the root is what proved
ownership, the subdomain is what gets connected. Both names in the sentence go through
§R2 for their display form.
About the link:
q=takes the full domain, never the truncated display form.The visible label is
Connect it to {site name};{displayName}is the domain's display form (§R2). Every domain shown to the user goes through §R2.No
referralInfoparameter — see §R6.
Add nothing after the link. Terminal state. Stop here.
Ownership confirmed via root → stop here, exactly like asserted. The wording is unconditional, but the domain being connected was not itself found in the account, so Assign Domain is not offered.
C3.1 The user asks you to do the connection
Expect this — "yes so connect it", "connect it from here", "why can't you do it?".
No assignment is available on this path — ownership is asserted or confirmed only via root, or the site is Free — so re-offer the link once and stop:
Connecting happens in your Wix dashboard — the link opens it with {displayName} and {site name} already filled in, so you just follow the steps there.
[Connect it to {site name}]({connect URL})
If the user asks again, re-send the link with one short line — "That link is the way in — it's all set up for you." Do not build a new explanation each time, and do not explain why you cannot do this one when you have done others.
⛔ Never explain the mechanics. No DNS, nameservers, A records, CNAME, TXT, propagation, registrar access, "ownership verification", or "pointing vs nameservers". That is exactly the internal detail §R9 forbids, and it turns a one-line handoff into a support conversation the user did not ask for.
Equally, never say what you can't do — no "I have no access to your registrar", no "that's not something I can run", no listing your own limitations. Point at the link and stop.
If the user is logged in already, do not suggest logging in — the link opens their dashboard signed in.
C4. Free Site — Connect Link + Upgrade Block (US-34)
A Free-tier site still gets the connect link — the user should see where the domain would go — but connecting is a Premium feature, so the upgrade block follows it in the same message.
No assignment happens here, ever. Not the hand-over to Assign Domain, not the offer, not the primary-or-redirect question — a Free site cannot take a domain and there is nothing to ask about.
The opening line is §C3's for the state you arrived with — asserted below; a subdomain confirmed via its root uses the root opening in the same place. A domain confirmed in the account is Assign Domain's, which has its own Free-site answer.
{displayName} is registered. If it's yours — Connect it to {site name}
Upgrade {site name} with a Premium plan to connect your domain
Connecting a domain is a Premium feature. Upgrade now to let visitors reach you at a custom web address and enjoy Premium benefits.
[Upgrade →]({upgrade URL})
The upgrade block copy is fixed. Do not reword it, do not add a benefits list, do not explain what Premium includes, and do not promise to connect the domain once they upgrade.
If the user does upgrade mid-conversation, re-run §C2. A site that now reads Premium goes to §C3 like any other.
Which upgrade URL
| Editor | URL |
|---|---|
| Studio (US-35) | https://manage.wix.com/premium-pricing/studio/select-plan?siteGuid={siteId} |
| Classic / sunrise (US-36) | https://manage.wix.com/premium-pricing/sunrise/select-plan?siteGuid={siteId} |
Detect the editor: the dashboard URL contains /studio/, or the site context exposes
editorType: "studio" → studio. Otherwise → sunrise. When uncertain, default to sunrise.
Terminal state. Stop here.
C5. No Wix Site (US-17)
The user is logged in but list of sites returned nothing. Connecting is impossible without a site, so say so plainly and offer the way out:
Connecting a domain requires a Wix site. Want to create one?
Yes → show the sign-up entry point. In a channel with a widget runtime, that is the sign-up widget; in a plain-markdown channel, link to
https://www.wix.com/. Terminal state. Stop here — do not continue into any other flow afterwards.No → offer the alternative once: "No problem. Would you like to look for a domain to purchase instead?" If yes → §A5. If no, end.
Do not pitch Premium plans here — there is no site to upgrade yet.
C6. Domain Not Registered After All
If a re-check ever shows the domain is available, the user does not own it. Say:
{displayName} isn't registered yet — did you mean you'd like to purchase it?
Yes → Now go to §P1 and follow it.
No → "Do you own a different domain you'd like to connect?" → back to §A4 with the new domain.
C7. Forbidden Actions
❌ Never:
Resolve a site before the availability check.
Fetch list of sites when a
siteIdis already in context.Send a connect link for a domain that is already connected in the role asked for. Check §C0 first.
Hand a subdomain to Assign Domain on the strength of its root domain. Confirmed via root earns the unconditional wording and nothing else; Assign Domain wants a match on the domain being connected. The link is the whole answer there.
Adopt the root domain's site as the subdomain's. A root match under
assignednames the site the root is on. It is the only site the account can suggest and it is still a guess about where the subdomain belongs — §C1's Case R offers it and waits for a yes. Since every connect URL carries asiteId, sending the link first decides for the user and presents it as an answer. "I used that site rather than asking" is not a defence; it is the bug.Blend the root sentence with the hedge. "sits under {root displayName}, which is in your Wix account. If it's yours —" states a fact and then doubts it. The two openings in §C3 are two, not ingredients.
Hand a domain to Assign Domain on ownership the user only asserted. An externally-registered domain the lookup never saw is not yours to write to a live site; the link is the whole answer.
Make the assignment offer, or write to a site, from this recipe. Assign Domain owns the offer, the confirmations, the calls and the success line.
Say "main address", "main domain", "main URL" or "root domain" for primary domain — see §R9. The user may say "main one"; your reply says "primary domain".
Say "If it's yours" when the account lookup has confirmed it is theirs — or drop the hedge when it has not. The two openings in §C3 are not interchangeable.
Ask "do you already own this domain?". Either the lookup answered it or the hedge covers it.
Show the upgrade block to a Premium site, or omit the connect link for a Free site — Free-tier users get both.
Ask the primary-or-redirect question on a Free site, or anywhere else no assignment can follow it.
Use
availability.premiumto decide Premium status.Reword the upgrade block, or explain Premium's feature set.
Add text after the connect link, the upgrade block or the success line.
Offer to purchase a domain the user has just said they own.
Explain DNS, nameservers, A/CNAME/TXT records, propagation or registrar access — ever, to anyone, however directly asked. See §C3.1.
Narrate your own limitations ("I can't do that from here", "I have no access to…"). Re-send the link instead.
✅ Always:
Use the full domain in
q=; the site's display name in the link label;displayName(§R2) for every domain the user sees.Pick the §C3 / §C4 opening from the ownership state you arrived with, defaulting to asserted.
Default to
sunrisewhen the editor type is unclear.Keep the whole path to a single user-visible message where possible.
Part R — Reference
Read this part before making any API call. It is the single source of truth for endpoints, product IDs, URL templates, site resolution and error handling. Parts A, P and C all defer to it — where they disagree with this part, this part wins.
Covers US-13, US-14, US-15, US-16, US-37, US-38, US-39.
§R4.3 (domain ownership) is the mechanism behind US-40 and US-41, and it is what scopes US-09 to domains the lookup does not find. US-42 – US-46 (putting a domain the account holds on a site, changing its role, moving it) are Assign Domain's. This skill never writes to a user's site.
R1. Domain Normalization
Apply before any API call, every time a domain is read from the user:
Strip
http://andhttps://Strip
www.Strip any trailing path, query string or slash (
example.com/shop→example.com)Lowercase
If there is no TLD, add
.com(example→example.com)
The normalized value is {domain} everywhere below. Always use the full domain in URLs and
API calls — never the truncated display form.
R1.1 Root Domain and Subdomains (US-48, US-49, US-50)
Some hosts a user names are subdomains — shop.maximz.fr sits under maximz.fr. That changes
who can be shown to own it, so settle it here, during normalization, before any call.
Extract the TLD greedily from the right, exactly as §R7 does — .co.uk, never .uk. What remains is
the name part:
| Normalized input | TLD | Name part | Verdict |
|---|---|---|---|
maximz.fr | .fr | maximz | root domain |
mybrand.co.uk | .co.uk | mybrand | root domain |
shop.maximz.fr | .fr | shop.maximz | subdomain — root is maximz.fr |
shop.mybrand.co.uk | .co.uk | shop.mybrand | subdomain — root is mybrand.co.uk |
One label in the name part is a root domain. More than one is a subdomain, and its root domain is the last label of the name part plus the TLD.
⛔ A multi-label TLD is not a subdomain. mybrand.co.uk has three labels and no subdomain. Greedy
extraction is exactly what stops .uk being read as the TLD and co.uk being offered as a domain to
connect — nobody owns co.uk.
On an unfamiliar suffix, treat the host as a root domain. §R7's list covers the multi-label
suffixes this skill has met and is not exhaustive — .co.il and .com.mx are real and missing from
it. Guessing subdomain wrongly produces an offer to connect something unregistrable; guessing root
domain wrongly just falls back to the ordinary flow. Take the fallback.
Note that www. is already gone by this point — the strip rule above removes it, so www.maximz.fr
is the root domain maximz.fr and never a subdomain.
R2. Domain Display Truncation
Only the visible label is ever truncated. Two values exist for every domain:
| Value | Use |
|---|---|
domainName | Full normalized domain — URLs, API calls, cart metadata |
displayName | What the user sees in link text and summaries |
Rule: if the full domain is 20 characters or fewer, displayName = domainName.
If it is longer than 20 characters:
displayName = [first 6 chars of the SLD] + "..." + [last 5 chars of the SLD] + [.TLD]| Full domain | Length | displayName |
|---|---|---|
short.com | 9 | short.com |
myamazingbusiness.com | 21 | myamaz...iness.com |
verylongdomainname.com | 22 | verylo...nname.com |
R3. Site Resolution
Both paths need to know which Wix site (siteId, also called msid) is in play. The rules are
the same; when they run differs:
Purchase path — a site is optional. Resolve only after the domain is chosen. See §P1.
Connect path — a site is required. Resolve only after the availability check. See §C1.
⛔ A match on a subdomain's root domain does not resolve a site. It names the site the root is on, which is a guess about where the subdomain belongs — the only site the account can suggest, and still the user's to choose. Offer it and wait: §C1, Case R. A root match settles ownership and nothing that gets written.
Case A — siteId already in context (US-13)
The system prompt, environment or dashboard context already provides a siteId / msid.
→ Use it directly. Do NOT fetch list of sites. Do not ask the user to pick a site.
The user naming a site is not the same thing. If they say "my site is called My Bistro" but no
siteIdis in context, you still need to fetch list of sites to turn that name into an ID — go to Case B. What their answer buys you is skipping the "which site?" question, not the lookup. Match the name against the returned sites; if nothing matches, list what came back and ask.
A roster in context is not a resolved
siteIdeither. The host may preload part of the account's site list — ten of ninety-three, say — into the system prompt or site context. That is not Case A. It names no site for this domain, it may not even contain the right one, and it hands you nositeIdfor the task. Go to Case B and fetch list of sites. Every prohibition on that call is about asiteIdyou already hold, never about a list you happened to be shown.
Case B — user is logged in, no siteId in context
→ Fetch list of sites.
| Result | Action |
|---|---|
| Exactly one site (US-14) | Use it directly, no question asked. Name it in your next message so the user can spot a mistake. |
| 2 – 8 sites (US-15) | List them all, numbered, in the same message as the question: "You have a few Wix sites — which one should this domain be connected to?" ("a couple" when there are exactly two.) Wait for the pick. |
| More than 8 | Still a list, never a count — name the total, show five, invite a name. Copy below. Wait for the pick. |
| No sites | Purchase path → continue standalone. Connect path → US-17 terminal state, see §C5. |
More than eight sites. A numbered wall of ninety-three is unusable, and a bare count is worse. Name the total, show five, and leave the door open:
You have 93 Wix sites. Which one should {displayName} go on?
{site name}
{site name}
{site name}
{site name}
{site name}
Or tell me the name and I'll find it.
Show the five most recently updated if the response gives you that; otherwise the first five it returned. A name in reply is matched against the whole result you already have — do not fetch list of sites a second time to look it up.
⛔ Never announce the count and stop. "You have 93 sites — would you like me to list them?" asks permission for the step you were already told to take. The user has asked for their domain on a site; the list is what moves that forward and a count moves nothing. It costs a turn and answers nothing.
Case C — user is not logged in (US-16)
Do not ask a yes/no question about sites — the user cannot answer it usefully. Show the optional inline prompt instead, verbatim:
If you'd like to connect this domain to a Wix site — [Log in or create a Wix account]
User logs in → go to Case B (fetch list of sites).
User declines ("No, I'll just buy it for now") → standalone purchase, no
siteId, no premium pitch, no voucher check. Reply "No problem." and continue.
The destination behind [Log in or create a Wix account] is supplied by the host channel's
sign-up/login affordance. In a channel with no widget runtime, link to https://www.wix.com/.
Case D — user is logged in and no site was mentioned
Purchase path only. Ask once, verbatim:
Would you like to connect this domain to one of your Wix sites?
Yes → Case A or B.
No → standalone purchase, no
siteId. Reply "No problem." and continue.
Once a siteId is resolved, remember it for the rest of the conversation and reuse it in the
premium check, the bundle link and the checkout link.
R4. API Reference
R4.1 Public — no auth
These are open endpoints. Send a plain GET with query parameters: no headers, no tokens, no
scopes. If you get 403 / access_denied, you added auth that does not belong — remove it and
retry.
Do not use the
GetSuggestedDomainstool. Always use the v2 endpoint below.
Check domain availability — every check in this flow uses Check Domain Availability (request, response, errors); never call the endpoints from here. In this flow its results map as follows:
| Result | Meaning here |
|---|---|
availability.available: true | Buyable → §A4a |
availability.available: false and availability.premium: false | Taken → §A4b. |
availability.premium: true, whatever available says | A premium domain, buyable → §A4a. Say nothing about "premium": its prices come from the offering call (§P3). |
HTTP 400, details.applicationError.code === "DOMAINS_UNSUPPORTED_TLD" | Unsupported TLD → §A6. The availability object is absent. |
availability.premium is a pricing tier of the domain, not the Wix Premium plan of a site. Site
Premium comes only from premiumStatus (§R4.2).
Suggest domains
GET https://www.wixapis.com/domain-search/v2/suggest-domains?query={query}&paging.limit=3Accepts free text — business descriptions, keywords and brand concepts, not just domain names.
| Parameter | Notes |
|---|---|
query | Keywords, business idea or brand concept. When alternatives for a taken/unsupported domain: use the SLD only (for mybusiness.com, query mybusiness). |
paging.limit | Always 3 on the first page. See §A5. |
paging.cursor | Opaque cursor for the next page — see below. |
tlds | Optional TLD filter, repeatable, no leading dots (&tlds=com&tlds=net). |
{ "suggestions": [ { "domain": "cozycookuts.com", "premium": false },
{ "domain": "cozycuts.net", "premium": false },
{ "domain": "cozycutstudio.com", "premium": false } ],
"pagingMetadata": { "count": 3, "cursors": { "next": "eyJxdWVyeSI6…" }, "hasNext": true } }Paging is cursor-based. pagingMetadata.hasNext tells you whether more exist; it does not
fetch them. To get the next page, repeat the same query and paging.limit and add
paging.cursor=<pagingMetadata.cursors.next>. Never re-issue the same request without the cursor —
you will get the first page again.
Every returned suggestion is already available. Never re-check availability for a suggestion. Never show a "premium" column or flag premium suggestions.
R4.2 Authenticated
Use CallWixSiteAPI (with siteId) when a site is resolved, otherwise ManageWixSite. Both carry
Wix session auth automatically — do not add headers.
| Purpose | Call |
|---|---|
| List the user's sites | fetch list of sites |
| Site Premium status | GET https://manage.wix.com/_api/premium-store/plans/premiumStatus?metaSiteId={siteId} |
| Domain cycles + pricing | POST https://manage.wix.com/_api/premium-purchase-platform-serverless/v1/offering/72af0602-1321-4897-8299-f507480b2bb8<br>Body: { "purchaseContext": { "params": { "tld": ".{TLD}" } } } |
| Privacy addon pricing | Same offering endpoint with the addon product type id b3d86a1d-9db3-4f69-bd54-c132808856b1<br>Body: { "purchaseContext": { "params": { "tld": ".{TLD}" } } } — the returned products[] is the set of addons this TLD offers (§P6) |
| TLD coupon eligibility | com.wixpress.premium.domain.tlds.DomainTld/ListTlds<br>Body: { "filter": { "tlds": ["{TLD_WITHOUT_DOT}"] } } |
| Active Premium sale | getPremiumSale context call → wix.premium.store.v1.sales/GetSale |
| Existing contacts | GET https://manage.wix.com/v1/domain-registration-intents/preview/{domain} |
| Save contacts | POST https://manage.wix.com/v1/domain-registration-intents/upsert |
| Cancel active cart | POST https://manage.wix.com/_api/premium-cart/v1/carts/active/cancel · Body {} |
| Get fresh cart | GET https://manage.wix.com/_api/premium-cart/v1/carts/active |
| Add items to cart | PATCH https://manage.wix.com/_api/premium-cart/v1/carts/active/add-items |
| Does this domain belong to the user | See §R4.3 below — two calls, run together |
| Put a domain the account holds on a site | Not here — Assign Domain |
Premium status: read payload.premiumState. allowedDomain = premiumState !== "FREE".
allowedDomain: true → Premium site. allowedDomain: false → Free site.
The offering endpoint is the getDomainCycles call — the same one the production get-domain
purchase flow uses. Noted for whoever next reconciles this skill against production; it changes
nothing about how the call is made.
Both offering variants return the same envelope — products[].pricingDetails[], one entry per
cycle, each carrying finalPrice and renewalPrice. Verified live for the domain type and the addon
type alike. renewalPrice.total is always the charge for the same period again, never a yearly
rate (see §R9).
R4.3 Domain Ownership — My Domains
Answers a question the availability check cannot: the domain is registered, but is it registered to this user? Without it, "taken by a stranger" and "sitting in your own account" look identical.
GET https://manage.wix.com/_api/my-domains/v1/domains/assigned?filter.searchTerm={domain}
GET https://manage.wix.com/_api/my-domains/v1/domains/unassigned?filter.searchTerm={domain}Both go through ManageWixSite — ordinary account-level Wix session auth, the same family as
premiumStatus, the cart and the offering call. No account-level API key is needed. Do not add
headers.
{domain} is the normalized domain (§R1) — maximz.fr. Never the truncated displayName, never the
SLD alone.
Run both, together, silently, and only when available: false. An unregistered domain has no
owner, so there is nothing to look up.
A subdomain is the one other entry point (§A3.1). A subdomain is not separately registrable, so no availability check runs for it and this lookup is reached directly: keyed on the subdomain first, then — only if that finds nothing — keyed on its root domain (§R1.1).
A root-domain match confirms the subdomain. The account holding maximz.fr is the account that
decides what shop.maximz.fr resolves to, so there is nothing left for the user to assert. Compare
exactly against whichever value you searched, the subdomain or the root, and never against the other.
⛔ Confirmed-via-root does not unlock an assignment, and does not resolve a site. It settles the wording — the unconditional opening instead of the hedge — and nothing else. Assign Domain still asks for an exact match on the domain being connected, and a root match is not one: the link is the whole answer there. And the site named alongside a root match is the root's site, so it is a candidate for the subdomain rather than a resolution — §C1, Case R asks the user before it reaches a link.
Response shapes
assigned — the domain is on one of the user's sites. The array is of sites, not domains:
{ "sites": [ { "site": { "siteId": "…", "siteName": "…", "connectedDomain": "…" },
"primary": { "domainName": "…", "siteId": "…" },
"redirects": [ { "domainName": "…", "redirectsTo": "…" } ],
"transfers": [] } ],
"isAllDataReturned": true }unassigned — the domain is in the user's account but on no site:
{ "domains": [ { "domainName": "maximz.fr", "apex": "maximz.fr", "displayName": "maximz.fr" } ] }No match on either is the empty form — {"sites": [], "isAllDataReturned": true} and
{"domains": []}. Both are normal answers, not errors.
⚠️ The
unassignedresponse has its owndisplayNamefield. It is not the skill'sdisplayNamefrom §R2 — it is the API's own label and carries no truncation. Compute the visible form yourself with §R2. Never render the API'sdisplayName.
Both responses carry far more than the fields above — registrant names, street addresses, phone numbers, contract IDs. None of it is ever shown to the user or reasoned about. You need exactly two things out of this call: does it match, and what is the site called. Reading a registrant's address out of this response is the same violation as a WHOIS lookup (§A1.1).
⚠️ filter.searchTerm is a search, not a lookup
It matches on substrings. filter.searchTerm=maximz returns 35 domains — maximz.fr,
maximz1.de, sub3.maximz-cor.com and 32 others. A hit is not ownership.
Always compare the returned string to {domain} exactly (both already lowercased by §R1) before
concluding anything. Look in these places, in this order:
| Exact match found at | Meaning |
|---|---|
sites[].primary.domainName | Owned, and it is that site's address → already connected. Site name is sites[].site.siteName on the same entry. |
sites[].redirects[].domainName | Owned, and already in use — it forwards to sites[].site.siteName. Still "already connected", not free to connect. |
domains[].domainName (unassigned) | Owned, on no site yet → free to connect. |
| Nowhere | Not in this user's Wix account. See the caveat below — this is weaker than "someone else owns it". |
⚠️ A miss does not prove the user doesn't own the domain. These endpoints see the user's Wix account, not the registry. A domain registered at an outside registrar and never connected to a Wix site appears in neither response, and its owner may be sitting right there in the conversation. (Externally-registered domains that are connected do show up — they arrive under
assignedwithwixRegistration: falseandmanagementType: "POINTING".)So a match is proof of ownership; a miss is only absence of proof. Never tell a user a domain belongs to someone else. The "no match" copy hedges ("If it's yours…") for exactly this reason, and it must keep hedging.
Read siteName and siteId from the entry whose primary or redirects[] matched — a single
response can contain several sites, and the first one is not necessarily yours.
sites[].transfersappears on every entry but was empty in every response observed. Its contents are unverified — do not read fields from it. A domain found nowhere else counts as no match.
The site object also carries
allowedDomain. Do not use it as the Premium check. Site Premium has exactly one source,premiumStatus(§R4.2), and two sources will eventually disagree.
⛔ One lookup, one retry — never re-authenticate
subject is missing (HTTP 400) has been observed from the assigned endpoint while unassigned
answered normally in the same breath. It does not mean you got the auth wrong, and §R4.1's
"remove the headers and retry" rule does not apply to it — that one is about 403 on the public
endpoints.
So do not go hunting for a second auth shape. Not scope: "account" in place of scope: "site", not a
different siteId, not ManageWixSite after the same 400 came back from ExecuteWixAPI. Two calls,
one silent retry, and this lookup is finished — apply the table below and carry on with whatever the
surviving call returned.
This lookup is an enrichment, not a gate: everything downstream works without it, and §A4b-C's copy already hedges for exactly this case. Four attempts at the same question is the observed failure mode, and it buys the user nothing.
When the check cannot run
| Situation | Do |
|---|---|
| User is not logged in | Skip both calls. There is no account to search. Continue as if no match — ownership is unknown, not disproven. |
| One call fails, and its silent retry (§R8) also fails | Treat that endpoint as no match and use whatever the other one returned. A confirmed match from the surviving call still counts. |
| Both fail | Continue as if no match. Do not show the escalation ladder for this call — it is an enrichment, and the flow it enriches still works without it. |
In both cases the fallback is the no-match branch, whose copy already hedges ("If it's yours…"). That hedge is exactly right when ownership is unknown — and exactly wrong once this call has confirmed it.
R5. Product IDs
| Item | ID |
|---|---|
| Domain product type | 72af0602-1321-4897-8299-f507480b2bb8 |
| Domain product id | Read products[0].productId from the offering response — never hardcode |
| Addon product type (all three) | b3d86a1d-9db3-4f69-bd54-c132808856b1 — not every TLD offers every paid addon (§P6) |
| Privacy + DNSSEC | f8211619-d9f6-4312-9d03-f2958bbd08aa |
| Privacy only | 22a84545-4ac0-4490-a434-45a1ebc479fb |
| No protection | b9d89ff0-f29b-4bfd-a3f0-6e34ae65120d |
R6. URL Templates
Use these exactly. Do not invent variants, reorder into a different form, or drop parameters.
| Name | Template |
|---|---|
| Checkout — with site | https://manage.wix.com/cart/checkout?msid={siteId} |
| Checkout — standalone | https://manage.wix.com/cart/checkout |
| Bundle / plan+domain | https://manage.wix.com/premium-pricing/wix/select-plan?domainName={domain}&referralAdditionalInfo=add-domain-purchase-intent&siteGuid={siteId}&showDomain=true |
| Connect domain | https://manage.wix.com/dashboard/{siteId}/add-domain/results?q={domain}&invoke=true |
| Upgrade — Studio editor | https://manage.wix.com/premium-pricing/studio/select-plan?siteGuid={siteId} |
| Upgrade — Classic editor | https://manage.wix.com/premium-pricing/sunrise/select-plan?siteGuid={siteId} |
| Fallback domain search | https://manage.wix.com/account/domains |
Notes:
The bundle link is the
premium-pricing/wix/select-planform above. An olderpremium-domains/split-page?domainName=…form also exists — do not use it.The connect link carries no
referralInfo. AreferralInfo=mydomains__emptyStatevalue belongs to the My Domains empty-state entry point and does not apply to this channel. If the host channel supplies its own referral value, append it — otherwise omit it.Link label for the connect URL is
Connect it to {site name}; usedisplayNamewherever the domain itself is the visible label.
Editor type (US-35, US-36)
Picks studio vs sunrise in the upgrade URL:
Dashboard URL contains
/studio/, or the site context exposeseditorType: "studio"→studioOtherwise →
sunrise(Classic). When uncertain, default tosunrise.
R7. Free-Domain-Coupon TLDs
Used by §P2 to decide whether the "free for the first year" benefit can be
promised. Authoritative source is DomainTld/ListTlds → coupons_applicable: true. Use this static
list only as a fallback when that call is unavailable:
.com, .com.au, .co.uk, .net, .org, .art, .at, .co.at, .be, .biz, .blog, .ca,
.ch, .club, .coach, .com.br, .de, .fit, .fitness, .fr, .fun, .in, .co.in,
.org.in, .firm.in, .gen.in, .ind.in, .net.in, .info, .live, .nl, .online,
.pictures, .rocks, .site, .space, .shop, .store, .studio, .training, .work,
.xyz, .yoga
Extract the TLD greedily from the right: site.co.uk → .co.uk, not .uk.
R8. Error Handling (US-37, US-38, US-39)
Silent retry (US-37)
Any failed call: retry once, silently. Say nothing to the user, before or after. Do not narrate "let me try that again", do not mention that anything failed. If the retry succeeds, continue as if nothing happened.
Escalation ladder
| Stage | Trigger | Say (verbatim) |
|---|---|---|
| 1 | Call fails, retry also fails | Something went wrong on our end. Please try again in a moment. |
| 2 | The user tries again and it fails again | Having trouble loading this — try again. You can also search for a domain directly → https://manage.wix.com/account/domains |
The fallback link appears at stage 2, not stage 1. Do not skip stage 1.
Specific errors
| Error | Action |
|---|---|
DOMAINS_UNSUPPORTED_TLD | Not an error to the user — a branch. See §A6. |
403 / access_denied on domain-search v2 | You added auth to a public endpoint. Remove all headers and retry. |
| Offering returns no products | "Wix doesn't support purchasing this TLD. Try a different extension like .com, .net, or .org." |
| Intent upsert validation error | Show which fields are wrong, ask for corrections, retry. See §P5. |
Cart add-items fails | Confirm productId came from the offering response, not hardcoded. Retry once. |
| Anything else, persistent | Escalation ladder above. |
R9. Forbidden Actions
❌ Never:
Expose internal mechanics — no API names, endpoint paths, tool names, error codes, HTTP status codes, field names, or phrases like "the request failed", "I'm calling the …", "saving to the intent API", "adding line items", "canceling the old cart".
Narrate work in progress: "Let me check…", "I'll look that up…", "Verifying…", "Hold on…". The only permitted progress line is "Setting up your order..." at cart build.
Invent a price, a cycle length, a suggestion, or a URL. Every price and cycle comes from the offering response; every suggestion comes from the suggest endpoint; every URL comes from §R6.
Copy a number out of an example. Every worked example in this document uses
{placeholder}braces for exactly this reason. A concrete figure appearing in a template, a transcript, or your own knowledge of what domains usually cost is not data — it is a fabrication with a currency symbol in front of it. If the call that supplies a price could not be made, the flow stops (§P3). It does not continue with a plausible guess.Attach a per-year period to a per-period price. Every figure in
pricingDetails[]—finalPriceandrenewalPricealike, domain and addon alike — is the charge for one whole cycle. A 3-year row's$107.50is one three-year charge./yris correct on a 1-year term and on nothing else; for anything longer the wording is "every {N} years" or "for {N} years" (§P6, §P9). This is arithmetic the user does in their head, and the error is always in the expensive direction.Divide or multiply a price to reach a per-year figure. The response carries
monthlyTotalandlowestCyclePriceprecisely because someone will be tempted; both are unverified in this skill and neither is a substitute for saying which period the price covers. Print the period, not a rate.Re-check availability for a domain that came from the suggest endpoint.
Run an availability check without Check Domain Availability, or call its endpoints from this recipe.
Use
availability.premiumfor anything but the premium-domain row in §R4.1, or as the site's Premium status.Fetch list of sites when a
siteIdis already in context. A partial roster the host preloaded is not that — see Case A.Announce a site count instead of the sites. "You have 93 sites — want me to list them?" asks permission for a step already required. Show them (§R3 Case B) — all of them up to eight, otherwise five and an invitation to name one.
Hedge about ownership the account already settled. Once §R4.3 returns an exact match, the domain is the user's — no "if it's yours", no "do you own this?", no "assuming it's yours". The hedge belongs to the branch where ownership is genuinely an inference, and nowhere else.
Treat a
searchTermhit as ownership. It is a substring search. Compare the returned domain string to the normalized domain exactly, or you will tell a user they own a domain they do not.Hedge about a subdomain whose root domain the account holds. "If shop.maximz.fr is yours" to a user who owns
maximz.frasks them to vouch for something the account already proves. §R1.1 and §A3.1 settle this before any message goes out.Check availability for a subdomain. It is not separately registrable, so there is no answer to get. Go straight to the ownership lookups (§A3.1).
Read a multi-label TLD as a subdomain.
mybrand.co.ukis a root domain. Offering to connectco.ukis the failure the greedy extraction in §R1.1 exists to prevent.Press the root-domain recommendation more than once. It is stated one time (§A3.1d). A user who has declined twice has decided, and the subdomain link still works without it.
Read anything but the match and the site name out of a My Domains response. Registrant names, addresses, phone numbers, expiry dates and contract IDs are all in there. None of it is in scope.
Write to a user's site. Putting a domain on a site, changing its role, moving it and taking it off are all Assign Domain's; hand over and let it ask.
Say "main address" for "primary domain" — or "main domain", "main URL", or any other paraphrase. Root domain is correct only for the domain a subdomain sits under (§R1.1), never for a site's primary domain.
Step outside the skill's scope on a taken domain. No WHOIS or registrant lookup, no naming the owner, no aftermarket/broker/acquisition advice, no valuation, no trademark opinion, no web browsing. A taken domain produces exactly one message — from whichever §A4b branch applies — and nothing is appended to it. The ownership check in §R4.3 is the sole exception, and it only ever looks inside the user's own account. Full boundary: §A1.1.
Use a tool this skill did not ask for. Having WHOIS, web search, or browsing available is not permission to use them. The information sources are the three in §R4 — that is the complete list.
✅ Always:
Normalize the domain before every call.
Reuse the resolved
siteIdfor the rest of the conversation.Reveal information only when it changes what the user must do next.
Say the currency note (§R10) in the same message as any price shown to the user — and never name a currency or convert between two.
R10. Currency at Checkout
Every price this skill shows comes from the offering call as formattedAmount, which arrives with
its own currency symbol already attached (§P3). Checkout is a separate surface and may present the
charge in the user's own currency, so the figure in the conversation and the figure at the till can
differ in currency. The skill cannot tell in advance, so it says exactly that much and no more.
One fixed sentence covers it, and it is the only thing this skill ever says about currency:
At checkout, prices may be shown in your local currency.
It goes in the same message as the prices it qualifies, once, wherever a currency amount is shown to the user — the period table, the privacy options and the pre-checkout summary (§P3, §P6 and §P9). In the summary it sits above the checkout link, so the link stays last.
❌ Never:
Name a currency, or convert between two. "That's about €7.30" invents a figure and does arithmetic on a price in one move — §R9 forbids both. The sentence hedges precisely because the skill does not know what the checkout will show.
Reword it. No "approximate", no "excluding taxes", no "prices may vary", and no promise that the figure will be identical. It says what is known; everything else is invention.
Send it twice in one message, or send it on its own with no price beside it.
Attach it to "Free", to a percentage discount, or to the free-first-year clause (§P2.3). None of those is a currency amount, so there is nothing to localise.
Why this sits after Forbidden Actions rather than in numerical order. Renumbering §R9 would invalidate every reference to it across the document. A new section appended at the end costs nothing and breaks nothing.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
The author says: Requires Wix REST API access (API key or OAuth).
Security
What our scanner noticed· Low risk
- Phrasing that asks for actions without confirmation
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Wix
- Publisher
- Wix (Official)
- Source
- wix/skills · skills/wix-manage · commit d168bc2
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Wix or Wix.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download wix-manage.zip