> ## Documentation Index
> Fetch the complete documentation index at: https://www.zippendo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Add a printer

> Register a Zippendo printer from the printer client, then manage name, type (Label or Document), status, rotation, and Print All on the Printers screen.

You do **not** add a printer from a form on the web app. The **Printers** screen lists devices that the [Zippendo Printer Client](/docs/how-to/setup-printer-client) registered. After a printer is **Active**, you edit its name and type here, turn on **Rotate wide pages to portrait**, and send jobs with **Print All** / **Print** from a shipment.

Journey walkthrough: [Labels and printing](/docs/tutorials/labels-printing). Install and **Sign in with Browser**: [Set up the printer client](/docs/how-to/setup-printer-client). Browser **Authorize Printer Client**: [Authorize the printer client](/docs/how-to/authorize-a-printer). Job history: [Printer jobs](/docs/how-to/printer-jobs). Printers on one shipment: [Shipment printer settings](/docs/how-to/shipment-printer-settings).

<Info>
  **Printers** is a top-level sidebar item (`/{org}/dashboard/printers`). It is not a Settings tab. Description in the header: **Manage your printers**.
</Info>

## Printer client vs the Printers screen

| Surface                          | What you do there                                                                                                     |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Printer client** (desktop app) | Sign in with the browser, pick a local OS printer, give it a **Display Name**, set **Printer Type**, and register it  |
| **Printers** (this screen)       | Download the client, see **Active** / **Offline**, **Approve** or **Disable**, **Edit** name/type/rotation, open jobs |

The list empty state is explicit: **No printers yet** — **Printers will appear here once they are registered from the printer client application.** There is no **Add printer** button in the dashboard.

<Frame caption="Printers list with stats, Download Printer Client, and Zebra ZD421 – Pakkebord">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/01-printers-list-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=d09ab2fe97bcc07b8663cdc7bfddbb2a" alt="Printers page showing Total printers, Active printers, Online now, Pending approval, and a Label printer named Zebra ZD421 – Pakkebord that is Active and Offline" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/01-printers-list-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/01-printers-list-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=456dbb4d930fe375003d2eca07be21c9" alt="Printers page showing Total printers, Active printers, Online now, Pending approval, and a Label printer named Zebra ZD421 – Pakkebord that is Active and Offline" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/01-printers-list-dark.png" />
</Frame>

## Download the printer client

The header action is **Download Printer Client**. The menu title is **Download for your system**. Each row is a direct installer (not a landing page):

| Label                     | Helper           | File                             |
| ------------------------- | ---------------- | -------------------------------- |
| **macOS — Apple Silicon** | M1 and newer     | `Zippendo-Printer-mac-arm64.dmg` |
| **macOS — Intel**         | Older Macs       | `Zippendo-Printer-mac-x64.dmg`   |
| **Windows**               | 10 / 11 (64-bit) | `Zippendo-Printer-win-x64.exe`   |

<Frame caption="Download Printer Client lists macOS Apple Silicon, macOS Intel, and Windows">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/02-download-client-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=d4bc799d163115dfa8a8bf1b5d6b704b" alt="Download Printer Client menu with macOS Apple Silicon, macOS Intel, and Windows installers" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/02-download-client-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/02-download-client-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=6e7ac452700835d36b80f2694f41c378" alt="Download Printer Client menu with macOS Apple Silicon, macOS Intel, and Windows installers" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/02-download-client-dark.png" />
</Frame>

Sign-in and approval happen in the client and on **Authorize Printer Client**. See [Set up the printer client](/docs/how-to/setup-printer-client) and [Authorize the printer client](/docs/how-to/authorize-a-printer).

## Register from the printer client

After you authorize, the client dashboard **Printers** heading has **+ Add Printer** (empty state: **Add Your First Printer**). The modal title is **Add Printer**. Every field is required (the client shows **Please fill in all fields** if any is empty):

| Field             | Control | Options / placeholder                                                                                                                                          |
| ----------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Organization**  | Select  | **Select organization…** — every org the signed-in user can access                                                                                             |
| **Local Printer** | Select  | **Select printer…** — printers the OS reports. The OS default is marked **(Default)**. While scanning: **Discovering printers…**. Empty: **No printers found** |
| **Display Name**  | Text    | Placeholder **e.g., Warehouse Label Printer** — this is the name on the Zippendo **Printers** list                                                             |
| **Printer Type**  | Select  | **Document Printer** or **Label Printer** (default in the modal is **Document Printer**)                                                                       |

Actions: **Cancel**, **Add Printer** (busy: **Adding…**).

Use **Label Printer** for shipping labels (thermal / ZPL). Use **Document Printer** for packing lists and invoices (usually A4). The same local OS printer can be registered once per type on that client — for example as both Label and Document, but not twice as Label.

A new printer lands on **Printers** with status **Pending Approval** until someone uses **Approve** on the row. The client shows **Waiting for admin approval**. Full approve / reject copy: [Authorize the printer client](/docs/how-to/authorize-a-printer).

<Note>
  Printer names must be unique within the organization. The OS name (**Local Printer**) is stored as **OS Printer Name** and cannot be changed in Zippendo.
</Note>

## Stats on the Printers screen

Four cards above the table (loading subtitle **Loading printers…**):

| Card                 | Counts                          | Subtitle                              |
| -------------------- | ------------------------------- | ------------------------------------- |
| **Total printers**   | Every row in the current filter | All printers registered               |
| **Active printers**  | Status **Active**               | Approved and ready to receive jobs    |
| **Online now**       | Connection **Online**           | Connected and reachable via WebSocket |
| **Pending approval** | Status **Pending Approval**     | Waiting for admin approval            |

A printer can be **Active** and **Offline** at the same time: it is approved, but the desktop app is not connected. Jobs stay queued until the client is online. See [Printer offline or not printing](/docs/knowledge-base/printer-offline-or-not-printing).

## Filters

Open **Filters** in the header (`common.filters`). **Add filters** applies; **Clear all filters** resets.

| Filter     | Label  | Options                                                 |
| ---------- | ------ | ------------------------------------------------------- |
| **Search** | Search | Placeholder **Search…** — matches printer name          |
| **Status** | Status | **All**, **Active**, **Pending Approval**, **Disabled** |
| **Type**   | Type   | **All**, **Label printer**, **Document printer**        |

<Frame caption="Filters on Printers: Search, Status, and Type">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/03-printers-filters-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=6303841983e141cffae4ec123fd99b8f" alt="Printers filter popover with Search, Status, and Type fields" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/03-printers-filters-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/03-printers-filters-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=cb7fbf7ca8f75656611cf6aa3df5e505" alt="Printers filter popover with Search, Status, and Type fields" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/03-printers-filters-dark.png" />
</Frame>

A search with no match uses the same empty copy: **No printers yet** / **Printers will appear here once they are registered from the printer client application.**

## List columns and row actions

Click a row to open printer detail. Columns:

| Column         | What it shows                                                                         |
| -------------- | ------------------------------------------------------------------------------------- |
| **Name**       | Display name. The OS name sits underneath when `localName` is set                     |
| **Type**       | **Label** or **Document**                                                             |
| **Status**     | **Active**, **Pending Approval**, or **Disabled**                                     |
| **Connection** | Green dot **Online** or grey dot **Offline**                                          |
| **Last Seen**  | **Never**, **Just now**, **N min ago**, **N hour(s) ago**, or **N day(s) ago**        |
| **Created By** | Name, or email, or **Unknown**. Email is shown under the name when both exist         |
| **Approved**   | Approval date, or **Not approved**. Subline **by \{name}** when an approver is stored |

Row menu:

| Action      | When it appears                                                                                                                                                                                   |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **View**    | Always — same as row click (printer detail)                                                                                                                                                       |
| **Edit**    | Always — opens **Edit Printer**                                                                                                                                                                   |
| **Approve** | Only if status is **Pending Approval**. Toast: **Printer approved successfully** / **Failed to approve printer**                                                                                  |
| **Disable** | Only if status is **Active** (destructive). Toast: **Printer disabled successfully** / **Failed to disable printer**. There is no confirmation and no **Enable** action for **Disabled** printers |
| **Delete**  | Always (destructive)                                                                                                                                                                              |

<Warning>
  **Delete Printer** is permanent. Title **Delete Printer**. Description: **This will permanently delete printer "\{name}". This action cannot be undone.** Confirm by typing the printer name in capitals. Toast: **Printer deleted successfully** / **Failed to delete printer**.
</Warning>

API errors the list can surface include **Printer not found.** (`PRINTER_NOT_FOUND`) and **The printer is offline.** (`PRINTER_OFFLINE`).

## Edit Printer

Modal id `edit-printer-modal`. Title **Edit Printer**. Subtitle **Update printer name and type**. **Save** stays disabled until something changes and **Printer Name** is non-empty. Busy: **Saving…**. **Cancel** reverts.

| Field                             | Required  | Notes                                                                                                                                               |
| --------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Printer Name \***               | Yes       | Placeholder **Enter printer name**. Trimmed on save                                                                                                 |
| **Printer Type \***               | Yes       | **Label** or **Document**                                                                                                                           |
| **Rotate wide pages to portrait** | No        | Off by default. Helper: **Turns landscape (wide) pages 90° when printing — useful for wide carrier labels on portrait label rolls.**                |
| **OS Printer Name**               | Read-only | Shown only when the client stored a local name. Helper: **This is the system name and cannot be changed**. Placeholder **OS-reported printer name** |

Toast: **Printer updated successfully** / **Failed to update printer**.

There is no rotate control on the label viewer. Rotation is only this switch.

<Frame caption="Edit Printer: name, type, and Rotate wide pages to portrait">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/04-edit-printer-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=e922346fe09e9c6a92ef7222d3f5fc4b" alt="Edit Printer modal with Printer Name, Printer Type Label, and Rotate wide pages to portrait switch" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/04-edit-printer-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/04-edit-printer-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=119dc17a962300b7a02faf74e7f522da" alt="Edit Printer modal with Printer Name, Printer Type Label, and Rotate wide pages to portrait switch" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/04-edit-printer-dark.png" />
</Frame>

## Printer detail (Overview)

URL `/{org}/dashboard/printers/{printerId}`. Tabs use `?tab=` (`useTabQueryState`):

| Tab          | `?tab=`                                                                                                      |
| ------------ | ------------------------------------------------------------------------------------------------------------ |
| **Overview** | `overview` (default)                                                                                         |
| **Jobs**     | `jobs` — badge is the job count. Field-level job list and retry/delete: [Printer jobs](/docs/how-to/printer-jobs) |

Header title is the printer **name**. Description is the OS name, or **Printer • \{LABEL|DOCUMENT}** if none. Back goes to **Printers**.

**Printer Information** rows (overview):

| Row             | Value                                             |
| --------------- | ------------------------------------------------- |
| **Status**      | **Active**, **Pending Approval**, or **Disabled** |
| **Connection**  | **Online** or **Offline**                         |
| **Type**        | `LABEL` or `DOCUMENT` (raw enum on this row)      |
| **Created At**  | Date-time                                         |
| **Last Seen**   | Only if the client has checked in                 |
| **Created By**  | Name or email                                     |
| **Approved At** | Date-time, with **by \{name}** when stored        |

Not found: **Printer Not Found** — **The printer you're looking for doesn't exist or you don't have access to it.**

<Frame caption="Printer overview for Zebra ZD421 – Pakkebord: Active and Offline">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/05-printer-overview-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=0f7884f3ab94b8569eb0aef288973bc9" alt="Printer detail Overview tab with Printer Information, status Active, connection Offline, and type LABEL" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/05-printer-overview-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/05-printer-overview-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=110e68e589832643163cae683f6b04a6" alt="Printer detail Overview tab with Printer Information, status Active, connection Offline, and type LABEL" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/05-printer-overview-dark.png" />
</Frame>

<Note>
  The header action **Create print job** goes to `.../jobs/create`. That route is not a form in the client. Jobs are created from **Print** / **Print All** on a shipment, from auto-print, or from the printer client receiving work. Use [Printer jobs](/docs/how-to/printer-jobs) for the jobs table.
</Note>

## Print All and Print Documents

On a shipment **Documents** tab (`?tab=documents`), **Print All** and each row's **Print** create Zippendo print jobs. They do **not** open the browser print dialog.

Labels go to an **Active** **Label** printer. Packing lists, invoices, and other non-label files go to an **Active** **Document** printer. Zippendo uses the shipping rule's printers first, then the shipment's printers. If neither is set, **Print Documents** opens (modal id `printer-select-modal`).

| Field                | Copy                                                                                                                                 |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Title                | **Print Documents**                                                                                                                  |
| Help                 | **Select which printer(s) to use for this shipment's documents.**                                                                    |
| **Label Printer**    | Helper **\{n} label(s) will be sent to this printer**. Placeholder **Select label printer**. Only **Active** label printers          |
| **Document Printer** | Helper **\{n} document(s) will be sent to this printer**. Placeholder **Select document printer**. Only **Active** document printers |
| Actions              | **Print**, **Cancel**                                                                                                                |

Warnings when a needed type has no **Active** printer:

* **No active printers found. Please set up a printer first.**
* **No active label printers found. Please set up a printer first.**
* **No active document printers found. Please set up a printer first.**

**Print** stays disabled until every shown dropdown has a value. Toasts: **1 print job created** / **N print jobs created**, or **1 document failed to print** / **N documents failed to print**.

<Frame caption="Print All opens Print Documents when no printer is configured on the shipment">
  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/06-print-documents-light.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=c66d7280aefb6d59c57c9c4b04efb91b" alt="Print Documents modal asking to select a label printer for the shipment documents" className="block dark:hidden" width="2880" height="1800" data-path="images/how-to/add-a-printer/06-print-documents-light.png" />

  <img src="https://mintcdn.com/zippendo/C18Zs_-3chtQ-0St/images/how-to/add-a-printer/06-print-documents-dark.png?fit=max&auto=format&n=C18Zs_-3chtQ-0St&q=85&s=953fc1e8bb0538d8b6f16ee6dfe38ccf" alt="Print Documents modal asking to select a label printer for the shipment documents" className="hidden dark:block" width="2880" height="1800" data-path="images/how-to/add-a-printer/06-print-documents-dark.png" />
</Frame>

To save printers on the shipment so this modal is skipped, use [Shipment printer settings](/docs/how-to/shipment-printer-settings). To print automatically when you send, use [Auto-print labels and documents](/docs/how-to/auto-print).

## Next

<CardGroup cols={2}>
  <Card title="Set up the printer client" icon="monitor-down" href="/docs/how-to/setup-printer-client">
    Install Zippendo Printer, sign in with the browser, and register a local printer.
  </Card>

  <Card title="Authorize the printer client" icon="shield-check" href="/docs/how-to/authorize-a-printer">
    Download, sign in with the browser, and approve a pending printer.
  </Card>

  <Card title="Printer jobs" icon="list-todo" href="/docs/how-to/printer-jobs">
    Pending, processing, failed, and completed jobs — retry and delete.
  </Card>

  <Card title="Auto-print" icon="zap" href="/docs/how-to/auto-print">
    Print labels and documents when a shipment is sent.
  </Card>

  <Card title="Labels and printing" icon="printer" href="/docs/tutorials/labels-printing">
    Send a shipment, then view, download, or print the label.
  </Card>
</CardGroup>
