> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.booksgpt.ai/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Upload a spreadsheet of invoices

An invoice records a sale: it adds to your income and to what the customer owes you (your accounts receivable) until they pay. If your invoices live in a spreadsheet or another system, you can bring them in all at once instead of typing each one. Every row comes in as a draft, so nothing reaches your books or your customers until you check it.

|| A spreadsheet row stays off your books until you open its draft and click **Save as final**. Nothing is sent to a customer.

Have a PDF or photo of one invoice instead? See "Create an invoice draft from a PDF or photo".

## Upload the spreadsheet

1. Open **All pages** in the left sidebar, then click **Sales** and **[Invoices](https://app.booksgpt.ai/go/invoices)**.
2. Click **More invoice actions**, the button with three dots beside **New invoice**, then **Upload invoices**.

![The Invoices page, with Upload invoices inside More invoice actions](https://booksgpt.ai/help/upload-invoices/more-menu-v2.png)

3. On **Import invoices**, drop a CSV, XLSX, or XLS file. The limit is 200 MB and 1,000 invoices. If the workbook has more than one sheet, pick the **Sheet**, then click **Use this sheet**.
4. On **Match your columns**, tell BooksGPT which column holds each field (see below), then click **Preview invoices**.
5. In the preview, pick a customer for any row that needs one, then click **Re-check customers**.
6. Click **Import N drafts**, where N is the number of rows that are ready. Rows with a problem are skipped.

Each row becomes its own invoice, and rows are never combined. Two rows that share an invoice number are both skipped.

In the same menu, the owner and bookkeepers also see **Import from QuickBooks**. See "Pick invoices to import from QuickBooks".

## Match your columns

BooksGPT guesses from your headers. Check these, which every invoice needs:

- **Invoice number**
- **Invoice date**
- **Customer** or **Customer email**
- **Amount** (or **Rate** with a **Quantity**; a rate alone counts as quantity 1)

The rest are optional: due date, terms, product or service, description, line details, sales tax, income account, PO number, memo, and currency. A column you don't need can stay **Not used**.

| Dates written as 2026-08-01 always work, whatever **Date format** says.

||| Discount, Class, and Location columns can't be imported. A row with a value in one of them is skipped. Put the net amount in **Amount**, change **Rate** to match or set it to **Not used**, and clear those cells before you upload.

## Check the rows, then import

The preview lists every row with its status. No invoices exist until you import.

- **Ready** means the draft can be created. A product name that matches none of your products comes in as plain text, with no stock change and your default income account, so check the product on each draft before **Save as final**.
- A customer name that doesn't match anyone shows **Choose customer…**. A spreadsheet never creates customers, so pick one from the list, or add the customer first in another tab. See "Customers, vendors, and products & services".
- If a product name matches two products, set **Product / service** to **Not used** and map the name to **Description**, or rename one product, then preview again.
- A row with an error says what is wrong. Fix it in the file and upload again, or let that row be skipped.

![Preview with one ready row, an unmatched customer, a row with an error, and the import button](https://booksgpt.ai/help/upload-invoices/preview-v2.png)

## After you import

**Open drafts** takes you to the **Drafts** tab. Open each draft, check it, and click **Save as final**.

![The import summary with created, skipped, already imported, Open drafts, and Download skipped rows](https://booksgpt.ai/help/upload-invoices/done-v2.png)

Once a draft is saved as final, its total shows as money owed to you on your A/R aging, and its amount before sales tax shows as income on your profit and loss (on Cash-basis reports, once it is paid). To send it and get paid, see "Create, send, and get paid on an invoice".

## A Xero invoice export

In Xero, open **Sales**, then **Invoices**, then **Export**, and drop that file on **Import invoices**. BooksGPT reads it as whole invoices, so there is no column step. The preview says what happens to each one:

- **Joins your books**: a paid or awaiting-payment invoice that is already in the Xero books you imported. Nothing new is posted.
- **Draft**: a Xero draft, or one awaiting approval.
- **Not imported**: the row says why. Without your Xero books here, paid and awaiting-payment invoices stay out, because adding a paid one would count that income a second time.

![Check these 3 Xero invoices, with one joining the books, one draft, and one not imported](https://booksgpt.ai/help/upload-invoices/xero-preview-v2.png)

A Xero contact that is not yet a customer is added, and the row says **New customer**. If the dates could be read either way, pick **Month first** or **Day first** before you import.

## If something goes wrong

- **You left before importing.** The file waits under **Files you uploaded but never imported** on **Import invoices**. Click **Open** to pick up where you left off (you choose the columns again), or **Discard** to remove it. Nothing there is on your books.
- **Rows were skipped.** Click **Download skipped rows** for a file that says why each row didn't come in, fix those rows, and upload just them. An invoice number you already have is skipped and that invoice is left as it is.
- **A stock product needs a lot or catch weight.** You can't pick those here. Create that invoice on the invoice page instead. See "Sell inventory and post cost of goods sold".
- **You don't see Upload invoices.** Viewers can't import invoices. Ask the workspace owner for a role that can.