cogs-tracking-allocation
Track cost of goods sold and landed costs using your platform's built-in tools or accounting integrations to compute accurate gross margin per order
What this skill does
# COGS Tracking and Allocation
## Overview
Tracking Cost of Goods Sold (COGS) tells you the actual gross margin on every order — revenue minus what you paid for the products you sold. Most platforms let you enter a cost price per product, and accounting integrations (QuickBooks, Xero) use that to generate COGS entries automatically. Landed cost allocation (freight, customs, duties) requires either a dedicated app or manual allocation in your accounting software. Only build a custom COGS system if your platform cannot meet your costing method requirements (FIFO, weighted average).
## When to Use This Skill
- When your income statement shows revenue but you cannot compute gross margin because unit costs are not tracked
- When importing goods internationally and needing to allocate freight, customs, and duties into the landed cost of each SKU
- When switching from periodic (year-end count) to perpetual (real-time) cost tracking
- When building variance analysis reports to identify SKUs where actual purchase costs are drifting from standard costs
- When an ERP integration (QuickBooks, NetSuite, Xero) requires COGS journal entries at time of sale
## Core Instructions
### Step 1: Determine platform and choose the right approach
| Platform | Recommended Approach | Why |
|----------|---------------------|-----|
| **Shopify** | Enter cost per variant in Admin; use Shopify Analytics or connect QuickBooks/Xero for COGS reporting | Shopify stores cost price per variant; profit reports use this for margin calculation |
| **WooCommerce** | Enter purchase price per product; connect WooCommerce Bookings + accounting plugin or Metorik for margin reports | WooCommerce stores cost price natively; Metorik provides profit analytics |
| **BigCommerce** | Purchase cost field per product; connect to QuickBooks via built-in integration | BigCommerce has a cost price field; the QuickBooks integration auto-posts COGS |
| **Custom / Headless** | Build a cost ledger with FIFO/weighted-avg logic and accounting journal entries | Required when none of the above integrations meet your costing method or reporting needs |
---
### Step 2: Enter cost prices per product
Before any COGS reporting is possible, every product variant needs a cost price.
#### Shopify
1. Go to **Admin → Products → [Product] → [Variant]**
2. Under **Pricing**, enter the **Cost per item** field
3. Shopify's **Analytics → Finances → Product sales by variant** report will then show profit per product
For bulk cost updates: use **Matrixify** (App Store) to import a CSV with cost per SKU — the column is `Variant Cost`.
#### WooCommerce
1. Go to **WooCommerce → Products → [Product] → Inventory tab**
2. Enter the value in the **Purchase cost** field (requires WooCommerce Cost of Goods plugin or the field added by your theme/plugin)
3. For reporting: install **Metorik** or connect **QuickBooks for WooCommerce** — both read the cost field and generate gross margin reports
Popular COGS plugins for WooCommerce:
- **WooCommerce Cost of Goods** (SkyVerge) — adds cost field, generates margin reports
- **Metorik** — analytics dashboard showing profit per product, order, and channel
#### BigCommerce
1. Go to **Products → [Product] → Pricing**
2. Enter the value in the **Cost Price** field
3. Connect **QuickBooks Online** via **Apps → BigCommerce for QuickBooks** — it maps cost price to COGS entries automatically
---
### Step 3: Connect accounting software for COGS journal entries
The cost price field alone only enables reporting inside the platform. For your P&L and balance sheet, connect an accounting integration that posts COGS when orders are fulfilled.
#### Shopify → QuickBooks / Xero
- **QuickBooks Online**: Install **QuickBooks Connector by OneSaas** from the Shopify App Store. Configure: Sales → Fulfilled orders post to COGS account; map products to QuickBooks items
- **Xero**: Install **Xero by Amaka** or **A2X** from the Shopify App Store. A2X is the most widely used — it batches daily Shopify sales into summarized Xero journal entries including COGS
> A2X is strongly recommended for Shopify + Xero — it handles currency conversion, refunds, fees, and COGS automatically.
#### WooCommerce → QuickBooks / Xero
- **QuickBooks**: Install **QuickBooks Commerce** or **MyWorks Sync** (most reliable WooCommerce ↔ QuickBooks sync)
- **Xero**: Install **Xero for WooCommerce by Zapier** or **Xero Bridge by Parex** for direct sync
#### BigCommerce → QuickBooks
- Use the built-in **BigCommerce for QuickBooks** app from the Apps marketplace
- Configure COGS mapping under **Settings → Accounting → Cost of Goods Sold account**
---
### Step 4: Set up landed cost allocation
Landed costs (freight, insurance, customs, duties) must be added to the product cost before the first sale to get accurate COGS.
**For most merchants (manual method):**
1. Receive your shipment and get the freight/customs invoice
2. Calculate the landed cost per unit: Total landed cost ÷ Total units received
3. Update the cost price in your platform to include the landed cost component
4. For allocation by value: `(Product value / Total shipment value) × Total landed cost ÷ Units received`
**For Shopify merchants with frequent imports:**
- Install **Shopify Shipping Costs** or **LandedCost.app** from the App Store
- These apps let you enter a shipment's landed costs and allocate them across received SKUs automatically
**For accounting software users:**
- In QuickBooks or Xero, use a **landed cost allocation** journal entry to add freight/duties to inventory asset value before goods are sold
---
### Step 5: Run COGS and margin reports
Once cost prices are entered and accounting is connected:
#### Shopify
- **Analytics → Finances → Profit by product** — shows revenue, cost, and margin per variant
- **Analytics → Reports → Product sales** — filter by date range, includes units sold and profit
#### WooCommerce + Metorik
- **Metorik → Reports → Profitability** — gross margin by product, order, and time period
- Metorik also shows cost per order and margin %
#### QuickBooks / Xero
- **P&L report** — COGS line shows total cost of goods sold for the period
- **Inventory valuation summary** — current on-hand value per SKU
---
#### Custom / Headless
For headless storefronts needing perpetual inventory costing with FIFO, build a cost ledger:
```typescript
// Cost layer model — one row per purchase order receipt
interface InventoryCostLayer {
variantId: string;
receiptDate: Date;
quantityReceived: number;
quantityRemaining: number; // Decrements as units are sold
unitCostCents: number; // Purchase price per unit
landedCostCents: number; // Allocated freight/duties per unit
}
// FIFO cost assignment when an order is fulfilled
async function assignCogsFifo(variantId: string, locationId: string, quantity: number, orderId: string) {
let remaining = quantity;
let totalCostCents = 0;
return db.transaction(async tx => {
// Consume oldest cost layers first (FIFO)
const layers = await tx.inventoryCostLayers.findAll({
where: { variantId, locationId, quantityRemaining: { gt: 0 } },
orderBy: { receiptDate: 'asc' },
});
for (const layer of layers) {
if (remaining <= 0) break;
const units = Math.min(remaining, layer.quantityRemaining);
const totalUnitCost = layer.unitCostCents + layer.landedCostCents;
await tx.inventoryCostLayers.update(layer.id, {
quantityRemaining: layer.quantityRemaining - units,
});
await tx.cogsEntries.create({
orderId, variantId, quantity: units,
unitCostCents: totalUnitCost,
costingMethod: 'fifo',
});
totalCostCents += units * totalUnitCost;
remaining -= units;
}
if (remaining > 0) throw new Error(`Insufficient cost layers for ${variantId}`);
return { totalCostCents };
});
}
// Allocate landed costs to a received shipment (by value)
async function allocateLandedCosRelated in catalog-inventory
product-content-enrichment
IncludedUse AI to auto-generate product descriptions, extract attributes, and tag images to enrich your catalog at scale using platform tools and AI writing apps
catalog-import-export
IncludedImport and export your entire product catalog in bulk using your platform's native tools or dedicated apps, with validation and scheduled sync support
product-bundles-kits
IncludedSell grouped products as bundles or kits with automatic inventory deduction, bundle pricing, and display logic using platform apps
product-categorization
IncludedBuild a clean product hierarchy with collections, categories, tags, and breadcrumb navigation using your platform's native tools
product-data-modeling
IncludedStructure your product catalog using your platform's native data model for variants, attributes, metafields, and product relationships
variant-matrix
IncludedGenerate and manage all size/color/material combinations for a product using your platform's variant tools with bulk price and inventory management