← Selected work

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.
Company
US multi-channel e-commerce brand (Amazon, Walmart, Wayfair and more)
My role
Architecture, backend, automation, UI
Platforms
Amazon Vendor Central, SellerCloud
Stack
Spring Boot, Node.js, MySQL, Puppeteer

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.
  1. PO export From Amazon Vendor Central, uploaded as downloaded
  2. Parse PO, ship-to, ASIN, SKU, quantity, unit cost, ship window
  3. Fill in each line SellerCloud order, kit and packing rules, bin stock, fallback inventory
  4. Stock check By parent SKU, smallest PO first
  5. Triage sheet Status filled in; the Accept column is left to the buyer
From the Vendor Central export to the sheet the buyer works from.

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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
filled in from SellerCloud / internal datacalculated

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.

Illustrative example · one parent SKU with 120 units on hand across both warehouses
PO#ParentExpected QtyRunning totalOn handStatusAccept
4Q7XK21BBLNKT-QN-GRY2424120Have Stock
7HM2PL9CBLNKT-QN-GRY4872120Have Stock
2ZR8WT4DBLNKT-QN-GRY60132120OOS

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.