This service provides data-gathering tools used by the discount recommendation flows. These are internal APIs hosted at manage.wix.com (not wixapis.com).
Base URL: https://manage.wix.com/recommendations
Permission: ecom:discounts_recommendations:v1:recommendation:build_recommendation
These endpoints are not directly callable as MCP tools. You must use CallWixSiteAPI to invoke them:
Important: You must have a siteId before calling any of these. Use ListWixSites first to resolve the site.
Retrieves site-level business metrics needed for discount analysis.
Endpoint: POST https://manage.wix.com/recommendations/v1/recommendations/get-site-data-tool
Request:
Response:
| Field | Type | Description |
|---|---|---|
country | string | Site's primary country (ISO alpha-2) |
businessType | string | Type of business |
industry | string | Industry vertical |
visitors | int | Visitors in last 30 days (0-1M) |
revenue | int | Revenue in last 30 days in site currency (0-1M) |
ordersCount | int | Orders in last 30 days (0-1M) |
aov | int | Average order value (revenue / ordersCount) |
currency | string | Store currency code (ISO-4217) |
language | string | Site language code |
currentDiscounts | string | "YES" or "NO" — whether active discounts exist |
discountMargin | double | Global max discount as decimal (0.25 = 25%) |
Validation: If country, industry, or revenue are missing/null, do not proceed with recommendations.
Note: discountMargin is returned as a decimal (0.25). Convert to percentage by multiplying by 100 (= 25%).
Computes aggregate statistics on the product catalog, grouped by category.
Endpoint: POST https://manage.wix.com/recommendations/v1/recommendations/get-catalog-analytics-tool
Request:
Request fields:
| Field | Type | Required | Description |
|---|---|---|---|
aggregates | array | Yes | List of aggregation operations (max 100) |
aggregates[].op | enum | Yes | count, sum, avg, min, max, stddev, quantiles |
aggregates[].field | enum | Yes | quantity, price, cost, profit, profitMargin, ordersCount |
aggregates[].q | double[] | If QUANTILES | Quantile values 0.0-1.0 (max 20) |
minMarginPct | double | Yes | Min margin filter as decimal (e.g., 0.15 for 15%) |
Response:
Aggregates to request per business goal:
| Goal | Aggregates |
|---|---|
| UPSELL_BOOST | count(price), quantiles([0.5,0.75,0.9], price), avg(profitMargin) |
| STOCK_MOVER | sum(quantity), sum(ordersCount), avg(profitMargin) |
| SEASONAL | sum(ordersCount), quantiles([0.5,0.9], price), avg(profitMargin) |
| BUNDLE_AND_SAVE | min(price), max(price), avg(profitMargin), count(price) |
Important: Always exclude "All Products" from category-level analysis. Use the "All Products" group only for overall catalog stats (AOV sanity check, price distribution).
Fetches product-level data for analysis. Returns individual products with pricing, margins, and inventory.
Endpoint: POST https://manage.wix.com/recommendations/v1/recommendations/get-product-catalog-data-tool
Request:
Request fields:
| Field | Type | Required | Description |
|---|---|---|---|
query | string | No | Keyword filter for products (max 250 chars) |
categoryNames | string[] | No | Category names to restrict search (max 10). Pass empty array if none. |
businessGoal | string | No | UPSELL_BOOST, BUNDLE_AND_SAVE, STOCK_MOVER, or SEASONAL. Affects sort order. |
minMarginPct | double | Yes | Min margin filter as decimal (0.15 = 15%) |
catalogLimit | int | No | Max products to return (1-1000, default 30) |
Sort order by goal (applied server-side based on businessGoal):
| Goal | Sort order |
|---|---|
| UPSELL_BOOST | price DESC, ordersCount DESC |
| BUNDLE_AND_SAVE | price DESC, ordersCount DESC |
| STOCK_MOVER | quantity DESC, ordersCount ASC |
| SEASONAL | ordersCount DESC |
Response:
Response item fields:
| Field | Type | Description |
|---|---|---|
id | string | Product UUID — use this for productIds in discount rules |
name | string | Product name |
description | string | Product description |
brand | string | Product brand |
quantity | int | Current stock level |
price | double | Product price |
profit | double | Profit per unit |
profitMargin | double | Profit margin as decimal (0.45 = 45%) |
ordersCount | int | Number of orders in the period |
Important rules:
categoryNamesConverts human-readable category names to GUID IDs. Must be called before using CATEGORY scope — never output category names as IDs.
Endpoint: POST https://manage.wix.com/recommendations/v1/recommendations/get-category-ids-tool
Request:
Response:
| Field | Type | Description |
|---|---|---|
categoryNames | string[] | Category names to convert (max 10, max 100 chars each) |
categoryIds | string[] | Resolved GUIDs (GUID format) |
If empty response: The category name doesn't exist. Fall back to SITE scope and explain: "Could not resolve IDs for category '{name}', using site-wide discount instead."
All discount L4 flows follow this data-gathering pattern:
Single attempt policy: You get one chance to call GetCatalogAnalytics + GetProductCatalogData. No retries.
Partial failure handling: