Tasks
Stock value, top 12 SKUs (at cost)
Inventory
Columns
No inventory yet
Stock, prices and variants arrive from Shopify every night. Use Add product if you need one before then.
Recently deleted (0)
| SKU | Product | Deleted | Actions |
|---|
No recently deleted rows.
Sales performance
Weekly trend
Top sellers
| # | Product | Units | Revenue |
|---|
Velocity
| # | Product | Units/wk | On hand | Cover | Pace |
|---|
Margin leaders
| # | Product | Units | Margin/unit | Total margin | Margin % |
|---|
Customer economics
Top customers
| # | Customer | Orders | Revenue | AOV |
|---|
Geography
| Country / City | Customers | Orders | Revenue |
|---|
No sales yet
Orders arrive from Shopify every night. Analytics fill in as soon as the first paid order lands.
Spend & reconciliation
Transactions
| Date | Payee | Debit | Credit | Amount | Source | Allocated |
|---|
No transactions yet
Bank transactions arrive from Monzo as they happen. Use Add transaction for anything that never touched the bank.
Financial statements
Fiscal year start (click to edit)
Marketing performance
Spend over time
Campaigns
| Campaign | Period | Spend | Impressions | Reach | Clicks | CTR | CPC | CPM | Conv. | Conv. value | Meta ROAS |
|---|
No marketing data yet
Export a campaign report from Meta Ads Manager as CSV and use Import CSV above. The columns are detected automatically.
Ledger sanity check
Assets must equal Liabilities + EquityBank reconciliation
Ledger Bank balance at end of month vs Monzo statement balanceAdd or correct a Monzo balance point
Sales reconciliation
HQ sales for the month vs Shopify-reported revenue for the same monthAdd or correct a Shopify snapshot
Inventory valuation (subledger to ledger)
Stock on hand at cost by product, tied to the Inventory (1200) ledger balanceInventory units (HQ vs Shopify)
HQ-derived units (opening + received - sold - written off) per product vs Shopify on hand. Negative derived means receipts not yet allocated; large positive gap means off-Shopify sales or an overstated receipt.Owner loan position
Outstanding balance owed to you by the businessMarketing reconciliation
Meta-reported ad spend vs ledger marketing transactionsShipping cost recovery
Postage charged to customers vs courier cost in the ledgerSales coverage
Every sale and whether its units, cost and revenue are captured correctlyRevenue by product
Shopify sales (web + POS)
Grouped by order. Units and cost come from the sales table; revenue arrives via Stripe payouts in the ledger.Direct sales (no Shopify order)
Bank-paid sales that predate POS. Revenue is the ledger transaction; units and cost need an "Add sale" allocation.Stripe payments with no sale
Payment-link charges that don't yet match a Shopify order. Each is a sale to enter, the payment -> order half of the reconciliation.Payment exceptions
Orders booked as sales but not marked paid in Shopify, and Shopify orders not yet imported into HQ. Each needs a call from you or George.Affiliate summary
All-time totals across every discount codeBy affiliate code
Net sales and commission due per code. Set the rate to match each affiliate's agreement.Recent activity
| When | Who | Action | Target | Changes |
|---|
No activity yet
Every change you make to inventory or sales will appear here.
Backups
Bank transactions needing a category
Auto-imported from Monzo but the payee wasn't recognised, so booked to Uncategorised (9998). Categorise each one, and the rule learns nothing yet, so tell Leo if a payee recurs.Sales with no Shopify match
Bank payments (excluding Stripe) with no matching Shopify order, enter in POS or allocateStripe payments not in Shopify
Stripe charges with no matching Shopify order, enter the sale in ShopifyOrders booked but not paid in Shopify
A sale is recorded in HQ but Shopify has not marked the order paid, confirm it was collected or fix the orderShopify orders not imported to HQ
Paid Shopify orders with no sale lines in HQ yet. The nightly sync books these; if one stays here after a sync, tell Leo.Sales with no payment recorded
A sale is booked but no payment is in the ledger yet (no Stripe charge, not card-at-checkout, no matching bank deposit). Often a recent cash or POS order whose deposit has not reached Monzo yet.Products needing a cost
Cost is £0, so sales of these post no COGSInventory purchases not fully allocated
Spend on Inventory (1200) not yet assigned to productsPurchases & returns not assigned to a batch
Assign each payment to a batch so FIFO can cost it. Receipt carries the units; extra payments go on the same batch as cost-only (quantity 0). Inventory returns (money back, "(inventory return)") attach to the batch the stock came from and reduce it.Inventory stock gaps (Shopify vs HQ)
Every product where HQ's derived stock (opening + purchases, less sales and write-offs) differs from Shopify's on-hand at all. A positive diff means HQ shows more than Shopify (often gifts/samples that left unrecorded); a negative diff means Shopify shows more (often an unrecorded receipt or a count difference). Monitoring only, not counted as an action.How the books flow
What happens at each stage, and the two steps you need to do by handThe two jobs that are yours
Plus one habit: stock lives in Shopify1. Allocate inventory purchases to a batch. When money goes out to a supplier (Dr Inventory), open that transaction in Transactions, expand it, then under "Allocate" pick the product, choose or create a batch (one production run), and enter the quantity received and total spent. A second payment for the same batch (deposit/balance, shipping, duty) goes on that batch as a cost-only line (quantity 0), so it adds cost without inflating units. A supplier refund is recorded as a return against the batch it came from. Cost is then derived per batch using FIFO (oldest batch sold first) and is read-only, you never type a product's cost by hand. The product must already exist with a SKU and a handle.
2. Record the sale in Shopify. Every sale should go through Shopify, a web order, or one George enters in Shopify POS. The units and cost then come into HQ from the Shopify order. The "Add sale" allocation is only a fallback for older sales that were never put through Shopify (it records the units and cost against the bank payment). Use it for the historical backlog, not day-to-day; a sale should never be in both Shopify and an allocation.
Keep stock in Shopify. Every night HQ copies stock levels, prices and variant names from Shopify, so any change you make to those in HQ is overwritten by morning. Adjust counts in Shopify and let HQ follow. One delivery of shirts is one batch, however many payments it took: the first payment carries the units, later payments for the same shirts go on the same batch with quantity 0.
The golden rule: revenue is always recognised from the bank ledger (a credit to Sales 4000). Allocations only add units-out and COGS, they never touch revenue, so nothing gets double-counted.
How each page works
The notes that used to sit at the top of each pageHow data gets into HQ
How transactions work
How marketing import works
Campaign name, Amount spent, Reporting starts, Reporting ends, Impressions, Reach, Clicks, CTR, CPC, CPM, Frequency, Results, Purchases conversion value). One CSV row becomes one campaign-period record. Re-imports for the same campaign and date range update in place.
Blended ROAS below is computed against actual Shopify revenue in the same period, so you can compare Meta's reported attribution to what hit the till.