---
title: Creating and Editing Invoices Manually
description: "Most invoices in RackHelm are raised automatically from orders. When you need to bill something that is not in the catalogue — a one-off migration fee, a support retainer, a hardware charge — you create a custom invoice by hand.…"
url: "https://rackhelm.com/documentation/creating-manual-invoices/"
updated: "2026-09-24"
category: "Billing & Payments"
---

# Creating and Editing Invoices Manually

Most invoices in RackHelm are raised automatically from orders. When you need to bill something that is not in the catalogue — a one-off migration fee, a support retainer, a hardware charge — you create a custom invoice by hand. This article covers the create screen field by field, and explains exactly what can and cannot be changed after an invoice exists. It is written for operators and staff.

## Before you start

> **Note:** Creating an invoice requires the `create_invoices` permission, and the screen itself sits behind `edit_invoices`. Holding `edit_invoices` alone lets you reach the form but the save is refused. Both are granted to the seeded Billing Manager role. See [Roles & Permissions](/docs/roles-and-permissions/).

## Create a custom invoice

1. Open **Billing → Create Invoices** (or use the button on **Billing → Invoices**).
2. Pick the **Customer**. Guest placeholder accounts created by the guest-ticket and guest-checkout flows are deliberately excluded from this list.
3. Set the **Due Date**. It must be today or later — a past date is rejected by validation.
4. Choose a **Payment Method**. Leave it on *Customer's default payment method* unless you want the automatic charge run to use one specific saved card. The list is loaded live for the customer you selected and shows the card brand, last four digits, expiry and which one is the default.
5. Add at least one line with **Add Item**. For each line pick a **Product Group**, then a **Product**, then adjust the **Price (£)**.
6. Select **Create Invoice**.

![The Create Custom Invoice form showing customer, due date and payment method selectors above a table of line items with group, product and price columns](/wp-content/uploads/rackhelm-docs/billing-invoice-create.png)
The Create Invoice screen. The product picker fills in the line description and pre-fills the price, both of which you can then override.

### How the line items actually work

The Product Group and Product dropdowns are pickers, not links. Selecting a product copies its **name** into the line description and pre-fills the price from the product's base price. Nothing is bound to the product record afterwards, so the line will not renew, will not provision anything, and will not follow later price changes. Every line is stored as an entry of type `custom` with a quantity of 1 and no setup fee.

> **Tip:** Because the description is only the copied product name, edit the price freely to bill a partial term, a discount or a bespoke figure. The description is fixed to the product name you pick — the field is a dropdown, not a text box — so choose the nearest product and use the price to carry the detail.

### Field reference

| Field | What it does | Rules |
| --- | --- | --- |
| **Customer** | Who the invoice is billed to. Also determines the billing address snapshot and the payment-method list. | Required; must be an existing non-guest user. |
| **Due Date** | When payment is expected. Drives the automatic charge run, reminders, late fees and the invoice number. | Required; must be today or later. |
| **Payment Method** | Pins one saved card for the automatic charge attempt. Blank means "use whatever is the customer's default at the time". | Optional; must be a saved method belonging to the selected customer, otherwise the save is rejected. |
| **Product Group** | Filters the product picker. Not stored. | — |
| **Product** | Supplies the line description. | Required per line; maximum 255 characters. |
| **Price (£)** | The line total. | Required per line; numeric, zero or greater. |

## What happens on save

1. A lightweight "ghost" order is created for the customer so the invoice has an order to attach to. It carries the invoice total and a status of `active`. It has no order items and provisions nothing.
2. The invoice is created with status `pending`, numbered `INV-{due date YYYYMMDD}-{random 3 digits}`, with `subtotal` and `amount` both set to the sum of the lines and a discount of zero.
3. The customer's primary address is copied into the invoice as a snapshot, so later address edits do not silently rewrite an issued document.
4. If a payment method was pinned, its gateway is recorded in the invoice's `meta` — this is what makes the PDF print bank-transfer instructions when the pinned method is Bank Transfer — along with the method's id for the automatic charge run.
5. The PDF is rendered immediately (not queued), and the customer is emailed an "invoice generated" notification.

> **Warning:** The customer is notified the moment you save. There is no draft state on this screen, so build the invoice correctly before submitting; correcting it means voiding and re-creating.

## Editing an invoice after it exists

RackHelm has no line-item editor for an existing invoice. The changes available from **Billing → Invoices → (open an invoice)** are:

| Change | How | Restrictions |
| --- | --- | --- |
| Billing address | **Change Billing Address** picks another of the customer's saved addresses and re-snapshots it onto the invoice. | Blocked once the invoice is `paid` — paid invoices are locked for accounting purposes. The PDF is regenerated automatically after the change. |
| Status | The **Actions…** selector offers *Mark as Paid*, *Mark as Pending* and *Mark as Void*. | Marking paid needs `mark_invoices_paid` and does far more than flip a flag — see [Recording payments, refunds and marking paid](/docs/recording-payments-and-refunds/). |
| The lines themselves | **Void & Regenerate from Order** voids the invoice and rebuilds it from the underlying order, with an option to suppress the customer email. | Only works on invoices backed by a real order, and refuses to touch a `paid` invoice. A ghost order from a custom invoice has no items, so this will not rebuild a custom invoice. |
| The PDF | **Regenerate PDF** re-renders the document from the current data and the currently selected template. | Queued as a background job. |
| Removing it entirely | **Delete Invoice**. | Requires `delete_invoices`, which the seeded Billing Manager role does *not* hold. |

> **Tip:** To correct a wrong custom invoice, mark it **Void** and create a replacement. Voided invoices stay on record and are ignored by the duplicate-billing check, so nothing is lost and nothing is double-billed.

## Troubleshooting

| Symptom | Cause and fix |
| --- | --- |
| "The selected payment method does not belong to this customer." | The pinned method was changed or removed between loading the form and saving, or the customer selection was changed after the method list loaded. Re-select the customer, then re-select the method. |
| The due date is rejected | Validation requires today or later. Backdating an invoice is not supported on this screen. |
| The Payment Method dropdown is empty | The customer has no saved payment methods. Leave it on the default option; the invoice will still be raised, but the automatic charge run will log "no default payment method" and email the customer instead of charging. |
| 403 when submitting the form | You hold `edit_invoices` but not `create_invoices`. The two are separate capabilities. |
| The customer says they were emailed before you finished | Expected. The notification fires on save, not on payment. |
| The invoice appears with no line detail on the PDF | The PDF is rendered synchronously at save time. If the render failed, use **Regenerate PDF** and check the application log for a dompdf error. |
