Fishbowl imports sales orders from a CSV with an SO row for each order and Item rows for its lines.
PDF, JPG, PNG, BMP, HEIC, TIFF
Submit your purchase orders
Drop documents here, or choose a file
Up to 50 files per batch
Uploading...
Fishbowl imports sales orders from a CSV with an SO row for each order and Item rows for its lines. Upload the purchase order your customer emailed and get the PO number, bill-to, ship-to and every line with part, unit and quantity as rows you drop into that file.
The Fishbowl import is fast once the file is right. Building that file from a buyer PDF is the slow part, and it lands on the order desk every morning.
Fishbowl reads a CSV with SO and Item rows. A customer purchase order printed by their ERP has to become those rows first, and today a person types them.
CustomerName is created if Fishbowl does not find it. ACME Supply Co on the PDF and Acme Supply Company in Fishbowl quietly become two customers.
Import the same SO number again and Fishbowl updates the header but leaves the items as they were, so a fixed quantity in the file never lands.
Buyers order by their own codes. Every line needs your Fishbowl product number and a unit Fishbowl knows, and a long release is many chances to key one wrong.
Upload the purchase order your customer sent. The AI reads the header and every line and returns a spreadsheet with one row per line and the header values beside each, which you turn into SO and Item rows for the Fishbowl import.
No per-customer template. Digital PDFs, scans and photographed pages from any buyer system come back in the same column layout.
A 40-line order returns 40 rows in document order, ready to sit under one SO row as Item rows.
The buyer PO number lands in its own column for the PONum field, so you can check it against the 15 character limit before import.
Name, street, city, state, ZIP and country come back as separate values, matching the BillTo and ShipTo fields Fishbowl requires.

Fishbowl Advanced brings sales orders in through a CSV import, and the format is documented in the Fishbowl help center. Every order in the file starts with a row whose first field is SO, and the lines of that order follow on rows whose first field is Item. The first row of the file holds the column names, spelled exactly as Fishbowl lists them. That format is quick to load once it exists. The trouble is where it comes from. Your customers send purchase orders as PDFs out of their own ERP, and none of them arrive as SO and Item rows. Someone on the order desk reads each PDF and types it, which is the step this page is about.
PurchaseOrders handles that step. Upload the customer PO and the AI returns the header and every line as a spreadsheet with one row per line and the header values beside it. From there you add the Flag column, insert one SO row above each group of lines, and save as CSV. A 40-line release that took twenty minutes to key becomes a few minutes of review. If your books sit in QuickBooks alongside Fishbowl, the same output also feeds the QuickBooks sales order import route.
The SO row is longer than most people expect. Fishbowl marks these fields as required: SONum, Status, CustomerName, the six BillTo fields (name, address, city, state, ZIP, country), the six ShipTo fields, CarrierName and TaxRateName. SONum can be left blank, and Fishbowl then assigns the next number. Status is a code: 10 for an estimate, 20 for an issued order, 95 for historical. State fields take the two-letter abbreviation. Customer purchase orders usually print the bill-to and ship-to blocks in full, so those values come straight off the document. Carrier and tax rate rarely do. Those come from your customer record, and most order desks fill them from a small lookup sheet per account.
Fishbowl keeps the customer purchase order number in the PONum field on the SO row, and the help center lists it at 15 characters. SONum, your own number, allows 25. Most small buyers print short PO numbers, but large retailers, hospital systems and government buyers often print longer strings with prefixes, release suffixes or line references. Check your longest customer PO number before the first import. If it runs past 15 characters, decide how you will shorten it or where else you will keep the full value, such as the order Note, because that number is what the buyer quotes when they call about the order.
PONum also sits in the optional block of the SO row. Fishbowl states that if you include any of the optional fields, all preceding fields must be included too. In practice that means a file that carries the customer PO number also has to carry PriorityId, which sits before it (10 highest to 50 lowest, 30 is normal). A file that skips PriorityId but includes PONum is the most common reason a first import fails on a column count.
CustomerName is matched without regard to case, and if Fishbowl does not find it, the customer is created. That is convenient for a migration and risky for daily order entry. A buyer PDF that says ACME Supply Co while your Fishbowl record says Acme Supply Company does not fail. It quietly adds a second customer, and the order, its pricing and its history land there. The fix is a mapping step before the import: keep one column that holds the exact Fishbowl customer name for each buyer, and replace whatever the PDF printed with that value. QuickBooks class names behave the same way, so a typo in QuickBooksClassName adds a class rather than rejecting the row.
On each Item row, ProductNumber is your Fishbowl product number, matched without regard to case. Customers order by their own codes, so the number printed on the PDF is usually not the one Fishbowl needs. Fishbowl gives you a separate CustomerPartNumber field on the Item row, which is the right place to keep the buyer code so pick tickets and invoices show it. Build the cross reference once per customer, map the extracted part column through it, and put your product number in ProductNumber and their code in CustomerPartNumber. ProductQuantity and UOM are required on every line, and the unit must be an abbreviation Fishbowl knows for that product.
ProductPrice is optional in the field reference. Leave it blank and Fishbowl applies its pricing rules, which is what most distributors want, since the price list is the source of truth. Fill it with the unit price from the customer PO and that price is used instead. Some teams do the second deliberately for contract buyers, then compare the PO price against the list price in the spreadsheet before import so a stale buyer price gets caught by a person, not by the invoice. Numeric fields take plain numbers only: zero or greater, up to four decimals, with no dollar sign and no thousands separator. 1234.56 imports and $1,234.56 does not, which matters because PDF extraction returns prices the way the document printed them. Clean the column once with a find and replace or a number format before saving the CSV.
Fishbowl documents this directly: the import creates a sales order when the SO number does not exist yet, and when it does exist, the import updates the order details but does not change the items. So if a quantity was wrong and you fix it in the file and import again with the same SONum, the header refreshes and the bad line stays exactly as it was. Correct lines on screen, or delete the order and import it fresh. This is also why the review step on the extracted data matters more than the import itself. Check quantities and units before the CSV leaves your desk.
SOItemTypeID sets what each Item row is. 10 is a sale, 12 a drop ship, 20 a credit return, 60 shipping, 70 tax, 80 a kit and 90 a note, with discount, subtotal and associated price types in between. Leave the field blank and Fishbowl uses the default type of the product. For a note line, the note text goes in ProductNumber, which is a useful place for a customer instruction printed on the PO, such as a dock appointment or a must-ship-complete flag. Freight charges printed on a customer PO usually belong on a shipping type line rather than a product line.
The same flagged layout covers purchasing. A purchase order import uses a PO row followed by Item rows. The PO row requires PONum (blank for auto numbering), Status (10 bid request, 15 pending approval, 20 issued, 95 historical), VendorName, the RemitTo block, the ShipTo block, DeliverToName and CarrierName. VendorName follows the same rule as CustomerName and is created if not found. Each Item row requires POItemTypeID (10 is a normal purchase), PartNumber, VendorPartNumber, PartQuantity, UOM and PartPrice. Note that both part fields are required: your Fishbowl part number and the vendor code. A supplier quote or order confirmation prints only the vendor code, so the cross reference matters here just as it does on the sales side. Teams loading supplier documents into purchasing often start from the purchase order PDF to CSV converter and add the Flag column after.
The field names on this page come from the Fishbowl Advanced help center. Fishbowl Drive, the cloud product, has its own import screens, so export a template or a sample order from your own account before you build a mapping, and match the column names to it. Whichever edition you run, PurchaseOrders does not connect to Fishbowl or post orders. It reads the customer document and gives you clean rows. Loading them stays inside Fishbowl, or inside your own script through the purchase order API.
The math is simple for a distributor or manufacturer on Fishbowl. If the order desk keys 20 customer POs a day at 10 lines each, that is 200 lines typed by hand, every one a chance to transpose a quantity or pick the wrong unit. Extraction does not remove review, but it turns typing into checking. Teams with a morning pile of attachments use bulk purchase order upload to clear up to 50 files at once, and the broader sales order entry automation page covers the same workflow for other ERPs.
What comes off the customer document and which Fishbowl sales order import field it fills. Field names are from the Fishbowl Advanced help center; confirm them against a template from your own version.
| Fishbowl field | Where it comes from | Notes |
|---|---|---|
| Flag | Not on the document. SO on the header row, Item on each line. | Required, first column |
| SONum | Not on the document. Leave blank for auto numbering. | 25 characters |
| Status | Not on the document. 20 for an issued order. | 10 estimate, 95 historical |
| CustomerName | The buying company, mapped to your exact customer name. | Created if not found |
| BillTo and ShipTo fields | The bill-to and ship-to blocks printed on the PO. | Two-letter state code |
| CarrierName and TaxRateName | Your customer record, rarely on the document. | Both required |
| PONum | The purchase order number the customer printed. | 15 characters |
| Date | The PO date on the document. | M/d/yyyy |
| ProductNumber | The customer part number, mapped to your product. | Must be a Fishbowl product |
| CustomerPartNumber | The customer part number as printed. | Keeps their code on the order |
| ProductQuantity and UOM | Quantity and unit on each line. | Both required |
| ProductPrice | Unit price on the PO, or blank. | Blank applies your price rules |
Four steps from the customer attachment to sales orders in Fishbowl.
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.
Check the header and lines on screen, then map the buyer to your exact Fishbowl customer name and each buyer code to your product number and unit.
Tip: Keep the mapping sheet per account so typos never create a customer.
Download Excel, insert an SO row above each order, put Item in the Flag column of every line, and strip dollar signs and commas from numbers.
Tip: Leave SONum blank to let Fishbowl number the orders.
Import a single two-line order, open it in Fishbowl, then load the full batch.
Tip: Check the customer, the PO number and both lines before the big run.
Build a CSV where each order starts with a row whose first field is SO and its lines follow on rows whose first field is Item, with the column names in the first row. Then run the sales order import in Fishbowl. Required SO fields include SONum, Status, CustomerName, the BillTo and ShipTo blocks, CarrierName and TaxRateName.
It is a flagged CSV. SO rows carry the order header, from SONum and Status through bill-to, ship-to, carrier and tax rate. Item rows carry the lines, with ProductNumber, ProductQuantity and UOM required and ProductPrice optional. Every Item row belongs to the SO row above it.
Yes. CustomerName is matched without regard to case and the customer is created if not found. A spelling difference between the customer PDF and your Fishbowl record adds a duplicate customer instead of failing, so map buyer names to your exact Fishbowl names before importing.
Only the header. If the SO number already exists, the import updates the order details but does not change its items. A corrected quantity in a re-imported file never reaches the line, so fix lines on screen or delete the order and import it again.
The PONum field on the SO row is listed at 15 characters, while SONum allows 25. Check your longest customer PO numbers before the first import. If they run longer, decide how to shorten them and where to keep the full value, for example in the order note.
Status is a numeric code on the SO row. 10 creates an estimate, 20 an issued order and 95 a historical order. Most daily order entry uses 20. A file loaded with 10 lands the orders as estimates that still need to be issued.
Not through the CSV import, which reads structured rows. A customer purchase order that arrives as a PDF has to become SO and Item rows first, typed by hand or extracted, before Fishbowl can create the order.
Yes. The purchase order import uses the same layout with a PO row followed by Item rows. It requires VendorName, the RemitTo and ShipTo blocks, and on each line POItemTypeID, PartNumber, VendorPartNumber, PartQuantity, UOM and PartPrice. VendorName is created if not found.
No. PurchaseOrders reads the customer purchase order and returns structured data as Excel, CSV or JSON. It does not install in Fishbowl or post orders. You load the rows through the Fishbowl import, the API or your own integration.
The same workflow on Zoho Inventory.
The same workflow in QuickBooks.
The same workflow on Sage 100.
The same workflow on Acumatica.
The full order entry workflow.
Reading customer orders with AI.
Choose your plan