The following slots and APIs are available when building a site plugin for the Checkout Page.
Important: Some plugins may not support automatic addition upon installation, even with autoAddToSite enabled. In that case, you must:
addSitePlugin() to let users add the plugin to the checkout slot.addSitePlugin() to work properly.The following image shows slots in the checkout page, into which users can add plugins.

Each slot is identified by a unique placement slot ID. Declare the slots your plugin can be added to by listing their IDs in the placementsSlotIds array in your plugin's configuration:
The following table lists the placement slot ID for each slot in the Slots diagram:
| Slot | Placement slot ID |
|---|---|
checkout:header | bb058d1f-b70f-4df9-9da0-0523322a38a1 |
checkout:top | 210b7bf5-8532-4f42-9f5f-00204534b403 |
checkout:steps:before | 16cf4440-fa01-47ff-973e-051bb91c25d9 |
checkout:delivery-step:options:after | b64dc1ee-b8d6-4870-9758-01f6c0c22fef |
checkout:policies:after-1 | Not yet available. Use the legacy placements format for this slot. |
checkout:summary:before | 969d874f-bdba-4429-a626-ff801d712c6a |
checkout:summary:lineItems:after | 6918440e-160c-4b55-87b6-2af2e83b3174 |
checkout:summary:lineItems:after2 | f63efbab-2b28-4565-af96-d198040d2303 |
checkout:summary:totalsBreakdown:before | 5e7ea8d8-adec-4a12-b28b-d07fbb055442 |
checkout:summary:after | c9614893-83dd-4481-8a86-62ce3c696fb0 |
For example, to allow your plugin to be placed before the totals breakdown in a checkout page:
Note: The legacy placements format isn't deprecated, and plugins that haven't been migrated continue to work. We still recommend migrating your code to placementsSlotIds.
placements valuesThe slots are represented by the following placement object:
Provide the following values for each property:
| Key | Value |
|---|---|
appDefinitionId | "1380b703-ce81-ff05-f115-39571d94dfcd" |
widgetId | "14fd5970-8072-c276-1246-058b79e70c1a" |
slotId | ID of the slot you want as displayed in the image above. Supported values:
|
For example, for your widget to appear before the totals breakdown in a checkout page use the following object in your configuration:
Use the Checkout plugin API to integrate with the plugin's host.
The API provides data about the current checkout process, and a function that refreshes the checkout after your plugin changes it.
Note: The checkout:delivery-step:options:after slot uses a different API.
| Name | Type | Description |
|---|---|---|
checkoutId | String | The ID of the current checkout process. |
stepId | String | The ID of the step currently rendered in the checkout page, which can be one of the following:
|
checkoutUpdatedDate | String | Date and time the checkout was updated. |
slotBrand | Object | The resolved brand styling for the section where your slot is rendered, so your plugin can match the merchant's checkout theme. Always defined, with sensible defaults when the merchant hasn't customized their checkout. See Brand styling. |
| Name | Type | Description |
|---|---|---|
onRefreshCheckout() | (refreshCheckoutCallback: () => void) => void | An event handler that accepts a callback function that's invoked by a widget. The widget should call the function whenever the checkout needs to be refreshed. In a custom element, Wix sets onRefreshCheckout to the refresh function itself, so you call it with no arguments. |
When you build a checkout plugin as a custom element, whether with the CLI or in a self-managed app, Wix passes it the checkout plugin API as follows:
checkoutId and onRefreshCheckout. Receive them with setters. A setter is a method declared with set that runs each time Wix sets the property it's named after.checkout-id, so code that reads attributes also works.onRefreshCheckout holds the function that refreshes the checkout. Call it with no arguments after your plugin changes the checkout.connectedCallback(), as the following example does.customElements.define().The following example stores and displays the checkout ID and the current step. It also stores the refresh function for its refreshCheckout() method, which you call after your plugin changes the checkout:
If you write the element in React, wrap the component with react-to-webcomponent and declare onRefreshCheckout as a method prop. The method prop type requires @r2wc/core 1.3.0 or later, which react-to-webcomponent depends on. The React example requires React 18. You don't need the connectedCallback() step, because react-to-webcomponent picks up values that Wix set early.
The following example displays the checkout ID and refreshes the checkout when a site visitor clicks Refresh checkout:
In Velo, read the properties from $widget.props, and export an onRefreshCheckout() function. The checkout calls it with the refresh callback, which you call after your plugin changes the checkout:
Merchants can theme their checkout (colors and corner radius). Checkout can't style your slot for you, so it passes the resolved design to your plugin as data in the slotBrand property, for you to apply in your own markup.
The values are:
textColor and buttonTextColor are pre-resolved for contrast against their section's background.Note: Checkout re-pushes slotBrand on every change, including live edits in the checkout composer. Read it reactively and reapply it each time. Don't cache a value read once at startup.
The slotBrand object has the following properties:
| Name | Type | Description |
|---|---|---|
backgroundColor | String | Background color of the section behind your slot, as a hex value. |
textColor | String | Text color for the section where the slot sits, as a hex value. Pre-resolved for contrast against backgroundColor. |
buttonColor | String | Color of the checkout's primary button, as a hex value. |
buttonTextColor | String | Text color of the primary button, as a hex value. Pre-resolved for contrast against buttonColor. |
selectionColor | String | Color of radio buttons and checkboxes, as a hex value. |
cornerRadius | Number | Default corner radius, in pixels, for the section where the slot sits. |
In both a custom element and Velo, slotBrand reaches you as a ready-to-use object. Read it, apply the values, and reapply them on every change. How you apply them depends on the framework.
In a custom element, receive slotBrand with a setter, which runs again on every change. As in Receive the API in a custom element, connectedCallback() passes a value that Wix set early to the setter:
In Velo, slotBrand is on $widget.props. Apply the same values to your elements through their style APIs when the widget loads, and again on every change with $widget.onPropsChanged():
Important: Checkout paints a white background behind your slot, so anything your slot doesn't cover renders as white. To avoid white gaps:
backgroundColor on your outermost element, and use padding rather than margin for spacing.cornerRadius to the outermost element, because the rounded corners expose white notches. Keep the outermost element square and full-bleed, and apply the corner radius (and any border) to a nested element.If you don't use slotBrand, your slot renders on a white background, which can look broken on a dark-themed checkout.
Checkout plugins require a dashboard page so users can add the plugin to their checkout page. Use addSitePlugin() to trigger the addition flow. The pluginId is the ID of your site plugin extension, which you can find in your app's dashboard under Extensions.
Important: Some plugins may not support automatic addition upon installation, even with autoAddToSite enabled. In that case, you must:
addSitePlugin() to let users add the plugin to the checkout slot.addSitePlugin() to work properly.The checkout:delivery-step:options:after slot uses a different API than the other checkout slots.
| Name | Type | Description |
|---|---|---|
checkoutId | String | The ID of the current checkout process. |
checkoutUpdatedDate | String | Date and time the checkout was updated. |
selectedDeliveryOptionCarrierId | String | The ID of the carrier for the selected delivery option. |
selectedDeliveryOptionId | String | The ID of the selected delivery option. |
deliveryStepState | String | The current state of the delivery step. Possible values: 'open' or 'summary'. |
slotBrand | Object | The resolved brand styling for the checkout's form section, where this slot renders, so your plugin can match the merchant's checkout theme. Always defined, with sensible defaults when the merchant hasn't customized their checkout. See Brand styling. |
| Name | Type | Description |
|---|---|---|
onRefreshCheckout() | (callback: () => Promise<void>) => void | An event handler that accepts a callback function that's invoked by a widget. The widget should call the function whenever the checkout needs to be refreshed. |
disableContinueButton() | (callback: (isDisabled: boolean) => void) => void | An event handler that accepts a callback function to control the checkout's continue button. Call the callback with true to disable the button, or false to enable it. |
The following permissions are relevant for most checkout plugins:
The following webhooks are relevant to most checkout plugins:
The Checkout page is the final step in the customer's purchase process. Its layout is closed and can't be changed by users or third parties, and all Wix eCommerce sites share the same checkout structure. Merchants can customize the checkout's colors and corner radius, and your plugin can match those choices — see Brand styling.
To test a checkout plugin:
Checkout plugins usually need to integrate with Wix eCommerce's Checkout APIs, as well as other backend APIs.
In your site plugin or in your app's server code, you may want to perform actions or implement logic that's dependent on the state of the current checkout or related data.
The following Wix APIs may be useful:
Last updated: 21 October 2026