Sage Intacct Sales Order Import from Customer Purchase Order PDFs to Order Entry CSV Rows

Sage Intacct loads sales orders from its Order Entry CSV template or through the API.

PDF, JPG, PNG, BMP, HEIC, TIFF

Submit your purchase orders

PDF, scan, or email attachment
Every order line captured
Rows shaped for the Order Entry template
Plans from $49 a month

Overview

Sage Intacct loads sales orders from its Order Entry CSV template or through the API. It does not read the PDF your customer emailed. Upload that purchase order here and get the customer PO number, the ship-to and every line with item, quantity, unit and price, laid out the way the template expects.

Why customer orders still get retyped into Sage Intacct

Intacct is strict about the file and silent about the document. The hours go into turning each customer PDF into rows that pass the import.

Bill capture is buy side only

Sage Intacct AP Automation creates draft bills from vendor bill documents you email or upload. A purchase order your customer sends you is on the sell side, and nothing in Intacct reads it.

The template is unforgiving

Header titles must match exactly, IDs are case sensitive, a stray leading or trailing space fails the row, and a comma inside a field needs double quotes.

Everything must already exist

CUSTOMER_ID and ITEMID have to match records in Intacct, and inventory items also need a WAREHOUSEID. A buyer part number is not your item ID.

A blank price loads as zero

PRICE is optional in the template and defaults to 0. Miss it on one line and the order imports cleanly with a free item on it.

From customer PO to Sage Intacct order entry rows

Upload the purchase order your customer sent. The AI reads the header and every line and returns structured data you can paste into the Order Entry transactions template, so creating the sales order becomes a mapping step instead of a typing job.

Reads any PO layout

No per-customer template. Works on digital PDFs, scans and photographed pages from any buyer system.

Every line, not a summary

A 60-line replenishment order comes back as 60 rows with part number, description, quantity, unit of measure and unit price.

Customer PO number kept apart

The buyer PO number sits in its own column, ready for CUSTOMERPONUMBER, so it never collides with your own DOCUMENTNO sequence.

Dates the buyer asked for

Order date, need-by and ship-by dates come off the document, so DATE, NEEDBYDATE and SHIPBYDATE are filled from the source, not guessed.

How sales orders get into Sage Intacct today

Sage Intacct gives you two ways to create sales orders without keying them. The first is the CSV import for Order Entry transactions. You download the template from Order Entry, All, Transactions (pick the transaction type, then Import and Download template), or from Company, Setup, Configuration, Import data. Sage customizes that template to your company, so your dimensions and custom fields are already in it. You upload the finished file through the same Import data page, and Sage recommends choosing Process offline and giving an email address, so a large file runs in the background and reports back.

The second is the API. The long-standing XML Web Services function is create_sotransaction, which needs a transaction type, a date, a customer ID and at least one line. Using it takes a Web Services developer license with a sender ID, and your administrator has to enable the Web Services subscription and authorize that sender ID. That is fine for a system integrator and heavy for an order desk.

Intacct also has a newer import service under Company, Setup, Import data, with XLS and XLSX support and AI-assisted field mapping. When we checked its list of supported objects, Order Entry transactions were not on it, so customer orders still go through the classic CSV template. Both routes assume the order already exists as clean data. Most customer POs in the United States arrive as a PDF from someone else's ERP, a portal download or a scan. That document is the gap this page fills.

The header fields that have to be right

TRANSACTIONTYPE is the name of an Order Entry transaction definition in your company, usually Sales Order, and it must match exactly. DATE, CUSTOMER_ID and DATEDUE are required. DOCUMENTNO is only required when the transaction definition has no automatic numbering, which is rare for sales orders. STATE takes Draft or Post and defaults to Draft. Terms, ship-to and bill-to contacts, currency and the three order dates (NEEDBYDATE, SHIPBYDATE, CANCELAFTERDATE) are optional, and each one you can fill from the customer document is one less thing a rep checks later.

Where the customer PO number belongs

Intacct has a dedicated field for it: CUSTOMERPONUMBER, up to 120 characters, described in the API as the customer's purchase order number. It is separate from REFERENCENO and from your own document number. Putting the buyer PO in the right column is what lets someone find the order when the customer calls, and it keeps the number on the documents that flow from the sales order.

Lines, items and warehouses

Each line needs LINE, ITEMID, QUANTITY and UNIT, where unit defaults to Count. WAREHOUSEID becomes required for inventory and stockable kit items. The item ID must already exist, and customers order by their own part numbers, so keep a mapping sheet per account from buyer code to your item ID and apply it to the extracted rows. The extraction keeps the part number exactly as printed next to the description, so an unmapped code shows up as a blank cell you can fix, not as a failed row. Watch PRICE as well. It defaults to 0, so a line without it loads at zero rather than failing.

Import as Draft, then post

Leave STATE at Draft for the first run of any new customer. Rows that start with a hash sign are ignored, which makes it easy to park a line you are unsure of. Rows that fail come back as a CSV with an error code on each one. Sage also notes that when more than 500 transactions fail to import, the batch frequency on the transaction definition is the first thing to check, and suggests setting summary frequency to each document for large loads. Since Sage's help does not spell out how header values should sit across the rows of one multi-line order, import a single two-line order first and look at the result before sending a batch.

When the order volume is high

If Monday morning starts with 30 customer POs in the shared inbox, run them through bulk purchase order upload, up to 50 files in one pass, and get one consistent file back. Long orders are covered by purchase order line item extraction, which returns every row rather than a summary. Teams that post orders from their own integration pull the same data as JSON from the purchase order API.

Same workflow, other systems

If part of the business runs elsewhere, the pattern is the same with different field names. See NetSuite sales order import, Business Central sales order import and Odoo sales order import. For the buying side of Intacct, where you issue the purchase order to a vendor, use purchase order to Sage Intacct, and if you are weighing a purchasing app on top of Intacct, we priced the options in purchase order software for Sage Intacct. Budgeting Intacct itself? See Sage Intacct pricing for the subscription, user types and implementation ratio.

Customer PO field to Sage Intacct template column

What comes off the customer document and where it goes in the CSV import for Order Entry transactions. Column names are the ones in the Sage template.

Intacct column Required Where it comes from Notes
TRANSACTIONTYPE Yes Set by you, usually Sales Order. Must match a transaction definition
DATE Yes The PO date on the document. Short date, for example 3/15/2026
CUSTOMER_ID Yes The buying company, matched to your customer record. Case sensitive, must exist
DATEDUE Yes From the payment terms on the PO. Or your agreed terms
CUSTOMERPONUMBER No The purchase order number the customer printed. Up to 120 characters
NEEDBYDATE No The delivery date the buyer asked for. Drives fulfillment follow-up
LINE Yes The line sequence on the PO. 1, 2, 3 within the order
ITEMID Yes The customer part number, mapped to your item. Item must exist
QUANTITY Yes Ordered quantity on each line. No negatives on inventory items
UNIT Yes Unit of measure on the line. Defaults to Count
PRICE No The unit price the buyer printed. Defaults to 0 if blank
WAREHOUSEID For stock items Your ship-from warehouse. Required for inventory items

How the import runs

Four steps from the customer attachment to a draft sales order in Sage Intacct.

1

Upload the customer PO

Drop in the PDF, the scan or the email attachment. Up to 50 files per bulk upload, with no per-customer setup.

Tip: Portal downloads and forwarded attachments work the same way.

2

Review and Map

Check the header and lines on screen, then map buyer part numbers to your item IDs and the customer name to its CUSTOMER_ID.

Tip: Keep the mapping sheet; the same account sends the same codes.

3

Fill the template

Download Excel or CSV and paste the rows into the Order Entry transactions template you downloaded from Intacct, keeping its headers untouched.

Tip: Trim spaces and quote any field that contains a comma.

4

Import as draft

In Company, Setup, Configuration, Import data, upload the file with Process offline, then review the draft sales orders and post them.

Tip: Run one two-line order first on any new customer.

Why order desks use this in front of Sage Intacct

1
Row per line item
3
Export formats: Excel, CSV, JSON
50
POs per bulk upload

Security and privacy

  • Bank-grade TLS encryption in transit
  • Your PO data is never sold or shared
  • US-based cloud infrastructure

Sage Intacct sales order import questions, answered

Download the CSV template for Order Entry transactions from Order Entry, All, Transactions (Import, Download template) or from Company, Setup, Configuration, Import data. Fill one row per line with the transaction type, date, customer ID, due date, item, quantity and unit, then upload it on the Import data page, ideally with Process offline.

Not natively. Sage Intacct AP Automation creates draft bills from vendor bill documents, which is the buying side. A customer purchase order has to become structured rows first, either typed by hand or extracted, before the Order Entry import or the API can create the sales order.

In CUSTOMERPONUMBER, a field of up to 120 characters that the API describes as the customer purchase order number. It is separate from REFERENCENO and from your own DOCUMENTNO, which usually comes from automatic numbering on the transaction definition.

It is the name of the Order Entry transaction definition the row creates, such as Sales Order or Sales Quote. It must match a definition set up under Order Entry, Setup, Transaction definitions, exactly as written, or the row fails.

When we checked, the import service object list covered areas such as accounts payable, accounts receivable, inventory, projects and the general ledger, but not Order Entry transactions. Sales orders still load through the classic CSV template on the Import data page.

The usual causes are a header title that does not match the template exactly, an ID with the wrong case, a leading or trailing space, a comma inside an unquoted field, or a customer, item or warehouse that does not exist yet. Failed rows come back as a CSV with an error code on each.

Yes. The STATE column takes Draft or Post and defaults to Draft, so an import creates draft sales orders unless you say otherwise. Draft is the safer choice for any new customer or template, because a rep can check the lines before anything moves downstream.

With the XML Web Services function create_sotransaction, passing the transaction type, the date, the customer ID and at least one line. It needs a Web Services developer license with a sender ID, and your administrator must enable the Web Services subscription and authorize that sender ID.

No. PurchaseOrders reads the customer purchase order and returns structured data as Excel, CSV or JSON. It does not install in Sage Intacct and does not create, post or ship orders. You load the rows through the Order Entry import, the API or your own integration.