NetSuite loads purchase orders through the CSV Import Assistant, and the assistant expects columns: an External ID repeated on every row, a Vendor that already exists in NetSuite, and at least one item line. PurchaseOrders handles the part the assistant cannot do. It reads the supplier purchase order in whatever layout it arrived in and returns the order number, vendor, dates, item codes, quantities and rates as clean CSV or Excel you can map into the import. Upload a real purchase order below.
Submit your purchase orders
Drop documents here, or click to file
Up to 50 files per batch
Uploading...
The CSV Import Assistant is not difficult once the file is right. Getting the file right is where the time goes, because NetSuite enforces rules that are not obvious from the mapping screen.
NetSuite needs one unique ID per record, and in a single-file import that value has to appear on every line of the order, not just the first. Leave it blank on the continuation rows and the assistant reads each line as a separate purchase order.
The External ID is the key the import uses to identify and re-identify the record. The PO Number your buyer quotes is a separate field. Teams routinely map the supplier order number into the External ID, then cannot re-run the load without creating duplicates.
A purchase order that carries only item lines can go in as one file. As soon as the order also has expense lines, NetSuite requires the multiple-file format: a primary file for the header and separate sublist files, all joined by the External ID.
None of that matters until the data is in columns. The order arrives as a PDF attachment or a scan, and the columns the assistant wants have to come from somewhere. That is the step that is still done by hand in most AP and purchasing teams.
PurchaseOrders is a document data capture layer. It reads a purchase order and returns structured fields you can map into a CSV Import Assistant template or a REST payload. It does not connect to NetSuite, does not run the import, and does not write to any NetSuite record. The load stays yours to run.
The AI pulls the order number, vendor, order date, expected receipt date, currency and memo, which covers the mainline columns a purchase order import needs before the sublist is mapped.
Each line comes back with the item code, description, quantity, rate and amount, so the items sublist can be built from one extraction instead of a line-by-line retype into the record.
Supplier documents print the vendor part number, not your internal item name. That value is what you reconcile against the NetSuite item record before the import, and it is the most common reason an otherwise clean file fails on the Item column.
The Import Assistant takes CSV. SuiteTalk REST takes JSON. The same extraction feeds either route, so a one-time migration and a scripted daily feed start from the same data.
These are the columns that decide whether the import posts or errors. The first four are effectively mandatory for a new purchase order record.
| Column | What it does | Key notes |
|---|---|---|
| External ID | Unique key for the record | Must appear on every row of the order in a single-file import |
| Vendor | Links the order to a vendor record | Has to match an existing vendor by name, internal ID or external ID |
| Item | The item on each sublist line | Must already exist in NetSuite, full hierarchy path included |
| Quantity and Rate | Line quantity and unit price | Amount can be derived, but supplying it avoids rounding surprises |
| Date | Transaction date | Has to match the date format on the importing user profile |
| PO Number | The visible order number | A separate field from External ID, not a substitute for it |
| Exchange Rate | Currency conversion rate | Required when the Multiple Currencies feature is enabled |
| Subsidiary | Owning subsidiary | Required on OneWorld accounts, ignored on single-entity accounts |
The extraction removes the typing. The import stays yours to run inside NetSuite, with your own roles and your own audit trail.
Drag in the PDF, scan or photo exactly as it arrived. There is no template to configure first and no supplier layout to teach the system in advance.
Tip: Multi-page orders and mixed vendors in one batch are fine.
Check the order number, vendor, dates and the line table before you export. Fixing a quantity here takes seconds. Finding it in a NetSuite import job log after a partial load takes far longer.
Tip: Check units of measure, because a case-versus-each mismatch posts a valid but wrong order.
Download CSV or Excel, add the External ID column, then run Import CSV Records with Transactions as the import type and Purchase Order as the record type. Save the field mapping so the next load is a two-click job.
Tip: Run the first pass on a handful of orders before loading the full batch.
Go to Setup, then Import/Export, then Import Tasks, then Import CSV Records. Choose Transactions as the import type and Purchase Order as the record type, upload the CSV, map the columns to NetSuite fields, and run the job. Save the mapping so later loads reuse it instead of being remapped by hand.
A unique External ID or Internal ID, a Vendor that already exists in NetSuite, and at least one item line. NetSuite will not create a new purchase order record with no lines. Exchange Rate becomes required when the Multiple Currencies feature is on, and Subsidiary is required on OneWorld accounts.
Because the External ID is missing from the continuation rows. In the single-file format the unique ID has to appear on every line belonging to the order, not only the first. NetSuite groups rows into one record by that repeated value, so a blank cell reads as a brand new order.
Yes, as long as the order carries item lines only. Write one row per line and repeat the header columns and the External ID on each row. The moment the order also needs expense lines, NetSuite requires the multiple-file format instead, with the header and each sublist in its own file.
A single file repeats the header data on every sublist row. A multiple-file import splits the load into a primary file holding the mainline data and separate files for the items and expenses sublists, joined by the External ID present in all of them. Items plus expenses on the same order requires the multiple-file route.
No. External ID is the unique key the import uses to identify the record and to update it on a later run. PO Number is the order number people quote to the vendor. Mapping the supplier order number into External ID works once, then blocks any clean re-import because the key is no longer under your control.
Match on a sublist key field. NetSuite uses Line or Order Line, or the Item itself, to decide whether an incoming row updates an existing line or appends a new one. Without a stable key on the row the import appends, which is how duplicate lines appear on an order that was only meant to be corrected.
Yes. SuiteTalk REST exposes purchase orders as a record endpoint at /services/rest/record/v1/purchaseOrder on your account-specific domain, which takes the form of your account ID followed by suitetalk.api.netsuite.com. That route suits a continuous feed, while the CSV Import Assistant suits a one-time or periodic bulk load.
No. PurchaseOrders reads purchase order documents and returns the data as CSV, Excel, JSON or API output. It does not connect to NetSuite, does not run the CSV Import Assistant, and does not write records. You run the import yourself, which keeps your roles, permissions and audit trail intact.
The Business Central configuration package route.
Acumatica import scenarios for PO data.
The DTW two-file template route.
Turn a PO into plain CSV columns.
The general ERP load pattern.
Same fields as JSON for a scripted feed.