Docs / Basics
Importing your spreadsheet
Load clients, items, materials, stock, orders, invoices, payments and more from a CSV, with mapping, review, duplicates and undo.
Nobody starts a business the day they start using OrderDen. There's a spreadsheet of customers, a materials tab, a shelf you counted last Sunday and invoices still unpaid from last quarter. The importer takes all of it, 10 kinds of record, one CSV file at a time. It shows you what it understood and writes nothing until you say so, and one button undoes a run.
Open it from Import on the Clients, Items, Materials, Vendors or Expenses list, or from Company Settings → Your data → Import a spreadsheet.
What you can import
The wizard groups the 10 kinds, and that order is also the order to do them in: each group only depends on the ones above it.
Your records
- Clients: the companies you sell to, with an email, a phone number, other contacts, tags, payment terms, a billing address and a shipping address. One address in the file becomes their default for both; a different shipping address is saved as a second one.
- Items: your catalog, with item numbers, names, descriptions, prices, costs, units, barcodes and tags.
- Materials: the wax, wicks and jars you make things from, with a code, a name, its unit, what it costs, a category, what's on the shelf today and the level you reorder at.
- Vendors: who you buy from, with their company name, email, phone, address, your account number with them, the currency they bill in and the terms they give you.
- Price list prices: prices for a price list you've already created, with each line's minimum, case pack and quantity breaks.
Your shelf
- Opening stock: what's physically here, item by item, with what it cost and, with more than one location, where it is.
Your history
- Orders: what you sold before OrderDen. One row per line; rows with the same Order # become one order, dated as the sheet says, marked Completed (or Canceled), with the sheet's own number. A line with no item number or SKU stays a typed line. An item number or SKU that matches nothing rejects every row of that order. No stock moves, because your opening stock already reflects these sales, and nothing is invoiced. Source is a label for where the sale came from ("Etsy", "market"). Revenue by client, item and period all include imported orders, so the reports have history from the first day.
- Invoices: your sales history, both what clients still owe and what they've settled, with the date and method of payment.
- Payments: money received, including one payment across several invoices and money paid on account before anything was invoiced.
- Expenses: the year's spending, from a bank export or a bookkeeping sheet.
The four steps
Upload. Choose what you're loading and pick your file. Commas, semicolons and tabs all work, so a European export or a tab-separated file needs no converting. Quoted cells, cells that wrap onto several lines and the hidden marker Excel puts at the start of a file are all handled. Up to 5,000 rows a file; split a bigger one.
Map columns. Each column in your file gets a dropdown: which OrderDen field it fills, or Ignore this column. OrderDen fills them in from your headings ("Customer", "E-mail", "SKU", "Cost per item", "Transaction date" and many more), so usually there's nothing to change. Columns it doesn't recognize are ignored.
A file OrderDen exported needs no mapping. Export a list, fix forty prices in a spreadsheet and load it back: the headings are the ones OrderDen wrote, so every column lands where it came from. Columns worked out rather than stored (Margin %, Balance, Days overdue, Created, Updated) are ignored on the way back in. On a Clients or Items file, your custom fields map by their own names.
Review. The first 20 rows as typed, with problem cells highlighted and explained ("Name is required", "Unit price must be an amount like 149.50"). Above them, the rows that match something you already have (the first 50), and what each matched on.
Review checks each value on its own. Checks that need your records (does this client, unit, item, location or price list exist?) run when you import, so a row can pass Review and still be rejected.
Done. Rows with problems are skipped and everything else is written. The summary counts what was created, updated, skipped and rejected, and lists the rejected rows by line number (up to 200) so you can fix them and import them again.
Download rejected rows saves those rows as a CSV, on the Done step and beside the run under Recent imports. It has your file's columns in the same order, plus a reason column, so you can fix the cells and import the file again as it is. If more rows were rejected than the file holds, its last row says how many are missing. Runs from before this button existed don't have the file.
Imported records are created the same way as ones you type in: the same checks and the same activity trail. Orders and invoices keep the number in your sheet, unless it's already taken (or, for an invoice, blank), when they get your next number.
Coming from a spreadsheet
The usual order for a move. Each file is its own run, and each can be undone on its own.
- Clients first. Names, emails and an address each, or two if you bill and ship to different places.
- Items. An item number or a SKU, a name and a price is enough; costs and units make the margin figures work from day one.
- Materials. Every material needs a unit that already exists (
kg,g,ml,eachand the rest are there from the start; add your own in Company Settings → Units). A unit typed as "kgs" is refused rather than created, because every bill of materials converts through it. A category you don't have yet is created. - Vendors. Address columns are joined into the one address a vendor has, so nothing needs rearranging first.
- Price list prices, for a price list you've already created.
- Opening stock, from your count. Name each item by its item number or SKU (a variant by its own SKU), say what you counted and, with more than one location, where. Choose Update them at the duplicates step: every row names an item you have, so Skip them imports nothing. Importing a corrected count books the difference, so fixing a count means fixing the file and importing it again.
- Orders, from your sales history. Each order needs a client you've already imported.
- Invoices. Each row needs a client you've already imported, and an Issued date before the day you created your workspace. An unpaid one comes in already sent, so it ages on the AR aging report and can be chased and paid. For a settled one, put what was paid in Paid so far, when in Paid date and how in Paid with, and OrderDen records a real payment against it, so the invoice lands paid with the payment on the right date. Status takes Draft, Void and Written off, for what a payment can't tell you. None of it counts as revenue here, because those sales happened before OrderDen. Imported invoices never count against the free 50, on any plan. See Plans & billing.
- Payments, when your invoices file can't say it all. One transfer that
cleared three invoices is one payment: put the invoices and their shares in
Allocated to (
2026-0184: 620.00; 2026-0191: 380.00). A payment naming no invoice is money on account and needs a Client; anything over what the invoices owe becomes that client's credit. Import your invoices first. - Expenses, from a bank export: date, amount and a category. Categories and vendors are created as needed. A project number that matches nothing leaves the expense without a project.
Duplicates
Before importing, Review says how many rows match something you already have, what each matched on, and what each choice would do to this file:
- Skip them (the default): leave the stored record alone.
- Update them: overwrite the stored record with the columns this file has. Columns your file doesn't have are left alone, so reloading a price list updates prices without erasing descriptions. On a client, updating adds new contacts and addresses, and rewrites an address with the same street line; it never removes any. Expenses are the exception: an updated expense with no Category column moves to Other, and with no Paid by column loses its payment method.
- Import anyway: create a second record. Rarely what you want.
What counts as a match:
| Kind | Matches on |
|---|---|
| Clients | Name plus the first email |
| Items | SKU, or item number and revision |
| Materials | Material number, then name |
| Vendors | Name |
| Price list prices | The price list plus the item or variant |
| Opening stock | The item (or variant) and the location |
| Orders | Order number |
| Invoices | Client plus invoice number |
| Payments | The payment number, then what it paid plus the date and amount |
| Expenses | Date, amount and vendor |
Rows that repeat within the same file count as duplicates too, so a sheet listing one customer twice imports them once. On an orders file, Review counts every line after an order's first as a duplicate, so its counts run high.
Orders, invoices and payments are never rewritten. Update them refuses an invoice you already have, paid or not (correct it with a credit note), and a payment is a fact with a date: remove it and import the row again, or refund it.
Importing invoices and then payments does not book the same money twice. A payments row whose invoice, date and amount match an invoice's Paid date and Paid so far is recognized as already recorded and skipped, with or without a number. Each payment you already have matches one row at most, so two payments of the same amount on the same day both count.
Already have duplicates?
Importing is how most workspaces get them. The Clients list shows a possible duplicates panel when it finds likely matches, grouped by shared email and by the same name at the same ZIP code, and merges from there. See Clients.
Undo
Recent imports at the bottom of the page lists the latest 10 runs, each with Undo, and the summary has Undo this import right after a run. Undo archives what the import created instead of deleting it, and archived records can be restored from their lists. Expenses, payments and price list prices have no archive, so undo deletes them. (A payment left behind would show its invoices paid by money that never arrived.)
Records already in use are kept, and the undo says how many: an item on a quote, a vendor on a purchase, a material a bill of materials uses, an invoice with a payment, a refunded payment. If every record an import created is in use, the undo is refused rather than half done.
Undo covers created records only. Rows that updated a record aren't rewound. Undoing a materials import archives the materials but leaves the opening stock it booked. An opening stock run has nothing to undo: it creates nothing, it sets balances, and to put a balance back you import the right count. A full-archive restore also appears in the list, and its Undo is refused.
Templates
The upload step has a template for each kind: a CSV with the right headings and one example row.
Or export what you have. A list you export from OrderDen loads straight back in with nothing to map. That's the quickest bulk edit: export, fix it in a spreadsheet, import with Update them. Some lists have no importer, because a list row is a total and the document is its lines. Those come back through the full archive, which restores documents whole.
Common export layouts are recognized, so a webstore's Products CSV maps
itself: Handle becomes the item number, Body (HTML) the description,
Variant SKU the SKU, Variant Price the price and Cost per item the
cost.
Custom fields
On a Clients or Items file, your custom fields are offered in the mapping step under their own names, so a sheet headed "Wholesale account no." maps itself. A required custom field has to be mapped before you can preview. Values are checked against the field's type when you import, not at Review: a date field rejects "the fourth", and a choice field takes only its own choices. The other imports ignore custom fields.
A blank cell is skipped rather than written as empty. A spreadsheet is mostly blank cells, and "this file has no column for that" isn't the same as "clear it".
Reading the errors
A row is rejected as a whole, and the message names the value that caused it. The usual causes:
- A required field is blank: Name for clients, vendors and materials; Name plus an Item # for items (a row with only a SKU uses it as the Item #); Issued and Amount for invoices; Order #, Ordered, Qty and Unit price for orders; Counted for opening stock; Date and Amount for expenses.
- A price, cost or quantity isn't a number. Currency symbols, thousands separators and decimal commas are fine ("$1,299.00", "14,50"); words aren't.
- A date OrderDen can't read.
2026-03-14is never ambiguous, so export that if your spreadsheet offers it. A date with slashes is read month first unless the first number is over 12. - A unit that isn't one of yours (materials), or a location that isn't one of yours (opening stock). The message lists the ones you have.
- A client that an order, invoice or payment names, or an invoice a payment names, that isn't there yet. Import clients first, and invoices before payments.
- A Status, Paid by, Method or Item type OrderDen doesn't know. The message lists the accepted values. An unknown Payment terms name on a client or vendor is ignored, and the row still imports.
- Allocated to adding up to more than the payment.
Importing from a script
Everything the wizard does is in the public API:
POST /imports/preview to check a file (it also returns the kind's fields,
so a script can build a file without hard-coding column names),
POST /imports to run it, GET /imports for the history and
POST /imports/{id}/undo to reverse a run.
Everything on this page is on the free tier: one person, the whole product, no card.
Start free