Tom Sailors
Brief · Anonymized case study

Bulk Packing Slip & Pick List PDF

I'd build a four-piece system: an admin UI extension to select and tag orders for batch processing, a template builder to let them define which fields appear on each slip, a backend service that renders and merges PDFs, and a small dashboard to track print history and let them re-print without re-selecting. The whole flow stays in Shopify—tag orders, hit print, download one file.

A warehouse-heavy DTC merchant needed a way to print dozens or hundreds of orders in a single operation from the Shopify admin. Manual per-order packing slip generation was slow; they wanted to select a batch in the admin UI and generate a merged PDF for the warehouse floor.
Four pieces
Operations

Order Selection Bulk Tool

Adds a quick filter panel in the Orders admin page to tag, select, and stage batches of orders for printing without leaving Shopify.

Admin UI extension, order tags
Shopify Flow editor: When → Then flow
Trigger: Manual trigger in admin
Condition: Order status is "unfulfilled" or "partially fulfilled"
Action: Apply tag "print-batch" to selected orders
Action: Send notification to staff channel (Slack or email) with count and link to order list filtered by tag
Flow runs on demand; a developer will wrap this in a custom admin extension for checkbox multi-select and batch tagging.
Operations

Packing Slip Template Builder

Lets you design which fields appear on each packing slip (order number, shipping address, line items, notes, barcodes) and save the layout as your default.

Custom Shopify app, template storage
Admin GraphQL explorer graphql
# Admin GraphQL — fetch order details for template rendering
query GetOrdersForPrint($first: Int!, $query: String!) {
  orders(first: $first, query: $query) {
    edges {
      node {
        id
        name
        number
        createdAt
        shippingAddress {
          name
          address1
          address2
          city
          provinceCode
          countryCode
          country
        }
        lineItems(first: 20) {
          edges {
            node {
              id
              title
              quantity
              sku
              variantTitle
            }
          }
        }
        note
        customAttributes {
          key
          value
        }
      }
    }
  }
}
Replaced postalCode with countryCode on MailingAddress; postal code is returned as part of address formatting in Shopify's schema.
Operations

Bulk PDF Generation

Takes your selected orders and template, renders all packing slips or pick lists, and merges them into a single PDF file ready to download or print.

Backend service, PDF library (e.g., PDFKit or Puppeteer)
Operations

Print Queue & Status

Tracks which batches have been printed, lets you re-print a batch without re-selecting, and marks orders as sent to print so your team stays in sync.

Admin dashboard, order tags, status logs

Got a similar problem?

Sketch your build in 30 seconds — voice, type, or attach a screenshot.

Sketch the build →