Tom Sailors
· Refreshed
Brief · Anonymized case study

Bulk Packing Slip & Pick List Generation

Build an admin extension that adds bulk order selection, custom packing slip templates, and single-file PDF export to Shopify's native admin. Tag unfulfilled or partially fulfilled orders in the Orders list, pull their details via Admin GraphQL, apply a configurable template layout, and merge all slips into one PDF for download. Track print batches with order tags and status logs so the team can re-print without re-selecting.

A mid-market e-commerce merchant needs to generate packing slips and pick lists for large order batches directly from the Shopify admin. Manually processing 200+ orders per print cycle consumes warehouse time and creates opportunities for selection errors. A UI extension that stages orders, applies a custom template, and renders a merged PDF solves this friction without leaving Shopify.
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 →