Skip to main content

Customize the Statement document template

Reference every data property available when you edit your organization's Statement template.

Written by Yasen Marinov

When you customize a Statement template to match your brand, you need the exact property names the renderer expects, not a guess at what might work. This article lists every property the Statement template can use, grouped by where it comes from: the customer, the location, the organization's billing settings, and the invoices and credit notes on the statement.

The Statement template renders through the same Twig-style templating engine as your other document templates, converted to PDF with wkhtmltopdf. It reads from a single data context built at generation time, and the properties below are what that context contains.


How the Statement template gets its data

The renderer passes a single object into the template on generation. Properties on that object map directly to the dot notation you see in the template code, so customer.name reads the name field on the customer object, and location.name does the same for location.

Two properties carry filters instead of a plain value. {{ logoUrl }} is wrapped in an {% if %} check because it only exists when the organization has a logo, and {{ line.amount | money(line.currency) }} runs the raw number through a money filter that formats it using the currency code you pass in. Any numeric property representing an amount should go through that filter rather than being output raw.


Document header properties

These properties populate the logo, organization name, and statement date at the top of the document.

Property

Description

Example

logoUrl

URL to the organization's logo image. Renders only inside an {% if logoUrl %} check; falls back to org.name as text when empty.

//ik.imagekit.io/officernd/.../logo.png

org.name

The billing organization name shown in the header when no logo is set.

date

The date the statement was generated, already formatted.

03/07/2026

Note: org.name and organizationName are two different properties in the context. Only org.name renders in the default header.


Customer properties

These properties render the billing address block on the left side of the statement header.

Property

Description

customer.name

The Member's billing name.

customer.address

Street address line.

customer.city

City.

customer.state

State or province, shown only when set.

customer.zip

Postal code.

customer.country

Country.

customer.email

The Member's billing email address.

customer.membershipsPONumber

The purchase order number tied to the Member's memberships.

customer.recipient / customer.recepient

The invoice recipient name. Both spellings appeared in the sample data with the same value. [Unverified – confirm which spelling is the intended field and which is legacy]


Location properties

These properties render the location's name and address on the right side of the statement header.

Property

Description

location.name

The location's display name.

location.address

Street address line.

location.city

City.

location.state

State or province, shown only when set.

location.country

Country.


Statement line item properties

statementItems is an array. Loop over it with {% for line in statementItems %} to build the table of invoices and credit notes on the statement.

Property

Description

Example

line.number

The document number for the line item.

line.type

The display label for the document type.

Invoice, Credit Note

line.documentType

The underlying document type code. Used in an {% if !line.documentType %} check to decide whether to show an outstanding amount.

invoice, creditNote

line.date

The issue date of the line item.

03/07/2026

line.payableAmount

The amount still outstanding on this line item, run through the money filter. Shows as a dash when documentType is empty.

0

line.amount

The total amount of the line item, run through the money filter.

1200, -1200

line.currency

The currency code for this specific line item, passed into the money filter alongside line.amount.

HKD

The context also carries line._id, line.status, and line.isOverdue on each item, which the default template doesn't display, but you can use to add conditional styling, for example, flagging overdue items in a different color.


Currency formatting properties

The currency object controls how the money filter displays amounts. statementTotal runs through {{ statementTotal | money(currency.code) }}.

Property

Description

Example

currency.code

The three-letter currency code passed to the money filter.

HKD

currency.symbol

The currency symbol.

HK$

currency.symbolOnLeft

Whether the symbol renders before or after the amount.

true

currency.spaceBetweenAmountAndSymbol

Whether a space separates the symbol from the amount.

false

currency.decimalDigits

Number of decimal places to display.

2

currency.thousandsSeparator

Character used to group thousands.

,

currency.decimalSeparator

Character used before the decimal digits.

.

If you build a custom amount display instead of relying on the money filter, use symbolOnLeft and spaceBetweenAmountAndSymbol Rather than hardcoding the symbol position, the template should still work for organizations with a different currency.


Payment details properties

These properties populate the bank details block at the bottom of the statement.

Property

Description

organizationAccountBank

The organization's bank name.

organizationAccountIban

The organization's account number or IBAN.

organizationAccountBic

The organization's BIC or SWIFT code.

organizationAccountBic didn't appear in the sample payload at all, which likely means the organization in that example hadn't set one. Treat the field the same way you treat any optional value: confirm it renders correctly on an organization that has a BIC saved before you publish a layout that assumes it.


Best practices

If you display customer or location addresses on a custom layout, test with records that have all fields populated, since empty fields collapse silently rather than showing a placeholder.

If you're adding a new line item property to the table, wrap it in the same {% if !line.documentType %} pattern the default template uses for payableAmount, so custom columns stay consistent with the existing dash-for-empty behavior.

If your organization operates in more than one currency, always pass a currency code into the money filter instead of formatting numbers manually. line.currency and currency.code aren't guaranteed to match when a statement mixes documents from different currencies.


FAQs

Can I add customer.email to the Statement template?

You can add customer.email to the Statement template, because the data context includes it even though the default layout doesn't display it. Insert {{ customer.email }} anywhere in the customer block, the same way customer.name is used.

Why doesn't the logo show up on some statements?

The logo doesn't show up when the organization hasn't uploaded one, because logoUrl is empty in that case. The template's {% if logoUrl %} check falls back to displaying org.name as bold text instead.

Why does a line item show a dash instead of an outstanding amount?

A line item shows a dash when its documentType property is empty. The template's {% if !line.documentType %} check treats a missing document type as having no payable amount to display, and shows - in that column instead.

Why do customer.address and location.address show blank even though the template references them?

customer.address and location.address show blank when the underlying data doesn't include those fields for that record. This can happen when a customer has no billing address saved, or when location address data lives under a different structure, such as location.physicalAddress, rather than a flat address field. Confirm the exact source with engineering if you see this consistently across records that should have address data.

Did this answer your question?