- 7 minutes to read

Order Shipped Stylesheet

This page provides the Liquid Stylesheet O2C - View Order Shipped for the pipe-separated (PSV) Order Delivered messages (Step 6) in the Order-to-Cash demo.

Delivery Note DLVY-2025-10005 for order ORD-10005 and Tailspin Toys rendered by the O2C - View Order Shipped Stylesheet, with the delivery address, proof of delivery from Nordic Freight, one delivered item, and the status DELIVERED (7.12)
The pipe-separated Order Delivered message rendered as a delivery note: delivered-to address, proof of delivery with carrier, tracking, recipient and location, the delivered items, and the order total.

Answer "was it delivered?" in one look. With Nodinite Stylesheets, support reads the delivery note and its proof of delivery instead of pipe-separated rows. On this page, you will:

  • ✅ Render a pipe-separated message with Liquid, without a parser
  • ✅ Read four sections of the file: header, details, proof, and footer
  • ✅ Open the delivery note from Log Views and from BPM Log Search New 7.11

Understanding the Order Shipped Stylesheet

A Stylesheet is tied to a Message Type. The business Log Event of Step 6, Order Delivered, carries the Message Type O2C.Order.Delivered/1.0, so Nodinite offers O2C - View Order Shipped for it.

The template uses the same pattern as the CSV Order Confirmation Stylesheet: the body arrives as one string in data, newline_to_br | split: '<br />' gives the lines, a section name (DeliveryConfirmationHeader, DeliveryDetails, DeliveryProof, DeliveryFooter) starts a section whose first line holds the column names, and split: '|' gives the fields.

graph LR A["fa:fa-inbox Order Delivered
Log Event (PSV)"] --> B["fa:fa-font Raw body
in data"] B --> C["fa:fa-scissors Split into lines
and four sections"] C --> D["fa:fa-table-columns Split each line
on pipes"] D --> E["fa:fa-file-alt Delivery note"] style A fill:#2678BD style B fill:#9E59BB style C fill:#E47528 style D fill:#E47528 style E fill:#93d16d

The pipe-separated Log Event (blue) reaches the Liquid template as one string (purple); the template splits it into sections, lines, and fields (orange) and renders the delivery note (green).

Note

A field that contains a pipe would be split too: Liquid has no parser for delimited files. The demo files have no such fields.

Where Users Open the Delivery Note

Where How
Log Views Search the Log View, open Action on the Order Delivered event, and choose View message formatted as 'O2C - View Order Shipped'.
BPM Log Search New 7.11 Click Log Search on the Order-to-Cash BPM, search for the order number, and open Action on the Order Delivered event in the BPM Viewer.

The dialog is titled View message body formatted as 'O2C - View Order Shipped' and has the buttons Open in New Window, Print, and Close. The forwarding event of the step, Order Delivered Received, logs O2C.Forwarding/1.0, so this Stylesheet isn't offered there.

Stylesheet Settings

Setting Value Why
Name O2C - View Order Shipped The name users pick in the Action menu
Type Liquid XSLT 1.0 can't split text
Render as HTML Checked The template outputs HTML
Message Body is Json Unchecked It has no effect on a PSV body, which always lands in data; leave it unchecked
Message Types O2C.Order.Delivered/1.0 Only the Step 6 business event gets the Stylesheet

Input PSV

The Order Delivered body of order 1 as logged by the demo data script, the same message as on the Step 6 page. The correlation ID differs per order and run.

DeliveryConfirmationHeader
DeliveryId|DeliveryDate|CorrelationId|OrderId|CustomerID|CustomerName|ShippingAddress|DeliveryStatus
DLVY-2025-10001|2025-10-20T14:32:15Z|<correlation id>|ORD-10001|CUST-001|Contoso Corporation|100 Commerce Drive, Suite 100, Springfield, IL 62701|DELIVERED

DeliveryDetails
LineNumber|SKU|Description|QuantityOrdered|QuantityDelivered|Condition
1|SKU-DEMO-001|Demo Widget|1|1|GOOD

DeliveryProof
TrackingNumber|Carrier|DeliverySignature|DeliveryTime|RecipientName|ProofOfDeliveryLocation|PhotoUrl
TRK-20251016-10001|Standard Courier|ACM-AUTO-SIGN|2025-10-20T14:32:15Z|Auto-confirmed|Front Porch|https://pod.courier.example/2025/10/dlvy-10001.jpg

DeliveryFooter
OrderTotal|Currency|ReturnWindow|ReturnInstructions
99.95|USD|30|Visit returns.contoso.com

PSV to Delivery Note Mapping

Section Field (position) Shown in the delivery note as
Header DeliveryId (h[0]) The title
Header OrderId, DeliveryDate (h[3], h[1]) Order … delivered under the title
Header CustomerName, CustomerID, ShippingAddress (h[5], h[4], h[6]) Delivered to
Header DeliveryStatus (h[7]) Status, as a badge
Details every data line Delivered Items table: Line, SKU, Description, Ordered, Delivered, Condition
Proof Carrier, TrackingNumber, RecipientName, DeliverySignature, ProofOfDeliveryLocation (p[1], p[0], p[4], p[2], p[5]) Proof of delivery
Footer OrderTotal, Currency, ReturnWindow (t[0], t[1], t[2]) Order total and Return window

PSV values show exactly as the message holds them. The delivery time, the photo URL, and the return instructions are not displayed.

Liquid Template

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
{%- comment -%} The pipe-separated (PSV) body arrives as one string in 'data': split it into lines, then each data line on '|'. {%- endcomment -%}
{%- assign lines = data | newline_to_br | split: '<br />' -%}
{%- assign section = '' -%}
{%- assign pos = 0 -%}
{%- assign rows = '' -%}
{%- for raw in lines -%}
  {%- assign line = raw | strip -%}
  {%- if line == 'DeliveryConfirmationHeader' or line == 'DeliveryDetails' or line == 'DeliveryProof' or line == 'DeliveryFooter' -%}
    {%- assign section = line -%}
    {%- assign pos = 0 -%}
  {%- elsif line != '' -%}
    {%- assign pos = pos | plus: 1 -%}
    {%- if pos > 1 -%}
      {%- assign f = line | split: '|' -%}
      {%- if section == 'DeliveryConfirmationHeader' -%}
        {%- assign h = f -%}
      {%- elsif section == 'DeliveryProof' -%}
        {%- assign p = f -%}
      {%- elsif section == 'DeliveryFooter' -%}
        {%- assign t = f -%}
      {%- else -%}
        {%- capture rows -%}{{ rows }}<tr><td>{{ f[0] }}</td><td>{{ f[1] }}</td><td>{{ f[2] }}</td><td class="text-center">{{ f[3] }}</td><td class="text-center">{{ f[4] }}</td><td>{{ f[5] }}</td></tr>{%- endcapture -%}
      {%- endif -%}
    {%- endif -%}
  {%- endif -%}
{%- endfor -%}
<div class="container mt-4">
  <h1 class="mb-0">Delivery Note {{ h[0] }}</h1>
  <span class="text-muted">Order {{ h[3] }} delivered {{ h[1] }}</span>
  <div class="row mt-3">
    <div class="col">
      <h6 class="text-muted mb-1">Delivered to</h6>
      <strong>{{ h[5] }}</strong> <span class="text-muted">{{ h[4] }}</span><br/>
      {{ h[6] }}
    </div>
    <div class="col">
      <h6 class="text-muted mb-1">Proof of delivery</h6>
      {{ p[1] }}, tracking <strong>{{ p[0] }}</strong><br/>
      Received by {{ p[4] }} ({{ p[2] }}), {{ p[5] }}
    </div>
  </div>
  <h5 class="mt-4">Delivered Items</h5>
  <table class="table table-sm">
    <thead>
      <tr><th>Line</th><th>SKU</th><th>Description</th><th class="text-center">Ordered</th><th class="text-center">Delivered</th><th>Condition</th></tr>
    </thead>
    <tbody>{{ rows }}</tbody>
  </table>
  <p>Status: <span class="badge badge-success">{{ h[7] }}</span> &middot; Order total {{ t[0] }} {{ t[1] }} &middot; Return window {{ t[2] }} days</p>
  <div class="mt-5 pt-3 border-top text-center text-muted"><small>Rendered by a Nodinite Stylesheet (Liquid) from the pipe-separated Order Delivered message</small></div>
</div>

Next Steps