Case study · Operations automation · Amazon Vendor Central
A triage sheet for Amazon Vendor purchase orders
Amazon Vendor Central sends purchase orders that the operations team has to accept or reject, line by line, before a deadline. I built a tool that takes the PO export as downloaded and returns one sheet with the matching SellerCloud order, kit and packing rules, and stock in both warehouses filled in, plus a check of which POs the stock can actually cover.
Key decisions and results
Decisions
- Lines are grouped by parent SKU and POs checked smallest first against combined stock in both warehouses, so competing POs can’t all claim the same units.
- Each line is filled in from four sources: the SellerCloud order, kit and packing rules, bin stock, and a fallback inventory snapshot.
- The Accept column is left blank: the sheet gathers the facts, and the buyer makes the call.
Results
- PO decisions start from one sheet with order, kit, packing and stock data already filled in.
- POs that together need more stock than the warehouses hold are flagged before anyone accepts them.
The problem
Vetting Vendor POs by hand, line by line
The brand already had an internal sales management system that collected sales, inventory and advertising data from every marketplace. But vetting Amazon Vendor purchase orders still sat outside it and still ate hours of the team’s time.
-
Vetting Vendor POs
- Amazon Vendor Central sends purchase orders that the team has to accept or reject, line by line, before a deadline.
- Each decision needed data from four places: the matching SellerCloud order, the kit’s components, box quantity and relabel rules, and stock in two warehouses.
- Several POs often wanted the same stock, and nobody could see that at a glance.
- PO export From Amazon Vendor Central, uploaded as downloaded
- Parse PO, ship-to, ASIN, SKU, quantity, unit cost, ship window
- Fill in each line SellerCloud order, kit and packing rules, bin stock, fallback inventory
- Stock check By parent SKU, smallest PO first
- Triage sheet Status filled in; the Accept column is left to the buyer
How it works
One export in, one filled-in sheet out
The buyer uploads the purchase-order export from Amazon Vendor Central exactly as downloaded. The system reads PO number, ship-to location, ASIN, SKU, accepted quantity, unit cost and the ship window. The window dates come in two date formats depending on how the export was saved, and the parser handles both. Then it fills in each line from four sources:
- SellerCloud orderPulls the last 31 days of Vendor Central orders from SellerCloud and matches each PO to its SellerCloud order number, so the buyer can jump straight to the order.
- Kit and packing rulesAdds the parent SKU, kit components with quantities, units per box and whether the item needs relabelling, all from the kit templates the warehouse maintains.
- Live bin stockAdds on-hand quantity per warehouse from bin exports that a scheduled job downloads from the SellerCloud portal. The job runs only on the automation worker and reads its credentials from that machine’s environment configuration, never from code.
- Fallback inventoryIf a SKU has no bin data, the system uses the daily warehouse inventory snapshot. It checks the SKU itself first, then its “shadow-of” parent, then the kit’s parent SKU.
The sheet the buyer gets back
- SC#
- Ship To
- PO#
- ASIN
- External ID
- Parent
- Expected Qty
- Per Box
- Total Qty
- Warehouse A
- Warehouse B
- Status
- Accept
- Relabel?
- Kit Components
- Ship Window
- Unit Cost
Deciding which POs the stock can cover
The hardest part was POs competing for the same stock. Checking each PO alone against inventory says every PO can ship, and that’s how orders get over-accepted. Instead, the system groups lines by parent SKU and sorts that SKU’s POs from smallest to largest. It keeps a running total and compares it with combined stock in both warehouses. A PO gets Have Stock only if it still fits after every smaller PO for the same SKU. Filling the small POs first means stock covers as many POs as possible.
| PO# | Parent | Expected Qty | Running total | On hand | Status | Accept |
|---|---|---|---|---|---|---|
| 4Q7XK21B | BLNKT-QN-GRY | 24 | 24 | 120 | Have Stock | |
| 7HM2PL9C | BLNKT-QN-GRY | 48 | 72 | 120 | Have Stock | |
| 2ZR8WT4D | BLNKT-QN-GRY | 60 | 132 | 120 | OOS |
The Accept column is left blank on purpose. The sheet gathers the facts, and the buyer still makes every call.
Engineering decisions
Why it’s built this way
Portal automation stays on one machine
All SellerCloud-facing work runs on the automation worker, which holds the portal credentials and browser session. The web app never handles them, which keeps it stateless and easy to deploy.
Spreadsheets on both ends
The team already worked in Excel, so the tool takes the Vendor Central export in and gives a spreadsheet back. Nobody had to learn a new screen.
Outcome
What changed for the team
- Vendor PO decisions start from one sheet with the SellerCloud order, kit, packing and two-warehouse stock data already filled in.
- The stock check stops the team accepting POs that together need more stock than the warehouses hold.
- Warehouse bin data now refreshes on a schedule, without anyone logging in to export it.
Stack
Stack
- Java 17
- Spring Boot 2.7
- Spring JDBC
- Thymeleaf
- Apache POI
- MySQL
- Node.js
- Puppeteer
- SellerCloud REST API
Company details are anonymized. Example PO numbers and SKUs are made up.