Procore Purchase Orders: Import PO Data Into Commitments and the Schedule of Values

Procore keeps purchase orders in the project-level Commitments tool, with the line items on a Schedule of Values. Both the SOV CSV import and the purchase_order_contracts REST API want structured rows. Neither reads a PDF. PurchaseOrders reads the purchase order PDF, scan, or photo and returns the header fields and the full line-item table as Excel, CSV, or JSON, so whatever feeds Procore is typed by a machine instead of a person. Upload a real purchase order below.

PDF, JPG, PNG, BMP, HEIC, TIFF

Submit your purchase orders

Header plus full line-item table captured
Excel, CSV, JSON & REST API output
Map once to your SOV columns
Free to try, nothing to install in Procore

Why Getting Purchase Orders Into Procore Still Starts With Typing

Procore is clear about what a purchase order is. In its own words, a PO is a documented financial commitment that details the types, quantities, and agreed-upon prices for products or services. Creating one is quick. Creating three hundred from documents that arrived as PDFs is a different job, and it is the job Procore deliberately leaves to you.

There Is No Native Bulk Import for Purchase Orders

This surprises people. Procore has downloadable import templates for direct costs, budgets, the directory, locations, punch list items, and submittals. Commitments have exactly one entry on that list, and it covers SOV line items only. The Procore Imports desktop application handles cost codes, contacts, locations, punch items, and submittals, and does not handle commitments at all.

The CSV Import Fills a PO, It Does Not Create One

The Schedule of Values CSV import adds or replaces line items inside a commitment that already exists. So a hundred purchase orders means a hundred commitments created by hand first, each one then filled from its own file. The import saves the line entry, not the order entry.

Bulk Creation Means the API, Which Needs Clean Fields

Creating purchase orders at volume means POST to purchase_order_contracts, or the sync endpoint for batches. Either way your integration has to supply vendor, number, dates, terms, and every line with its cost code and amount. If the source is an emailed PDF, something upstream has to produce those values.

Draft Status Gates the Import

By default the commitment has to be in Draft status to import SOV line items. The Enable Always Editable Schedule of Values setting relaxes that, but even then you cannot replace line items that have already been invoiced. Discovering this halfway through a migration is a bad afternoon.

The Template Is Strict and the Rejections Are Silent

Procore is explicit that you must not add or move data columns, because the order matches its database. Rows missing a cost code name, cost code number, line item type, or an amount are skipped. A blank amount cell is rejected outright, so you enter 0.00 instead. Typing errors produce a shorter file, not an error message you can act on.

Budget Codes Are Not Importable

The CSV does not accept budget codes. You supply the cost code, the cost type, and optionally the sub job segment, and Procore assembles the budget code from those. Anyone building a file from a supplier PO has to map to that structure rather than to what the document says.

Where PurchaseOrders Sits in the Procore Workflow

PurchaseOrders is the capture step in front of Procore. It is not a Procore integration and it does not run inside Procore. You give it a purchase order document. It gives back clean, field-level data that you map to the SOV CSV template Procore generates for you, or hand to the integration that calls the commitments API.

Reads the Document You Actually Received

A digital PDF from a supplier system, a scan of a mailed order, or a phone photo taken in a job trailer. All go through the same extraction, with no per-supplier template to build first.

Header Fields and Every Line Item

PO number, vendor, bill-to and ship-to, order and delivery dates, payment terms, ship via, and the line grid: description, quantity, unit of measure, unit price, and extended amount, captured across page breaks.

CSV Shaped for the SOV Template

Output is one row per line item with consistent headers, which is what the Schedule of Values import expects once you have added your cost code, cost type, and line item type columns. Map once, and every later batch drops into the same mapping.

JSON and a REST API for Your Integration

Pull the same extraction as JSON and feed whatever calls purchase_order_contracts and its line_items collection. Clean fields in, no document parsing on your side, and no PDF handling in your integration code.

Batches for Migrations and Backlogs

Upload a stack of orders at once rather than one at a time. That is what turns a migration onto Procore from a staffing problem into a same-day job.

Review Before Anything Reaches Procore

Captured fields are shown on screen so you can correct an odd value before you export. Catching it here is cheaper than finding out a row was silently skipped during the SOV import.

Why Choose PurchaseOrders?

  • No template to build per supplier or per subcontractor
  • Scans and photos handled, not just digital PDFs
  • Full line-item tables, not just header totals
  • Excel, CSV, and JSON from the same extraction

Three Ways to Get a PDF Purchase Order Into Procore

All three end at the same place, a commitment with a populated Schedule of Values. They differ in what happens before it.

What matters Manual keying into Commitments Template OCR tools PurchaseOrders AI
Setup per supplier layout None, but slow forever Build a template each None, any layout
Mixed PDF, scan, job-site photo Handled by a person Often breaks Handled automatically
Line-item capture for the SOV Error-prone by hand Varies by template Full line-item tables
Time per purchase order 5 to 10 minutes 1 to 3 minutes Under 10 seconds
Output shape Typed straight into the screen Needs cleanup Row per line, ready to map
Rows silently skipped on import Typos drive most of them Some Fewer, data is reviewed first
Cost per PO at volume High manual labor Per-page plus setup Under $2

PurchaseOrders.io extracts purchase order data into Excel, CSV, JSON, or an API response that you map to Procore's Schedule of Values columns or hand to your own integration. It is not a Procore integration, does not install in Procore, does not call the Procore API on your behalf, and does not create, approve, receive, or match commitments. Procore is a trademark of Procore Technologies, Inc.; this page is not affiliated with or endorsed by Procore. Manual cost reflects published estimates of $15 to $40 to fully process a purchase order by hand.

From PDF Purchase Order to Procore SOV in 3 Steps

No templates to build, no changes inside Procore.

1

Upload the Purchase Orders

Drag in PDFs, scans, or photos, one at a time or a whole batch pulled from the orders mailbox.

Tip: Mixed suppliers and file types in the same upload are fine.

2

AI Extracts Every Field

The AI reads each order and returns the header fields and the complete line-item table in seconds.

Tip: Check the captured values on screen before you export, not after the SOV import silently skips a row.

3

Export, Map, and Import

Download Excel or CSV, add your cost code, cost type, and line item type columns, and paste into the SOV template Procore generates for the commitment, or pull JSON via the API and let your own integration post to purchase_order_contracts.

Why Construction Teams on Procore Use PurchaseOrders

10s
To extract one purchase order
Any
Supplier format or layout
Under $2
Cost per PO at volume

Security & Privacy

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

Procore Purchase Orders: Common Questions

Yes. Purchase orders are one of the two commitment types in the project-level Commitments tool, alongside subcontracts. Procore defines a purchase order as a documented financial commitment detailing the types, quantities, and agreed-upon prices for products or services. You create one from the Contracts tab and give it a Schedule of Values for the line items.

Go to the project's Commitments tool, open the Contracts tab, click Create, and choose Purchase Order. Fill in contract number, contract company, and title, then the general information such as status, payment terms, ship to, and ship via. Add the line items on the Schedule of Values. The status has to reach Approved or Complete before you can raise change orders or invoices against it.

Only partly, and this is the detail that catches migrations out. Procore supports importing Schedule of Values line items into a commitment from CSV, but there is no native CSV or Excel import that creates the purchase order records themselves in bulk. Commitments are not in the Procore Imports desktop application either. Bulk creation goes through the REST API.

Purchase orders are purchase_order_contracts. List and create at /rest/v1.0/purchase_order_contracts, read, update, and delete at /rest/v1.0/purchase_order_contracts/{id}, and line items at /rest/v1.0/purchase_order_contracts/{id}/line_items. The PATCH sync variants handle batches. GET /rest/v1.0/commitments is read-only and returns purchase orders and subcontracts together, so it cannot be used to create either.

Procore documents that the sync endpoints accept attributes for a maximum of 1000 resources per call. Sync always returns HTTP 200 and reports per-record outcomes in an entities array and an errors array, so you have to read the response body rather than trust the status code. Rate limits apply on an hourly and a ten-second window, reported through the X-Rate-Limit headers.

Both are commitments, and in the API a subcontract is a work order contract. A purchase order carries assignee, bill to and ship to addresses, ship via, payment terms, and delivery date, and moves through Draft, Processing, Submitted, Partially Received, Received, Approved, and Closed. A subcontract carries contract dates, inclusions, and exclusions, and runs Draft, Out For Bid, Out For Signature, Approved, Complete, Terminated, and Void. Buy materials on a PO, buy labor and scope on a subcontract.

Rows are skipped when the cost code name, cost code number, line item type, or the amount is missing. A blank amount cell is rejected, so enter 0.00 rather than leaving it empty. Procore also requires that you do not add or move columns in its template, because the column order matches its database. And budget codes cannot be imported at all: supply cost code, cost type, and optional sub job instead.

By default, yes. With the Enable Always Editable Schedule of Values setting turned off, which is the default, the commitment must be in Draft to import line items. Turning that setting on allows the import at any status, but you still cannot replace line items that have already been invoiced.

Procore's ERP Integrations cover Viewpoint Spectrum, Vista, QuickBooks Desktop and Online, Sage 300 CRE, Sage 100 Contractor, Sage Intacct, Yardi Voyager, NetSuite, Acumatica, MRI Platform X, CMiC, Workday, and Xero. Procore states that each connector has its own feature set, so confirm commitment export on yours specifically. Foundation and Dynamics 365 Business Central are not on Procore's own supported list.

No, and we would rather say so plainly. It reads purchase order documents and returns structured data. It does not install in Procore, does not call purchase_order_contracts, does not write to Procore, and does not create, approve, receive, or match commitments. You keep using Procore's own SOV import or your own API integration; we just remove the typing in front of it.

Yes. The AI handles scans and phone photos, not only digital PDFs, and returns the same structured fields. That matters on construction projects because material orders and supplier confirmations often reach the office as a photo taken in a job trailer, which template-based OCR tools tend to miss or mangle.