MAD Mowers
MAD Mowers
Stock Tracker — Staff Access Only
Incorrect username or password.
MAD Mowers
MAD Mowers
STOCK TRACKER
📷 Scan & Sell
📥 Receive Stock
📍 Move
📦 Models
🔍 Stock Check
🔗
Connect to Notion
Two Notion databases: Models holds your product catalogue, Stock holds individual units by serial number — linked to a model via a Relation.
1Create two Notion databases
📋 Models database
PropertyTypeNotes
NameTitleModel name, e.g. KAB03
DescriptionTextOptional — full product name
Last CheckedDateAuto-set when a stock check is completed
Last Check NoteTextAuto-set — e.g. "12/15 found · 3 missing"
📦 Stock database
PropertyTypeNotes
Serial NumberTitleRename the default title column
ModelRelation→ points to Models database
StatusSelectIn Stock · Sold · Reserved · Sent Back
Sold DateDateAuto-set when sold
LocationSelecte.g. Back Storage · Showroom
NotesTextOptional — customer, order ref
To create the Relation: in the Stock database, add a new property → choose Relation → select your Models database.
2Create a Notion Integration & share both databases
Go to notion.so/my-integrations → New Integration → "Stock Tracker" → copy the token. Then open each database, click ··· → Connections → add your integration.
3Deploy your Cloudflare Worker proxy (free)
Go to workers.cloudflare.com → Create Worker → paste this code → deploy. Then go to Settings → Variables and Secrets → add NOTION_API_KEY as a Secret with your integration token:
addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { if (request.method === 'OPTIONS') { return new Response(null, { headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET,POST,PATCH,OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type', }}) } const url = new URL(request.url) const path = url.pathname.replace(/^\/+/, '') const notionUrl = `https://api.notion.com/v1/${path}${url.search}` const body = ['GET','HEAD'].includes(request.method) ? undefined : await request.text() const resp = await fetch(notionUrl, { method: request.method, headers: { Authorization: `Bearer ${NOTION_API_KEY}`, 'Content-Type': 'application/json', 'Notion-Version': '2022-06-28', }, body, }) const out = new Response(resp.body, resp) out.headers.set('Access-Control-Allow-Origin', '*') return out }

Your Connection Details
The string in the URL before the ?
Property name overrides

Scan Serial Number
Ready
Point camera at serial number barcode or QR code
USB scanners send Enter automatically — just point and scan
—
—
—
—
— units in stock
Recent Activity
No activity yet
Recent Activity
No activity yet — scan a serial number to begin
Add New Stock
Models come from your Notion Models database
Select a model above, then scan serial numbers one by one
Press Enter or click Add after each serial number
Added This Session
Move to Location
Ready
Point camera at serial number barcode or QR code
USB scanners send Enter automatically
—
—
—
Move to:
Change status:
Recent Activity
No activity yet
Not yet synced
🔍
Press Sync Now to load your stock
🔍 Stock Check
Loading models…
Select one or more models to check
—
0 / 0
Scan each unit you can find
Point camera at each unit's serial number barcode
USB scanners send Enter automatically
Expected Units
📋 Check Report
0
Found
0
Missing
0
Unexpected
⚠ Missing — not scanned
✓ Found & Accounted For
⚠ Unexpected Scans
These serial numbers were scanned but weren't listed as In Stock for this model. Check them manually.
Confirm