PDF, email & text
Each statement that's sent produces three things for the restaurant: a PDF, an email to the address chosen in the dialog, and a text message to the phone chosen. All three carry the numbers frozen at sending (why), and the email and text link to the live statement page.
Who uses it
- Restaurants receive the email and text and open or download the PDF.
- Supplier staff see the same PDF in the preview and in Statement history.
How it works
| When | What happens | Timing people notice |
|---|---|---|
| Preview Statement | A PDF titled STATEMENT PREVIEW is made on the fly. Nothing is saved or sent. | A few seconds per customer |
| Send | The PDF is made and saved; the email and text go out at the same time | Within the send; no delay or schedule |
| Saving the PDF fails | Tried 3 times (after 0.2 s, then 0.4 s). If it still fails, the email and text still go out; the PDF is just unavailable later. | — |
| Email or phone left empty | That channel is skipped | — |
| Clipp has muted the channel | That channel is skipped and isn't counted as a failure | — |
There are no reminders or repeat sends. A statement goes out once; the supplier sends a new one to remind.
The PDF
Letter size. Top to bottom:
| Part | Content |
|---|---|
| Header, left | Supplier logo (the Clipp logo when there's none, or it can't be fetched within 3 seconds; 2 seconds for a preview), supplier name, address, phone and email |
| Header, right | Statement, and STATEMENT NO. {number}, or STATEMENT PREVIEW for a preview |
| Ship To | Restaurant name, address, phone and email |
| Bill To | The same restaurant details again. A preview leaves out the restaurant's email in both; the sent PDF includes it. |
| Box | Statement Date (MM/DD/YYYY) and Total Due |
| Invoice table | INVOICE ID · INVOICE DATE · DUE DATE · INVOICE TOTAL · LINK |
| Aging table | CURRENT DUE · 1-30 DAYS PAST DUE · 31-60 DAYS PAST DUE · 61-90 DAYS PAST DUE · 90+ DAYS PAST DUE · TOTAL DUE (bold) |
| Footer, every page | Powered by Clipp · Visit {statement link} for current balances. · Page {n} of {m} · Printed {MM/DD/YYYY HH:mm} |
Invoice table details:
- INVOICE DATE is printed exactly as stored on the invoice, for example
2026-10-03, or — when the invoice has none. Statements made before the column shipped (merged Jun 30, 2026) never have one. - DUE DATE is MM/DD/YYYY, or —.
- INVOICE TOTAL is the invoice's full total, not what's still owed.
- LINK is View & Pay, which opens that invoice's own pay page on the supplier site, or — if there's no link.
- A preview's footer link points to a placeholder (
…/statement/preview), not a real statement. - "Printed" is the time the PDF was made, on the server's clock (verify: assumed UTC, so it can read hours ahead of New York).
Worked example. Statement #41, Oct 15, 2026, for two invoices: INV-1041, total $500.00, $200.00 already paid; INV-1052, $99.99, unpaid.
| INVOICE ID | INVOICE DATE | DUE DATE | INVOICE TOTAL | LINK |
|---|---|---|---|---|
| INV-1041 | 2026-09-10 | 10/10/2026 | $500.00 | View & Pay |
| INV-1052 | 2026-10-01 | 10/31/2026 | $99.99 | View & Pay |
| CURRENT DUE | 1-30 DAYS PAST DUE | 31-60 | 61-90 | 90+ | TOTAL DUE |
|---|---|---|---|---|---|
| $99.99 | $300.00 | $0.00 | $0.00 | $0.00 | $399.99 |
The invoice rows add up to $599.99 but Total Due is $399.99, because $200.00 of INV-1041 is already paid. The email for the same statement shows $300.00 and $99.99.
The email
| Item | Content |
|---|---|
| Trigger | Send in the Create Statement dialog |
| To | The email in the dialog (billing contact, else the restaurant's email, unless changed) |
| Subject | Statement from {supplier} |
| Inbox preview | Statement from {supplier}: {total} outstanding |
| Body | Dear {restaurant}, · A statement has been issued summarizing your outstanding invoices. · Statement Total: {total} · Statement Date: {MM/DD/YYYY} · Invoices Included: {count} |
| Per invoice | A card: Invoice {number} · Due {MM/DD/YYYY, blank when there's no due date} · Outstanding {amount still owed} |
| Button | View & Pay Statement → the statement page |
| Note | This statement was issued by {supplier}. For billing questions or discrepancies, please contact them directly. |
| Close | Regards, then the standard Clipp footer with support contacts |
For the example above: Statement Total $399.99, Invoices Included 2, cards INV-1041 · 10/10/2026 · $300.00 and INV-1052 · 10/31/2026 · $99.99. The cards add up to the total.
The PDF is not attached; the restaurant gets it from the statement page.
The text message
| Item | Content |
|---|---|
| Trigger | Send in the Create Statement dialog |
| To | The phone in the dialog |
| Text | Clipp: Statement from {supplier}. Total due {total}.View & pay: {statement link}Reply STOP to opt out. |
For the example: Clipp: Statement from Fresh Farms. Total due $399.99. The link is tracked for clicks.
Where it shows up
- The PDF: the preview and Send screens of the dialog, View Statements, and Download PDF on the statement page.
- The email and text: the restaurant's inbox and phone.
- No push notification is sent for statements.
Permissions
Anyone holding the email or text can open the statement page; it needs no login. The saved PDF is only reachable through short-lived links (10 minutes) handed out by the statement page or View Statements.
Decisions
- The email lives in the codebase, not only in SendGrid. It had been overwritten by hand in SendGrid with the packing-slip email, and 7 statements went out wrong. (#2377)
- The email shows what's still owed per invoice. Its column is labelled OUTSTANDING. (#2377)
- The PDF shows the invoice date and the due date side by side. (#2094)
- A failed PDF save doesn't stop the email and text. The restaurant can still open the page and pay. (#1981)
- Statement links point at the restaurant site, never the supplier app. (#1981)
Known limitations
- PDF INVOICE TOTAL vs Total Due don't reconcile for part-paid invoices. The email does.
- Ship To and Bill To are identical: both print the restaurant's own details.
- The preview drops the restaurant's email from Ship To and Bill To, so it isn't an exact match for the PDF that is sent.
- Invoice date and due date are in different formats on the PDF (
2026-10-03vs10/03/2026). - "Reply STOP" is in the text, but statements don't check an opt-out list of their own (verify how OneSignal handles STOP).
FAQ
Why doesn't the PDF match the email? The PDF lists each invoice's full total, and the email lists what's still owed. Both have the same Total Due.
The restaurant says there's no PDF attached. There isn't one. They click View & Pay Statement and use Download PDF on the page.
Why does the PDF say "Printed" at a strange hour? It's the server's clock, which isn't New York time.
The supplier's logo is missing from the PDF. The supplier has no logo, or it couldn't be fetched in time, so the Clipp logo was used.