Documentation
Feedback
Guides
API Reference

Guides
Guides
VTEX Sales App

Exploring Sales App extensions

Customize Sales App with extension points in the cart, product detail page, and menu.

This feature is in beta, and we're working to improve it. If you have any questions, please contact our Support.

VTEX Sales App provides extension points in the cart that let you customize the user experience and interface according to your store's requirements.

The available extension points for Sales App are:

Extension PointCategoryDescriptionLayout shift
cart.cart-list.afterCartRender content after the full cart item list and before the bottom of the cart page.No
cart.cart-item.afterCartRender content below each cart item row.Yes ⚠️
cart.order-summary.afterCartAdd components below the order summary on the cart page.Yes ⚠️
pdp.sidebar.beforePDPRender content at the top of the product detail page sidebar, before the default purchase and shipping content.Yes ⚠️
pdp.sidebar.afterPDPRender content after the product details page sidebar.Yes ⚠️
pdp.content.afterPDPRender content below the main product detail page content, after sections such as related products or frequently bought together.Yes ⚠️
menu.itemMenuAdd a custom tile to the Sales App side menu.No
menu.drawer-contentMenuDefine the content shown in the drawer opened from your menu.item tile.No

Some extension points may trigger layout shifts. If your extension fetches data, reserve space in the area where the extension renders so the layout remains stable while the content loads. Use skeletons or loading states to improve the user experience, especially in extension points where layout shifts may occur. Static extensions and extensions that use only data-layer hooks shouldn't cause layout shifts, because the VTEX Sales App renders them consistently within the layout.

The following sections describe each extension point in more detail. For the full list of available hooks and types for building your extensions, see Sales App extension hooks and types.

Cart extension points

Use the following cart extension points to customize different areas of the cart experience.

cart.cart-list.after

Use this extension point to render content after the entire cart item list and before the bottom of the cart page. It's ideal for cart-level messaging such as cross-sell components, store policies, or trust and security notices that apply to the whole order.

  • Available hooks: useCart, useExtension
  • Layout shift: No. VTEX Sales App reserves this area in the layout, so static and data-layer–only components render without moving surrounding content.

{"base64":"  ","img":{"width":1920,"height":1002,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":27902,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/cart.cart-list.after.webp"}}

cart.cart-item.after

This extension point renders immediately below each cart item row, allowing you to attach item-specific content such as warranties, services, item badges, or custom delivery details for that product.

  • Available hooks: useCart, useCartItem, useExtension
  • Layout shift: Yes. Components that fetch remote data or change height over time can cause nearby elements to move. Reserve vertical space and implement loading states or skeletons to keep the cart stable while data loads.

{"base64":"  ","img":{"width":1920,"height":1001,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":31040,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/cart.cart-item.after.webp"}}

cart.order-summary.after

Use this extension point to append components under the order summary on the cart page, such as financing simulators, loyalty messages, or upsell suggestions based on the current totals.

  • Available hooks: useCart, useExtension
  • Layout shift: Yes. Because it's adjacent to key actions (like the Continue button), dynamic height changes are noticeable. Pre-allocate space and display skeletons or loading indicators to avoid pushing the summary or primary button while data is loading.

{"base64":"  ","img":{"width":1920,"height":1001,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":27996,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/cart.order-summary.after.webp"}}

Product Detail Page (PDP) extension points

Use the following PDP extension points to customize key areas of the product detail page.

pdp.sidebar.before

This extension point appears at the top of the PDP sidebar, before the standard purchase and shipping content. It's useful for badges, membership highlights, or store-specific information that should appear near the main buying actions.

  • Available hooks: usePDP, useCart, useExtension
  • Layout shift: Yes. Content rendered here can change the position of the rest of the sidebar. When fetching data, keep components compact, reserve height, and use loading placeholders to minimize visible shifts.

{"base64":"  ","img":{"width":2982,"height":1698,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":48936,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/pdp.sidebar.before.webp"}}

pdp.sidebar.after

Use this extension point to render content after the PDP sidebar, such as additional services, store pickup programs, or fulfillment-related contextual recommendations.

  • Available hooks: usePDP, useCart, useExtension
  • Layout shift: Yes. Late-loading data or components that expand can push the sidebar content up or down. Implement skeletons and fixed minimum heights to keep the sidebar visually stable while your extension loads.

{"base64":"  ","img":{"width":2048,"height":1169,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":29386,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/pdp.sidebar.after.webp"}}

pdp.content.after

This extension point is located below the main PDP content area, after sections like related products or "frequently bought together". It's recommended for long-form or secondary content, such as recommendations, promotions, or informational blocks, that don't need to appear near the Buy button.

  • Available hooks: usePDP, useCart, useExtension
  • Layout shift: Yes. Because it sits near the bottom of the page, vertical movement is less disruptive but still noticeable. Allocate enough vertical space and use loading states when rendering content that depends on external APIs.

{"base64":"  ","img":{"width":2048,"height":1162,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":38128,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/pdp.content.after.webp"}}

Use the following menu extension points to add custom entry points and flows to the Sales App menu.

This extension point adds a custom tile to the Sales App side menu, providing an entry point to your own flow (for example, a loyalty dashboard, financing calculator, or partner app).

  • Available hooks: useExtension
  • Layout shift: No. The tile is rendered within the existing menu grid, and static labels or icons do not affect the surrounding layout. Keep the label concise so it fits well among other menu tiles.

{"base64":"  ","img":{"width":1000,"height":610,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":9432,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/menu.item.webp"}}

Create a simple component that returns a string within HTML tags, such as div or p.


_10
import React from "react";
_10
_10
export function MenuItem() {
_10
return <div>Extension</div>;
_10
}

This component is optional. If you don't create it, a default menu labeled Extension Point will be displayed. The menu will only be visible if you define the menu.drawer-content extension.

This extension point defines the content of the drawer opened from your menu.item tile, allowing you to build full-screen flows such as forms, dashboards, or multi-step tasks without leaving the VTEX Sales App.

  • Available hooks: useCurrentUser, useExtension
  • Layout shift: No. The drawer area is fully reserved in advance, so rendering dynamic content inside it does not move elements on the underlying page. Focus on performance and responsiveness rather than reserving extra height.

{"base64":"  ","img":{"width":1882,"height":1634,"type":"webp","mime":"image/webp","wUnits":"px","hUnits":"px","length":29488,"url":"https://cdn.jsdelivr.net/gh/vtexdocs/dev-portal-content@main/images/menu.drawer-content.webp"}}

Contributors
1
Photo of the contributor
Was this helpful?
Yes
No
Suggest Edits (GitHub)
See also
Setting up Sales App extensions
Guides
Creating Sales App extensions
Guides
Contributors
1
Photo of the contributor
Was this helpful?
Suggest edits (GitHub)
On this page