Setup Discount Rules

Download skillThe skill is a reference md and part of wix-manage skill. You can use the following command to add the full wix-manage skill to your project:
Copy

Prerequisites

  • Wix Stores (or another eCommerce business solution) installed on the site
  • At least one product in the catalog

Required APIs


Step 1: Query existing discount rules

Before creating new rules, check what already exists to avoid conflicts.

Endpoint: POST https://www.wixapis.com/ecom/v1/discount-rules/query

Request:

Copy

Response:

Copy

Note existing rules and their scopes to avoid stacking conflicts.


Step 2: Create a percentage discount rule

Endpoint: POST https://www.wixapis.com/ecom/v1/discount-rules

Request — 20% off all products:

Copy

Response:

Copy

Request — 15% off a specific collection:

Copy

Step 3: Create a fixed-amount discount rule

Request — $5 off specific products:

Copy

Step 4: Update a discount rule

Endpoint: PATCH https://www.wixapis.com/ecom/v1/discount-rules/{discountRuleId}

Request:

Copy

The revision field is required and must match the current revision.


Step 5: Deactivate or delete a discount rule

To deactivate without deleting:

Copy

To delete permanently:

Endpoint: DELETE https://www.wixapis.com/ecom/v1/discount-rules/{discountRuleId}


Key field rules

FieldRequiredNotes
nameYesInternal name for the rule
activeYesWhether the rule is currently applied
activeTimeInfo.startNoISO 8601 start time. Omit for immediate activation
activeTimeInfo.endNoISO 8601 end time. Omit for no expiration
discounts[].discount.discountTypeYesPERCENTAGE or FIXED_AMOUNT
discounts[].discount.percentageIf PERCENTAGEInteger 1-100
discounts[].discount.fixedAmountIf FIXED_AMOUNTDecimal string (e.g., "5.00")
discounts[].scope.typeYesCATALOG, COLLECTION, or SPECIFIC_PRODUCTS
discounts[].scope.idYes"catalog" for CATALOG type, or the collection/product UUID

Scope types

Scope Typescope.id valueDescription
CATALOG"catalog"Applies to all products in the store
COLLECTIONCollection UUIDApplies to all products in a specific collection
SPECIFIC_PRODUCTSProduct UUIDApplies to a single product (use multiple discount entries for multiple products)

Recommendation → API Mapping

When creating a discount rule from a recommendation output, use this mapping to convert the recommendation's simplified JSON into the actual Discount Rules API payload.

Constants

  • Store catalog app ID: 215238eb-22a5-4c36-9e7b-e7c08025e04e — used in all scope constructions below.
  • Initial state: Recommendations create rules as active: false with status: "PENDING". The merchant must approve before the rule goes live.

Scope mapping

The recommendation's scope field maps to the API's internal scope structure. The scope ID uses a prefix convention:

Recommendation scopeAPI scope typeScope ID prefixHow to build
SITECATALOG_ITEMall_Set catalogItemFilter.catalogAppId to the store catalog app ID. No item IDs.
ITEMSCATALOG_ITEMspecific_Set catalogItemFilter.catalogAppId + catalogItemFilter.catalogItemIds to the product UUIDs from productIds.
CATEGORYCUSTOM_FILTERcollections_Set customFilter.appId to the store catalog app ID + customFilter.params.collectionIds to the category UUIDs from categoryIds.

Example — SITE scope:

Copy

Example — ITEMS scope (with product IDs):

Copy

Example — CATEGORY scope (with collection IDs):

Copy

Discount type mapping

Recommendation discountTypeAPI field to setValue format
PERCENTAGEdiscount.percentageInteger (e.g., 15)
FIXED_AMOUNTdiscount.fixedAmountString (e.g., "5.00")
FIXED_PRICEdiscount.fixedPriceString (e.g., "29.99")

All discount entries use targetType: "SPECIFIC_ITEMS" with the scope wrapped in specificItemsInfo.scopes[].

Trigger mapping (conditions)

Triggers determine WHEN the discount activates. They are built from the recommendation's conditions fields. If no conditions exist (both minSubTotal and minItemQuantity are 0), do NOT set a trigger — the discount applies unconditionally.

ConditionTrigger typeHow to build
minItemQuantity > 0 onlyITEM_QUANTITY_RANGESet itemQuantityRange.from to the value. No upper bound. Include the same scope as the discount target.
minSubTotal > 0 onlySUBTOTAL_RANGESet subtotalRange.from to the value as a string. No upper bound. Include the same scope.
Both conditions > 0ANDCombine both triggers in and.triggers[] array.
Neither conditionNo triggerLeave trigger field unset entirely.

Example — minSubTotal trigger (upsell boost: spend $200+):

Copy

Example — minItemQuantity trigger (bundle: buy 3+):

Copy

Example — AND trigger (both conditions):

Copy

Date handling

Recommendation fieldAPI mapping
startDate is a date string (e.g., "2026-06-01")Convert to ISO 8601 timestamp: activeTimeInfo.start
startDate is empty ""Default to current time (now)
endDate is a date stringConvert to ISO 8601 timestamp: activeTimeInfo.end
endDate is empty ""Omit activeTimeInfo.end — rule has no expiration

Settings

All recommendation-created rules use these fixed settings:

Copy

Error Handling

ErrorCauseFix
DISCOUNT_RULE_NOT_FOUNDThe discount rule ID doesn't existRe-query discount rules to get current IDs
REVISION_MISMATCHThe revision doesn't match the current versionRe-fetch the rule to get the latest revision, then retry
INVALID_DISCOUNT_TYPEUnsupported discount typeUse PERCENTAGE or FIXED_AMOUNT
Both productIds and categoryIds setScope mutual exclusivity violationUse only one: ITEMS with productIds OR CATEGORY with categoryIds
productIds empty when scope is ITEMSMissing required IDsQuery products and provide at least 1 product UUID
categoryIds empty when scope is CATEGORYMissing required IDsCall getCategoryIds to convert category names to GUIDs

References

Did this help?