Set up needed

The Supabase credentials haven't been configured yet. Open this file and fill in two values near the top of the script:

const SUPABASE_URL = "https://YOUR-PROJECT.supabase.co";
const SUPABASE_ANON_KEY = "your-publishable-or-anon-key";

Then re-deploy the file. The full setup guide lives in SETUP-cloud-inventory.md next to this file.

sixforty

HQ

Sign in to continue.

Access is invite-only. Ask Leo to add you.
sixforty HQ
Connecting...
How CSV import works
The Import CSV button auto-detects whether you're dropping a Shopify products export or an orders export and routes it to the right place. For products: reads Handle, Title, Option1 Value, Variant SKU, Variant Inventory Qty, Cost per item, Variant Price. Existing SKUs update quantity/price; manual fields (reorder, supplier, lead days) are preserved. For orders: reads Name, Created at, Lineitem sku, Lineitem quantity, Lineitem price. Each line item becomes a sale. Duplicate order+SKU combos are skipped automatically.

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)
SKUProductDeletedActions

No recently deleted rows.

Sales performance

Weekly trend

Top sellers

Ranked by units sold
#ProductUnitsRevenue

Velocity

Units per week, weeks of cover
#ProductUnits/wkOn handCoverPace

Margin leaders

Most profit earned in this period
#ProductUnitsMargin/unitTotal marginMargin %

Customer economics

ARPU, CAC, LTV and repeat rate

Top customers

Ranked by revenue
#CustomerOrdersRevenueAOV

Geography

Where the orders ship
Country / CityCustomersOrdersRevenue

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
Every transaction is a double-entry journal. Money flows from one account (credited) into another (debited). Buying inventory: Debit Inventory, Credit Bank. Paying for marketing: Debit Marketing, Credit Bank. A refund reverses the direction. When you imported your old Monzo CSV the categories were mapped automatically. New CSV imports keep working the same way. To add accounts, run an UPDATE/INSERT in Supabase against public.accounts; everything in the dropdowns refreshes in real time.

Spend & reconciliation

Inventory reconciliation

Transactions

DatePayeeDebitCreditAmountSourceAllocated

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)
Used for YTD calculations. All balances are derived from the ledger; no manual opening balances needed.
How marketing CSV import works
Export campaign performance from Meta Ads Manager (or Google Ads) as a CSV, then click Import CSV. Sixforty auto-detects Meta exports by their column headers (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
Each panel below checks a specific consistency rule in your books at a chosen as-of date. Green means the numbers match, amber means there's a gap worth investigating. Bank balances are populated automatically from any native Monzo CSV you import (the Balance column); you can also enter a point by hand. Shopify snapshots come from periodic pulls via the Shopify MCP (or manual entry). Once you've set up the scheduled task, this whole tab runs hands-off.

Ledger sanity check

Assets must equal Liabilities + Equity

Bank reconciliation

Ledger Bank balance at end of month vs Monzo statement balance
Add or correct a Monzo balance point

Sales reconciliation

HQ sales for the month vs Shopify-reported revenue for the same month
Add or correct a Shopify snapshot

Inventory reconciliation

Ledger inventory spend vs Shopify stock on hand + sold at cost

Owner loan position

Outstanding balance owed to you by the business

Marketing reconciliation

Meta-reported ad spend vs ledger marketing transactions

Recent activity

WhenWhoActionTargetChanges

No activity yet

Every change you make to inventory or sales will appear here.

Manual snapshot

Saves the current state of inventory and sales to a separate table you can roll back to. Useful before a big stock count, a major price change, or an experimental bulk edit. Supabase also takes daily automatic Postgres backups, so this is belt-and-braces.