HomeShopify & E-commerceShopify packing slip email automation with…

Shopify packing slip email automation with n8n

Shopify packing slip email automation with n8n









Shopify packing slip email automation sends a clean, printable packing slip to your warehouse or fulfillment desk the instant an order is placed, so nobody has to open Shopify admin and export one by hand. This guide builds that flow in n8n with just three nodes: a Shopify order trigger, a Code node that renders the slip as HTML, and a Gmail node that emails it. It works on n8n Cloud and self-hosted, uses no paid service, and a ready-to-import template is linked at the end.

What it does

The workflow watches for new orders and turns each one into a pick-and-pack document, delivered by email.

  • A new Shopify order fires the workflow in real time through the orders/create webhook.
  • A Code node builds a tidy HTML packing slip: order number, date, shipping address, a line-item table with SKU and quantity, a total unit count, and any order note.
  • A Gmail node emails that slip to your warehouse address as an HTML message the team opens and prints.

The result is a hands-off fulfillment step. Orders reach the people picking them within seconds, formatted for the shop floor rather than buried in the admin. It slots neatly into a wider Shopify automation setup alongside inventory and shipping flows.

Why it beats the default

Shopify can print packing slips, but only one order at a time from the admin, and only when a human goes looking. During a busy drop, that manual step is where slips get missed and the wrong quantity gets picked.

Pushing the slip by email flips the model from pull to push. The warehouse does not log into Shopify at all; the document arrives the moment the order does, already formatted and ready to print. You also control exactly what appears on the slip. The default Shopify template is fixed, but here the layout is plain HTML in a Code node, so you can add a barcode column, a bin location, or a “requires cold pack” flag without fighting a theme editor.

Because it is an HTML email rather than a PDF render, there is no PDF engine to host and nothing that breaks on n8n Cloud. Staff print straight from the email with Ctrl+P. If you later need a true PDF attachment, the Common mistakes section explains how to add one.

What you need

  • A Shopify store with a custom app and an Admin API access token carrying read_orders scope. If you have not connected Shopify to n8n yet, follow connect Shopify to n8n (2026 method) first.
  • An n8n instance, Cloud or self-hosted (version 1.0 or newer).
  • A Gmail account connected to n8n through Gmail OAuth2, and the email address of your warehouse or fulfillment desk.
  • About 15 minutes to build from scratch, or a couple of minutes with the template below.

Node-by-node list

Three nodes, one straight line.

# Node Type Job
1 New Order Shopify Trigger Fires on the orders/create topic for every new order
2 Build Packing Slip HTML Code Turns the order payload into a printable HTML packing slip
3 Email Packing Slip to Warehouse Gmail Sends the slip as an HTML email to your fulfillment address
  [New Order] --> [Build Packing Slip HTML] --> [Email Packing Slip to Warehouse]
  

There is no data store and no schedule. The order payload from the trigger carries everything the slip needs, so the Code node reads it directly and the Gmail node sends the result. That is why the whole thing fits in three nodes and runs in well under a second per order. If you outgrow a single warehouse, every branch you add hangs off the same trigger, so the core stays exactly this simple.

Step-by-step build

  1. New Order (Shopify Trigger). Add a Shopify Trigger node, set Authentication to Access Token, pick your Shopify credential, and set Topic to orders/create. n8n registers the webhook with Shopify automatically. Its output is the full order object: name, created_at, shipping_address, line_items, and note.
  2. Build Packing Slip HTML (Code). Add a Code node set to run once for all items and paste the slip builder. It walks line_items into table rows, assembles the shipping address, sums the quantities into a pick total, and returns an html field:
    const order = $input.first().json;
    const ship = order.shipping_address || {};
    const rows = (order.line_items || []).map(li => {
      const name = li.title + (li.variant_title ? ' - ' + li.variant_title : '');
      return `<tr><td>${li.sku || '(no SKU)'}</td><td>${name}</td><td>${li.quantity}</td></tr>`;
    }).join('');
    const totalUnits = (order.line_items || []).reduce((s, li) => s + (li.quantity || 0), 0);
    // full HTML template with inline CSS ships in the download
    return [{ json: { orderName: order.name, totalUnits, html: '...' } }];

    The full node in the template builds the complete styled slip; the snippet above shows the shape.

  3. Email Packing Slip to Warehouse (Gmail). Add a Gmail node, Operation Send. Set To to your warehouse address, Subject to =Packing slip for order {{ $json.orderName }}, Email Type to HTML, and Message to ={{ $json.html }}. Connect the Code node to it, save, and toggle the workflow Active.

Place a test order in Shopify and the slip lands in the warehouse inbox within seconds, ready to print.

Common mistakes

  • Setting Email Type to Text. The slip is built as HTML with inline styles. Leave Email Type on HTML or the table and layout arrive as raw markup.
  • Missing read_orders scope. Without it the trigger cannot register or receive the order payload. Grant read_orders on the custom app and reconnect the credential.
  • Expecting a PDF attachment. This build emails HTML for portability. If you want a real PDF, add a Convert to File node then an HTTP Request to a Gotenberg /forms/chromium/convert/html endpoint and attach the returned binary in Gmail. That path needs a self-hosted Gotenberg service, so only add it if you run n8n with Docker.
  • Forgetting the order note. Gift messages and delivery instructions live in order.note. The template surfaces it in a highlighted box; do not strip it out or pickers lose that context.
  • Gmail sending limits. A standard Gmail account sends up to roughly 500 emails a day. High-volume stores should point the node at Google Workspace or switch to the SMTP node.

Cost at realistic volume

No paid service touches this workflow. The Shopify Admin API, the n8n Code node, and Gmail are all free within their normal limits.

Volume n8n executions / month Est. monthly cost
50 orders/month, self-hosted n8n 50 $0 beyond your server
300 orders/month, n8n Cloud Starter 300 Inside the Starter execution allowance
1,500 orders/month, n8n Cloud Pro 1,500 A modest slice of the Pro allowance

Each order is exactly one execution and one email. The only ceiling to watch is Gmail’s daily send limit, which a busy store clears by moving to Workspace or SMTP.

Ready-to-import template

Shopify packing slip email automation, ready to import

The full guide above is free to follow. If you would rather skip the build, the downloadable template is the exact three-node workflow from this post, with the complete styled packing-slip Code node and credential placeholders in place, ready to run after you add your Shopify and Gmail credentials.

Download the template ($9) →

Instant download · works on n8n Cloud and self-hosted. Want it built and connected for you? See our done-for-you setup service.

FAQ

Does this send a PDF or an HTML email?

It sends a clean HTML email that your warehouse opens and prints with Ctrl+P or Cmd+P. This keeps the workflow to three nodes and works on n8n Cloud with no extra infrastructure. If you need a true PDF attachment, you can add a Gotenberg render step, which requires a self-hosted PDF engine.

Will it fire on every order, including test orders?

Yes. The orders/create trigger fires for every new order, including manual and test orders. If you want to skip certain orders, add an IF node after the trigger to filter on tags, fulfillment location, or whether the order requires shipping before the email step.

Can I send to more than one warehouse address?

Yes. The Gmail node accepts a comma-separated list in the To field, so you can send the same slip to several addresses. For routing by location, add a Switch node keyed on the line item or order location and point each branch at a different Gmail recipient.

What order fields does the packing slip include?

Out of the box it shows the order number, order date, the full shipping address, a table of every line item with its SKU and quantity, a total unit count for picking, and any customer order note. You can add or remove fields by editing the HTML in the Code node.

Does this cost anything to run?

No paid service is involved. It uses the Shopify Admin API, an n8n Code node, and Gmail, all on their free tiers. Each order is one n8n execution and one email, so even a few hundred orders a month stay well inside a standard n8n plan and Gmail sending limits.

Related guides