Sweets Tracker

Inventory, batches & sales — backed by your Google Sheet

Couldn't load your saved data.
Adding sweets, tiers, batches or recording a sale is disabled until this is fixed, so nothing gets written over stale data. Tap Refresh to retry — check your connection if it keeps failing.

Record a sale

Items in this sale 0 items added

Selling 2+ different sweets in one transaction? Pick each one above with its own quantity and tap "Add to sale" for each one, then hit Record sale once the cart is right. A cart spanning 2 different price tiers gets a flat £0.50 off automatically. A single sweet doesn't need this panel at all — just pick it above and record the sale as usual.

£0.00
Total revenue
£0.00
Total Cost per Sweet
£0.00
Sales profit
£0.00
Net profit (after expenses)

All-time, across every sale minus every logged expense. Sales profit still charges each £0 reward redemption its real, stored COGS — Net profit instead charges today's cheapest active tier price for each reward redemption (recalculated live, not stored), so the two figures are no longer on the same reward-cost basis.

Live stock

SweetTierPriceStock remaining

Recent sales

DateSweetQtyPrice chargedRevenueCOGSProfitStock afterCustomerActions

Sweets

Stock pools

A stock pool lets two or more sweets share the same physical delivery of stock (e.g. sold under two interchangeable names at the same price) — selling ANY sweet in a pool draws down the shared total. Assign a sweet to a pool from its Edit form above. Most sweets have no pool — leave "Shares stock with" set to none.

Price tiers

A sweet's sale price is always whatever its assigned tier currently says here — editing a tier's price only affects sales recorded from now on; past sales keep the price they were sold at.

Record a batch (bulk reorder)

Batch history

Order dateSweetQty orderedRemainingCost/unitSupplier

Log an expense

Expense log

Not tied to any sweet/batch; kept separate from COGS. Delete is a real hard-delete, gated behind the admin access code — see the Delete button on each row.

DateDescriptionAmountActions

End-of-day report

Derived from the expense log above, not a separate record — nothing here is stored. Grouped by day (most recent first), plus a rollup by calendar week (Monday–Sunday, based on each expense's own date) so week-on-week cost trend is visible at a glance.

DayTotal

WeekTotal

Couriers

Each courier gets a short access code, generated here, that they enter once into courier.html. It's a real credential — checked server-side against this list on every single sale they record, not just at login. Flip a courier to Inactive to revoke their access immediately; their very next sale attempt will be rejected, even if they never reload the page.

NameAccess codeStatusAdded

Hand stock to a courier

A REAL physical stock draw — this decrements the chosen batch's remaining stock immediately, same as any other draw. The courier then owes you the sale-price revenue for whatever they sell from it; unsold stock just stays outstanding (no "return to batch" — a future manual fix if it's ever needed). Since this shipped, a courier can ONLY sell stock they currently have an open handout for on courier.html — this replaces free selling from the whole warehouse.

Choose a courier and a batch.

Handouts

Open and settled handouts both stay visible here, tagged — audit-trail style, same as voided sales. Outstanding/revenue owed are always computed fresh from the Sales log (excluding voided sales), never a stored counter.

CourierSweet / PoolBatch dateHandout dateHanded outSoldOutstandingRevenue owedStatus
sweets-tracker · build 2026-09-18b