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)

PlaceholderWhat 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.*)

PlaceholderWhat 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

PrefixWhat 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)

PlaceholderWhat 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:

PlaceholderWhat 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

PlaceholderWhat 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

PlaceholderWhat 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

PlaceholderWhat 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 your itemsHeaderHtml. That's all that's needed.

Status

PlaceholderWhat 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

PlaceholderWhat 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 format YYYY-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

FieldDescription
{{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

FieldDescription
{{customerEmail}}Customer email address
{{customerNotes}}Notes from the customer

Payment & Shipping

FieldDescription
{{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

FieldDescription
{{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 engineMustache ({{#loop}}, {{^fallback}})Simple handlebar substitution
Line item loop✅ {{#orderLines}}...{{/orderLines}}❌ Not supported
Fallback syntaxNested inverted sectionsPipe {{a|b|"default"}}
Unit price{{unitPrice}} inside {{#orderLines}}Not available
Custom fields{{skuCustomFields.*}}, {{lineCustomFields.*}}, {{orderCustomFields.*}}By exact label name
Edit locationManage → TemplatesTools → Automation