# PickPack - Magento 2 Pick and Pack PDF Generation

> PickPack is the Magento 2 pick and pack PDF extension - branded invoices, packing sheets, picklists, and Zebra labels generated in batch from the admin.

---

## Overview

PickPack is a Magento 2 pick and pack PDF extension that replaces the built-in PDF printing with a fully customisable document generation system. From the Orders grid, select any set of orders and generate branded invoices, packing sheets, combined picklists, Zebra labels, return forms, and more - individually or in batch.

![PickPack PDF template manager](images/overview.png)

This module helps you:

- Generate professional, branded PDF documents for any order or batch of orders without leaving the admin
- Run warehouse picking workflows with combined picklists, product-separated lists, and out-of-stock alerts
- Print address and product labels directly to Zebra thermal printers
- Attach PDF invoices or packing sheets automatically to transactional emails
- Speed up batch printing with pre-built PDF caching so high-volume batches open instantly

---

## When to use this

Use PickPack when you want to:

- Replace Magento's default PDF invoices with branded, well-formatted documents
- Give warehouse pickers a single-page combined picklist covering all orders in a batch
- Print thermal Zebra labels for shipping or product identification at pack time
- Automatically include a packing sheet or invoice in every customer shipment email
- Split picklists by product attribute or inventory source so different warehouses or teams each get their own document

---

## Key capabilities

- Invoices and packing sheets - generate per-order or batch PDFs with your logo, custom address format, and product columns
- Multiple picklist formats - combined, order-separated, product-separated, and filtered picklists for different warehouse layouts
- Zebra thermal labels - address labels, product labels, packing sheets, and product lists formatted for Zebra printers
- Return and credit memo documents - returns sheet and credit memo PDFs with one-click access from the Orders or Credit Memos grids
- PDF template editor - create, duplicate, and customise templates from PickPack > PDF templates in the admin; assign each document type its own template
- Barcode support - embed barcodes in any template; SVG (crisp, scalable) or PNG (GD/Imagick) output
- Speedup cache - pre-render PDFs via cron so batch jobs return instantly
- Customer-facing PDFs - optionally expose invoice and packing sheet download buttons in customer accounts
- Smart page backgrounds - match a background image to an order attribute or source (Growth/Pro plan)
- Shipping method callout images - automatically print a carrier logo or callout on documents that match a shipping method

---

## Installation

PickPack installs via Composer, then activates with a license key from your Moogento.com account. The whole flow takes about 5 minutes.

### Step 1: Get your Composer keys from Moogento.com

1. Sign in at **https://www.moogento.com** and open **My Plugins** in your account menu.
2. Find **PickPack** in the list of plugins you own.
3. Generate (or reveal) the Composer access keys for that plugin - a **public key** and a **private key**.
4. **Add your install domain to the key.** Each Composer key is tied to a specific domain - if you're installing on `yourstore.com`, add `yourstore.com` to the key's allowed domains. The Composer download will be rejected on any other domain.

If you run staging and production on different domains, add both - separate keys per environment are fine too.

### Step 2: Install the module with Composer

From your Magento 2 root directory:

```
composer require moogento/module-pickpack
```

When Composer asks for credentials, paste the **public key** as the username and the **private key** as the password. They'll be cached in `~/.composer/auth.json` for future runs.

### Step 3: Enable the module in Magento

```
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento cache:clean
```

If you run `php bin/magento module:status Moogento_PickPack` you should see it listed as enabled.

### Step 4: Add your license key in the Moogento admin

1. Still on **https://www.moogento.com > My Plugins**, copy the **license key** for PickPack (separate from the Composer keys you used above).
2. In your Magento admin, go to **Stores > Configuration > Moogento > Licenses**.
3. Find the row for **PickPack** and paste the license key.
4. Click **Save Config**, then run `php bin/magento cache:clean` once.

The license validates within a few seconds. You should see the module's status flip to active. If it stays inactive, double-check the domain on the license matches where you've installed - domain mismatch is the most common cause.

---

## Setup overview

Most setup happens in:

Stores > Configuration > Moogento > PickPack

You'll mainly work with:

- General - date formats, barcode settings, address format, print-once, email attachment, and logging
- Design: Assign PDF Templates - map each document type (invoice, packing sheet, picklist, Zebra label, etc.) to its template and configure its filename and order-comment behaviour
- Design: Smart Page Backgrounds - upload background images matched by order attribute or source
- Design: Shipping Method Callout Images - upload carrier images matched by shipping method
- Backend: Button Options - choose which PDF buttons appear on the Order Detail, Invoice, Shipment, and Credit Memo detail pages
- Backend: Action Menu Options - choose which PDF actions appear in the Orders, Invoices, Shipments, and Credit Memos mass-action menus
- Backend: Speedup - enable PDF caching, choose which PDF type to warm, configure cron lookback, and monitor cache statistics
- Frontend: Customer Profile Options - allow customers to download their own invoice and packing sheet PDFs
- Custom: Integrations Setup - register custom inventory location or POS source classes for bespoke warehouse integrations

---

## Common setups

### Assign a branded template to your invoices

The first thing most stores do after installation is replace the default Magento PDF invoice with a PickPack-branded version.

#### How to set it up

1. Go to PickPack > PDF templates and create (or duplicate) a template. Set your logo, column layout, and colours.

2. Go to:
   Stores > Configuration > Moogento > PickPack > Design: Assign PDF Templates > PDF Invoice

3. Set:
   - **Template** = your new template name
   - **Output filename** = `invoice_` (or any prefix you prefer)
   - **Include Order ID in filename** = Yes (recommended)
   - **Add an order comment when creating this PDF?** = Yes

4. Save config.

![Assign PDF Templates config group](images/config-pdfs.png)

#### Notes

- Each document type (Invoice, Packing Sheet, Picklist, etc.) has its own sub-group under Design: Assign PDF Templates. Assign templates independently.
- The `moogento_pickpack/pdfs/invoice/template` path controls this setting.
- Changes take effect immediately for the next print job; no cache flush required.

---

### Generate a combined picklist for a batch of orders

Use the combined picklist to give your warehouse a single document listing every item across all selected orders, sorted by product - ideal for single-picker operations.

#### How to set it up

1. Go to:
   Stores > Configuration > Moogento > PickPack > Design: Assign PDF Templates > PDF Order-combined Picklist

2. Set:
   - **Template** = your picklist template
   - **Show orders for different stores on different pages?** = Yes (if multi-store)

3. Save config.

4. Go to:
   Stores > Configuration > Moogento > PickPack > Backend: Action Menu Options > Orders

5. Enable **PDF (Order-combined Picklist)** with the toggle switch.

6. Save config.

7. In the Orders grid (Sales > Orders), select the orders you want to pick, open the **Actions** menu, and choose **PDF (Order-combined Picklist)**.

#### Notes

- The split-by-attribute or split-by-source feature (General group) lets you automatically generate separate picklists per warehouse or product attribute - requires a Pro plan.
- The `moogento_pickpack/pdfs/combined/template` path controls the template assignment.

---

### Attach a packing sheet to shipment confirmation emails

Send a PDF packing sheet automatically with every shipment email so customers have a copy in their inbox.

#### How to set it up

1. Go to:
   Stores > Configuration > Moogento > PickPack > General

2. Set **Enable PickPack PDFs to be attached to transactional emails?** = Yes.

3. Save config, then follow the Moogento guide to add the correct variable to your transactional email templates (see the comment link in the admin field for the exact snippet).

#### Notes

- You must add a template variable to the email body in addition to enabling this toggle. Enabling the toggle alone does not attach the PDF.
- The `moogento_pickpack/general/attach_pdf_to_email` path controls this setting.

---

### Speed up batch printing with Speedup caching

For stores printing 50+ orders at a time, Speedup pre-renders PDFs via cron so the batch downloads in seconds instead of minutes.

#### How to set it up

1. Go to:
   Stores > Configuration > Moogento > PickPack > Backend: Speedup

2. Set **Enable Speedup** = Yes.

3. Set **Warmup which PDF type** = the document type you print most often (e.g. `packing_sheet_fast`).

4. Set **Order Statuses to Cache** = Processing (or whichever statuses your warehouse works from).

5. Set **Cache Warmup Lookback Days** = 7 (default) or however many days back to scan on each cron run.

6. Optionally set **Use Message Queue** = Yes for high-volume stores to offload generation to queue workers.

7. Save config.

![Speedup config group](images/config-speedup.png)

#### Notes

- Speedup requires cron to be running. Confirm your Magento cron is active before enabling.
- Click **Process Recent Orders** in this section to trigger a manual warmup immediately after enabling.
- The **Show Cache Indicator** toggle adds a subtle watermark to cached PDFs so you can tell which documents came from cache during testing.
- Parallel processing (requires PHP `pcntl` extension) can further accelerate batch generation - configure **Parallel Processing Chunk Size** and **Maximum Parallel Processes** based on your server's CPU and memory.
- The `moogento_pickpack/speedup/enabled` path controls the master Speedup toggle.

---

## Features reference

### General settings

Controls date display, address format, barcode configuration, and logging.

- **Date format: PDFs** (`moogento_pickpack/general/date_format`) - PHP date format string used on all PDF documents. Default: `M j, Y`.
- **Date format: Filenames** (`moogento_pickpack/general/filename_date_format`) - Format used when dates appear in PDF filenames. Default: `Y_m_d`.
- **Date format: Timezone** (`moogento_pickpack/general/timezone`) - Override the timezone for PDF date/time display if server timezone differs from your store's local time.
- **Number of invoices to print** (`moogento_pickpack/general/number_invoices_printed`) - How many copies of the invoice to include when printing "Invoice and Packing Sheet". Default: 1.
- **Filter/split by Attribute or Source** (`moogento_pickpack/general/pdf_split_by`) - Generates separate picklist PDFs per product attribute value or inventory source. Requires Pro plan.
- **Group by store** (`moogento_pickpack/general/pdf_group_by_store`) - Separates combined picklist pages by store view.
- **Customer address format** (`moogento_pickpack/general/pickpack_pdf`) - Template tokens that control how shipping and billing addresses are rendered on PDFs. Supports `{firstname}`, `{lastname}`, `{street}`, `{city}`, `{region}`, `{postcode}`, `{country}`, `{telephone}`, `{email}`, and others.
- **Hide this 'country name'** (`moogento_pickpack/general/hide_country`) - Suppress a country name from addresses so it only appears on international orders.
- **Print once?** (`moogento_pickpack/general/print_once`) - Prevents re-printing selected PDF types for orders that have already been printed.
- **Enable PickPack PDFs to be attached to transactional emails** (`moogento_pickpack/general/attach_pdf_to_email`) - Master toggle for email attachment. Also requires a template variable in email templates.
- **Barcode: Output Format** (`moogento_pickpack/general/barcode_format`) - SVG (crisp, scalable) or PNG (GD/Imagick raster). Default: Auto.
- **Barcode: Maximum Height (px)** (`moogento_pickpack/general/barcode_max_height`) - Cap on barcode height. Template height field is a multiplier of 40 px (e.g. height=2 → 80 px). Default: 200.
- **Auto-download fonts** (`moogento_pickpack/general/auto_download_fonts`) - When enabled, PickPack downloads CJK and Thai fonts automatically when needed for PDF generation. Default: No (disabled for security). Fonts are stored in `var/moogento/pickpack/fonts/`.
- **Enable: Logging** (`moogento_pickpack/general/enable_log`) - Writes debug output to `var/log/moogento_pickpack.log`. Leave off in production.

---

### Design: Assign PDF Templates for Pick and Pack PDFs

Groups under Stores > Configuration > Moogento > PickPack > Design: Assign PDF Templates control which template and filename each document type uses.

Each sub-group (Invoice, Packing Sheet, Picklist, Zebra, etc.) exposes:
- **Template** - select from templates managed in PickPack > PDF templates
- **Output filename** - file prefix for the downloaded PDF
- **Include Order ID in filename** - appends the order increment ID to the filename
- **Add an order comment when creating this PDF?** - records a history note on the order when the PDF is generated

Document types available:
- PDF Invoice / PDF Invoice (minimal)
- PDF Credit Memo
- PDF Packing Sheet / (Notes) / (compact) / (minimal) / (fast)
- PDF Order-combined Picklist
- PDF Order-separated Picklist / (filtered)
- PDF Product-separated Picklist
- PDF Order Out-of-stock - also has **Trigger below this stock qty** to control which items appear
- PDF Address Label
- PDF Zebra Address Label / PDF Zebra Product Label / PDF Zebra Packing Sheet / PDF Zebra Product List
- PDF Returns Sheet
- PDF Order Summary
- PDF Gift Message

---

### Design: Smart Page Backgrounds

Path: Stores > Configuration > Moogento > PickPack > Design: Smart Page Backgrounds (`moogento_pickpack/page_backgrounds/list`)

Upload one or more background images and define matching rules by order attribute value. When an order matches, its PDFs use that background. Useful for distinguishing VIP orders, gift orders, or different warehouse zones visually. Requires Growth or Pro plan.

---

### Design: Shipping Method Callout Images

Path: Stores > Configuration > Moogento > PickPack > Design: Shipping Method Callout Images (`moogento_pickpack/shipping_method_callouts/list`)

Upload carrier logos or callout images and map them to shipping method codes. The matching image is automatically printed on documents for orders using that shipping method.

---

### Backend: Button Options

Path: Stores > Configuration > Moogento > PickPack > Backend: Button Options

Controls which PDF action buttons appear on the Order Detail, Invoice Detail, Shipping Detail, and Credit Memo Detail pages. Toggle each button type on or off. Hiding unused document types keeps the admin interface clean for warehouse staff.

---

### Backend: Action Menu Options

Path: Stores > Configuration > Moogento > PickPack > Backend: Action Menu Options

Controls which PDF options appear in the mass-action menus on the Orders, Invoices, Shipments, and Credit Memos grids. Organised into groups: Default actions (Cancel, Hold, Print All), Packing Sheet PDFs, Invoice-related PDFs, Picklist PDFs, Summary & Specialised PDFs, and Zebra-specific PDFs.

---

### Frontend: Customer Profile Options

Path: Stores > Configuration > Moogento > PickPack > Frontend: Customer Profile Options (`moogento_pickpack/frontend_customer_account_pdf`)

When **Allow customers to make PDFs?** is set to Yes, logged-in customers can download their own invoice or packing sheet from their account. Toggle individual buttons (PDF Invoice, PDF Packing Sheet) and optionally relabel the native "Print Order" / "Print Invoice" links to "PDF Invoices".

---

### Custom: Integrations Setup

Path: Stores > Configuration > Moogento > PickPack > Custom: Integrations Setup (`moogento_pickpack/custom_integration`)

Register custom PHP class names for bespoke inventory location, collection location, or POS source data. Used when PickPack needs to pull location or source data from a non-standard inventory system. Provide comma-separated location mappings in the format `{PDF Location ID}:{Magento Location ID}`.

---

## Advanced configuration

### Split picklists by attribute or source

#### What it does

When **Filter/split by Attribute or Source** is enabled in the General group, PickPack generates separate picklist PDFs for each distinct attribute value (e.g. brand, warehouse, product type) or inventory source. Each picker only sees the items relevant to their area.

#### Setup

1. Go to Stores > Configuration > Moogento > PickPack > General.
2. Set **Filter/split by Attribute or Source** to `Attribute` or `Source`.
3. If using Attribute: set **Attribute** to the product attribute whose values will drive the split.
4. Select **Filter/split-by-attribute, which PDFs?** to choose which picklist templates participate.
5. Save config.

#### Notes

- Requires a Pro plan.
- The `moogento_pickpack/general/pdf_split_by` path controls the split mode.
- When splitting by Source, use `moogento_pickpack/general/pdf_split_attribute_options_source` to select participating templates.

---

### Speedup parallel processing

#### What it does

When **Use Parallel Processing** is enabled inside the Speedup group, PickPack forks multiple PHP processes to generate PDF cache entries simultaneously. On a server with spare CPU and memory this can cut batch warmup time significantly.

#### Setup

1. Confirm the server has PHP's `pcntl` extension installed.
2. Go to Stores > Configuration > Moogento > PickPack > Backend: Speedup.
3. Enable Speedup, then set **Use Parallel Processing** = Yes.
4. Set **Parallel Processing Chunk Size** (orders per fork, default 5) and **Maximum Parallel Processes** (default 4).
5. Save config.

#### Notes

- `pcntl` is not available on all hosts - check with your hosting provider.
- Start with the defaults and increase chunk size gradually while monitoring server load.
- The `moogento_pickpack/speedup/use_parallel_processing` path controls this feature.

---

### Barcode configuration

#### What it does

PickPack can embed barcodes in any PDF template. The barcode format and size are controlled globally in General, while individual template fields set the barcode token and height multiplier.

#### Setup

1. Go to Stores > Configuration > Moogento > PickPack > General.
2. Check **Server: Barcode Requirements** - you need either GD or Imagick installed.
3. Set **Barcode: Output Format** - Auto is recommended (SVG with PNG fallback).
4. Set **Barcode: Maximum Height (px)** - raise above 200 only if your templates use high height multipliers.
5. In the PDF template editor (PickPack > PDF templates), add a barcode column and set its height multiplier (1 = 40 px, 2 = 80 px, etc.).

#### Notes

- SVG barcodes are crisp at any print resolution; PNG barcodes depend on GD or Imagick quality.
- If barcodes appear stretched or missing, re-check the Barcode Requirements panel in the General config.
- The `moogento_pickpack/general/barcode_format` and `moogento_pickpack/general/barcode_max_height` paths control global barcode settings.

---

## Tips & best practices

- Start with the Packing Sheet (fast) template type for Speedup - it is optimised for cache warmup and is the default.
- Set **Print once?** to Yes for invoices and packing sheets to prevent duplicate printing when re-running a batch that was partially completed.
- Keep **Auto-download fonts** disabled in production unless you actively need CJK or Thai character support - it prevents unexpected outbound connections.
- Use **Add an order comment when creating this PDF?** on all document types so your order history shows when each document was generated and by whom.
- If date/times on PDFs are offset from your local time, set the **Date format: Timezone** field in General rather than changing your server timezone.
- Assign meaningful filename prefixes (e.g. `inv_`, `ps_`, `pick_`) and enable **Include Order ID** so archived PDFs are easy to search by order number.
- To clean up the Orders grid action menu for warehouse staff, disable the standard Magento PDF options (PDF Invoices, PDF Shipments, PDF Credit Memos) using the toggle in Backend: Action Menu Options and leave only the PickPack variants enabled.
- When using Zebra labels, set up a dedicated Zebra template with the correct label dimensions before assigning it in Design: Assign PDF Templates.

---

## Troubleshooting

### Barcodes do not appear on PDFs

- Cause: Neither GD nor Imagick is installed on the server.
- Check the **Server: Barcode Requirements** panel at Stores > Configuration > Moogento > PickPack > General. Install GD or Imagick, then restart PHP-FPM.

---

### Barcodes appear very tall or very short

- Cause: The template height multiplier does not match the **Barcode: Maximum Height (px)** cap, or the multiplier value is set too high.
- In General, raise **Barcode: Maximum Height (px)** to accommodate your multiplier (height multiplier × 40 must not exceed the maximum). In the PDF template editor, adjust the barcode column's height multiplier.

---

### PDFs contain garbled characters or missing text for international orders

- Cause: The required font (CJK, Thai, etc.) is not installed.
- Enable **Auto-download fonts** in General temporarily to download the font, or manually place the font file in `var/moogento/pickpack/fonts/`. Disable auto-download again once the font is present.

---

### Batch print jobs are slow

- Cause: PDFs are being generated on demand for every order in the batch.
- Enable Speedup (see [Speed up batch printing with Speedup caching](#speed-up-batch-printing-with-speedup-caching)) and ensure Magento cron is running. Click **Process Recent Orders** in the Speedup config to warm the cache immediately.

---

### PDF dates show the wrong time or timezone

- Cause: Server timezone differs from store timezone.
- Set **Date format: Timezone** in Stores > Configuration > Moogento > PickPack > General to your local timezone string (e.g. `America/New_York`, `Europe/London`).

---

### "Print once" is not preventing re-printing

- Cause: The PDF type is not selected in the **Select PDFs for 'Print once'** multi-select.
- At Stores > Configuration > Moogento > PickPack > General, set **Print once?** = Yes and then select the specific document types you want to lock in the **Select PDF's for 'Print once'** field.

---

## FAQs

<!-- seo: FAQPage schema - the page converter should emit JSON-LD for this section -->

### How do I print packing sheets for multiple orders at once?

Select the orders in Sales > Orders, open the **Actions** dropdown, and choose the packing sheet option you want - for example, **PDF (Packing Sheet)** or **PDF (Packing Sheet - Fast)**. Make sure those actions are enabled in Stores > Configuration > Moogento > PickPack > Backend: Action Menu Options > Orders first.

### Can I use a barcode scanner to verify items during picking?

Yes - PickPack can embed barcodes (order number, SKU, or any supported token) on picklist and packing sheet templates. Your scanner reads the barcode from the printed sheet. PickPack generates the documents; the scanner hardware is separate and can be any standard USB or Bluetooth barcode reader.

### Does PickPack work with Picknscan?

PickPack generates the warehouse paperwork (picklists, packing sheets, labels) and Picknscan handles scan-to-verify workflows - the two complement each other. PickPack's combined and separated picklist formats are the source documents a Picknscan-style workflow verifies against.

### How do I get my logo on the PDFs?

Upload your logo inside the template editor at PickPack > PDF templates, then assign that template to the document type you want at Stores > Configuration > Moogento > PickPack > Design: Assign PDF Templates.

### Can customers download their own invoice PDFs?

Yes - enable **Allow customers to make PDFs?** and **Customer: PDF Invoice button?** at Stores > Configuration > Moogento > PickPack > Frontend: Customer Profile Options. Customers will see a download button in their account order history.

### Will PickPack work with Hyvä, Luma, and Porto themes?

PickPack's PDF generation and admin UI are fully backend-driven and theme-independent. The optional customer-facing buttons in the account area are compatible with Luma and Porto; a Hyvä-specific template snippet may be needed for those frontend buttons on Hyvä storefronts - contact support if you need the snippet.

### What happens if I disable PickPack?

Disabling PickPack removes its admin buttons and action menu options, and reverts to Magento's built-in PDF printing. No order data or templates are deleted; re-enabling the module restores everything.

### How many PDF templates can I create?

There is no enforced limit on the number of templates. Create as many as you need, then assign different templates to different document types in Design: Assign PDF Templates.

### Which plan do I need for the picklist split feature?

The **Filter/split by Attribute or Source** feature requires a Pro plan. Invoices, packing sheets, and basic picklists are available on all plans.

### Why are my PDF totals showing the wrong currency?

If your orders are placed in a currency different from the store base currency, enable `show_base_currency` on the totals component in the template JSON to display base-currency amounts. When `show_exchange_rate` is also set to true, an exchange-rate line is appended to the totals section.

---

## Related guides

- **ShipEasy** - carrier rate management and label generation that feeds shipment data into PickPack documents

---

## Need help?

- moo@moogento.com
- Include:
  - Magento version
  - Module name
  - What you're trying to do

