Batch Shipping Cover and Footer Templates

Updated 7/2/20269 min read

Warehance's batch shipping flow combines all the shipping labels, packing slips, and pick sheets for a batch of orders into one large PDF that a warehouse operator can print in a single job. That combined PDF has two decorative bookends:

  • A cover sheet printed at the start (prepended)
  • A footer sheet printed at the end (appended)

Historically these were fixed, built-in sheets that just showed the batch ID, creation date, and order count. Batch shipping cover and footer templates let you replace either sheet with your own custom design — a branded manifest, a QA sign-off, a per-parcel tracking recap, whatever your fulfillment operation needs.

This article covers everything: how to enable them, every placeholder available, side-by-side examples showing minimal → detailed layouts, and tips for the layouts customers ask about most often.

Key Concepts First

Both templates are optional and independent. You can:

  • Template the cover only, leaving the footer on the built-in default
  • Template the footer only, leaving the cover on the built-in default
  • Template both
  • Template neither (default) — Warehance uses its built-in sheets

If a template isn't set (or fails to render for some reason), Warehance falls back to the built-in sheet. There's no way to end up with no cover/footer at all when Include Batch Info Sheets is enabled — worst case you get the built-in default.

Both templates must be exactly 4in × 6in. Warehance rejects any template of these types with a different page size at save time. This is because the combined batch PDF is assembled at 4×6 page dimensions downstream; a differently-sized cover would break the assembly.

Cover and footer share the same data. Everything you can put on a cover sheet you can put on a footer sheet, and vice versa. They differ only in where they attach to the combined PDF, not in what variables are available.

Both templates work in both batch flows. The batch shipping flow and the custom batch shipping flow both use these templates. Layouts you build once print at the start/end of either combined PDF.

Enabling Batch Shipping Templates

Step 1: Go to Settings → Printing.

Step 2: In the Batch Shipping section, make sure Include Batch Info Sheets is turned on. Without this, Warehance skips both the cover and footer entirely regardless of any templates you've assigned.

Step 3: Under Batch Cover Sheet Template, pick a template from the dropdown. Only templates of type batch_shipping_cover appear here.

Step 4: Under Batch Footer Sheet Template, pick a template from the dropdown. Only templates of type batch_shipping_footer appear here.

Step 5: Click Save Changes.

Leave either dropdown on None (use built-in default) to fall back to the built-in sheet for that slot. This is the safest way to test a new cover: assign it, print a small batch, and if it doesn't work, revert to None.

Creating a Batch Cover or Footer Template

Step 1: Go to Templates → PDF Templates and click Create.

Step 2: Give it a Template Name (e.g., "Warehouse Cover with Tracking").

Step 3: Choose Batch Shipping Cover Sheet or Batch Shipping Footer Sheet from the Template Type dropdown. You'll see a hint under the dropdown reminding you that these must be 4in × 6in.

Step 4: Click Browse Presets to start from a pre-built template. Warehance ships 5 cover presets and 3 footer presets covering the most common patterns

Step 5: Edit the XML in the code editor. As you type {{, the editor suggests available placeholders.

Step 6: Click Generate Preview to render the template against sample data — you'll see a realistic batch with 3 parcels, 6 orders, and full metadata. Iterate until it looks right.

Step 7: Click Save Template. If your <template width="..." height="..."> isn't 4in × 6in, save fails with a clear error message.

Step 8: Assign the template under Settings → Printing → Batch Shipping (see above).

Every Available Placeholder

Batch shipping templates expose four scopes of data:

  • Top-level scalars — batch metadata, warehouse identity, totals
  • Section groups — one per parcel + a synthetic "Pick Slip" section
  • Section rows — the individual pick lines inside a section
  • Order groups — one per order (used for manifest-style layouts)

Top-Level Scalars

Available anywhere in the template.

Batch identity and timing:

PlaceholderDescriptionExample
{{batch_id}}Numeric batch session ID48231
{{created_at}}Batch creation timestamp (date + time)07/01/2026 03:04PM
{{created_date}}Creation date only07/01/2026
{{created_time}}Creation time only03:04PM
{{completed_at}}When the batch was marked complete (blank if not yet)07/01/2026 04:15PM
{{printed_at}}When labels were printed07/01/2026 03:20PM
{{is_completed}}"true" or "false"false
{{is_printed}}"true" or "false"true
{{is_packed}}"true" or "false"false

Order and staff:

PlaceholderDescriptionExample
{{number_of_orders}}Order count in the batch12
{{picker_name}}Operator who printed the labelsMarcus Chen
{{packer_name}}Operator who packed the batchPriya Patel

Totals across the batch:

PlaceholderDescriptionExample
{{total_shipments}}Non-voided shipment count12
{{total_parcels}}Total parcel/box count14
{{total_skus}}Distinct SKU count4
{{total_units_picked}}Sum of all pick quantities36
{{total_weight}}Aggregate parcel weight, in ounces268.80 oz
{{total_order_value}}Sum of order totals$1,458.24
{{unique_locations}}Distinct pick locations6

Warehouse and organization:

PlaceholderDescriptionExample
{{warehouse_name}}Physical warehouse nameAurora Fulfillment
{{warehouse_company}}Warehouse company name (from ship-from)Sample Fulfillment Co.
{{warehouse_street}}Warehouse street line 1123 Warehouse St
{{warehouse_street2}}Warehouse street line 2Bay 4
{{warehouse_city}}Warehouse cityAurora
{{warehouse_state}}Warehouse stateCO
{{warehouse_zip}}Warehouse ZIP/postal80011
{{warehouse_country}}Warehouse countryUS
{{warehouse_city_state_zip}}Single-line: City, ST ZIPAurora, CO 80011
{{warehouse_timezone}}IANA timezoneAmerica/Denver
{{organization_name}}Organization / account nameSample Fulfillment Co.

Store and client aggregation:

PlaceholderDescriptionExample
{{primary_store}}Name of the first order's storeSample Shopify Store
{{store_count}}Distinct stores across the batch2
{{primary_client}}Name of the first order's client (for 3PLs)Acme Brands

Section Groups — <data-groups source="sections">

Sections are one-per-parcel across the batch, plus a synthetic Pick Slip section at the end that aggregates all picks. Use <data-groups source="sections"> to loop over them.

Inside a section group, you have access to:

PlaceholderDescriptionExample
{{title}}Section titleBox 1, Pick Slip
{{box}}Box or container nameSmall Box, Poly Mailer M
{{box_id}}Warehance box-type ID101
{{dimensions}}Box dimensions (formatted)8.00 x 6.00 x 4.00
{{weight}}Parcel weight12.70 oz
{{parcel_index}}1-indexed position of this parcel1, 2, 3
{{shipment_id}}Warehance shipment ID90001
{{tracking_number}}Parcel tracking number1Z999AA10123456784
{{carrier}}Normalized carrier slugups, fedex, usps
{{service}}Carrier service levelGround, Priority Mail
{{service_code}}Carrier-specific service codeups_ground
{{ship_to_name}}Recipient full nameJane Customer
{{ship_to_street}}Recipient street 1456 Customer Ave
{{ship_to_city}}Recipient cityNew York
{{ship_to_state}}Recipient stateNY
{{ship_to_zip}}Recipient ZIP10001
{{ship_to_country}}Recipient countryUS
{{ship_to_city_state_zip}}Single-line recipient locationNew York, NY 10001
{{order_number}}Order that owns this sectionORD-10042
The synthetic Pick Slip section has title="Pick Slip" and empty box/dimensions/weight — its rows show the aggregate pick list for the whole batch (each SKU with its total quantity across all orders), which is what a warehouse worker actually picks from. Use if="{{box}}" on parcel-specific text (like "Dimensions: ...") to hide those lines on the Pick Slip section.

Section Rows — <data-rows source="rows">

Each section contains a rows array. Use <data-rows source="rows"> inside a section group to render one row per pick line. Rows expose:

Core identifiers:

PlaceholderDescription
{{sku}}Product SKU
{{barcode}}Product barcode / UPC
{{qty}}Quantity in this row
{{order_number}}Order this row belongs to

Product details:

PlaceholderDescription
{{product_name}}Human-readable product name
{{product_description}}Long-form product description
{{product_note}}Internal product note
{{product_pack_note}}Packing instructions
{{product_weight}}Per-unit weight
{{product_dimensions}}Per-unit L x W x H
{{product_image_url}}Filename of the primary product image (for <image src="...">)
{{product_custom_field_1}}Custom field 1
{{product_custom_field_2}}Custom field 2
{{product_custom_field_3}}Custom field 3
{{uom_type}}Unit of measure (Each, Case, Innerpack, etc.)

Kit / bundle info:

PlaceholderDescription
{{is_bundle}}"true" if this row is a bundle component
{{bundle_parent_sku}}Parent kit's SKU (blank if not a bundle child)

Lot / serial tracking:

PlaceholderDescription
{{lot_number}}Product lot number
{{expiration_date}}Lot expiration date
{{serial_numbers}}Comma-joined list of serial numbers

Order Groups — <data-groups source="orders">

For manifest-style layouts, iterate over orders to render one block per order:

PlaceholderDescriptionExample
{{order_number}}Order numberORD-10043
{{order_date}}Date the order was placed06/30/2026
{{customer_name}}Recipient's full nameMarcus Diaz
{{ship_to_street}}Recipient street 112 Oak St, Apt 3
{{ship_to_city_state_zip}}Recipient city/state/zipBoston, MA 02116
{{tracking_number}}First tracking number for this order9400111899223345678902
{{carrier}}Carrier for this orderusps
{{service}}Service levelPriority Mail
{{item_count}}Total item quantity in this order4
{{order_total}}Order total value$98.50
{{store_name}}Source store / marketplaceSample Shopify Store
{{gift_note}}Gift note (if any)Happy birthday!
{{packing_note}}Packing instructions (if any)Gift wrap requested
{{priority}}"true" if the order is marked prioritytrue

Common Layout Patterns

Once you know the placeholders, here are the layouts customers ask for most often — with copy-paste XML you can start from.

Pattern 1: The Absolute Minimum

Barcode + Batch ID + order count. Fits on one 4×6 page. Good for warehouses that just need a scannable header.

<template width="4in" height="6in" margins="0.25in" page-numbers="false">
  <text size="22" weight="bold" align="center">BATCH</text>
  <line color="#000000" height="1pt"/>
  <spacer height="0.2in"/>
  <barcode type="code128" width="3.4in" height="0.9in" align="center">{{batch_id}}</barcode>
  <text size="10" align="center">Batch #{{batch_id}}</text>
  <spacer height="0.3in"/>
  <text size="10" align="center">{{created_at}}</text>
  <text size="10" align="center">{{number_of_orders}} orders</text>
</template>

Pattern 2: Cover with Box Summary

Cover page + per-parcel list showing box, dimensions, weight, tracking. Uses <data-groups source="sections"> — grows to as many pages as parcels require.

<template width="4in" height="6in" margins="0.2in" page-numbers="true">
  <page>
    <text size="20" weight="bold" align="center">BATCH SHIPPING</text>
    <line color="#000000" height="1pt"/>
    <spacer height="0.15in"/>
    <barcode type="code128" width="3.4in" height="0.7in" align="center">{{batch_id}}</barcode>
    <text size="10" align="center">Batch #{{batch_id}}</text>
    <spacer height="0.3in"/>
    <table border="0">
      <columns widths="45%,55%"/>
      <data-row><cell align="right" size="9" weight="bold">Created:</cell><cell align="left" size="9">{{created_at}}</cell></data-row>
      <data-row><cell align="right" size="9" weight="bold">Orders:</cell><cell align="left" size="9">{{number_of_orders}}</cell></data-row>
      <data-row><cell align="right" size="9" weight="bold">Parcels:</cell><cell align="left" size="9">{{total_parcels}}</cell></data-row>
    </table>
  </page>

  <page>
    <text size="13" weight="bold" align="center">Box Summary</text>
    <line color="#000000" height="0.5pt"/>
    <spacer height="0.1in"/>
    <data-groups source="sections" keep-together="0.8in">
      <text size="10" weight="bold">{{title}} · {{box}}</text>
      <text size="8" if="{{dimensions}}">Dims: {{dimensions}} · Weight: {{weight}}</text>
      <text size="8" if="{{tracking_number}}">{{carrier}} {{service}} · {{tracking_number}}</text>
      <spacer height="0.05in"/>
      <line color="#cccccc" height="0.3pt"/>
      <spacer height="0.05in"/>
    </data-groups>
  </page>
</template>

Pattern 3: Manifest for a Driver Handoff

Iterates over orders to print one row per order with recipient + tracking. Great when you're handing off a pallet to a specific driver.

<template width="4in" height="6in" margins="0.2in" page-numbers="true">
  <page>
    <text size="18" weight="bold" align="center">Batch Manifest</text>
    <line color="#000000" height="1pt"/>
    <spacer height="0.15in"/>
    <barcode type="code128" width="3.4in" height="0.6in" align="center">{{batch_id}}</barcode>
    <text size="9" align="center">Batch #{{batch_id}} · {{created_at}}</text>
  </page>

  <page>
    <text size="12" weight="bold" align="center">Order Tracking</text>
    <line color="#000000" height="0.5pt"/>
    <spacer height="0.08in"/>
    <data-groups source="orders" keep-together="0.7in">
      <row border="0">
        <col width="60%" border="0">
          <text size="9" weight="bold">{{order_number}}</text>
          <text size="7">{{customer_name}}</text>
          <text size="7">{{ship_to_city_state_zip}}</text>
        </col>
        <col width="40%" border="0">
          <text size="7" align="right" weight="bold">{{carrier}} {{service}}</text>
          <text size="7" align="right">{{tracking_number}}</text>
          <text size="7" align="right" if="{{priority}}">PRIORITY</text>
        </col>
      </row>
      <line color="#dddddd" height="0.3pt"/>
      <spacer height="0.04in"/>
    </data-groups>
  </page>
</template>

Pattern 4: Full Pick Sheet with Product Names

Three-page cover: banner, box summary, per-section pick detail with a product table. This is closest to a from-scratch pick sheet.

<template width="4in" height="6in" margins="0.2in" page-numbers="true">
  <page>
    <text size="22" weight="bold" align="center">BATCH PICK</text>
    <line color="#000000" height="1pt"/>
    <spacer height="0.15in"/>
    <barcode type="code128" width="3.4in" height="0.7in" align="center">{{batch_id}}</barcode>
    <text size="10" align="center">Batch #{{batch_id}}</text>
    <spacer height="0.2in"/>
    <table border="0">
      <columns widths="45%,55%"/>
      <data-row><cell align="right" size="9" weight="bold">Orders:</cell><cell align="left" size="9">{{number_of_orders}}</cell></data-row>
      <data-row><cell align="right" size="9" weight="bold">Parcels:</cell><cell align="left" size="9">{{total_parcels}}</cell></data-row>
      <data-row><cell align="right" size="9" weight="bold">SKUs:</cell><cell align="left" size="9">{{total_skus}}</cell></data-row>
      <data-row><cell align="right" size="9" weight="bold">Units:</cell><cell align="left" size="9">{{total_units_picked}}</cell></data-row>
    </table>
    <spacer height="0.35in"/>
    <text size="9" weight="bold">Picker</text>
    <line color="#666666" height="0.5pt"/>
    <spacer height="0.2in"/>
    <text size="9" weight="bold">Packer</text>
    <line color="#666666" height="0.5pt"/>
  </page>

  <page>
    <text size="14" weight="bold" align="center">Pick Detail</text>
    <line color="#000000" height="0.5pt"/>
    <spacer height="0.1in"/>
    <data-groups source="sections" keep-together="1.8in">
      <text size="11" weight="bold">{{title}}</text>
      <text size="8" if="{{box}}">{{box}} · {{dimensions}} · {{weight}}</text>
      <spacer height="0.04in"/>
      <table border="1">
        <columns widths="27%,43%,10%,20%"/>
        <header-row background-color="#f0f0f0" height="0.18in">
          <cell align="left" size="7" weight="bold">SKU</cell>
          <cell align="left" size="7" weight="bold">Product</cell>
          <cell align="right" size="7" weight="bold">Qty</cell>
          <cell align="left" size="7" weight="bold">Barcode</cell>
        </header-row>
        <data-rows source="rows" height="0.2in">
          <data-row>
            <cell align="left" size="7">{{sku}}</cell>
            <cell align="left" size="7" wrap="true">{{product_name}}</cell>
            <cell align="right" size="7" weight="bold">{{qty}}</cell>
            <cell align="left" size="7">{{barcode}}</cell>
          </data-row>
        </data-rows>
      </table>
      <spacer height="0.15in"/>
    </data-groups>
  </page>
</template>

Pattern 5: Footer with Signature Block

For warehouses that want a physical sign-off at the end of the batch. Put this on the footer template.

<template width="4in" height="6in" margins="0.25in" page-numbers="false">
  <text size="16" weight="bold" align="center">QA Signoff</text>
  <line color="#000000" height="1pt"/>
  <spacer height="0.15in"/>
  <barcode type="code128" width="3.4in" height="0.55in" align="center">{{batch_id}}</barcode>
  <text size="9" align="center">Batch #{{batch_id}} · Printed {{printed_at}}</text>
  <spacer height="0.4in"/>
  <row border="0">
    <col width="45%" border="0"><text size="9" weight="bold">Picker</text><text size="7">{{picker_name}}</text></col>
    <col width="55%" border="0"><line color="#000000" height="0.5pt"/></col>
  </row>
  <spacer height="0.2in"/>
  <row border="0">
    <col width="45%" border="0"><text size="9" weight="bold">Packer</text><text size="7">{{packer_name}}</text></col>
    <col width="55%" border="0"><line color="#000000" height="0.5pt"/></col>
  </row>
  <spacer height="0.2in"/>
  <row border="0">
    <col width="45%" border="0"><text size="9" weight="bold">QA Reviewer</text></col>
    <col width="55%" border="0"><line color="#000000" height="0.5pt"/></col>
  </row>
</template>

Preset Catalog

Warehance ships 5 cover presets and 3 footer presets. Access them via Browse Presets in the template editor.

Cover Presets

NameCategoryPagesBest for
Minimal Batch CoverBasic1Just need a scannable batch header
Cover with Box SummaryWith Summary2+Per-parcel box list; grows with parcel count
Cover with Tracking ManifestWith Tracking2+Driver handoff sheets with per-order tracking
Detailed Pick Sheet CoverDetailed3+Full pick sheet: banner + box summary + per-section detail with product tables
Warehouse-Branded CoverBranded1Multi-warehouse orgs; warehouse name/address prominent

Footer Presets

NameCategoryPagesBest for
Minimal Batch FooterBasic1Simple "batch complete" marker
QA Signoff FooterQA1Signature lines for picker / packer / QA reviewer
Batch Recap FooterReconciliation2+End-of-batch reconciliation with per-parcel ledger

Layout Tips

Keeping Section Blocks Together

When using <data-groups source="sections">, add keep-together="1.5in" (or whatever height you want) to prevent a section header from stranding at the bottom of a page with no rows underneath it:

<data-groups source="sections" keep-together="1.8in">

If less than 1.8 inches remain on the current page when a new section starts, the renderer inserts a page break first.

Hiding Blank Values

Use if="{{placeholder}}" on any element to hide it when the value is empty. This is critical for the Pick Slip section (which has no box/dimensions/weight) and for warehouses that don't set every optional field:

<text size="8" if="{{box}}">Box: {{box}}</text>
<text size="8" if="{{tracking_number}}">Tracking: {{tracking_number}}</text>

Formatting Boolean Fields

{{is_bundle}}, {{is_completed}}, {{priority}}, etc. render as the strings "true" or "false". Combine with if= to only show when true — the if check treats "false" and blank the same:

<text size="9" align="right" if="{{priority}}">PRIORITY</text>

The word "PRIORITY" only renders when {{priority}} resolves to "true".

Multi-Page Templates

Wrap logical pages in <page> blocks for clean breaks:

<template width="4in" height="6in">
  <page>...page 1...</page>
  <page>...page 2...</page>
  <page>...page 3...</page>
</template>

If a section on page 3 has more data than fits, auto page-break inserts additional pages between page 3 and any subsequent <page> block — you don't need to worry about it.

Barcodes That Actually Scan

  • Use code128 for numeric or alphanumeric IDs (like {{batch_id}})
  • Give the barcode height="0.6in" or taller — most warehouse scanners struggle below 0.5in
  • Keep align="center" and add small padding for a clean quiet zone

Warehouse Address as a Return Block

If your cover doubles as a return label, this pattern reads well:

<text size="11" weight="bold">{{organization_name}}</text>
<text size="9">{{warehouse_name}}</text>
<text size="8" if="{{warehouse_street}}">{{warehouse_street}}</text>
<text size="8">{{warehouse_city_state_zip}} {{warehouse_country}}</text>

Preview and Testing

Click Generate Preview in the template editor to render your template against realistic sample data:

  • 12 orders
  • 3 parcels (Small Box, Poly Mailer, Medium Box)
  • 4 SKUs (Widget, Gadget, Tee, Supplement) with product names, barcodes, weights
  • Realistic recipients, tracking numbers, carriers (UPS, USPS, FedEx)
  • A synthetic Pick Slip section aggregating the picks
  • 6 sample orders for the <data-groups source="orders"> block

This lets you verify your layout without setting up a real batch. Iterate on the XML, click Generate Preview, repeat.

The preview uses fixed sample data — it won't show your real batches. Once the layout looks right, assign the template under Settings → Printing and print a small real batch to verify against production data.

Troubleshooting

The cover prints but my customization is missing

  • Check Settings → Printing → Batch Shipping — is the template actually assigned to the cover slot?
  • Check Include Batch Info Sheets is turned on. Without this, no cover/footer prints at all.
  • If the template fails to render (bad XML, unknown attribute), Warehance logs the error and falls back to the built-in default. Check the batch shipping error logs in your Sentry dashboard or contact support.

The footer looks fine on preview but doesn't print

Same as above — check Settings → Printing and the Include Batch Info Sheets toggle. Footer and cover are independent, so it's possible to have the cover template assigned and the footer template unassigned (which means the footer falls back to the built-in default).

The template save is rejected with "must be 4in x 6in"

Your <template width="..." height="..."> isn't 4in × 6in. Change it and save again. The following are all equivalent to 4in × 6in:

  • width="4in" height="6in"
  • width="101.6mm" height="152.4mm"
  • width="288pt" height="432pt"

Warehance normalizes units internally with a small tolerance, so 101.6mm is treated the same as 4in.

Product names are showing up empty

Check that the batch actually has product data preloaded. In edge cases (e.g., orders with items missing product references), product fields render as blank strings — the template still renders, but the product row is thin. This is intentional: the sheet still prints, but blank fields signal something to investigate.

The Pick Slip section shows box "Custom Box" or wrong dimensions

The Pick Slip section is a synthetic aggregate — it doesn't belong to any specific parcel, so {{box}}, {{dimensions}}, and {{weight}} are empty strings on that section. If you're seeing "Custom Box" that's a specific parcel's box name from an earlier iteration. Use if="{{box}}" guards on your section header text to hide those lines when the section is the Pick Slip aggregate.

Preview button is disabled

Make sure a template type is selected. Both batch_shipping_cover and batch_shipping_footer support preview, but the preview button stays disabled while the type dropdown is empty.

Related Articles

  • How to Create and Use PDF Templates (the general overview — start here if you're new to templates)
  • Batch Shipping Overview
  • Setting Up the Custom Batch Shipping Flow

Still need help?

Can't find what you're looking for? Our support team is happy to help.

Contact Support