vendor-management
Vendor Management
Overview
Vendor management covers creating and sending purchase orders to suppliers, tracking goods receipts, running vendor performance scorecards (on-time rate, fill rate, defect rate), and maintaining a supplier portal where vendors can acknowledge POs and provide tracking numbers. For most merchants, QuickBooks/Xero handles POs and vendor tracking, while a supplier portal can be as simple as an email-based workflow for smaller operations.
When to Use This Skill
- When managing 5+ suppliers and need a centralized system instead of email-based coordination
- When your merchandising team manually creates purchase orders in spreadsheets and needs automation
- When onboarding new dropship suppliers and need a structured integration flow
- When preparing quarterly business reviews with suppliers and need performance metrics
- When building a multi-vendor marketplace where each seller needs their own dashboard
Core Instructions
Step 1: Determine your platform and choose the right vendor management tool
| Store Stage | Recommended Tool | Why |
|---|---|---|
| Small (< $1M revenue) | QuickBooks Online or Xero + email-based POs | QuickBooks handles POs, vendor payments, and basic receipt tracking; most small merchants don't need a dedicated vendor portal |
| Mid-market ($1M–$20M) | DEAR Inventory (now Cin7 Core) or Unleashed | Both handle POs, goods receipts, and vendor scorecards with Shopify/WooCommerce/BigCommerce integrations |
| Enterprise | NetSuite or Coupa | Full procurement suite with approval workflows, supplier portals, and compliance tracking |
| Dropshipping focus | DSers, AutoDS, or Spocket | See @dropshipping-integration skill for supplier-specific dropshipping tools |
| Custom | Build a PO system + supplier portal | For unique workflows that existing tools don't support |
Step 2: Connect your e-commerce platform to your vendor management system
Shopify
Using Cin7 Core (formerly DEAR Inventory):
- Install the Cin7 Core connector from the Shopify App Store or via the Cin7 Core integration settings
- Cin7 Core syncs Shopify products and inventory — your Shopify stock levels reflect what Cin7 shows as "on hand"
- Create purchase orders in Cin7 Core → Purchase → Add Purchase
- When goods are received in Cin7 (mark as Received), Shopify inventory updates automatically
Using QuickBooks Online for POs:
- Connect QuickBooks to Shopify via the QuickBooks Online app or A2X connector
- Create POs in QuickBooks Online → Expenses → Purchase Orders
- When goods are received: in QuickBooks, go to the PO and click "Receive" to record the goods receipt
- Manually update Shopify inventory after receiving (or use Cin7 Core which does this automatically)
WooCommerce
Using ATUM Inventory Management (PO module):
- Install ATUM Inventory Management from WordPress.org (premium version for PO features)
- Go to ATUM → Purchase Orders → Add PO
- Select supplier, add products, set expected delivery date
- ATUM emails the PO to the supplier automatically
- When goods arrive: mark the PO as received in ATUM → WooCommerce inventory updates automatically
Using Cin7 Core:
- Connect Cin7 Core to WooCommerce via their integration (Cin7 Core → Integrations → WooCommerce)
- Manage all POs and vendor relationships in Cin7 Core; inventory syncs back to WooCommerce
BigCommerce
Using Unleashed:
- Install the Unleashed connector from the BigCommerce App Marketplace
- Create purchase orders in Unleashed → Purchases → New Purchase Order
- Unleashed syncs inventory back to BigCommerce when POs are received
Using Cin7 Core:
- Connect via BigCommerce API integration in Cin7 Core settings
- Same workflow as Shopify/WooCommerce
Step 3: Create and send purchase orders to suppliers
A good PO includes: your PO number, item descriptions with your SKU and the supplier's SKU, quantities, unit costs, expected delivery date, and delivery address.
In QuickBooks Online
- Go to Expenses → Vendors → [Vendor] → click New Transaction → Purchase Order
- Fill in: vendor, PO date, expected ship date, items with quantities and unit costs
- Click Save and Send to email the PO directly to the vendor from QuickBooks
- Track the PO status in Expenses → Purchase Orders — open POs show as "Open", received as "Closed"
In Cin7 Core / ATUM
- Navigate to Purchase → New Purchase Order
- Select the supplier; the system pre-fills the supplier's products from your supplier catalog
- Adjust quantities based on your reorder quantities (see @demand-forecasting)
- Set the expected delivery date: your supplier's lead time + today's date
- Send the PO via the built-in email workflow — the PO PDF is attached to the email
Using a simple email template (for merchants not using a PO system yet)
Subject: Purchase Order PO-202603-001
Dear [Supplier Contact],
Please find our purchase order details below:
PO Number: PO-202603-001
Order Date: March 12, 2026
Expected Delivery: March 26, 2026
Items:
| SKU | Description | Qty | Unit Cost | Total |
|-----|-------------|-----|-----------|-------|
| YS-1001 | Cotton T-Shirt, White, S | 100 | $8.50 | $850.00 |
| YS-1002 | Cotton T-Shirt, White, M | 150 | $8.50 | $1,275.00 |
Total: $2,125.00
Payment Terms: Net 30
Please confirm receipt of this order and your expected ship date.
Ship to:
[Your warehouse address]
Step 4: Set up a supplier portal for PO acknowledgment
For suppliers who work via email, a simple acknowledgment email workflow is sufficient. For higher-volume supplier relationships, a portal improves visibility.
Simple email-based workflow:
- Send PO via email with a reply-by date (2 business days) asking the supplier to confirm: PO number, items, quantities, and expected ship date
- When the supplier replies, update the PO status in your system to "Acknowledged"
- If the supplier can't fulfill the full quantity, get a partial commitment in writing
ATUM Supplier Portal (WooCommerce):
- ATUM Premium includes a supplier-facing portal where suppliers receive POs, acknowledge them, and enter tracking numbers
- Go to ATUM → Suppliers → [Supplier] → configure portal access credentials
Cin7 Core Supplier Portal:
- Cin7 Core includes a supplier portal where vendors can view POs, confirm delivery dates, and upload shipping documents
- Invite suppliers in Cin7 Core → Settings → Suppliers → Invite to Portal
Step 5: Track goods receipt and update inventory
When a shipment arrives from a supplier:
- Match the packing list to the purchase order — check every line item's quantity
- Identify any discrepancies:
- Short shipment: supplier sent fewer units than ordered → update PO with received qty, leave PO "open" for the balance
- Damaged goods: record separately; do not put damaged inventory into your sellable stock
- Wrong items: contact supplier immediately with photos for credit memo
In QuickBooks:
- Open the PO → click "Receive Items" → enter actual received quantities
- QuickBooks creates a bill for the received quantity automatically
In Cin7 Core / ATUM:
- Navigate to the PO → click "Receive Stock" → enter quantities received per line
- Inventory updates automatically in Shopify/WooCommerce/BigCommerce
Step 6: Calculate and review vendor performance scorecards
Run vendor scorecards quarterly to identify underperforming suppliers and support negotiation.
Key metrics:
| Metric | Definition | Target |
|---|---|---|
| On-time delivery rate | % of POs where actual receipt date ≤ expected delivery date | > 90% |
| Fill rate | Total units received / total units ordered across all POs | > 95% |
| Defect rate | Damaged/incorrect units received / total units received | < 2% |
| Lead time accuracy | Actual lead time vs. quoted lead time | ± 2 days |
Calculate from your PO system:
In QuickBooks, export PO data to a spreadsheet and compute these metrics. In Cin7 Core and ATUM, built-in vendor reports provide these metrics automatically.
Custom / Headless — vendor scorecard calculation
async function calculateVendorScorecard(params: {
vendorId: string;
periodDays: number;
}): Promise<{
onTimeRatePct: number;
fillRatePct: number;
defectRatePct: number;
overallScore: number; // 0–100
}> {
const since = new Date(Date.now() - params.periodDays * 86400000);
const pos = await db.purchaseOrders.findAll({
vendor_id: params.vendorId,
status: { in: ['received', 'partial'] },
created_at: { gte: since },
});
if (pos.length === 0) return { onTimeRatePct: 0, fillRatePct: 0, defectRatePct: 0, overallScore: 0 };
// On-time: PO received on or before expected delivery date
const onTimeCount = pos.filter(po => po.received_at && po.received_at <= new Date(`${po.expected_delivery}T23:59:59Z`)).length;
// Fill rate: total received / total ordered
const allLines = await db.poLines.findByPoIds(pos.map(p => p.id));
const totalOrdered = allLines.reduce((s, l) => s + l.quantity_ordered, 0);
const totalReceived = allLines.reduce((s, l) => s + l.quantity_received, 0);
// Defect rate: damaged units / total received
const totalDamaged = await db.damagedReceipts.sumByVendorAndPeriod(params.vendorId, since);
const onTimeRatePct = (onTimeCount / pos.length) * 100;
const fillRatePct = totalOrdered > 0 ? (totalReceived / totalOrdered) * 100 : 0;
const defectRatePct = totalReceived > 0 ? (totalDamaged / totalReceived) * 100 : 0;
// Weighted score: on-time 40%, fill rate 40%, defect-free 20%
const overallScore = Math.round(
(onTimeRatePct * 0.4) + (fillRatePct * 0.4) + ((100 - defectRatePct) * 0.2)
);
return { onTimeRatePct, fillRatePct, defectRatePct, overallScore };
}
Best Practices
- Use your accounting software (QuickBooks, Xero) for POs if you're under $1M — it integrates AP and inventory receiving in one tool; you don't need a separate vendor portal at this stage
- Set expected delivery dates conservatively — add the vendor's quoted lead time plus a 2-day buffer; this improves on-time metrics without changing actual performance
- Track partial receipts carefully — many POs arrive in multiple shipments; record the received quantity per line and keep the PO open until fully received
- Record defects at the dock, not later — damaged goods must be logged at receiving time with photos; retrospective claims are harder to substantiate with suppliers
- Share scorecards with suppliers quarterly — suppliers who see their metrics improve; use the data in pricing negotiations ("your fill rate dropped to 88% last quarter")
Common Pitfalls
| Problem | Solution |
|---|---|
| PO total doesn't match the supplier's invoice | Store unit costs at the PO line level and never update them retroactively; price discrepancies become AP exceptions flagged for review |
| Supplier ships to the wrong address | Include the warehouse address on every PO and in the portal confirmation screen; verify the ship-to address has been acknowledged |
| Inventory incremented before damaged goods are removed from the count | Only increment inventory for receipts with condition = 'good'; damaged goods go to a quarantine count, not sellable stock |
| Scorecard shows high on-time rate but stock still runs out | On-time rate measures delivery vs. expected date, not vs. actual demand need date; also track "stockout events attributed to late delivery" as a separate metric |
Related Skills
- @dropshipping-integration
- @order-management-system
- @multi-channel-selling
- @demand-forecasting
- @accounts-payable-management