Connect PO Data to Your Inventory System
Without a Developer
You already know AI can pull PO data out of a PDF. What nobody explains is what happens next: getting those fields into Fishbowl, Zoho Inventory, Cin7, Katana, or NetSuite without IT involvement. The gap isn't technology — it's format. Each inventory system expects its own column names, its own field order, its own reference-key type. Miss one, and the import fails silently. Get them right, and the process takes one step.
Key Takeaways
- 15 to 30 minutes of every purchase order (PO) import vanish into renaming columns and reformatting dates — not fixing data, just translating between the language your supplier uses and the language your inventory system reads.
- The gap everyone calls an integration problem is a naming disagreement — your supplier writes "Order Ref" and your inventory system reads "PONum," and no API or webhook resolves what two humans independently named the same piece of data.
- Name your extraction columns to match your inventory system's expected fields — "PONum" not "Order Ref," "VendorName" not "Supplier" — and the file is import-ready the instant extraction finishes. ImageToTable.ai finds data by semantic meaning (what a field represents, not what the supplier labeled it), so 30 different PO formats collapse into one consistent output.
The real gap between extracted PO data and your inventory system isn't technology — it's format translation
Ask a procurement manager what happens after the AI tool finishes extracting PO fields into a spreadsheet, and you'll get the same answer across industries: "I open the file, rename half the columns to match what the inventory system expects, fix the date format, look up the vendor's internal ID, split the data into headers and line items if the system requires it, and re-save as CSV." That's not integration. That's reformatting — and it burns 15-30 minutes per import, every time.
This step exists because PO data arrives in the supplier's language — "Order Date," "Vendor," "Part #" — and your inventory system speaks its own: "TranDate," "VendorName," "PartNumber." The work of translating between them falls on whoever does the upload. Most teams treat this as inevitable. It isn't.
The problem is compounded by format diversity. A manufacturer buying from 30 suppliers receives POs in 30 layouts. Even after extracting the data into a clean spreadsheet — using a tool like AI-powered PO field extraction — the structure that makes sense for a human to read (grouped by supplier, with descriptive column headers) rarely matches what an inventory system's import engine will accept. The fix requires understanding what the target system actually expects, not just what looks right.
Your downstream workflow doesn't change — and that's the point
When teams resist adopting a new data entry method, it's rarely because they love data entry. It's because they've built a fragile but functional pipeline around it, and any change makes them ask: "Will this break receiving? Will putaway still work? What happens to cycle counts?" The answer, in a properly set up extraction-to-inventory flow, is: none of that changes.
Here's what stays exactly the same in your workflow:
- Receiving — warehouse staff still check incoming goods against the PO in the inventory system, just as they always have. The PO is already in the system when the shipment arrives.
- Putaway — bin locations, aisle assignments, and scanning workflows are unaffected. The inventory record was created by the import, same as if it had been manually entered.
- Cycle counts and physical inventory — these compare physical stock against system records. The source of those records (manual entry or import) makes zero difference to the counting process.
- Supplier reconciliation — your AP team still matches invoices against POs in the system. The PO data is there. The matching logic doesn't care how it got there.
- Reorder triggers — minimum stock levels, lead times, and reorder points all operate on system data, regardless of origin.
The only step that changes is how PO data enters the system. Instead of someone reading a PDF and typing fields into the inventory UI (or copying into a spreadsheet and then importing), the data flows from extraction → structured output → import. One step replaces manual typing. Everything downstream stays intact.
The new step (AI extraction → structured output) replaces manual data entry. Everything after the import is identical.
Name your extraction columns for the target system, not the source document
This is the integration technique that eliminates the reformatting step entirely. Instead of extracting PO data with column headers that reflect the supplier's document ("Order Ref," "Supplier," "Item Code") and then renaming them manually, you name the extraction columns to match exactly what your inventory system expects on import.
The mechanism that makes this possible is column-name extraction: you specify the data fields you want to capture — "PONum," "VendorName," "PartNumber" — and the AI locates the corresponding values anywhere on the document by understanding what each field means semantically. It doesn't matter what the supplier calls those fields. "Order Reference," "PO #," "Document No." — all map to "PONum" because the AI reads meaning, not labels.
This flips the conventional workflow. Normally, you extract data first (using whatever column names feel natural), export to spreadsheet, compare against the inventory system's import template, rename columns, reformat dates, and then import. The column-name alignment approach collapses extraction and formatting into one pass: the output file is already structured for the target system.
Why this works across supplier formats: Supplier A's PO calls the order number "PO Ref." Supplier B calls it "Order #." Supplier C uses "Document No." When you extract all three with the column name "PONum," the AI finds the value semantically regardless of the label. The output column is always "PONum" — and that's exactly what Fishbowl's CSV import expects. No renaming, no reformatting, no template maintenance per supplier.
For POs that arrive with missing fields — a supplier doesn't include a delivery date per line item, but your inventory system requires one — you can use computed columns to fill the gap during extraction. If the delivery date appears only in the PO header, a computed column can derive it for every line item row. If the unit price is missing but the line total and quantity are present, a simple Total ÷ Qty calculation fills it in. The extraction engine handles both finding data that exists and deriving data that's implied.
If you're processing multiple POs at once — a stack of 50 PDFs from different suppliers — batch extraction applies the same column-name mapping across all files in one pass. The output is a single structured file ready for import, regardless of how many different supplier formats were in the batch.
How five inventory systems actually receive PO data — and what your extraction output needs to match
Each inventory system has a specific import format. The differences are small but consequential — get one detail wrong and the entire import fails. Here's what each system expects, drawn from their official documentation, and how to structure your extraction output to match.
Fishbowl Inventory
Fishbowl is widely used in North American manufacturing and wholesale distribution. Its CSV import for purchase orders uses a two-row-type flag system:
- Row type 1 — PO header: First column contains the text "PO." Fields include PONum, Status (numeric: 10=Bid Request, 15=Pending Approval, 20=Issued, 95=Historical), VendorName (case-insensitive, auto-creates if not found), RemitToName, ShipToName, CarrierName, and date fields.
- Row type 2 — Item line: First column contains the text "Item." Fields include POItemTypeID (numeric: 10=Purchase, 20=Credit Return, 30=Out Sourced, 40=Shipping), PartNumber (must match an existing Fishbowl part), VendorPartNumber, PartQuantity, and UnitCost.
Extraction output structure for Fishbowl:
Flag,PONum,Status,VendorName,RemitToName,...
PO,PO-2026-0423,20,Acme Industrial,Acme Industrial,...
Item,10,PART-8842,VP8842-A,250,14.75,...
Item,10,PART-7721,VP7721-B,100,22.30,...Key gotcha: VendorName is case-insensitive but PartNumber must match existing Fishbowl records exactly. If your supplier uses a different part number than Fishbowl, map it using VendorPartNumber instead. Status codes are numeric — "20" means Issued, not "Issued" as a text string.
Zoho Inventory
Zoho Inventory provides a standard CSV import with field mapping. Unlike Fishbowl's flag system, Zoho uses a flat structure where each row represents a line item, and header-level fields repeat across rows:
- Download the sample import template from Zoho's import page — it contains the exact column headers and order expected.
- During import, you can map your CSV columns to Zoho fields interactively. This means your column names don't need to match Zoho's field names perfectly — you can align them during the upload step.
- Required fields include Vendor Name, Item Name, Quantity, and Rate. Vendor and item names must exist in Zoho before import.
Extraction output structure for Zoho Inventory:
Vendor Name,Item Name,Quantity,Rate,PONumber,Delivery Date
Acme Industrial,PART-8842,250,14.75,PO-2026-0423,2026-05-15
Acme Industrial,PART-7721,100,22.30,PO-2026-0423,2026-05-15Key gotcha: Zoho's field mapping UI gives you flexibility, but Vendor Name and Item Name must match Zoho's existing records character-for-character — including spaces and punctuation. The interactive mapping only helps with column-to-field alignment, not with reference data matching.
Cin7 Core
Cin7 Core (formerly DEAR Inventory) uses a RecordType-based CSV structure that's more complex than most. Each row's first column determines what type of data that row contains, per the official import documentation:
- RecordType values: header, invoice_lines, stock_received, additional_costs, payments, credit_notes, refunds, unstock.
- The header row (column names) is mandatory — Cin7 validates the CSV type by checking the header line.
- Multiple purchase tasks can be in one file (up to 100 tasks per import).
- Important limitation: you cannot edit existing purchase lines via CSV — the import is for creating new tasks only. Existing lines must be managed through the API.
Extraction output structure for Cin7 Core:
RecordType,Supplier,OrderNumber,OrderDate,...
header,Acme Industrial,PO-2026-0423,2026-05-10,...
invoice_lines,ITEM-8842,250,14.75,...
invoice_lines,ITEM-7721,100,22.30,...Key gotcha: Cin7's column header format is rigid — download the template from the Purchase tasks import page and use its exact headers. The "RecordType" column is non-negotiable. Also, stock received lines can only be imported for draft invoices.
Katana MRP
Katana takes a different approach from the CSV-centric systems above. Its primary integration method is a REST API, not CSV import. This is both more powerful and initially more intimidating for non-technical users:
- Native integrations exist with QuickBooks Online, Xero, Shopify, HubSpot, BigCommerce, and WooCommerce.
- The API supports creating products/variants, customers/suppliers, sales orders, purchase orders, stock adjustments, and stock transfers.
- Webhooks notify external systems of order lifecycle changes (created, updated, deleted).
- Katana's Partner Directory lists integration partners who can build custom workflows.
For teams without API development resources, the practical path is: extract PO data into a spreadsheet, then use Katana's product import (which supports CSV) to create new materials, followed by manual PO creation or a pre-built QuickBooks/Xero sync. If Katana is connected to QuickBooks Online, a PO created in QuickBooks flows into Katana automatically.
NetSuite
NetSuite's CSV import for purchase orders is structurally the most demanding of the five systems covered here. Key requirements:
- Two separate files — one for PO headers, one for line items. They are linked by an External ID field that must appear in both files and match exactly.
- Vendor references must use internal ID or external ID — vendor name strings will fail validation. You need to look up the numeric vendor ID from NetSuite's vendor master before building the import file.
- Date format: M/D/YYYY without leading zeros (3/5/2026, not 03/05/2026).
- The same PO number repeats across header and all its item rows in the single-file format. In the dual-file format, the External ID links them.
- Drop-ship POs require a separate import job with a different custom form.
Extraction output structure for NetSuite:
File 1 — Headers:
External ID,Order #,Vendor,Vendor Internal ID,Tran Date
EXT-0423-001,PO-2026-0423,Acme Industrial,8842,3/5/2026File 2 — Line Items:
External ID,Item,Item Internal ID,Quantity,Rate,Amount
EXT-0423-001,PART-8842,4421,250,14.75,3687.50
EXT-0423-001,PART-7721,3398,100,22.30,2230.00Key gotcha: The import order matters. Headers must be imported first, then line items. If External IDs don't match between files, line items become orphaned. One bad row in the line items file can reject the entire order. And opening the CSV in Excel between extraction and import can silently corrupt leading zeros, date formats, and encoding — see the six patterns that break ERP imports for how to prevent this.
Pattern across all five systems: The import format requirements are always stricter than the source document. The supplier's PO never includes NetSuite internal IDs or Fishbowl numeric status codes. The work of adding these system-specific fields is unavoidable — but it can happen during extraction rather than after. If your extraction template includes a column for "VendorInternalID" and fills it from a lookup table (or a computed column), that field is ready for import before the file is even saved.
Google Sheets as the bridge — for teams that prefer avoiding CSV files entirely
Not every team wants to manage CSV files — especially when multiple people need visibility into what's been processed and what's waiting. For smaller procurement teams (processing 20-50 POs per week), Google Sheets combined with a no-code integration platform can replace the CSV import step with an automated pipeline.
The setup works in three layers:
- Extraction to Google Sheets. Instead of downloading extracted data as a CSV, send it directly to a Google Sheet. ImageToTable.ai provides a Google Sheets add-on — a sidebar within Sheets where you upload PDFs or images, specify the column names you want extracted, and the structured data is appended directly into your spreadsheet. No file downloads, no format conversion between steps.
- Formatting layer. A dedicated tab in the same Sheet holds the reference lookup tables: vendor internal IDs, item number mappings, status code translations. A simple
VLOOKUPorINDEX/MATCHformula pulls the system-specific values into the extraction output. If the extraction produces "Acme Industrial" in the vendor column, the formula in the next column returns NetSuite vendor ID "8842." This lookup tab is maintained once, not per import. - Push to inventory system. Platforms like Zapier and Make connect Google Sheets to inventory systems. A Zap monitors for new rows, transforms the data if needed, and creates the corresponding PO record in the inventory system. For systems with no direct connector, Skyvia handles the Google Sheets-to-inventory CSV import as a scheduled job.
This approach costs more in setup time (configuring the formulas and the Zap) but eliminates the recurring manual work of downloading, opening, checking, and uploading files. For a team processing 30 POs per week, it saves roughly 5-7 hours of file-handling time per month — at the cost of a 2-hour initial setup.
The trade-off is real: the Google Sheets path adds a dependency (the Zap must stay active, the formulas must stay correct) in exchange for visibility (any team member can check the sheet to see what's been processed). For teams where procurement is handled by one person, the direct CSV import path is simpler. For teams where multiple people touch PO data, the shared visibility of a Google Sheet bridge justifies the extra moving parts.
The 60-second pre-import checklist
Regardless of which path you choose — direct CSV import or a Google Sheets bridge — four things will silently break an import if they're wrong. Check these before every upload:
| Check | What goes wrong | How to verify |
|---|---|---|
| Date format | NetSuite expects M/D/YYYY without leading zeros (3/5/2026). Fishbowl accepts multiple formats but defaults to system locale. A European DD/MM/YYYY date in a US-configured system silently swaps month and day. | Open the file in a plain-text editor (Notepad, not Excel) and check one date row. Excel will auto-format dates and hide the actual stored value. |
| Reference key type | NetSuite requires vendor internal ID (numeric), not vendor name. Fishbowl accepts VendorName but only case-insensitive string matching — "acme industrial" works, "Acme Industrial Corp" doesn't. Zoho Inventory requires exact string matching. | Confirm which key type your system uses: internal ID (numeric), external ID (your own reference code), or display name (exact string). Look in your system's import documentation — not the general help docs, the CSV import guide specifically. |
| Leading zeros | Opening a CSV in Excel drops leading zeros from item numbers. Part number "001234" becomes "1234" — which doesn't exist in your inventory system. The import fails with "item not found." | If your part numbers start with zeros, never open the CSV in Excel between extraction and import. If you need to review, use a plain-text editor or Google Sheets (which preserves formatting better). |
| Required fields present | Every system has non-negotiable fields. Fishbowl: Flag, PONum, Status, VendorName, RemitToName. NetSuite: External ID (or Internal ID), Vendor (by ID), Tran Date. Cin7: RecordType. Missing any one of these, and the import rejects every row in the file. | Keep a one-page cheat sheet of required fields per system. If a supplier's PO doesn't include a required field (e.g., no delivery date per line item), use a computed column to derive it or set a default value during extraction. |
One more silent failure worth knowing about: encoding corruption. A supplier name containing special characters (the ™ symbol in a part description, an accented vowel in a European vendor name) can survive the extraction intact but break during CSV save if the encoding changes from UTF-8 to ASCII. This is hard to spot because the corrupted characters sometimes look correct in a spreadsheet preview but fail the import engine's string comparison. The fix is simple: always save as UTF-8 CSV, and if your tool offers an encoding option, never select anything else.
Frequently Asked Questions
Do I need to change how my suppliers send POs for this to work?
No. Column-name extraction reads the meaning of fields regardless of format — that's the mechanism that makes supplier-side changes unnecessary. Whether a supplier sends a PDF, an email attachment, a portal screenshot, or a scanned image, the AI locates the data you specified. You don't need suppliers to adopt a standard template, a portal, or any new behavior. This is the core architectural difference between template-based extraction (which breaks on format variation) and semantic extraction (which doesn't).
What if my inventory system isn't one of the five listed here?
The column-name alignment principle works with any system that accepts CSV import. Check your system's import documentation (search "[system name] CSV import" or "[system name] import purchase orders") for the exact column headers it expects, then use those as your extraction column names. The mapping step is the same; only the specific field names differ. If your system uses API-based import (like Katana) and you have developer access, the API documentation will list the JSON field names — use those as your extraction column names instead of CSV headers.
How do I handle POs that don't have all the fields my inventory system requires?
Three approaches, in order of effort. First: use computed columns during extraction. If your system requires a delivery date per line item but the PO only shows it in the header, a computed column can assign the header value to every line. If the unit price is missing but the line total and quantity are present, Total ÷ Qty fills it in. Second: maintain a small lookup table for values that don't change per PO — payment terms, shipping method, default warehouse location — and merge them into the output after extraction. Third: configure the inventory system's import to accept default values for certain fields (NetSuite's Import Assistant supports this through the field mapping page).
Does this work if I'm processing POs from 30 different suppliers in 30 different formats?
Yes — and this is where the column-name alignment approach provides the largest time savings over template-based methods. With template-based import, 30 supplier formats require 30 import templates, and any format change from any supplier requires a template update. With semantic extraction, you define the column names once (matching your inventory system's expected fields), and the AI handles format variation on the supplier side. Batch processing lets you process all 30 POs in one pass — the extraction runs against each file independently, applying the same column-name mapping, and merges results into a single output file structured for your inventory system's import.
What happens if the extraction gets a field wrong?
The import will fail — and that's actually better than importing wrong data silently. Most inventory systems validate reference keys before accepting a file. If a vendor name or part number doesn't match an existing record, the import rejects the row and generates an error. This gives you a chance to correct the extraction before the data enters your system. No inventory system does a "best guess" match on reference data — either the key matches exactly or the row is rejected. For common extraction error patterns and how to catch them before import, see the six categories of ERP import failures and how to fix them at the source.
One step between extraction and your inventory system
The gap between "PO data is extracted" and "it's in my inventory system" is not a technology problem that needs an IT project. It's a format-matching problem that needs a column-name map. Once you know what your inventory system expects — the exact field names, the reference key type, the date format — you can configure your extraction to output directly into that structure. The manual reformatting step disappears.
If you're processing POs into Excel and then retyping them into your inventory system, the column-name alignment approach replaces both steps with one pass: extract directly into the system's import format, and upload.
Extract PO data directly into your inventory system's format
Define your columns to match Fishbowl, Zoho, Cin7, Katana, or NetSuite — skip the reformatting step entirely.
Start free