How CSV import works
Handle, Title, Option1 Value, Variant SKU, Variant Inventory Qty, Variant Price. Existing SKUs update quantity and price. Cost is not imported: it is derived from purchase allocations (weighted average per product). Manual fields (reorder, supplier, lead days) are preserved.
For orders: reads Name, Created at, Lineitem sku, Lineitem quantity, Lineitem price, Discount Code. Each line item becomes a sale. Duplicate order+SKU combos are skipped automatically. Discount codes feed the Affiliates tab.
Stock value, top 12 SKUs (at cost)
Inventory
No inventory yet
Click Import CSV and drop a Shopify products export, or Add product to enter one by hand.
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
Drop a Shopify orders CSV onto the Import CSV button, or load demo data to see the analytics in action.
How transactions work
public.accounts; everything in the dropdowns refreshes in real time.
Spend & reconciliation
Transactions
| Date | Payee | Debit | Credit | Amount | Source | Allocated |
|---|
No transactions yet
Click Import CSV and drop a Monzo export, or click Add transaction to add one by hand.
Financial statements
Fiscal year start (click to edit)
How marketing CSV 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.
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 CSV from Meta Ads Manager and click Import CSV. The columns are auto-detected, so any standard campaign export will work.
How reconciliation works
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 ledgerHow the Sales tab works
Sales coverage
Every sale and whether its units, cost and revenue are captured correctlyShopify 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.How the Affiliates tab works
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
How the Tasks tab works
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
Orders that exist in Shopify but have no sale lines in HQ, import the orders CSV to bring them inSales 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/POS order whose deposit has not been imported.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
1. 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.
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.