---
title: Acknowledging customer orders
order: 11
updated: 2026-07-12
---

# Acknowledging customer orders

When a customer places an order, you can send them a one-time *"thank you for your order"* acknowledgment — a short courtesy note confirming you have received their order, with a table of the ordered products and (optionally) a copy of their PO attached. It is a goodwill gesture, not an invoice or a delivery note: sending it changes nothing about the order itself, it just tells the customer "we've got it".

Acknowledgment is a **one-time, per-order** action. The moment you send it — or explicitly *Ignore* it — the order is stamped and drops off the list for good. There is no re-send and no un-ignore.

## Who can send

Sending (or ignoring) needs the *Send Order Acknowledgment* permission (`sales.sendOrderAcknowledgment`), which depends on *View Sales Orders* (`sales.viewSalesOrders`). Firm administrators always have it. Without the permission the *Order Acknowledgment* entry never appears in the Orders menu, and the page itself shows *"You do not have permission to send order acknowledgments."*

*Viewing* the record afterwards (the order's *Mail History* and the *Acknowledgment* card) is open to anyone who can view the order — you do not need the send permission just to see what happened.

Editing the acknowledgment **template** is a separate, firm-wide setting and needs the *Manage Quotation Personalisation* permission (`firm.manageQuotationPersonalisation`) — the same flag that governs every other mail template. See [Customising the mail](#customising-the-mail).

## Open the screen

1. Open *Sales → Orders* (the *Sales Orders* page).
2. Click the options control in the page header (top right — the sliders icon).
3. Pick *Order Acknowledgment* (*"Send a thank you for your order mail to customers"*).

You land on the *Order Acknowledgments* page (route `/enquiry/order-acknowledgment`), subtitled *"Thank customers for their order — a one-time courtesy mail"*.

## The acknowledgment list

Every non-deleted order that has **not** yet been acknowledged appears here — regardless of the order's status or whether it has been delivered. An order becomes eligible the instant it exists; it does not need a PO on record, and it does not need to be pending or complete. Sending or ignoring stamps the order and removes it from the list.

Because acknowledgment is a one-time action there are **no checkboxes and no bulk send** — each row carries its own *Send* link. Rows are sorted newest order first and load in pages of `20` as you scroll (infinite scroll).

### Columns

The table is column-configurable through the *Toggle Columns* control in the page header. The columns are:

- *Customer* — the customer's name.
- *Contact Person* — the contact person on the order (the person who would receive the mail in the default recipient mode).
- *Enquiry No* — the originating enquiry number the order was converted from.
- *PO No* — the customer's purchase-order number, if recorded.
- *PO Date* — the customer's PO date. **Hidden by default.**
- *Order Date* — when the order was created (the enquiry's conversion moment).
- *Products* — one line per product, showing the customer-facing head name (the Product Head's *External Display Name*, falling back to the head's own name, then the code name). Duplicate heads are collapsed.
- *Send Button* — the per-row *Send* link.

### Filters

Six search boxes sit above the table, all search-as-you-type:

- *Customer* — pick a customer.
- *Contact Person* — scoped to the selected customer once one is chosen.
- *Product Head*.
- *Product Code* — scoped to the selected head.
- *PO Number* — free text; matches PO numbers **case-insensitively as a substring** (server-side regex), so a partial number works.
- *Enquiry No* — free text; same case-insensitive substring match.

The *PO Number* and *Enquiry No* boxes are debounced (they wait ~0.65 s after you stop typing). Changing the customer resets the contact-person filter; changing the product head resets the product-code filter. The backend re-validates every id you pass — a forged or malformed id is rejected rather than crashing the list.

## Sending an acknowledgment

Click *Send* on an order's row. A cover modal opens and loads the full order, showing:

- A header with the customer name, a status chip, and the enquiry reference.
- A *Customer* card — name and GST number.
- A *Contact Person* card — name, email, and phone (phone only if present). The email shown here is where the mail will go in the default recipient mode.
- An *Order Info* card — enquiry reference and order date.
- A *Purchase Order* card — PO number and PO date.
- A *Products* table — one row per line item with *Product*, *Qty* (with unit), *Rate*, *Tax %*, *Make*, and *HSN*. Expand any row to read its rich-text description.

At the bottom-right is a single **Send Acknowledgment** button. The *Ignore* and *Open Order* actions live in the top-right *⋮* menu (deliberately kept away from *Send* so they can't be misclicked).

Press *Send Acknowledgment* to compose and queue the mail. A toast confirms *"Acknowledgment queued for sending"*, the modal closes, and the row disappears from the list. A background worker then actually delivers the email.

### Who the mail is addressed to

You do **not** pick the recipient or the sending account at send time — both are decided by firm settings and re-checked on the server:

- In the default *Contact person email* mode the mail goes to the order's contact person's email address. If that contact person has no valid email, the send is blocked with *"Contact person on this order has no valid email address"* and the order stays in the list.
- In *Fixed mailbox* mode every acknowledgment is routed to the one firm address configured in the template. If that address is missing or invalid the send is blocked with *"Firm fixed email is not configured or is invalid."*

The firm's CC and BCC lists (from the template) are added automatically, de-duplicated against the recipient.

The sending email account is resolved automatically from the firm's *Order Acknowledgment Send* email policy — the app picks an eligible account for you. If no account is permitted for that use-case, sending is blocked with a message telling you to configure the email policy in *Firm Customisation* first. See [Email account & policy](#email-account--policy).

### What gets attached

The only thing that can be attached to an acknowledgment is the **customer's PO copy** — orders carry no proof-of-delivery files of their own. The PO copy is attached only when **all** of these hold:

- The template's *Attach PO copy* switch is on (it is **on by default**).
- The order has actually been marked *PO arrived* (`po.hasPoArrived`).
- The uploaded PO documents exist and are fully stored (status `READY`).

If any of those is missing, the mail simply goes out without an attachment.

### What the mail says

The subject and body come from the firm's *Order Acknowledgment* template ([Customising the mail](#customising-the-mail)). Tokens like `{customer}` are replaced with the order's real values at send time; the `{ProductTable}` token expands to a styled table of the products on this order. If the resolved subject is empty the send is blocked with a message telling you to configure the personalisation first. The body is sanitised server-side before it goes out.

## Ignoring an order

Some orders never need a thank-you mail — an in-house order, a sample, a correction. For those, open the row's send modal, open the top-right *⋮* menu, and choose *Ignore* (*"Skip the mail, mark as ignored"*). A confirmation appears — *"Ignore acknowledgment"*, warning that no mail will be sent, the order will be marked acknowledged (ignored), and **this can't be undone**. Confirm and the order is stamped and leaves the list.

No email is sent and no send job is created, but the ignore is recorded (who did it and when) and shows up in the order's history exactly like a send does.

## One-time guarantee and races

Both *Send* and *Ignore* are **terminal**. Under the hood the order is stamped the instant you act, and the list only shows orders without that stamp — so:

- A second click, or a colleague opening the same order at the same moment, gets a clear *"This order's acknowledgment has already been sent or ignored"* message instead of a duplicate mail.
- If sending fails before the mail job is even created, the stamp is rolled back and the order returns to the list, so a failed attempt never silently "uses up" the order.

## After you send: delivery and status

Queuing hands the mail to a background worker, which sends it through the chosen account (Gmail API or SMTP) and records the outcome. The order's acknowledgment status tracks the job:

- *Sending…* — queued or in flight.
- *Sent* — the mail was handed off to the mail server successfully.
- *Failed* — the send failed (for example, bad email-account credentials). The reason is kept on the send record.

If a worker crashes mid-send, a startup sweep flips any job stuck *Sending…* for more than five minutes to *Failed*, so the status never hangs forever. A *Failed* acknowledgment does **not** return to the list — it has already been stamped; it is a one-time action.

## Where the record lives

Open the order (*Sales → Orders → View*) to see the outcome in two places:

- The **Acknowledgment** card shows a status chip — *Not sent*, *Ignored*, *Sent*, *Failed*, or *Sending…* — plus who actioned it and when (labelled *Sent By / Ignored By / Actioned By* and *Sent At / Ignored At / Queued At* to match the state).
- The order's options menu → **Mail History** (*"Quotations & acknowledgments sent for this order"*) lists the acknowledgment send alongside the order's quotation and follow-up history. Each acknowledgment record carries its recipients, subject, body, the sending account, attempt count, any error, and the attached PO files. Mail History is visible to anyone who can view the order or send acknowledgments.

## Customising the mail

The wording, recipient rule, CC/BCC, and attachment default are firm-wide and edited in *Settings → Firm Customisation → Sales Communication → Order Acknowledgment*. A change only affects acknowledgments sent **after** you save it. The full reference lives on the templates page — see [Order acknowledgment template](/docs/settings/document-templates#order-acknowledgment) — but the essentials are:

### Recipient

Two modes only — there is **no hybrid** and no send-time picker:

- *Contact person email* — the contact person on the order. **Default.**
- *Fixed mailbox* — every acknowledgment routed to one fixed address you type in. Saving in this mode requires a valid fixed email (enforced on both the form and the server). A previously saved legacy *hybrid* value is quietly treated as *Contact person email*.

### CC & BCC

A *Manage* button opens the *CC & BCC Lists* modal. Each list holds up to `20` valid addresses; CC is visible to the recipient, BCC is hidden. Both are copied on every acknowledgment.

### Email subject line

A tokenised subject (default mode *Dynamic*, up to `300` characters). Default: `Thank you for your order, {customer} (Ref: {enquiryNo})`.

### Email body

Rich text with quick-insert token buttons. The default body reads:

`Dear {contactPerson},` — a thank-you paragraph — an `Enquiry No / Your PO No / PO Date` line — `{ProductTable}` — a progress-update line — `Warm regards,`.

The body is capped at `10000` characters server-side (the editor additionally refuses to save a body over `2 MB`, which mostly matters if you paste in large inline images — but the 10000-character limit is the effective ceiling). Anything you save is sanitised for safety before it can ever be sent.

### Attachments

- *Attach PO copy* — includes the customer's PO documents uploaded when the order was marked PO-arrived. **On by default.** This is the only attachable set for an acknowledgment, and it is only attached when the order actually has a PO on record (see [What gets attached](#what-gets-attached)).

### Available tokens

Insertable from the token-button rows in the template editor:

| Token | Resolves to | Subject | Body |
|---|---|---|---|
| `{customer}` | Customer name | yes | yes |
| `{contactPerson}` | Contact person's name (with salutation) | yes | yes |
| `{enquiryNo}` | The originating enquiry number | yes | yes |
| `{poNo}` | The customer's PO number (or `—`) | yes | yes |
| `{poDate}` | The customer's PO date (e.g. `12 Jul 2026`, or `—`) | yes | yes |
| `{productsCommaSeparated}` | Comma-joined, de-duplicated customer-facing product names | yes | yes |
| `{ProductTable}` | A styled HTML table of the order's products (`#`, `Item`, `Quantity`, `Rate`, `Description`) | — | yes only |

The table's **Rate** column shows the *effective* per-unit rate — the base price with the line's discount already deducted (a line of `100` at `10%` off shows `90`), before tax. There is no separate discount column; the discount is folded into the rate.

`{ProductTable}` is **body-only** — it is filtered out of subject lines (no HTML in subjects). Only these tokens are substituted; any other `{...}` you type is left as literal text, so a stray `{password}` can never leak data. A sales order has no order-number of its own, which is why the references offered are the enquiry number and the customer's PO — not an "order number".

## Email account & policy

The acknowledgment is sent from an account allowed for the *Order Acknowledgment Send* use-case under *Settings → Firm Customisation → Email Accounts → Policy*. If no account is permitted, sending is blocked with a clear message and you must configure the policy first. The account you send from, and whether it is valid, is managed there — see [Email accounts and sending policy](/docs/settings/document-templates#email-accounts-and-sending-policy).

## Common questions

### Why isn't an order showing up in the list?

Only orders without an acknowledgment stamp appear. If you (or a colleague) already sent or ignored it, it is gone for good — check the order's *Acknowledgment* card or *Mail History*. Deleted orders never appear. Every other order is eligible, whether or not it has a PO and whether or not it has been delivered.

### Can I send the acknowledgment twice, or undo an ignore?

No. Both send and ignore are one-time and terminal — the order is stamped and leaves the list permanently. There is intentionally no re-send or un-ignore.

### Can I edit the recipient, subject, CC, or the PO attachment for one specific send?

Not from the send screen — it has no per-send overrides. Everything is taken from the firm template and resolved on the server. Change the firm-wide template under *Firm Customisation → Sales Communication → Order Acknowledgment* if you need different wording, recipient, or attachment behaviour.

### The contact person has no email — what happens?

The send is blocked and the order stays in the list. Add an email to the contact person (under *Records → Customers → Contact Persons*), or switch the template to *Fixed mailbox* mode, then try again.

### The acknowledgment shows "Failed" — will it retry or come back to the list?

No. A failed send has already stamped the order, so it does not return to the list. Open *Mail History* on the order to read the failure reason (a common cause is an invalid email account — fix it under [Email account & policy](#email-account--policy)).

### Do I choose which email account it sends from?

No — the app resolves an eligible account automatically from the *Order Acknowledgment Send* email policy. If none is configured, sending is blocked until you set the policy.

### Is this a web-only or desktop-only feature?

Neither — the Order Acknowledgment page, the send modal, and the template editor all work identically in the web app and the Tauri desktop app.
