Printing API 登場 POS 拡張から「レシートプリンタへ直接印刷」できるようになった
原題: POS UI extensions can now print directly to hardware receipt printers
- POS UI Extensions
- Printing API
- Shopify POS
- 非推奨
- 新機能
- Apps
- SDK
- Session Token
- Receipt Printer
図解 : POS UI Extensions の Printing API(レシートプリンタへの直接印刷) POS UI Extensions 2026-07 / 新 API Printing API 登場 POS 拡張から「レシートプリンタへ直接印刷」できるようになった これまでの shopify.print はシステムの印刷ダイアログを開くことしかできず、専用レシートプリンタを狙い撃ちできなかった。新しい shopify.printing は端末に繋がったプリンタを列挙し、ダイアログ無しで直接印刷ジョブを飛ばせる。 このページの構成 30 秒で理解 : 何が変わったか 仕組み図解 : 印刷が飛ぶまでの流れ 2 つの API : getPrinters() と print() 旧 shopify.print との比較 src とドキュメント形式のルール 実装の型(フォールバック必須) 技術者が押さえるべき 5 つのポイント 業務に活かせる 3 つのユースケース 提案で使える 1 行サマリ 1 30 秒で理解 : 何が変わったか POS UI Extensions 2026-07 で Printing API( shopify.printing ) が追加された。 拡張から 端末に繋がっているハードウェアプリンタを列挙 し、 印刷ダイアログを出さずに レシートプリンタへ直接ドキュメントを送れる。 これまで : shopify.print できるのは「システムの印刷ダイアログを開く」ことだけ。ダイアログは専用レシートプリンタをターゲットにできないため、スタッフが毎回手で選ぶ/そもそも出せないという状態だった。 これから : shopify.printing getPrinters() で繋がっているプリンタを取得し、 print(src, {printer}) で直接印刷。ダイアログは出ない。 printer を省略すれば従来どおりダイアログも使える。 旧 shopify.print は deprecated(非推奨) になったが、 即時対応は不要 。2026-07 を採用するタイミングで移行を計画すればよい。それより前の POS UI Extensions API バージョンは変更なし。 2 仕組み図解 : 印刷が飛ぶまでの流れ ドキュメントは 拡張のセッショントークンを使って fetch される 。つまりアプリ側の印刷用エンドポイントは、そのトークンで認証して中身を返す作りにしておけばよい。 3 2 つの API : getPrinters() と print() shopify.printing.getPrinters() その端末で利用できる ハードウェアプリンタの一覧 を返す。各プリンタは id / name / connected (接続状態)を持つ。 POS 11.11.0 未満では常に空配列 。レシートプリンタがペアリング済みでも空になる。 shopify.printing.print(src, options?) src のドキュメントを印刷する。 options.printer 省略 → システム印刷ダイアログが開く。 getPrinters() が返したプリンタを渡す → ダイアログ無しでそのプリンタに直接印刷。 プリンタ情報 内容 id プリンタの識別子 name プリンタ名 connected 接続状態。実装では connected が true のものを選ぶのが基本 Printing API は すべての POS UI extension ターゲット で利用できる。 4 旧 shopify.print との比較 項目 shopify.print(非推奨) shopify.printing(2026-07〜) プリンタの列挙 不可 getPrinters() id / name / connected レシートプリンタ指定 不可 ダイアログは専用レシートプリンタをターゲットにできない 可能 ダイアログ無しで直接印刷 システム印刷ダイアログ これだけ printer 省略で従来どおり利用可 ステータス deprecated ただし即時対応不要 推奨 2026-07 採用時に移行 旧 API バージョン それ以前の POS UI Extensions API バージョンは 変更なし 5 src とドキュメント形式のルール src に渡せるもの OK アプリの application_url に付く相対パス 例 : '/print/receipt' OK 同一オリジンのフル URL オリジンが違う URL は対象外。 ドキュメントの取得は 拡張のセッショントークン を使って行われる。 ドキュメント形式ごとの扱い HTML レシートプリンタが 直接レンダリングできる 。 printer を渡してダイアログ無し印刷が可能。 画像 HTML と同様、レシートプリンタが直接レンダリングできる。 PDF システム印刷ダイアログが必須 。 src が PDF のときに printer を渡すと print は エラーを throw する 。PDF では必ず options.printer を省略する。 6 実装の型(フォールバック必須) getPrinters() が空配列を返すケースは 必ず ハンドリングし、システム印刷ダイアログにフォールバックする。これは POS 11.11.0 未満の端末だけでなく、 レシートプリンタを持たないマーチャント のカバーにもなる。 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' ); } 1 プリンタを探す getPrinters() で一覧取得し、 connected が true のものを選ぶ。 2 あれば直接印刷 print(src, {printer}) 。ダイアログは開かない。 3 無ければダイアログ print(src) のみ。旧環境・プリンタ無し店舗もこれで動く。 ハードウェアプリンタ探索には Shopify POS 11.11.0 以上が必要。 それ未満のバージョンでは、レシートプリンタがペアリング済みでも getPrinters() は空配列を返す。 なお、この制約はシステム印刷ダイアログには影響せず、ダイアログは引き続き利用できる。 動作確認の方法 開発ストアで POS 11.11.0 以上 + ペアリング済みレシートプリンタ を用意し、 getPrinters() で取得したプリンタを shopify.printing.print に渡す。 ダイアログが出ずに印刷されれば直接印刷が効いている 。 7 技術者が押さえるべき 5 つのポイント 1. 空配列は「異常」ではなく通常フロー POS 11.11.0 未満、またはレシートプリンタ非所持の店舗では getPrinters() が空配列を返す。 常にダイアログへフォールバックする分岐を必ず書く 。例外扱いにするとその環境で印刷できなくなる。 2. PDF × printer 指定は throw する src が PDF を指しているときに printer を渡すと shopify.printing.print はエラーを投げる。 PDF は常に options.printer を省略 してダイアログに任せる。レシート系は HTML/画像で作るのが素直。 3. src はオリジン制約あり・トークン付きで fetch 渡せるのは application_url 起点の相対パスか、 同一オリジンのフル URL のみ。取得は拡張のセッショントークン経由なので、印刷用エンドポイントは そのトークンで認証して描画結果を返す設計 にする。 4. 移行は 2026-07 採用と同時でよい shopify.print は deprecated だが 即時対応は不要 。それ以前の API バージョンは変更されないので、既存拡張は動き続ける。 2026-07 に上げるタイミングで一緒に置き換える のが最小コスト。 5. 全ターゲットで使える = 印刷導線をどこにでも置ける Printing API は すべての POS UI extension ターゲット で利用可能。特定の画面に縛られないので、注文詳細・カート・カスタムアクションなど、業務動線に合わせて印刷ボタンを配置できる。検証は開発ストア+POS 11.11.0 以上+ペアリング済みレシートプリンタで、 ダイアログが出ずに印字されるか を見る。 8 業務に活かせる 3 つのユースケース USE CASE 1 店頭オペレーションの「印刷ダイアログ地獄」を撲滅する 課題 レジ横に専用レシートプリンタがあるのに、POS 拡張からの印刷は毎回システム印刷ダイアログが開き、スタッフが出力先を選び直す必要があった。そもそもダイアログは専用レシートプリンタをターゲットにできない。 打ち手 2026-07 に上げて getPrinters() → connected なプリンタを選択 → print(src, {printer}) の 3 行に置き換える。 効果 タップ 1 回で印字完了。レジ待ち時間の短縮と、出力先誤選択によるやり直しの解消。 技術メモ レシート本体は HTML か画像 で生成する(PDF だと直接印刷不可)。空配列時のダイアログ・フォールバックは必ず残す。 USE CASE 2 多店舗チェーンで「端末バージョンがバラバラ」でも壊れない印刷を作る 課題 店舗ごとに POS アプリのバージョンやプリンタ構成が違う。新機能を入れた途端、旧端末の店舗で印刷が動かなくなるのが怖い。 打ち手 getPrinters() の結果が空かどうかだけで分岐する実装にする。バージョン判定を書かず、 空配列=ダイアログ の 1 本のフォールバックで両方を吸収する。 効果 端末バージョンの棚卸しやアップデート完了を待たずに機能をリリースできる。プリンタ未導入店舗も同じコードで動く。 技術メモ ハードウェア探索は POS 11.11.0 以上が条件。それ未満はペアリング済みでも空配列になるが、 システム印刷ダイアログは引き続き利用可能 なので機能全体が落ちることはない。 USE CASE 3 取り置き票・修理伝票など「レシート以外の店頭帳票」を拡張から刷る 課題 取り置きや修理受付の控えを、スタッフが別端末や手書きで用意していて、POS 側の業務動線と分断されている。 打ち手 アプリ側に /print/<帳票> エンドポイントを用意し、POS UI extension のカスタムアクションから shopify.printing.print で同じレシートプリンタへ流す。 効果 帳票発行が POS の 1 操作に統合される。Printing API は全ターゲットで使えるため、業務に合った画面に印刷ボタンを置ける。 技術メモ src は application_url 起点の相対パス or 同一オリジン URL。 拡張のセッショントークンで fetch される ため、エンドポイント側でそのトークンを検証して HTML を返す。 9 提案で使える 1 行サマリ 「POS UI Extensions 2026-07 の Printing API で、拡張から レシートプリンタへダイアログ無しの直接印刷 が可能に。 HTML/画像は直接印字、PDF はダイアログ必須。POS 11.11.0 未満は空配列なのでフォールバック必須。 旧 shopify.print は非推奨だが即時対応は不要 = 2026-07 採用時にまとめて移行 すればよい。」 source : shopify.dev / changelog / pos-ui-extensions-can-now-print-directly-to-hardware-receipt-printers generated 2026-07-27