Overview
Sales Order document templates in Luminous use Mustache-style placeholders ({{variableName}}) inside four HTML sections: Header, Items Header, Item Row, and Footer. The Item Row section wraps each line in a {{#orderLines}}…{{/orderLines}} loop. The default template does not include a price column, but you can add one in a few steps.
How to open and edit a Sales Order template
- Go to Manage → Templates.
- Locate your Sales Order template, or create a new one.
- Click the ⋮ menu on the template's row and choose Edit to open the HTML editor (Configuration Mode: Use Custom HTML).
- Make changes to the Items Header and Item Row sections, then click Save.
Adding a Unit Price column — step by step
Step 1 — Add the column header
In the Items Header section, add a <th> cell where you want the price to appear. For example, after the Qty Ordered header:
<th scope="col" style="text-align: right;">Unit Price</th>
Step 2 — Add the data cell inside the line loop
In the Item Row section, inside the {{#orderLines}}…{{/orderLines}} block, add a matching <td> cell:
<td valign="top" style="text-align: right;">{{unitPrice}}</td>
{{unitPrice}} renders as a formatted dollar amount (e.g. $12.50). If you need the raw number without the $ symbol or comma formatting — for example to use in a calculation or custom script — use {{unitPrice.raw}} instead.
You may also add the line subtotal, discount, and total columns the same way:
| Placeholder | What it shows |
|---|---|
{{unitPrice}} | Unit price, formatted as $X,XXX.XX |
{{lineSubtotal}} | Quantity × unit price, formatted as $X,XXX.XX |
{{lineDiscount}} | Discount applied to this line, formatted as $X,XXX.XX |
{{lineTotal}} | Line subtotal minus discount, formatted as $X,XXX.XX |
Append .raw to any of these (e.g. {{lineTotal.raw}}) to get the plain numeric value.
Full placeholder reference
Order-level placeholders (use anywhere in Header / Footer)
| Placeholder | Description |
|---|---|
{{orderNumber}} | Sales order number |
{{orderDate}} | Order creation date (formatted) — also {{orderDate.short}}, {{orderDate.long}}, etc. |
{{estimatedShipDate}} | Estimated ship date — also .short, .long |
{{status}} | Current order status |
{{notes}} | Customer-facing notes |
{{internalNotes}} | Internal/private notes |
{{shippingNotes}} | Shipping instructions from the ship-to address |
{{{shippingNotesFormatted}}} | Shipping notes with line breaks preserved (use triple braces) |
{{shippingMethod}} | Requested shipping service |
{{customerPoNumber}} | Customer PO number |
Company (your business)
| Placeholder | Description |
|---|---|
{{company.name}} | Your company name |
{{company.logoUrl}} | Your company logo URL |
{{company.email}} | Your company email |
{{company.website}} | Your company website |
{{company.phone}} | Your company phone |
{{company.address}} | Ship-from / invoice address (plain text) |
Customer
| Placeholder | Description |
|---|---|
{{customer.name}} | Customer / account name |
{{customer.email}} | Customer email |
{{customer.phone}} | Customer phone |
Addresses
| Placeholder | Description |
|---|---|
{{shipTo.name}}, {{shipTo.company}}, {{shipTo.street1}}, {{shipTo.city}}, {{shipTo.state}}, {{shipTo.postalCode}}, {{shipTo.country}}, {{shipTo.phone}}, {{shipTo.email}} | Ship-to contact fields |
{{{shipTo.fullAddressBlock}}} | Ship-to address as a preformatted HTML block (use triple braces) |
{{billTo.*}} | Same fields as shipTo but for the billing address |
Document totals
| Placeholder | Description |
|---|---|
{{orderSubtotal}} | Sum of all line subtotals |
{{orderDiscount}} | Total discount across all lines |
{{orderTax}} | Tax amount |
{{orderShipping}} | Shipping amount |
{{orderGrandTotal}} | Subtotal − discount + tax + shipping |
{{salesOrderSubtotal}}, {{salesOrderGrandTotal}}, etc. | Same values always pulled from the parent Sales Order (useful on Fulfillment Order exports) |
Append .raw to any currency placeholder for the unformatted number.
Invoice details (first associated invoice)
| Placeholder | Description |
|---|---|
{{invoiceNumber}} | First invoice ID |
{{grandTotal}} | First invoice grand total |
{{subTotal}}, {{taxTotal}}, {{shippingTotal}} | First invoice sub-components |
Totals & unit counts
| Placeholder | Description |
|---|---|
{{totalUnitsOrderLines}} | Sum of all top-level line quantities |
{{totalUnitsCombined}} | Non-kit line quantities + kit component quantities |
Inside the {{#orderLines}} loop (Item Row section)
Identity & description
| Placeholder | Description |
|---|---|
{{lineNumber}} | Sequential line number (1, 2, 3…) |
{{sku}} | SKU as received from the sales channel |
{{productName}} | Product name as received from the sales channel |
{{internalSku}} | Internal (Luminous-managed) SKU |
{{internalProductName}} | Internal product name |
{{channelSku}} | Channel-mapped SKU (if configured) |
{{channelProductName}} | Channel-mapped product name |
{{description}} | Line item description from the order source |
{{uom}} | Unit of measure (e.g. EA) |
{{imageUrl}} | Product thumbnail URL |
Quantities
| Placeholder | Description |
|---|---|
{{quantity}} | Quantity ordered |
{{fulfilledQuantity}} | Quantity assigned to fulfillment orders |
{{inFulfillmentQuantity}} | Assigned to FOs but not yet shipped |
{{shippedQuantity}} | Quantity already shipped |
{{backorderedQuantity}} | Quantity not yet assigned or shipped |
Append .raw for the plain number (e.g. {{quantity.raw}}).
Pricing
| Placeholder | Description |
|---|---|
{{unitPrice}} | Unit price as $X,XXX.XX |
{{lineSubtotal}} | quantity × unitPrice as $X,XXX.XX |
{{lineDiscount}} | Line discount amount as $X,XXX.XX |
{{lineTotal}} | lineSubtotal − lineDiscount as $X,XXX.XX |
Append .raw for unformatted values; append .decimals4 (or any digit 0–6) for custom decimal precision.
Status
| Placeholder | Description |
|---|---|
{{fulfillmentStatus}} | Shipped / Partially Shipped / In Fulfillment / Partially In Fulfillment / Backordered |
{{customerStatus}} | Customer-facing version of status (future-dated lines show Backordered) |
Dates
| Placeholder | Description |
|---|---|
{{estimatedShipDate}} | Estimated ship date for this line — also .short, .long |
{{estimatedShipDateIsInherited}} | true if the date was inherited from the order level |
Location (for warehouse-picked orders)
| Placeholder | Description |
|---|---|
{{warehouse}} | Warehouse name from the pick location |
{{location}} | Bin / shelf name within the warehouse |
{{externalLocation}} | Location code from external systems (e.g. ShipStation) |
Custom fields (inside {{#orderLines}})
| Placeholder pattern | Description |
|---|---|
{{lineCustomFields.YourFieldName}} | A line-item custom field by name |
{{skuCustomFields.YourFieldName}} | A SKU-level custom field by name |
{{#lineCustomFields.list}}…{{/lineCustomFields.list}} | Loop over all line custom fields |
Kits & lots
- Use
{{#isKitParent}}…{{/isKitParent}}to show kit-specific content on parent rows. - Kit component rows are available in a nested
{{#components}}…{{/components}}loop, with{{sku}},{{productName}},{{quantity}},{{uom}},{{warehouse}}, and{{location}}. - Lot details (when lot tracking is enabled) are in a
{{#lot}}…{{/lot}}block:{{number}},{{expiryDate.short}},{{manufacturerCode}}.
Conditional sections
Use Mustache block tags to show content only when a value is present, or based on document type:
{{#unitPrice}}Unit Price: {{unitPrice}}{{/unitPrice}}
{{#isSalesOrder}}Sales Order: {{orderNumber}}{{/isSalesOrder}}
{{#isFulfillmentOrder}}Fulfillment Order{{/isFulfillmentOrder}}
Tip: browse placeholders in the template editor
The template editor in Manage → Templates includes a built-in placeholder reference panel. Use it to browse all available variables and copy them directly into your HTML without switching screens.