Shipment dispatched → packing slip with the van

The van is loading and the paperwork is a spreadsheet someone is printing by hand.

Trigger → artefact

A shipment leaves the warehousea delivery note per dispatch, with what actually went on the vehicle

Dispatch paperwork is late because it is generated by a person, after the fact, from a system that already knows every answer. The order says twelve; nine were picked; the note that travels with the goods still says twelve, and the argument happens at the customer’s goods-inward desk a week later.

You POST the shipment as it left. The document works out which lines are short, how many units remain on back order, and says so on the page the receiver signs. Values can be shown or suppressed with one field, because a packing slip going to a customer’s dock is not always allowed to carry prices.

Built with the HTML API. Need a designed image or certificate instead? Use the Canvas API — same data, same free year.

A delivery note PDF rendered by PixlDocs, showing ordered versus shipped quantities, carrier details and a short-shipment notice
Rendered by the template this page calls — not a mockup.

The whole integration

One call. Named fields. No SDK to install.

the call your product makesbash
# the call your dispatch job makes, once per shipment
curl https://api.pixldocs.com/v1/render \
  -H "Authorization: Bearer $PIXLDOCS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "235509e4-acfe-4088-b724-b544a14595e8",
    "format": "pdf",
    "data": {
      "issuer_name": "Northwind Systems Private Limited",
      "customer_name": "Halden Precision Components",
      "ship_to_address": "Unit 44B, Halden Industrial Park, Rotterdam 3089 JR",
      "document_number": "DN-2026-0917",
      "dispatch_date": "03 Aug 2026, 14:20",
      "order_number": "PO-2026-0184",
      "carrier": "Safe Express",
      "tracking_number": "SE-4471-88203",
      "show_values": "no",
      "line_items": [
        { "description": "Linear rail, 20mm", "sku": "LR-20-1000",
          "unit": "pcs", "qty_ordered": 12, "qty_shipped": 12 },
        { "description": "Ball screw, 16mm", "sku": "BS-16-800",
          "unit": "pcs", "qty_ordered": 4, "qty_shipped": 2 }
      ]
    }
  }' --output delivery-note.pdf

Run against our API before publishing: 200, application/pdf, 51,479 bytes, 1.4s. The back-order line on the document is computed from the quantities above — we do not ask you to send the sentence.

Measured, not estimated

short shipments
detected from ordered vs shipped, stated on the page
prices on the slip
one field — show or suppress, same template
one document
~1.4s, PDF bytes in the response
a day of dispatches at once
142 documents a minute, measured
a line missing a quantity
400 naming the field — never a blank column

The arithmetic being inside the document is the point: the warehouse system sends what it knows, and the note that travels with the goods cannot disagree with it.

The contract

Exactly what you send, exactly what you get.

The delivery note / packing slip template takes these named keys. Nothing about layout, fonts or page breaks appears in your code.

Delivery note / packing slip

235509e4-acfe-4088-b724-b544a14595e8

Fields · 28

issuer_nameissuer_addressissuer_emailissuer_phoneissuer_tax_idcustomer_namecustomer_attncustomer_accountship_to_addressbill_to_addressdocument_numberdocument_datedispatch_dateorder_numberorder_dateshipment_sequencecarrierservice_leveltracking_numbervehicle_referenceincotermsdelivery_windowhandling_notesnotescontact_emailshow_valuescurrency_codecurrency_locale

Rows · line_items[]

description · sku · batch · unit · qty_ordered · qty_shipped · unit_price

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

Rows · packages[]

package_id · package_type · weight_kg · dimensions · contents

Send as many as you have. Pagination, running totals and the carried-forward header are the renderer's problem, not yours.

What you would ask next.

We need a packing slip and an invoice from the same shipment.

Two templates, two calls, the same record. The delivery note suppresses values and the invoice does not — that is a field, not a fork.

Our carrier and consignment fields are different.

Field names are yours. Describe the note you use today, or paste its HTML, and the endpoint takes your names — no mapping layer on your side.

Can the driver get it on a phone?

You get PDF bytes back from the call; where they go is yours. Most teams put them straight into the object store the dispatch record already points at.

Your system already knows when the document is owed.

Free to start · No credit card required