This guide explains how to add service plugin extensions to your new Wix CLI project as part of migrating an app from the legacy Wix CLI.
All service plugins follow the same pattern. The -cli/ wrapper directory is removed in the new structure:
| Legacy | New |
|---|---|
src/backend/service-plugins/<type>/<type>-cli/plugin.ts | src/extensions/backend/service-plugins/<type>/plugin.ts |
src/backend/service-plugins/<type>/<type>-cli/plugin.json | src/extensions/backend/service-plugins/<type>/<type>.extension.ts |
src/extensions/backend/service-plugins/<type>/.src/backend/service-plugins/<type>/<type>-cli/plugin.ts to src/extensions/backend/service-plugins/<type>/plugin.ts in the new project.plugin.ts file if needed, including imports of backend code.Don't copy the old plugin.json file. It is replaced by a new .extension.ts file.
All service plugins use the same basic structure:
| Field | Source | Required |
|---|---|---|
id | id from plugin.json | Yes. Must match legacy value to preserve the extension. |
source | Path to plugin.ts, relative to src/ | Yes |
Important:
The id must match the value from the legacy plugin.json. Otherwise, the new entry is treated as a separate extension instead of a continuation of the legacy one.
Use the builder name from the table below. Most service plugins only need id and source. The ecom-shipping-rates service plugin supports additional optional fields.
| Legacy type | Builder | Additional optional fields |
|---|---|---|
ecom-shipping-rates | ecomShippingRates | description, fallbackDefinitionMandatory, learnMoreUrl, dashboardUrl, thumbnailUrl |
ecom-gift-cards | ecomGiftCards | none |
ecom-discount-triggers | ecomDiscountTriggers | none |
ecom-payment-settings | ecomPaymentSettings | none |
ecom-validations | ecomValidations | none |
ecom-additional-fees | ecomAdditionalFees | none |
bookings-staff-sorting-provider | bookingsStaffSortingProvider | none |
realtime-permissions-provider | realtimePermissionsProvider | none |
viewer-service | viewerService | none |
data-collections | dataCollections | none |
generic-extension | genericExtension | none |
In the new project, in src/extensions.ts, import the extension and add it with .use():
Return to the Test, build, and release step in the main migration guide.
Last updated: 29 June 2026