DEVELOPERS / NODE.JS / ZPL

Print ZPL Labels From Node.js

Two ways to print labels from Node.js: raw ZPL over a TCP socket to port 9100, or the LabelInn Node SDK — print to any printer from any server, with queueing, status and templates.

FREE PLAN · NO CREDIT CARD · WINDOWS / MAC / LINUX / WEB

THE PROBLEM

You need Node.js code to put a label on a thermal printer: a shipping label when an order is paid, a product label when a batch is finished. There are two ways to do it. This page shows both, with code you can paste.

01 / NODE.JS

The quick way: raw ZPL to port 9100

Zebra printers, and most printers that emulate ZPL, accept raw ZPL on TCP port 9100. If your code runs on the same network as the printer, this is all it takes:

EXAMPLENODE.JS
const net = require('net');

const zpl = '^XA^FO50,50^A0N,40,40^FDHello from LabelInn^FS^XZ';

const socket = net.createConnection(9100, '192.168.1.50', () => socket.end(zpl));
socket.on('error', (err) => console.error('Printer unreachable:', err.message));

02 / ZPL

Why not just open a socket?

Writing ZPL to port 9100 works on the bench. In production it leaves you with problems the printer will not solve for you:

  • Your server has to reach the printer. A cloud-hosted Node.js app cannot open a socket to a printer on a warehouse LAN without a VPN or port forwarding.
  • Nothing tells you it printed. Port 9100 accepts the bytes whether or not the ribbon is out or the head is open.
  • Nothing queues. If the printer is off, the job is gone.
  • One language per printer. ZPL works on Zebra; TSC wants TSPL, Toshiba wants TPCL.

LabelInn puts a small runtime next to the printer that connects out to the cloud. Your code calls one HTTPS API from anywhere; the job is queued, delivered in the printer's own language, and its status comes back.

📦 npm install labelinn, one API key, and your Node.js code prints to any registered printer, anywhere. Get a key →

03 / ZEBRA

Install the SDK

EXAMPLESHELL
npm install labelinn

04 / API

Find the printer

Register the printer once in the LabelInn app on the computer it is connected to. Then list your printers to get the id:

EXAMPLENODE.JS
const LabelInn = require('labelinn');

const client = new LabelInn('sk_live_...');

const printers = await client.fleet.list();
for (const p of printers) console.log(p.id, p.name, p.status);

05 / NODE.JS

Print ZPL

EXAMPLENODE.JS
const job = await client.print.create({
  printer_id: 'prt_abc123',
  payload_type: 'zpl',
  payload_data: '^XA^FO50,50^A0N,40,40^FDHello from LabelInn^FS^XZ',
});
console.log(job.id, job.status);

06 / ZPL

Print a designed label with data

Raw ZPL means your code owns the layout. With a template, the label is designed visually in LabelInn and your code sends only the data. Fields fill by name, and LabelInn converts the design to ZPL, TSPL or TPCL for whichever printer you choose.

EXAMPLENODE.JS
const job = await client.print.create({
  printer_id: 'prt_abc123',
  payload_type: 'template',
  design_id: 'dsg_shipping',
  data: { order_id: 'ORD-9876', customer: 'Jane Doe', barcode: 'TR123456789' },
  copies: 2,
});

07 / ZEBRA

Print many labels in one call

Batch up to 100 jobs per request. Each job is accepted or rejected on its own, so one bad row does not sink the rest.

EXAMPLENODE.JS
const result = await client.print.batch(
  ['A-1001', 'A-1002', 'A-1003'].map((sku) => ({
    printer_id: 'prt_abc123',
    payload_type: 'template',
    design_id: 'dsg_product',
    data: { sku },
  })),
);
console.log(`${result.succeeded} of ${result.total} accepted`);

08 / API

Never print the same label twice

Retries happen: a timeout, a redeploy, a queue redelivery. Send an idempotency key and a repeated call returns the original job instead of printing again.

EXAMPLENODE.JS
const job = await client.print.create(
  { printer_id: 'prt_abc123', payload_type: 'template', design_id: 'dsg_shipping', data: { order_id: 'ORD-9876' } },
  { idempotencyKey: 'order-ORD-9876-label' },
);

Printing through the API is part of the Pro plan, and the free trial includes it. Keys that start with sk_test_ run against a sandbox that never prints, so you can build and test before going live. See pricing.

QUESTIONS / FAQ

Frequently asked questions

How do I print a ZPL label from Node.js?

On the same network, write the ZPL to the printer's TCP port 9100. From anywhere else, install the LabelInn SDK, register the printer once, and call print.create with payload_type "zpl" and the printer id.

Can my cloud-hosted Node.js app print to a printer in a warehouse?

Yes. The LabelInn runtime next to the printer connects out to LabelInn, so your server calls an HTTPS API and never needs network access to the printer itself.

Does it only work with Zebra printers?

No. Raw ZPL needs a ZPL printer, but templates are converted to the printer's own language, including TSPL for TSC and TPCL for Toshiba.

How do I avoid printing duplicates when a request is retried?

Send an idempotency key with the job. Repeating the call with the same key returns the original job instead of printing again.

Can I print from JavaScript in the browser?

Browsers cannot open raw TCP sockets. Either call your own backend, which uses the SDK, or call the LabelInn runtime's local API on your network; see printing from a web app.

NEXT STEP / LABELINN

Print from Node.js without touching a printer driver

Get an API key, register a printer, and send your first label in minutes. · Official SDK · ZPL or visual templates · Queue, status and retries handled

Start free →