Migrate Service Plugin Extensions

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.

Folder structure

All service plugins follow the same pattern. The -cli/ wrapper directory is removed in the new structure:

LegacyNew
src/backend/service-plugins/<type>/<type>-cli/plugin.tssrc/extensions/backend/service-plugins/<type>/plugin.ts
src/backend/service-plugins/<type>/<type>-cli/plugin.jsonsrc/extensions/backend/service-plugins/<type>/<type>.extension.ts

Step 1 | Move files

  1. In the new project, create the folder src/extensions/backend/service-plugins/<type>/.
  2. From the legacy project, copy src/backend/service-plugins/<type>/<type>-cli/plugin.ts to src/extensions/backend/service-plugins/<type>/plugin.ts in the new project.
  3. Fix any import paths in the 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.

Step 2 | Create the extension file

All service plugins use the same basic structure:

Copy
FieldSourceRequired
idid from plugin.jsonYes. Must match legacy value to preserve the extension.
sourcePath 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.

Builder names and fields

Legacy typeBuilderAdditional optional fields
ecom-shipping-ratesecomShippingRatesdescription, fallbackDefinitionMandatory, learnMoreUrl, dashboardUrl, thumbnailUrl
ecom-gift-cardsecomGiftCardsnone
ecom-discount-triggersecomDiscountTriggersnone
ecom-payment-settingsecomPaymentSettingsnone
ecom-validationsecomValidationsnone
ecom-additional-feesecomAdditionalFeesnone
bookings-staff-sorting-providerbookingsStaffSortingProvidernone
realtime-permissions-providerrealtimePermissionsProvidernone
viewer-serviceviewerServicenone
data-collectionsdataCollectionsnone
generic-extensiongenericExtensionnone

ecom-shipping-rates with optional fields

Copy

Step 3 | Register the extension

In the new project, in src/extensions.ts, import the extension and add it with .use():

Copy

Step 4 | Return to the main migration guide

Return to the Test, build, and release step in the main migration guide.

Last updated: 29 June 2026

Did this help?