The existing shopify.print could only open the system print dialog, and had no way to target a dedicated receipt printer. The new shopify.printing enumerates the printers connected to the device and sends print jobs directly, with no dialog.
shopify.printing).shopify.printcould only "open the system print dialog." The dialog can't target a dedicated receipt printer, so staff had to pick one by hand every time — or couldn't print at all.
shopify.printinggetPrinters() retrieves the connected printers, andprint(src, {printer}) prints directly. No dialog appears.printer can be omitted to keep using the dialog as before.
shopify.print is now deprecated, butno immediate action is required. Plan the migration whenever you adopt 2026-07. Earlier POS UI Extensions API versions are unchanged.
shopify.printing.getPrinters()Returns the list of hardware printers available on that device . Each printer has id / name / connected(connection status).
always an empty array below POS 11.11.0. It stays empty even when a receipt printer is already paired.
shopify.printing.print(src, options?)src — prints the document at that URL.
options.printer Omitted → the system print dialog opens.getPrinters() → pass a printer it returned → prints directly to that printer with no dialog.
| Printer info | Description |
|---|---|
id | Printer identifier |
name | Printer name |
connected | Connection status. In practice, you generally pick the ones where connected is true |
The Printing API is available on every POS UI extension target .
| Item | shopify.print (deprecated) | shopify.printing(2026-07~) |
|---|---|---|
| Enumerate printers | No | getPrinters() id / name / connected |
| Target a specific receipt printer | No The dialog can't target a dedicated receipt printer | Yes Print directly with no dialog |
| System print dialog | Only option | printer Omit it and it works as before |
| Status | deprecated but no immediate action needed | Recommended Migrate when you adopt 2026-07 |
| Older API versions | Earlier POS UI Extensions API versions areunchanged | |
application_url -relative pathExample: '/print/receipt'
URLs on a different origin are not supported.
Receipt printers candirectly render.printer — pass it to print without a dialog.
Like HTML, receipt printers can render these directly.
System print dialog required.src is a PDF and you pass printer , print throws an error. For PDFs, always use options.printer is omitted.
getPrinters() returning an empty array is a case you must always handle by falling back to the system print dialog. This covers not only devices below POS 11.11.0, but alsomerchants who have no receipt printer .
const printers = await shopify.printing.getPrinters();
const receiptPrinter = printers.find((printer) => printer.connected);
if (receiptPrinter) {
await shopify.printing.print('/print/receipt', {printer: receiptPrinter});
} else {
await shopify.printing.print('/print/receipt');
}
getPrinters() to fetch the list, then select the one whoseconnected is true.
print(src, {printer}). The dialog never opens.
print(src) only. Legacy environments and stores without a printer still work this way.
getPrinters() returns an empty array.
Note that this limitation does not affect the system print dialog, which remains available.
On a development store, set up POS 11.11.0 or later+a paired receipt printer , then usegetPrinters() to get a printer and pass it to shopify.printing.print .If it prints without showing the dialog, direct printing is working.
On POS versions below 11.11.0, or in stores with no receipt printer, getPrinters() returns an empty array.Always write a branch that falls back to the dialog. Treating it as an exception will break printing in those environments.
src points to a PDF, passing printer will make shopify.printing.print throw an error.For PDFs, always leave options.printer outand let the dialog handle it. For receipts, HTML or images is the natural choice.
The only thing you can pass is application_url a relative path from the root, ora full same-origin URL only. The fetch goes through the extension's session token, so the print endpoint should bedesigned to authenticate with that token and return the rendered result.
shopify.print is deprecated, but no immediate action is needed. Earlier API versions are unchanged, so existing extensions keep working.Replacing it when you bump to 2026-07is the lowest-cost path.
The Printing API is all POS UI extension targets . You aren't tied to a specific screen, so you can place the print button wherever it fits your workflow — order details, cart, custom actions, and so on. Test on a development store with POS 11.11.0 or later and a paired receipt printer, and checkwhether it prints without showing a dialog.
getPrinters() → connected printer selection → print(src, {printer}) .getPrinters() returns an empty result — branch on that alone. Don't write version checks; just treatempty array = dialog as a single fallback covers both cases./print/<帳票> endpoint, then from a custom action in the POS UI extension call shopify.printing.print to send it to the same receipt printer.src takes a path relative to application_url , or a same-origin URL. It isfetched with the extension's session token, so your endpoint should verify that token and return the HTML.shopify.print is deprecated, but no immediate action is needed — migrate everything at once when you adopt 2026-07."