Skip to content

210 × 297 mm

Delivery notes

Standard delivery note

An A4 delivery note with a consignment barcode, delivery address, order and carrier details, lines comparing ordered and delivered quantities with a back-ordered badge and expected date, a list of items to follow, and received-by and driver signature blocks.

A4 portraitLocale en-GBHTML + JinjaHeader & footer

Opens Dynamic Document API with this template preloaded in a free workspace.

Template language features

  • Loops
  • Conditionals
  • Macros
  • Filters
  • Number formatting
  • Date formatting
  • Barcode
  • Repeating table headers
  • Header & footer
  • Page numbers

Filters such as format_currency and qrcode are described in the template language reference.

Variables

Derived from the sample data: 5 top-level fields, 31 paths in total. Send the same shape as data.

PathTypeExample
supplierobject
supplier.namestring"Calderbank Office Interiors Ltd"
supplier.addressstring"Calder Works, 2 Tanyard Road ⏎ Halifax HX3 5AL…"
supplier.phonestring"+44 20 7946 0615"
supplier.emailstring"deliveries@calderbank.example.com"
supplier.vat_idstring"GB 135 7924 68"
customerobject
customer.namestring"Tarnside Architects LLP"
customer.accountstring"C-10457"
customer.delivery_addressstring"3rd Floor, Wharfside House ⏎ 18 Navigation Wal…"
customer.contactstring"Farida Ellingham"
customer.phonestring"+44 20 7946 0642"
deliveryobject
delivery.note_numberstring"DN-240613"
delivery.consignment_numberstring"CBK4471093026GB"
delivery.datedate"2026-09-16"
delivery.order_numberstring"SO-58217"
delivery.customer_referencestring"TA-PO-1193"
delivery.carrierstring"Brackenfield Logistics"
delivery.servicestring"Two-person delivery and installation"
delivery.vehiclestring"Van 12"
delivery.driverstring"Kwame Holloway"
delivery.packagesnumber14
delivery.total_weight_kgnumber412.5
itemsarray<object> · 9
items[].codestring"CB-DSK-1600-OAK"
items[].descriptionstring"Sit-stand desk, 1600 × 800 mm, oak-effect top"
items[].orderednumber6
items[].deliverednumber6
items[].back_order_datedate"2026-09-30"
notesstring"Installation team on site from 08:00 to 13:00.…"

Sample data

Fictional records used for previews. Replace them with your own data when you call the API.

data.json
{
  "supplier": {
    "name": "Calderbank Office Interiors Ltd",
    "address": "Calder Works, 2 Tanyard Road\nHalifax HX3 5AL\nUnited Kingdom",
    "phone": "+44 20 7946 0615",
    "email": "deliveries@calderbank.example.com",
    "vat_id": "GB 135 7924 68"
  },
  "customer": {
    "name": "Tarnside Architects LLP",
    "account": "C-10457",
    "delivery_address": "3rd Floor, Wharfside House\n18 Navigation Walk\nLeeds LS10 1JR\nUnited Kingdom",
    "contact": "Farida Ellingham",
    "phone": "+44 20 7946 0642"
  },
  "delivery": {
    "note_number": "DN-240613",
    "consignment_number": "CBK4471093026GB",
    "date": "2026-09-16",
    "order_number": "SO-58217",
    "customer_reference": "TA-PO-1193",
    "carrier": "Brackenfield Logistics",
    "service": "Two-person delivery and installation",
    "vehicle": "Van 12",
    "driver": "Kwame Holloway",
    "packages": 14,
    "total_weight_kg": 412.5
  },
  "items": [
    { "code": "CB-DSK-1600-OAK", "description": "Sit-stand desk, 1600 × 800 mm, oak-effect top", "ordered": 6, "delivered": 6, "back_order_date": null },
    { "code": "CB-CHR-ERG-GRY", "description": "Ergonomic task chair, grey mesh back", "ordered": 8, "delivered": 5, "back_order_date": "2026-09-30" },
    { "code": "CB-PED-3D-WHT", "description": "Mobile pedestal, three drawers, white", "ordered": 6, "delivered": 6, "back_order_date": null },
    { "code": "CB-SCR-1600-SGE", "description": "Desk-mounted acoustic screen, 1600 mm, sage felt", "ordered": 6, "delivered": 4, "back_order_date": "2026-10-07" },
    { "code": "CB-TBL-MTG-2400", "description": "Meeting table, 2400 × 1200 mm, oak-effect", "ordered": 1, "delivered": 1, "back_order_date": null },
    { "code": "CB-CHR-MTG-BLK", "description": "Meeting chair, stackable, black", "ordered": 10, "delivered": 10, "back_order_date": null },
    { "code": "CB-CAB-TALL-WHT", "description": "Tall storage cabinet, lockable, white", "ordered": 2, "delivered": 2, "back_order_date": null },
    { "code": "CB-LMP-TASK-LED", "description": "LED task lamp with USB-C port", "ordered": 6, "delivered": 0, "back_order_date": "2026-10-14" },
    { "code": "CB-CBL-TRAY-1600", "description": "Under-desk cable tray, 1600 mm", "ordered": 6, "delivered": 6, "back_order_date": null }
  ],
  "notes": "Installation team on site from 08:00 to 13:00. All packaging taken away for recycling. Back-ordered items are delivered free of charge and do not need a new order."
}

Source

The body markup with Jinja, the stylesheet placed in <head> and the header and footer settings.

{#- Delivery note. A line is back-ordered when fewer units were delivered than ordered. -#}
{%- set locale = "en-GB" -%}
{%- set total_ordered = items | sum_by("ordered") | int -%}
{%- set total_delivered = items | sum_by("delivered") | int -%}
{%- set total_outstanding = total_ordered - total_delivered -%}
{%- set back_orders = items | rejectattr("back_order_date", "none") | list -%}

{%- macro tick(label) -%}
<span class="tick"><span class="box"></span>{{ label }}</span>
{%- endmacro %}

<header class="masthead">
  <div class="brand">
    <svg class="logo" viewBox="0 0 40 40" aria-hidden="true">
      <rect x="2" y="2" width="36" height="36" rx="4" fill="#0b4dbd"/>
      <path d="M9 27h22M11 27V17h18v10M14 17v-4h12v4" fill="none" stroke="#ffffff" stroke-width="2.4" stroke-linejoin="round"/>
    </svg>
    <div>
      <p class="brand-name">{{ supplier.name }}</p>
      <p class="brand-meta">{{ supplier.address | replace("\n", " · ") }}</p>
      <p class="brand-meta">{{ supplier.phone }} · {{ supplier.email }}</p>
    </div>
  </div>
  <div class="doc">
    <h1>Delivery note</h1>
    <p class="doc-number">{{ delivery.note_number }}</p>
  </div>
</header>

<section class="consignment">
  <div class="code">
    {{ delivery.consignment_number | barcode("code128", alt="Barcode " ~ delivery.consignment_number) }}
  </div>
  <dl>
    <div><dt>Consignment</dt><dd>{{ delivery.consignment_number }}</dd></div>
    <div><dt>Delivery date</dt><dd>{{ delivery.date | format_date("long", locale) }}</dd></div>
    <div><dt>Packages</dt><dd>{{ delivery.packages }}</dd></div>
    <div><dt>Gross weight</dt><dd>{{ delivery.total_weight_kg | format_number(locale, 1) }} kg</dd></div>
  </dl>
</section>

<section class="info">
  <div>
    <p class="label">Deliver to</p>
    <p class="strong">{{ customer.name }}</p>
    <p>{{ customer.delivery_address | nl2br }}</p>
    <p class="muted">Contact: {{ customer.contact }}, {{ customer.phone }}</p>
  </div>
  <div>
    <p class="label">Order</p>
    <dl class="pairs">
      <dt>Our order</dt><dd>{{ delivery.order_number }}</dd>
      <dt>Your reference</dt><dd>{{ delivery.customer_reference }}</dd>
      <dt>Account</dt><dd>{{ customer.account }}</dd>
    </dl>
  </div>
  <div>
    <p class="label">Carrier</p>
    <dl class="pairs">
      <dt>Carrier</dt><dd>{{ delivery.carrier }}</dd>
      <dt>Service</dt><dd>{{ delivery.service }}</dd>
      <dt>Vehicle</dt><dd>{{ delivery.vehicle }} · {{ delivery.driver }}</dd>
    </dl>
  </div>
</section>

<table class="items">
  <thead>
    <tr>
      <th class="idx" scope="col">#</th>
      <th class="code-col" scope="col">Item code</th>
      <th scope="col">Description</th>
      <th class="num" scope="col">Ordered</th>
      <th class="num" scope="col">Delivered</th>
      <th class="status" scope="col">Status</th>
    </tr>
  </thead>
  <tbody>
    {%- for item in items %}
    {%- set short = item.ordered - item.delivered %}
    <tr{% if short > 0 %} class="short"{% endif %}>
      <td class="idx">{{ loop.index }}</td>
      <td class="code-col">{{ item.code }}</td>
      <td>{{ item.description }}</td>
      <td class="num">{{ item.ordered }}</td>
      <td class="num delivered">{{ item.delivered }}</td>
      <td class="status">
        {%- if short > 0 %}
        <span class="badge back">Back-ordered {{ short }}</span>
        {%- if item.back_order_date %}<span class="eta">Due {{ item.back_order_date | format_date("%d %b", locale) }}</span>{% endif %}
        {%- else %}
        <span class="badge full">Complete</span>
        {%- endif %}
      </td>
    </tr>
    {%- endfor %}
  </tbody>
  <tfoot>
    <tr>
      <td colspan="3">{{ items | length }} lines</td>
      <td class="num">{{ total_ordered }}</td>
      <td class="num">{{ total_delivered }}</td>
      <td class="status">{% if total_outstanding > 0 %}{{ total_outstanding }} to follow{% else %}All delivered{% endif %}</td>
    </tr>
  </tfoot>
</table>

<section class="after-table">
  {%- if back_orders %}
  <div class="followup">
    <p class="label">To follow</p>
    <ul>
      {%- for item in back_orders %}
      <li><strong>{{ item.ordered - item.delivered }} × {{ item.description }}</strong><span>expected {{ item.back_order_date | format_date("long", locale) }}</span></li>
      {%- endfor %}
    </ul>
  </div>
  {%- endif %}
  {%- if notes %}
  <div class="notes">
    <p class="label">Delivery notes</p>
    <p>{{ notes }}</p>
  </div>
  {%- endif %}
</section>

<section class="signoff">
  <div class="sign-box received">
    <p class="sign-title">Received by</p>
    <div class="checks">
      {{ tick("Received in good condition") }}
      {{ tick("Damage noted below") }}
      {{ tick("Packages missing") }}
    </div>
    <div class="fields">
      <div class="field wide"><span>Name (capitals)</span></div>
      <div class="field"><span>Date</span></div>
      <div class="field wide tall"><span>Signature</span></div>
      <div class="field tall"><span>Time</span></div>
      <div class="field full"><span>Damage or discrepancies</span></div>
    </div>
  </div>
  <div class="sign-box">
    <p class="sign-title">Delivered by</p>
    <p class="driver">{{ delivery.driver }}, {{ delivery.carrier }}</p>
    <div class="fields single">
      <div class="field tall"><span>Driver signature</span></div>
      <div class="field"><span>Time on site</span></div>
    </div>
    <p class="hint">Please check the number of packages before signing. Report hidden damage within 48 hours, quoting {{ delivery.note_number }}.</p>
  </div>
</section>

Render it with the API

After adding the template to your workspace, render it by ID and pass your data. Arrays are shortened here.

curl -X POST https://api-eu.dynamicdocumentapi.com/v1/renders \
  -H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "input": {
    "type": "template",
    "template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C"
  },
  "data": {
    "supplier": {
      "name": "Calderbank Office Interiors Ltd",
      "address": "Calder Works, 2 Tanyard Road\nHalifax HX3 5AL\nUnited Kingdom",
      "phone": "+44 20 7946 0615",
      "email": "deliveries@calderbank.example.com",
      "vat_id": "GB 135 7924 68"
    },
    "customer": {
      "name": "Tarnside Architects LLP",
      "account": "C-10457",
      "delivery_address": "3rd Floor, Wharfside House\n18 Navigation Walk\nLeeds LS10 1JR\nUnited Kingdom",
      "contact": "Farida Ellingham",
      "phone": "+44 20 7946 0642"
    },
    "delivery": {
      "note_number": "DN-240613",
      "consignment_number": "CBK4471093026GB",
      "date": "2026-09-16",
      "order_number": "SO-58217",
      "customer_reference": "TA-PO-1193",
      "carrier": "Brackenfield Logistics",
      "service": "Two-person delivery and installation",
      "vehicle": "Van 12",
      "driver": "Kwame Holloway",
      "packages": 14,
      "total_weight_kg": 412.5
    },
    "items": [
      {
        "code": "CB-DSK-1600-OAK",
        "description": "Sit-stand desk, 1600 × 800 mm, oak-effect top",
        "ordered": 6,
        "delivered": 6,
        "back_order_date": null
      },
      {
        "code": "CB-CHR-ERG-GRY",
        "description": "Ergonomic task chair, grey mesh back",
        "ordered": 8,
        "delivered": 5,
        "back_order_date": "2026-09-30"
      }
    ],
    "notes": "Installation team on site from 08:00 to 13:00. All packaging taken away for recycling. Back-ordered items are delivered free of charge and do not need a new order."
  },
  "output": {
    "format": "pdf",
    "filename": "delivery-note-standard.pdf"
  }
}'