Skip to content

Customer statements

Generate per-customer statements showing invoices, payments, brought-forward balances and aging buckets. Use them to chase overdue payments. Statements are available on screen, as a branded PDF or as CSV. You can email a statement directly to the customer with the PDF attached, or generate statements for every customer with an outstanding balance from the All Outstanding view. You can also open a customer’s statement straight from their customer record.

  • You have the finance.statements.view permission. Owner and Manager have this by default.
  • To download or email statements, you also need finance.statements.export.
  • Customers must have invoices in the system for statements to show anything.
  1. Go to Finance → Statements.
  2. On the Individual Statement tab, search for the customer (search-as-you-type by name, company or reference).
  3. Pick a date range. It defaults to the current calendar month.
  4. Click Generate Statement.

The on-screen statement shows:

  • Customer header: name, company, billing address, account status and payment terms.
  • Activity table: Date, Type (Invoice / Payment), Document number, Vehicle, Total, Credited, Paid, Refunded and Outstanding.
  • Brought forward: invoices outstanding from before the date range, labelled “B/F”.
  • Total Due: prominent at the bottom.
  • Aging summary: five buckets, Current / 30 / 60 / 90 / 120+ days.

Each invoice row adds up: Total, less Credited, less Paid, plus Refunded, equals Outstanding.

  1. Credited is the total of the invoice’s credit notes. It only appears when at least one row on the statement has a credit note.
  2. Paid is money that arrived against the invoice. A payment that was deleted in Xero is not counted and is not listed.
  3. Refunded is money sent back to the customer’s card. It only appears when at least one row on the statement has a card refund.
  4. A manual credit note that would put an already-paid invoice into credit is treated as money handed back. The Paid figure on that row is then shown net of it. See Credit notes and refunds.

The PDF follows the same rule for the Credited and Refunded columns. The CSV always has both columns, left empty when there is nothing to show.

All totals are exact penny sums.

  1. Open the customer and click the Invoices tab.
  2. Click Open statement. The statements page opens with the customer picked and the range set from their first invoice to today, and the statement is generated straight away.
  3. Or click Download PDF on the same tab for the PDF of that statement.

The aged total of this statement equals the Balance on the customer record. See The customer record.

From the on-screen statement, the action buttons are:

  • Download PDF: a branded PDF, suitable for printing or sending yourself.
  • Export CSV: a spreadsheet of the statement.
  • Email Statement: sends the PDF to the customer’s email. The subject reads “Statement from {your org}” followed by the period. The body uses your organisation’s payment instructions.

The send confirmation dialog protects you from misclicks. The statement view shows the last sent timestamp, with a Resend option.

Generate statements for every outstanding customer

Section titled “Generate statements for every outstanding customer”
  1. Go to Finance → Statements and click the All Outstanding tab.
  2. The list shows every customer with an outstanding balance, with their per-customer aging breakdown.
  3. Sort by any column (text columns ascending, numeric descending).
  4. Click any row to open that customer’s PDF in a new tab.
  5. Click the row’s Email button to send to that customer (with a confirmation dialog).
  6. URL pagination (?page=N) lets you bookmark a specific page.

The bulk view defaults to the current calendar month. There is no per-row date range picker in this version. For custom date ranges, use the Individual Statement tab.

A statement on screen, downloadable as PDF or CSV, or emailed to the customer. The customer receives a branded email with the statement PDF attached.

Aging buckets use the invoice’s due date, not the invoice date. As of today:

  • Current: not overdue (today ≤ due date).
  • 30 / 60 / 90 / 120+: days past due.

A customer’s payment terms (set on their record) determine the due date for new invoices. See Customer account types and payment terms.

  • The “brought forward” entries cover invoices outstanding at the start of the period, however old they are.
  • Payments during the period appear in the activity table even if they apply to brought-forward invoices.
  • Pre-period invoices that get fully paid during the period also appear, so the payment is visible.
  • Customers without an email address see “Customer has no email address on file” when you try to email them. Add one to their record first.
  • Voided invoices are excluded from statements entirely (they are not struck through).
  • Credit notes show as the Credited figure on their invoice’s row. They are not listed as rows of their own.
  • Pay Total and the statement payment link charge what the customer owes today across all their invoices, the same figure as the Balance on the customer record. That can differ from the Total Due of a statement for a shorter date range. See Online payments with Stripe.
  • Email sends use the verified noreply@mail.torqueflow.app domain.

Problem: I cannot find Statements in Finance navigation. Cause: Your role does not have finance.statements.view. Fix: Ask an Owner.

Problem: Statement total does not match the customer’s outstanding balance. Cause: The date range may be filtering out activity, or some invoices may have been voided after generating. Total Due also subtracts any invoice in credit, while the customer record’s Balance never does. Fix: Use Open statement on the customer’s Invoices tab for a statement from their first invoice to today. Compare its aging total with the Balance. Voided invoices are excluded by design.

Problem: A customer on the All Outstanding list shows less than the Balance on their customer record. Cause: The All Outstanding list has not moved to the customer record’s calculation yet. It still takes credits off what is owed, and it reads a card refund on a part-paid invoice as a smaller debt. Fix: Trust the customer record’s Balance, or open that customer’s individual statement from their Invoices tab.

Problem: I changed the customer on a statement I opened from the customer record, then reloaded, and the first customer came back. Cause: The link from the customer record sets the starting customer and range. Reloading the page reads the link again. Fix: Pick the customer again and click Generate Statement.

Problem: Customer says they did not receive the email. Cause: Email is going to spam, the customer’s email is wrong, or they have no email at all. Fix: Confirm the email address on the customer record. Resend from the statement page. Ask the customer to check spam.

  • finance.statements.view to view statements.
  • finance.statements.export to download PDF or CSV, or to email statements.