Skip to main content

Import sales orders

You can bring orders into SKU.io two ways instead of keying each one by hand. Pick the importer that matches what you have.

ImporterWhere it livesWhat it does
Import Sales Orders (spreadsheet)The Import button on the sales orders listCreates — or updates — many orders at once from a CSV, TSV, or Excel file.
Import from PDF (OCR)The Import from PDF tab in the New Sales Order dialogScans one customer purchase-order PDF, extracts the header and lines, and lets you review them before creating a single order.
Terms used on this page
  • Line item — one product row on an order: a SKU, a quantity, and a unit price.
  • Header columns — values that describe the whole order (order number, customer, sales channel, currency), as opposed to a single line.
  • Upsert — an import that either creates a new record or updates an existing one, depending on whether a match key is present.
  • OCR — optical character recognition; reading text out of a PDF so SKU.io can turn it into structured order data.

Before you begin

RequirementWhy it matters
Import sales orders permission (sales_orders.import)The Import button is hidden without it. This gates the spreadsheet importer.
Write access to orders (scope.rw:orders)Gates the OCR path — uploading a PDF, reviewing the scan, and creating the order all run through it.
Products already exist in SKU.ioBoth importers match each row to a product by SKU. Neither creates products — an unmatched SKU is flagged for you to fix.
Sales channels, currencies, and warehouses already existThe spreadsheet importer resolves these by name or code and doesn't create them. Every order needs a sales channel.
Invoice OCR enabled in Settings → Invoice OCRRequired only for the PDF/OCR path. Uploading a PDF while it's off returns an error telling you to enable it.

Customers are the exception: the spreadsheet importer can create a new customer from a row when the email or name doesn't match an existing one.

Import sales orders from a spreadsheet

This flow creates or updates one or more orders from a file. It walks through four steps — Upload, Map Columns, Preview & Validate, and Import — and nothing is written to your account until the final step.

  1. Go to Orders → Sales Orders.
  2. In the toolbar above the list, click Import. The Import Sales Orders window opens on step 1, Upload.
  3. Click Download Template. SKU.io generates an Excel template seeded with your own channels, customers, and products so the values you type match existing records. The file downloads as sales-order-import-template.xlsx.
  4. Fill in your data. Use one row per line item, and repeat the header columns (order number, customer, sales channel, currency) on every row that belongs to the same order, so multiple lines collapse into one multi-line order.
  5. Load your data. Drag a CSV, TSV, or Excel file onto the drop zone, click Choose File, or paste rows directly into the Paste CSV/TSV data box. Confirm the First row is a header checkbox matches your file, then check the raw preview.
  6. Click Next: Map Columns. SKU.io auto-matches your headers to its fields. Adjust any that are wrong, or set a column to Skip this column. Fields marked with an asterisk are required (see Which columns are required below). You can also map a column onto any sales-order custom field — see Set custom field values.
  7. Click Next: Validate. SKU.io checks every row and resolves names to records without saving anything. You can run this step as many times as you need.
  8. Review the grouped preview. The summary cards count Sales Orders, Line Items, New, Updates, Blocked, and Errors. Each order appears as a card; expand one to see its lines. Use the All, New, Updates, Blocked, and With Errors tabs to focus on the orders you still need to fix.
  9. Click Import N Sales Orders. The number is how many orders are currently importable — orders with errors and blocked orders aren't counted.
  10. Review the results. Created Sales Orders and Updated Sales Orders each list the affected orders as clickable links; Skipped Sales Orders lists any that failed with the reason. Click Import More to run another file, or Close to return to the list.

What you'll see: each successful order appears under Created Sales Orders or Updated Sales Orders as a clickable order number, and lands in your sales orders list.

Validating is always safe to repeat

Validation matches your rows without saving anything. Nothing is created or changed until you click Import N Sales Orders, so you can validate, fix your file, and re-validate as often as you need. The importer accepts up to 50,000 rows per run.

Which columns are required

The required columns depend on whether you are creating a new order or updating an existing one.

ColumnRequired when creatingNotes
Sales ChannelYesEvery order must belong to a sales channel. Matched by name.
Order DateYesThe order's date.
SKUYes (per line)Matched to a product. An unmatched SKU is reported as a line error.
QuantityYes (per line)
Unit PriceYes (per line)
Sales Order ID (upsert key)NoPresent only when you want to update existing orders — see Update existing orders below.

Everything else — customer details, currency, store, shipping method, ship-by / deliver-by / hold-until dates, tags, order-level discount and shipping amounts, and full shipping and billing addresses — is optional and maps in the same step.

What each column controls

For the complete, authoritative list of every importable column — its accepted values, defaults, and blank-cell behavior — see the Importable sales order columns reference. A few things worth knowing up front: customer_company and customer_phone are used only when auto-creating a new customer; the per-line discount column is a per-unit amount (stored as discount × quantity); and if you supply both order_discount_amount and order_discount_rate, the rate wins.

Set custom field values

If you've defined custom fields on sales orders, you can set them from your spreadsheet — the template includes a custom_<slug> column for each one (for example custom_gift_message), and the Field Guide sheet lists the slug, type, and valid values.

  • Put the value in the custom_<slug> column and map it in the Map Columns step, the same way you map any other field.
  • On an update, a mapped but blank cell clears that custom field. A custom-field column you don't map is left untouched — a partial-import sheet never wipes custom fields it doesn't include.
  • Custom-field values are read from the first row of each order, like the other header fields.

Update existing orders

Mapping a column to Sales Order ID (upsert key) switches the importer into update mode. An Update mode banner appears, and the rules relax: because the ID targets an existing order, only the columns you actually want to change need to be present. Order date, sales channel, and line items are no longer required — leave them out for header-only updates such as tags, the customer PO number, sub-channel, or shipping method.

An update replaces every line on the matched order

When an import row updates an existing order and includes line items, all line items on that order are replaced with the rows in your import — not merged. The preview shows an I understand confirmation you must tick before the import can run. For a header-only change (tags, PO number, dates), omit the line columns entirely so the existing lines are left untouched.

Some rows can't be updated at all. An order that's archived, canceled, or closed, or an ID that doesn't exist, is marked Blocked in the preview and is never sent. Remove the ID column from those rows to create new orders instead, or drop the rows from your file.

When validation reports errors

Each order card and line shows the specific problem — for example an unmatched SKU, a missing sales channel, or a quantity that isn't a positive number. By default, an import won't run while any order has errors. To push the valid orders through anyway, tick Continue on error (skip invalid sales orders, import valid ones) on the preview step; invalid orders (and individual error lines) are then skipped and the rest import. The results screen lists whatever was skipped, with the reason.

New customers are created on import

When a row's customer email or name doesn't match an existing customer, the preview flags it with a New customer chip and the summary counts it. Those customers are created as part of the import. If you'd rather reuse an existing customer, correct the email or name in your file so it matches.

Scan a customer PO (OCR)

Use this when a customer sends you a purchase-order PDF and you want SKU.io to read it into a draft rather than retype it. OCR extraction runs in the background and drops you into a review screen with the PDF on the left and the extracted data on the right, so you can confirm every value before the order is created.

Turn on Invoice OCR first

This path is available only when Invoice OCR is enabled under Settings → Invoice OCR. If it's off, the upload is refused with a message pointing you there.

  1. Go to Orders → Sales Orders and click + New to open the New Sales Order dialog.
  2. Click the Import from PDF tab. The dialog title changes to Import Customer PO.
  3. Drop the customer's PO onto the drop zone, or click it to browse. Only PDF files up to 20 MB are accepted.
  4. Wait for the scan. SKU.io uploads the file and starts an AI extraction as a background job, then opens the Customer PO OCR Review screen. Scanning usually takes 15–30 seconds; you can follow it in the job tray.
  5. Confirm the header. Set or change the Customer (click Select Customer to search, or Create Customer to add one inline), then check the Customer PO Number, Order Date, Deliver By, and Ship To Address fields the scan filled in. A customer is required.
  6. Resolve the line items. Each detected line shows a confidence dot and its match status. Adjust the Qty and Unit Price inline, and follow up on anything flagged (see Match the lines the scan couldn't below).
  7. Leave Remember product and revenue line matches for future imports ticked to teach SKU.io this customer's wording, so the same descriptions map automatically next time. Untick it to keep this a one-off.
  8. Click Create Sales Order. SKU.io creates the order and opens it, ready to approve and fulfill.

What you'll see: the new order opens on its detail page. From there the next steps are the same as any order you build by hand.

You can only create the order once the scan is reviewed

The Create Sales Order button acts on an extraction that's in the pending review state — the state a scan lands in when it finishes. If the button is disabled, hover it: the tooltip lists what's missing, such as select a customer, set the order date, or resolve at least one line.

Match the lines the scan couldn't

The scan sorts each detected line by how confidently it matched a product in your catalog:

  • Matched lines already point at a product — the SKU links to the product page, and a variance chip appears when the extracted price differs from the customer's pricing tier. Review the quantity and price and move on.
  • Unmatched lines are grouped under a red unmatched heading and must be resolved before you can create the order. For each one, either search to match a product or click Mark as revenue line to book it as a charge (shipping, handling, or another non-product amount) by choosing a Revenue Type.

Use the trash icon on any line to drop it from the order entirely. A line tagged history was resolved from this customer's past purchases rather than a direct SKU match, so double-check its product and quantity.

Manage a scanned document

While you review a scan, a few extra actions are available beyond editing the header and lines:

ActionWhere it'sWhat it does
Re-scanToolbar buttonRe-runs OCR on the same PDF. It discards unsaved edits to the working header and lines, so use it when the first pass read the document poorly. Unavailable once an order has been created from the extraction.
ReclassifyToolbar dropdownOpens a menu to move the document to another review queue — for example a Supplier Invoice — when the scan wasn't actually a customer PO. You confirm the move, and the original extraction is marked rejected with a reference to the new one.
Clone from a prior orderInline bannerAppears above the line items only when this customer has a matching earlier order, offering to pull that order's confirmed lines into this one. It's a banner in the extracted-data panel, not a toolbar button.

To remove a scan entirely, delete it from the document inbox — the review screen itself has no delete action.

A confirmed scan is locked

Once you create an order from a scan, that extraction is confirmed and can no longer be re-scanned or reclassified. Open the resulting order with the View Sales Order button to make further changes there.

Common problems

What you seeWhat's happeningWhat to do
The Import button is missing.You don't have the Import sales orders permission.Ask an administrator to grant sales_orders.import. See the permissions reference.
An order shows as Blocked in the spreadsheet preview.The mapped Sales Order ID points at an order that's archived, canceled, closed, or nonexistent.Remove the ID from that row to create a new order, or drop the row.
An update quietly wiped an order's lines.An update row that includes line items replaces all lines on the matched order.For header-only changes, leave the line columns out of the file entirely.
A SKU reports not found.The value doesn't match a product, or a long SKU lost digits when the spreadsheet app saved to CSV.Copy the SKU from the template, and keep long numeric SKUs in Excel (.xlsx) or a Text-formatted column so no digits are dropped.
Uploading a PDF is refused with a Settings message.Invoice OCR is turned off.Enable it under Settings → Invoice OCR, then try again.
Create Sales Order stays disabled after a scan.A required value is missing.Hover the button — the tooltip names what to fix (customer, order date, or an unresolved line).

Next steps

Video transcript

To bring many orders in at once, go to Orders, then Sales Orders, and click Import. Start from the downloaded template so your values match.

Paste or upload your file, one row per line item, then click Next.

Your columns are matched automatically. Click Next to validate.

Validation groups your rows into orders and checks each one, without saving. Here: two new sales orders, three lines, no errors. Click Import.

Both orders are created and ready to reserve and fulfill. A spreadsheet just became sales orders.

Last verified: