stallpack explained

Market stall inventory tracker, explained — how stallpack reconciles a whole market day from two counts

No POS, no per-sale tapping, no spreadsheet at midnight. You count your stock twice — once going out, once coming back — and sold units, expected cash and variance fall out of the arithmetic. This page walks through exactly how, with the same numbers the app computes.

The 9 pm problem every stall seller knows

The market closes. You're tired, the light is going, the crates are half-packed — and one question hangs over the cash box: does the money match the stock?

Most vendors answer it one of three ways: they don't (and hope), they tap every sale into a POS app all day (and miss sales while tapping), or they rebuild the day in a spreadsheet at midnight. The "craft fair inventory spreadsheet" is a whole genre for a reason.

stallpack takes a fourth path, the one market sellers already half-do by hand: count twice, and let subtraction do the rest.

How it works: one day at the Tuesday haat

A real worked example — the same fixture the app's self-tests prove, to the paisa.

1 Morning · under the awning, going out

Pack out: list what you carry

Item, quantity, unit price — that's the whole morning count. One tap copies your last day at this market, so a regular Tuesday takes seconds.

Carried out
Glass bangles ₹50 30
Jhumka earrings ₹120 24
Cotton scarves ₹35 10

2 Evening · under the awning, coming back

Count back: the 90-second return count

The morning list reappears with big +/− steppers and a one-tap Sold out. Anything you don't touch defaults conservatively to returned = carried — zero sold, never an invented sale.

Came back carried returned
Glass bangles 12 of 30
Jhumka earrings 9 of 24
Cotton scarves 10 of 10

3 No typing — just subtraction

Sold = carried − returned, expected = sold × price

Every rupee is computed in exact integer paise — no floating-point drift, ever. The orange segment is your day: what left the crate and never came back.

Sold & expected takings sold
Glass bangles 18 × ₹50 = ₹900.00
Jhumka earrings 15 × ₹120 = ₹1,800.00
Cotton scarves 0 × ₹35 = ₹0.00
Expected takings ₹2,700.00

4 The moment of truth

Variance = what you hold − what you should hold

Count the cash box, add one digital-payments total (UPI/card), and the day sheet gives its verdict. Here: ₹140 short — maybe a discount, maybe a miscount. The band tells you that, never who.

Day sheet
Expected at list price₹2,700.00
Cash in box₹2,100.00
Digital (UPI/card)₹460.00
▼ SHORT −₹140.00

Variance is arithmetic — discounts, haggling, freebies, miscounts and loss all look the same here. This is not theft detection.

Try the arithmetic yourself

One item, live. This demo runs the same integer-paise engine this page's self-tests verify — nothing is saved, nothing is sent.

30
12
Sold18
Expected₹900.00
Variance−₹50.00 · short

Returned can never exceed carried — the app clamps it, so a slip of the thumb can't invent sales.

Privacy that is enforced, not promised

Your takings are nobody's business. stallpack doesn't just say it won't send your data — it ships a policy that makes the browser itself refuse to.

your browser localStorage stallpack.v1 ✓ connect-src 'none' internet
Every request the page could ever make — blocked before it leaves.

The page's Content-Security-Policy header includes:

default-src 'self'; connect-src 'none'
  • No network calls possiblefetch, XHR and WebSockets are all refused by the browser, by policy.
  • No server, no account, no analytics — there is nothing to log in to and nothing watching.
  • localStorage only — your markets, items and cash figures live in your browser under one key.
  • CSV export is the only exit — a file you download on purpose; it's also your only backup, so export regularly.

The honest flip side: clearing site data or switching devices loses your history. There is no cloud copy — by design.

What's in the app

Markets directory

Name your recurring markets — "Tuesday haat", "Sunday craft fair". Every day record is tagged to one, so history compares like with like.

Copy last day

One tap pre-fills today's pack list from your last day at that market. Regulars pack out in seconds.

90-second return count

Big steppers, one-tap "Sold out", a progress strip — and untouched items default to zero sold, never a guess.

Per-market history

Sold-per-day, sell-through %, and a "best day sold N" badge used as the suggested pack quantity next time. A history lookup — not forecasting, and no AI anywhere.

Print & CSV

A pack checklist to tick while loading, a printable day sheet, and RFC 4180 CSV export — the one way data leaves, and your backup.

Money done right

Integer paise everywhere, Indian digit grouping (₹1,23,456.75), display-only $/€/£ option, prices validated to 2 decimals.

What stallpack honestly is not

  • Not theft detection. Variance is takings − expected at list price; discounts, haggling, freebies, breakage, miscounts and theft are indistinguishable in it.
  • Not a POS. Deliberately a two-count tool — no per-sale entry, no barcode catalog, no payment-app integration, no multi-device sync.
  • Not a forecaster. The pack suggestion is "your best day sold N at this market" — a simple lookup, with no AI involved.
  • Only as good as your counts. A miscount at either end shows up as variance, and the app cannot tell which count was wrong.
  • Expected assumes list prices. If you routinely haggle, variance will run negative — that's a fact worth seeing, not an error.

Questions sellers ask

What is stallpack and who is it for?

A free market stall & craft fair inventory tracker for weekly-haat and street-market vendors, flea-market, craft-fair and pop-up sellers. You count going out and coming back; the app computes sold, expected takings and variance from those two counts.

How does the two-count reconciliation work?

Three lines of arithmetic in exact integer paise: sold = carried − returned per item; expected = Σ sold × list price; variance = (cash + digital payments) − expected. A miscount at either end shows up as variance.

Does stallpack send my sales data anywhere?

No — and it can't. The page's Content-Security-Policy sets connect-src 'none', so the browser itself blocks every network request. No server, no account, no analytics; localStorage only, CSV export the only exit.

Is the variance figure a theft detector?

No. It's pure arithmetic, and the verdict band says so explicitly — discounts, haggling, freebies, breakage, miscounts and theft all look identical in it. It never accuses.

Two counts. One honest day sheet.

Free, offline, MIT-licensed. Works on the phone already in your pocket — even with no signal at the market.

Open stallpack →

Source code on GitHub