Skip to main content

Setup guide · For brands

Send stock to a warehouse with purchase orders

A purchase order (PO) records stock you are sending into a warehouse: a shipment from a vendor to your own warehouse, or to a 3PL that stores and ships for you. When the goods arrive, whoever runs that warehouse receives the PO in FulfillPros, and the on-hand count at that location goes up by what was actually received.

Steps 1 to 6 are written for brands. If you are a 3PL creating purchase orders for a brand you work with, read Step 7.

Steps
8
Last updated

Before you start

Have these in place:

  • A FulfillPros account with the Purchase orders permission. The built-in Super Admin and Operations roles already have it; Viewer can look but not change. A custom role needs Purchase orders granted under Settings → Roles. Without it, the Purchase Orders page does not appear in the sidebar.
  • The warehouse the stock is going to. Either your own warehouse, listed under My Ship Nodes, or a 3PL whose partnership with you is active. A 3PL’s warehouses only appear as receiving locations once the partnership shows Active Partner ✓.
  • Your products on the Items page, with an Item ID equal to the SKU you will put on each line. Received stock lands on the item whose Item ID matches the line’s SKU exactly. A line whose SKU matches no item is skipped when the PO is received, so bring in your products first (see Step 5 of the Shopify setup guide).
  • Optional: your vendors’ details, so each PO can name who is shipping the goods.

Step 1: Add your vendors

A vendor is the supplier a purchase order is placed with. You can create purchase orders without one, but a spreadsheet upload can only name a vendor that already exists.

  1. Click Purchase Orders, then Vendors at the top right.
  2. Click New vendor. Only Name is required. Add the Contact name, Email, Phone, Ship-from address, Billing address and a Note if you have them.
  3. Save. The vendor appears in the list and in the vendor picker on every new PO.

Spell names exactly

A spreadsheet upload (Step 3) matches vendors by name, ignoring capitals. A name that matches no vendor rejects that whole PO rather than silently dropping the vendor, so keep vendor names consistent with your supplier files.

Step 2: Create a purchase order

  1. Click Purchase Orders, then + New purchase order.
  2. PO Details. The Reference number is optional, for your supplier’s or accounting system’s number. Currency applies to every line. PO date is filled in with today; change it if the order was placed earlier. Planned receiving date and Planned arrival date are optional.
  3. Vendor & Receiving. Pick the Vendor. Under Receiving location, choose the warehouse the stock is going to. The list is grouped: My warehouses first, then each 3PL partner with its warehouses.
  4. Products. One line per product. In SKU, start typing and pick the item, or type the SKU in full. Add a Description if you like, then the Qty you ordered and the Unit price. Click Add line for the next product.
  5. Add a Note if the warehouse needs instructions, then finish in one of two ways:
    • Save draft keeps the PO editable and private to your account. Come back to it from the list.
    • Create purchase order issues it. The PO becomes CREATED, can no longer be edited, and is visible to the 3PL whose warehouse it is going to.

Either way FulfillPros assigns the next PO number for your brand, such as PO000001, and the PO appears at the top of the list.

Leaving the receiving location empty

You can create a PO with No receiving node, for example before you have decided where the stock goes. Such a PO can still be received, but since it names no warehouse, receiving it only marks it received and changes no inventory. Set the location while the PO is still a draft if you want the stock counted.

Step 3: Upload purchase orders from a spreadsheet

Use this when your supplier or ERP gives you purchase orders as a file. One upload can create many POs, up to 20,000 rows at a time.

  1. Click Purchase Orders, then Upload.
  2. Download the CSV template or the XLSX template. It holds the column headers below and nothing else.
  3. Fill it in with one row per line item. Rows with the same external_po_id become one purchase order, so repeat the PO-level columns on each of its rows.
  4. Choose the file and click Upload. The dialog reports N created, M with errors, followed by one line per PO that failed, with the row number and the reason.
ColumnWhat to put in it
external_po_idRequired. Your own id for the PO, the same on every row of that PO. Uploading a PO with an external_po_id you already uploaded does not create a second copy.
skuRequired. The product’s SKU, matching its Item ID on the Items page.
quantity, unit_priceUnits ordered, a whole number, and the price per unit in the PO’s currency, for example 12.50. A blank price counts as 0.
product_name, pack_type, receiving_locationOptional line details: a description, the pack type, and a bin or area note.
statusDRAFT or CREATED. Blank means DRAFT. Use CREATED to issue the POs as they are uploaded.
vendor_nameThe name of a vendor from Step 1, spelled the same (capitals don’t matter). Blank for no vendor.
receiving_ship_node_codeThe warehouse’s short code, for example PHILLY-WH. It is the ship_node_code column of an export from Inventory, and a 3PL sees it on each ship node’s Details tab. It must be one of your warehouses or a warehouse of a 3PL you are actively partnered with. Blank for no receiving location.
reference_number, note, currencyAs on the form. Currency defaults to USD.
po_date, planned_receiving_date, planned_arrival_dateDates as YYYY-MM-DD. A time may follow, such as 2026-10-30 14:00.

Each PO in the file is created on its own, so one bad PO does not stop the others. Fix the rows the dialog lists and upload the file again: the POs that already went through are left alone.

Step 4: Follow a purchase order

The Purchase Orders list shows each PO’s number, status, vendor, receiving node, line count, total and PO date, newest first. Click a PO number to open it.

StatusWhat it means
DRAFTSaved but not issued. You can still edit every field. Only your account can see it.
CREATEDIssued. The PO is read-only and the receiving 3PL, if any, can see it. The Receive button is available to whoever runs the receiving warehouse.
RECEIVEDThe goods were received. The PO shows what was received against what was ordered, and inventory has been updated. This is final.
CANCELLEDWithdrawn before receiving. Also final.

A created PO shows the notice This purchase order is created and can no longer be edited. If something is wrong with it, cancel it (see Troubleshooting) and create a new one.

Step 5: Receive the stock at your own warehouse

Do this when the goods arrive at a warehouse you run yourself, or when the PO has no receiving location.

  1. Open the PO and click Receive. The receiving page opens, headed with the warehouse the stock is being added to.
  2. Each line shows the quantity Ordered and a Received box already filled with that number. Change a box to what actually arrived, up or down. If everything arrived as ordered, Receive all resets every line to the ordered quantity.
  3. Click Confirm receipt. Cancel takes you back without changing anything.

The PO becomes RECEIVED and its page shows a green summary such as Received at PHILLY-WH with 95 of 100 received per line. On Inventory, the On hand count for each item at that warehouse goes up by the received quantity, and the row’s adjustment log shows the change with the reason PO_RECEIVED.

Receiving is final

A received PO cannot be received again or corrected. If a count was wrong, fix the stock directly: on Inventory, click Adjust on the row and enter the difference as a positive or negative Delta.

Short shipments. Enter what arrived. The PO records both numbers, but FulfillPros does not reopen it for the balance. Create a new PO for the remainder if the vendor will ship it later.

Step 6: When a 3PL receives for you

If the receiving location is a 3PL’s warehouse, the 3PL receives the PO, not you.

  • As soon as you click Create purchase order, the PO appears under Purchase Orders in the 3PL’s portal. Drafts are never shown to them.
  • Your Receive button is still visible, but confirming it fails with Could not receive the purchase order. Only a user at the 3PL whose access includes that warehouse can receive it.
  • When the 3PL confirms receipt, your copy of the PO turns RECEIVED and the stock shows up on your Inventory page at that warehouse, with the same PO_RECEIVED adjustment.

Agree with your 3PL whether they receive against your PO or add stock themselves. Doing both counts the goods twice.

Step 7: For 3PLs: create and receive on a brand’s behalf

A 3PL can raise purchase orders for the brands it stores for, and receives every PO whose destination is one of its own warehouses.

Create a purchase order for a brand

  1. Click Purchase Orders, then + New purchase order.
  2. Under Brand, choose the brand this PO is for. Only brands with an active partnership are listed. The brand will be able to see the PO.
  3. Fill in the same form as in Step 2. The Receiving location list holds your own active ship nodes under My ship nodes. The SKUs are the brand’s Item IDs.
  4. Save draft or Create purchase order. Drafts you created stay visible to you until you issue them.

Spreadsheet upload is not in the 3PL portal yet. To upload a brand’s file, use the API (Step 8) and pass the brand’s id.

Receive stock as it arrives

Your Purchase Orders list shows every created PO headed to one of your warehouses, whether the brand or you created it. Open it when the goods arrive and follow Step 5: check the received quantities, then Confirm receipt. The brand’s inventory at your warehouse updates immediately, and the brand sees the PO as RECEIVED.

If your account limits a user to certain ship nodes, that user can only receive POs for those nodes.

Step 8: Use the API

Everything above is also available through the FulfillPros API, for an ERP or WMS that raises and receives purchase orders itself. Authenticate with your API key and send an Idempotency-Key header when creating a PO, so a retried request does not create a duplicate.

  • /api/v1/vendors: list, create, update and delete vendors.
  • /api/v1/purchase-orders: list and create; /{id} to read or update a draft.
  • /{id}/submit, /{id}/receive and /{id}/cancel: issue, receive and cancel.
  • /upload and /upload/template: the same spreadsheet import as Step 3.

Field names, request bodies and responses are in the developer docs.

Troubleshooting

What you seeWhat to do
Purchase Orders is missing from the sidebarYour role lacks the Purchase orders permission. A Super Admin can add it under Settings → Roles, or move you to the Operations role.
The 3PL’s warehouses are not in the receiving location listThe partnership is not active yet. Check Network → 3PL Network; the card must show Active Partner ✓.
“Vendor not found for this brand” on uploadThe vendor_name matches none of your vendors. Create it (Step 1) or correct the spelling, then upload again.
“missing required column: external_po_id” or “… sku” on uploadThe header row is not the template’s. Download the template again and keep its column names.
“status must be DRAFT or CREATED” on uploadThe status column holds another value. Use one of the two, or leave it blank for a draft.
“This brand has no active relationship with the receiving 3PL”The receiving_ship_node_code is a warehouse of a 3PL you are not actively partnered with. Use one of your own warehouse codes, or wait for the partnership to become active.
The PO is received but inventory did not changeEither the PO had no receiving location, or the line’s SKU matches no Item ID on the Items page, so the line was skipped. Create the item with that Item ID, then add the stock with Adjust on Inventory. The PO cannot be received a second time.
Could not receive the purchase orderThe receiving location is a 3PL’s warehouse, so the 3PL receives it (Step 6), or your role can view purchase orders but not change them.
There is no Receive buttonOnly a CREATED PO can be received. Issue a draft first with Create purchase order. A received or cancelled PO stays as it is.
A 3PL cannot see a POIt is still a draft, or its receiving location is not one of that 3PL’s warehouses. Set the location while it is a draft, then create it.
I need to cancel a purchase orderThe portal has no cancel button yet. Cancel it through the API (Step 8) or email [email protected] with the PO number. A received PO cannot be cancelled.