All articles

June 23, 2026 · Articles

HTML Templates for Invoice Emails: The Complete Field-Code Cheat Sheet


This is part two of our three-part series on HTML email templates in BigWave. If you’re new to templates, start with what they are and why they matter — including how AI can build the layout for you so you never have to touch raw HTML. Part three covers alerts and everything else.

Here we’re focused on the most valuable template of all: the invoice email. A clean, accurate invoice that lands in your customer’s inbox with a one-click payment button gets you paid faster and makes your business look buttoned-up.

What makes an invoice template tick

Once your layout is in place (built by hand or generated by AI), you personalize it with field codes — placeholders in [square brackets] that BigWave fills in from the work order when the invoice is sent. There are three kinds:

  1. Simple value codes replace themselves with one piece of data. [InvoiceNumber] becomes 14695-1; [TotalSummary.TotalPricePlusTaxString] becomes the grand total.
  2. Repeating blocks print a row for each line item on the job, so a 12-item invoice and a 2-item invoice both come out correctly without you touching the template.
  3. Conditional blocks show or hide text depending on the invoice — for example, only mentioning a deposit when the balance is over a threshold.

Remember: keep all styling inline, and if a code prints as literal [bracketed] text in a preview, it’s misspelled. Fix the spelling and preview again.


Invoice email field-code cheat sheet

Drop these into your template. When the invoice is sent, BigWave replaces each one with the real value from the work order. Spelling must match exactly.

Invoice & job details

Field codeWhat it becomes
[InvoiceNumber]Invoice number (e.g. 14695-1)
[InvoiceDate.Date]Date of the invoice
[WO.WOID]Work order number
[WO.PONumber]Customer PO number
[WO.ScheduledStartDateSite]Scheduled job date/time
[Notes]Invoice / work description
[WO.CustomField.Group.Name]Any custom field (e.g. permit number)

Addresses

Field codeWhat it becomes
[BillingAddress.AddressName]Bill-to name
[BillingAddress.StreetAddress]Bill-to street
[BillingAddress.CSZ]Bill-to city/state/zip
[BillingAddress.EmailAddress]Bill-to email
[WO.Site.SiteName]Service site name
[WO.Site.StreetAddress]Service site street
[WO.Site.CSZ]Service site city/state/zip
[WO.Site.MainPhone]Service site phone

Your company (payment address)

Field codeWhat it becomes
[PaymentAddress.StreetAddress]Your street (footer)
[PaymentAddress.CSZ]Your city/state/zip
[PaymentAddress.MainPhone]Your phone
[PaymentAddress.EmailAddress]Your email

Totals

Field codeWhat it becomes
[LaborSummary.TotalPriceString]Labour subtotal
[MaterialsSummary.TotalPriceString]Materials subtotal
[OtherSummary.TotalPriceString]Other subtotal
[FeesSummary.TotalPriceString]Fees subtotal
[TotalSummary.TotalPriceString]Subtotal (before tax)
[TotalSummary.SalesTaxGST]Tax amount
[TotalSummary.TotalPricePlusTaxString]Grand total due

Line-item sections & repeating rows

Wrap a section so it hides when empty, and repeat one row per line item:

[#block LaborPricingContainer collapseIfEmpty]
  <h3>Labour</h3>
  <table>
    [#each Pricing]
      <tr><td>[ItemNameForInvoice]</td><td>[QtyString]</td><td>[TotalPriceString]</td></tr>
    [/each]
  </table>
  Subtotal: [Summary.TotalPriceString]
[/block]
ConstructWhat it does
[#block Container collapseIfEmpty] … [/block]A section that disappears (heading and all) when it has no items. Containers: LaborPricingContainer, MaterialsPricingContainer, OtherPricingContainer, FeesPricingContainer.
[#each Pricing] … [/each]Repeats its row once per line item inside a section.
[Summary.TotalPriceString]That section’s subtotal (used inside a #block).

Row fields available inside [#each Pricing]: [ItemNameForInvoice] / [MaterialName] / [ItemName], [QtyString], [UnitPriceString], [TotalPriceString], and [TransactionDate.Date].

Conditional text

Show text only when a condition is true ([#else] is optional):

[#if AmountDue > 100]
  A deposit is required for balances over $100.
[#else]
  Thank you — your balance is under the deposit threshold.
[/if]

Compare values with >, >=, <, <=, ==, !=; combine conditions with && or ||. A bare field name tests whether it has a value (or a non-empty list).

Your personal message

Field codeWhat it becomes
[UserMessage]The note you type when sending the invoice lands here.

Pay Now button

Field codeWhat it becomes
[PaymentLink]Put this inside the button’s link (href); it becomes a secure payment URL on a real, sent invoice.

Build it step by step

  1. Start with a layout — built in the template editor, or generated by AI from your logo and text (see part one).
  2. Add your header and footer — logo up top, payment address in the footer using the [PaymentAddress.*] codes.
  3. Drop in the details — invoice number, dates, and the bill-to/site addresses from the tables above.
  4. Add a repeating line-item section using a [#block] / [#each Pricing] pair so the table grows and shrinks with the job.
  5. Show the totals, ending with [TotalSummary.TotalPricePlusTaxString] for the grand total due.
  6. Add a Pay Now button by putting [PaymentLink] inside the button’s href.
  7. Preview against a real work order, fix any field code that prints as literal text, then save.

From then on, sending an invoice is as simple as choosing the template and adding your personal note — and your customers get a clean, professional invoice they can pay in one click.

Next: HTML templates for alerts and everything else →

Try BigWave free for 30 days

Streamline national service centers and help desks, manage assets, eliminate status meetings, and deliver reliably with less.