Integration recipe

Keep ShipStation. Drop the print dialog.

ShipStation returns label data when a label is created. Send those bytes to the printer at the bench doing the packing, and nobody has to sit in front of a browser with the right printer selected.

The recipe

Create the label, forward the bytes.

Trigger from your own workflow or from a ShipStation webhook — either way the print step is one request.

01

Create the label

Ask ShipStation for the label, requesting ZPL when the destination is a thermal printer. It comes back base64-encoded.

createlabel → labelData
02

Pick the printer

Map the warehouse or bench on the order to a printer ID you store. This is your data, not a network route.

bench → printerId
03

Send it

POST the base64 label data as raw content with an idempotency key derived from the shipment ID.

POST /v1/print-jobs
label-printer.ts
import RocketPrint from "@rocketprint/node";

const rocketprint = new RocketPrint({ apiKey: process.env.ROCKETPRINT_KEY });

export async function printShipStationLabel(shipmentId, bench) {
  // ShipStation returns label data already base64-encoded.
  const label = await shipstation.createLabel({ shipmentId, labelFormat: "zpl" });

  const job = await rocketprint.printJobs.create({
    printerId: bench.printerId,
    title: `Label ${shipmentId}`,
    contentType: "raw_base64",
    content: label.labelData,          // pass base64 straight through
    source: "shipstation",
  }, {
    idempotencyKey: `shipstation-${shipmentId}-${bench.id}`,
  });

  return job.id;
}

Practical notes

What changes on the floor.

No connector on the bench machine

The RocketPrint agent is the only local software, and it does one thing: print jobs your organization sends it. It does not need the browser open or a session logged in.

Request ZPL, not PDF

Raw ZPL reaches the printer untouched. A PDF goes through the station's driver, which decides scaling — the usual cause of a label that scans badly. Format details →

Multi-warehouse routing is a lookup

Keep a map from warehouse to printer ID. A new warehouse is an agent install and a new row, not an integration change.

Every label gets a job record

Status, timestamps, and a failure reason when something goes wrong — so "did that print?" stops being a question anyone walks across the warehouse to answer.

Questions

ShipStation-specific questions.

Does this replace ShipStation?

No. ShipStation stays your shipping platform. RocketPrint replaces the part where a person has to be at a browser with the right printer selected for a label to come out.

What format does the label data come back in?

Base64-encoded, in whichever format you requested — request ZPL for thermal printers so the barcode is generated at native resolution. If it arrives as base64 already, you can pass it straight through.

Can we still print manually from ShipStation when we want to?

Yes. Nothing about this recipe removes the manual path; it just means the common case does not need one.

How do we handle a bench that is offline?

You do not have to. The job queues and prints when the station reconnects, in order.

One bench, one label

Print the next label without touching the browser.

Install the agent, create a key, forward the label data you already receive.