Luminous uses two separate placeholder systems — one for custom HTML document templates (packing slips / sales order PDFs) and one for Enhanced Email automation action subjects and bodies. This article covers both in full.
Part 1 — Sales Order Document Templates (Packing Slip PDF)
Sales order and fulfillment order packing slips use Mustache syntax: {{placeholder}}. Section blocks use {{#field}}...{{/field}} to show content only when a value is present, and {{^field}}...{{/field}} to show a fallback when it is absent. Use triple braces {{{field}}} only for the special pre-formatted HTML fields noted below.
Tip: The template editor in Manage → Templates has a built-in placeholder picker (click Insert Placeholder) that lists every available variable for your account, including any custom fields you have created. Use it as your live reference.
Order Details (top-level)
| Placeholder | What it renders |
|---|---|
{{orderNumber}} | Sales order number |
{{orderDate}} | Order creation date (see date formats below) |
{{estimatedShipDate}} | Estimated ship date (see date formats below) |
{{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 name |
{{status}} | Current order status |
{{customerPoNumber}} | Customer PO number |
Company Information (company.*)
| Placeholder | What it renders |
|---|---|
{{company.name}} | Your company name |
{{company.logoUrl}} | Your company logo URL (use in <img src="...">) |
{{company.address.*}} | Your company address sub-fields (see address formats below) |
{{company.email}} | Your company email |
{{company.website}} | Your company website |
{{company.phone}} | Your company phone number |
Customer Information (customer.*)
The customer object contains business account details including name, email, phone, and any customer-level custom fields. Use the placeholder picker in the template editor for the full list of customer.* sub-properties.
Shipping & Billing Contacts
| Prefix | What it covers |
|---|---|
{{shipTo.*}} | Shipping contact — name, company, phone, email, and address fields under shipTo.address.* (street1–3, city, state, zip, country), plus a pre-formatted {{{shipTo.address.html}}} block |
{{billTo.*}} | Billing contact — same sub-fields as shipTo |
Example: {{shipTo.name}}, {{shipTo.address.city}}, {{{shipTo.address.html}}}.
Invoice Details (from the first associated invoice)
| Placeholder | What it renders |
|---|---|
{{invoiceNumber}} | First invoice ID |
{{subTotal}} | First invoice total amount as $X,XXX.XX |
{{taxTotal}} | First invoice tax as $X,XXX.XX |
{{shippingTotal}} | First invoice shipping as $X,XXX.XX |
{{grandTotal}} | First invoice grand total as $X,XXX.XX |
{{invoiceTotal}} | Alias for grandTotal on the first invoice |
To loop through all invoices, use {{#clientInvoices}}...{{/clientInvoices}}. Inside that loop: {{invoiceNumber}}, {{invoiceDate}}, {{netTotalAmount}}, {{subtotalAmount}}, {{taxAmount}}, {{shippingAmount}}, {{paymentTermTitle}}.
Document Totals
Two sets of totals are available to handle the case where you export a fulfillment order (which only contains a subset of lines).
Dynamic totals — calculated from the lines on the current document:
| Placeholder | What it renders |
|---|---|
{{orderSubtotal}} | Sum of all line subtotals on this document |
{{orderDiscount}} | Total discount for this document's lines |
{{orderTax}} | Tax (0 for FO exports; SO tax value for SO exports) |
{{orderShipping}} | Shipping (0 for FO exports; SO shipping for SO exports) |
{{orderGrandTotal}} | Grand total for this document |
Sales Order totals — always the full SO values, even when exporting a fulfillment order:
{{salesOrderSubtotal}}, {{salesOrderDiscount}}, {{salesOrderTax}}, {{salesOrderShipping}}, {{salesOrderGrandTotal}}.
Document Type Flags
Use these booleans to show or hide content depending on what is being exported:
{{#isSalesOrder}}...{{/isSalesOrder}}
{{#isFulfillmentOrder}}...{{/isFulfillmentOrder}}
{{#isShipment}}...{{/isShipment}}
Shipments Loop
Loop over all shipments with {{#shipments}}...{{/shipments}}.
Inside the loop: {{shipmentId}}, {{shipDate}}, {{shipmentCost}}, {{trackingNumber}}, {{carrierCode}}, {{serviceCode}}, {{packageCode}}, {{isReturnLabel}}.
Order Lines Loop — {{#orderLines}}...{{/orderLines}}
This is where line-level fields live, including unit price.
Identity & description
| Placeholder | What it renders |
|---|---|
{{sku}} | SKU as received from the sales channel |
{{productName}} | Product name as received from the sales channel |
{{internalSku}} | Internal (Luminous) SKU |
{{internalProductName}} | Internal product name |
{{channelSku}} | Channel-mapped SKU |
{{channelProductName}} | Channel-mapped product name |
{{description}} | Line item description from the order source |
{{uom}} | Unit of measure (e.g. EA) |
{{imageUrl}} | Thumbnail image URL |
Quantities
| Placeholder | What it renders |
|---|---|
{{quantity}} | Ordered quantity |
{{fulfilledQuantity}} | Quantity assigned to fulfillment orders |
{{inFulfillmentQuantity}} | Assigned to FOs but not yet shipped |
{{shippedQuantity}} | Total shipped quantity |
{{backorderedQuantity}} | Not yet assigned or shipped |
Pricing — including unit (wholesale) price
| Placeholder | What it renders |
|---|---|
{{unitPrice}} | Unit price formatted as $X,XXX.XX |
{{unitPrice.raw}} | Unit price as a plain number (e.g. 12.5) |
{{lineSubtotal}} | quantity × unitPrice, formatted |
{{lineDiscount}} | Discount amount for this line, formatted |
{{lineTotal}} | lineSubtotal − lineDiscount, formatted |
Adding a price column: Inside your
itemRowHtml, add a<td>{{unitPrice}}</td>cell, and add a matching<th>Price</th>to youritemsHeaderHtml. That's all that's needed.
Status
| Placeholder | What it renders |
|---|---|
{{fulfillmentStatus}} | Shipped, Partially Shipped, In Fulfillment, Partially In Fulfillment, or Backordered |
{{customerStatus}} | Customer-facing version (future-dated unshipped lines show as Backordered) |
{{isFutureEstimatedShipDate}} | Boolean — use as a block: {{#isFutureEstimatedShipDate}}...{{/isFutureEstimatedShipDate}} |
Location
{{warehouse}}, {{location}} (pick bin), {{warehouseAddress.*}}, {{externalLocation}}.
Dates (per line)
{{estimatedShipDate}} · {{estimatedShipDateIsInherited}} (boolean block)
Kit fields
{{isKitParent}} — boolean. For kit parents, use the nested {{#components}}...{{/components}} loop. Inside that loop: {{sku}}, {{productName}}, {{quantity}}, {{uom}}, {{parentSku}}, {{warehouse}}, {{location}}.
Lot information (if lot tracking is enabled)
Access via {{#lot}}...{{/lot}}. Inside: {{number}}, {{expiryDate}}, {{productionDate}}, {{manufacturerCode}}, {{originalQuantity}}.
Weight fields (per line)
Available in ounces and pounds: {{lineItemTotalProductWeightOz}}, {{lineItemTotalShippingWeightOz}}, {{lineItemTotalBoxWeightOz}}, {{lineItemTotalCartonWeightOz}}, {{lineItemTotalPalletWeightOz}} — and the same set with Lbs suffixes.
Custom fields (per line)
{{lineCustomFields.*}}— sales order line item custom fields{{skuCustomFields.*}}— SKU-level custom fields{{variantAttributes.*}}— variant attributes (color, size, etc.)
Use the placeholder picker to see the exact key names for your account's custom fields.
Order Custom Fields (top-level)
{{orderCustomFields.*}} — access by custom field key. Loop over them with {{#orderCustomFields.list}}...{{/orderCustomFields.list}}.
Overall Totals & Weight
| Placeholder | What it renders |
|---|---|
{{totalUnitsOrderLines}} | Sum of top-level line quantities |
{{totalUnitsComponents}} | Sum of kit component quantities |
{{totalUnitsCombined}} | Non-kit lines + component quantities |
{{totalProductWeightOz}} / {{totalProductWeightLbs}} | Total order product weight |
{{totalShippingWeightOz}} / {{totalShippingWeightLbs}} | Total order shipping weight |
{{totalBoxWeightOz}} / {{totalBoxWeightLbs}} | Total order box weight |
{{totalCartonWeightOz}} / {{totalCartonWeightLbs}} | Total order carton weight |
{{totalPalletWeightOz}} / {{totalPalletWeightLbs}} | Total order pallet weight |
Fulfillment Order–specific fields
When exporting a fulfillment order, these additional fields are populated:
{{destinationOms.label}}, {{destinationOmsStore.storeName}}, {{warehouseGroup.label}}.
Use {{#showFulfillmentDetails}}...{{/showFulfillmentDetails}} to wrap content that should only appear on FO exports.
Value formatting cheat-sheet
Currency fields (e.g. unitPrice, lineTotal, orderSubtotal):
{{unitPrice}}→$12.50(formatted, 2 decimal places){{unitPrice.raw}}→12.5(raw number — use for math or zero-checks){{#unitPrice.raw}}Show only if non-zero{{/unitPrice.raw}}
Number fields (e.g. quantity, totalUnitsOrderLines):
{{quantity}}→ formatted with commas{{quantity.raw}}→ raw float{{quantity.decimals4}}→ 4 decimal places
Date fields (e.g. estimatedShipDate, orderDate):
{{estimatedShipDate}}→ ISO formatYYYY-MM-DD{{estimatedShipDate.mmddyyyy}}→MM/DD/YYYY{{estimatedShipDate.ddmmyyyy}}→DD/MM/YYYY{{estimatedShipDate.short}}/.medium/.long→ locale-aware formats
Part 2 — Enhanced Email Automation Action Placeholders
Enhanced Email actions (in Tools → Automation) use a different, simpler {{field}} syntax in both the Subject and Body fields. This is a flat list — there is no loop over line items.
Syntax
- Simple:
{{orderNumber}} - Pipe fallback (first non-empty value wins):
{{customerPoNumber|orderNumber}} - Literal fallback:
{{customerPoNumber|"N/A"}} - Custom field by exact label:
{{My Custom Field Label}}
Available fields
Order Information
| Field | Description |
|---|---|
{{orderNumber}} | Order number |
{{orderDate}} | Date the order was created |
{{orderStatus}} | Current order status |
{{totalAmount}} | Order total including tax and shipping |
{{subtotal}} | Order subtotal before tax and shipping |
{{taxAmount}} | Tax amount |
{{shippingAmount}} | Shipping cost |
{{amountPaid}} | Amount already paid |
{{totalOrderQuantity}} | Total item quantity |
{{customerPoNumber}} | Customer PO number |
{{tags}} | Comma-separated list of order tags |
{{createdAt}} | When the order was created |
{{updatedAt}} | When the order was last updated |
Customer Information
| Field | Description |
|---|---|
{{customerEmail}} | Customer email address |
{{customerNotes}} | Notes from the customer |
Payment & Shipping
| Field | Description |
|---|---|
{{paymentMethod}} | Payment method used |
{{paymentDate}} | Date payment was received |
{{carrierCode}} | Shipping carrier code |
{{serviceCode}} | Shipping service code |
{{requestedShippingService}} | Customer-requested shipping service |
{{shipDate}} | Date the order shipped |
{{shipByDate}} | Date the order should ship by |
Notes
{{internalNotes}}, {{giftMessage}}
Billing Address
{{billToName}}, {{billToFirstName}}, {{billToLastName}}, {{billToCompany}}, {{billToStreet1}}, {{billToStreet2}}, {{billToStreet3}}, {{billToCity}}, {{billToState}}, {{billToStateCode}}, {{billToPostalCode}}, {{billToCountry}}, {{billToCountryCode}}, {{billToPhone}}
Shipping Address
{{shipToName}}, {{shipToCompany}}, {{shipToStreet1}}, {{shipToStreet2}}, {{shipToStreet3}}, {{shipToCity}}, {{shipToState}}, {{shipToPostalCode}}, {{shipToCountry}}, {{shipToPhone}}, {{shipToEmail}}
Advanced
| Field | Description |
|---|---|
{{channel.label}} | Name of the sales channel |
{{businessAccount.name}} | Associated business account name |
Custom Fields
Order-level custom fields are available as part of the flattened order data. Use the field key (not the display label) as it appears in the order's custom field data.
Key differences between the two systems
| Document Templates (PDF) | Enhanced Email Actions | |
|---|---|---|
| Syntax engine | Mustache ({{#loop}}, {{^fallback}}) | Simple handlebar substitution |
| Line item loop | ✅ {{#orderLines}}...{{/orderLines}} | ❌ Not supported |
| Fallback syntax | Nested inverted sections | Pipe {{a|b|"default"}} |
| Unit price | {{unitPrice}} inside {{#orderLines}} | Not available |
| Custom fields | {{skuCustomFields.*}}, {{lineCustomFields.*}}, {{orderCustomFields.*}} | By exact label name |
| Edit location | Manage → Templates | Tools → Automation |