Shopify has just released a major UI upgrade for POS extensions. The 2026‑10 API introduces s‑pos‑list, a virtualized list component that replaces the old List component and lets developers build mixed‑type rows with custom templates while dramatically improving performance on large data sets. If you build or maintain POS extensions, this update is worth a close look.
What Changed
The classic List component, which shipped up to API version 2025‑07, has been retired. It rendered every row as a separate view, causing display time and memory usage to grow linearly with list size. The new s‑pos‑list component fills the gap in Polaris web components, offering a virtualized scrolling experience. Developers now provide raw row data and a template for each row type—headings, dividers, content rows, etc.—and the POS engine recycles row views as the user scrolls.
Who Is Affected
Why It Matters
Mapping rows into s‑scroll‑box (the technique used by the old List) forces the POS to create a view for every row upfront. On devices with limited resources—like iPads or low‑end tablets—large lists can lag or even fail to render. s‑pos‑list virtualizes the list, creating only the rows that are visible on screen. In benchmark tests on an iPad (A16) with a complex row layout, s‑pos‑list matched or exceeded the speed of the legacy List while using a fraction of the memory.
How to Migrate
No mandatory code change is required; existing extensions will keep working. However, when you bump your extension’s api_version to "2026-10" and confirm the POS version is 11.17.0 or newer, you can replace List with s‑pos‑list to reap performance gains. Below is a side‑by‑side mapping that shows the minimal adjustments:
// Before (2025‑07)
import { List } from '@shopify/ui-extensions/pos';
<List rows={myRows}>
{(row) => <RowComponent data={row} />}
</List>
// After (2026‑10)
import { sPosList } from '@shopify/ui-extensions/pos';
<sPosList rows={myRows}>
<template slot="heading" let:row>
<HeadingComponent data={row} />
</template>
<template slot="divider" let:row>
<DividerComponent />
</template>
<template slot="content" let:row>
<ContentComponent data={row} />
</template>
</sPosList>
Key points in the migration:
Action Checklist
Conclusion
s‑pos‑list is a welcome performance upgrade for Shopify POS UI extensions, especially for merchants with extensive inventories or order histories. While the change is optional, adopting the 2026‑10 API now positions your extensions for faster rendering, lower memory usage, and a more polished in‑store experience. Ready to boost your POS UI? Update your extension’s API version, swap in s‑pos‑list, and watch large lists glide effortlessly.
If you have questions or need help with the migration, reach out in the Shopify Developers Discord or drop a comment below. Happy coding!
