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.

The whole integration
One call. Named fields. No SDK to install.
# 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.pdfRun 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-b544a14595e8Fields · 28
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