{{ uiAskTitle }}
{{ uiConfirmTitle }}
{{ uiConfirmBody }}
Practice sandbox · local only · nothing sends {{ dataStateLabel }}
Practice · not live
{{ dataStateLabel }}
Empty sandbox — counts and prep read the items you activate in the Item Catalog.
Practice · fake data Nothing here is real — and nothing you do here touches the live fair.
Empty sandbox — counts and prep read the items YOU enter and activate in the Item Catalog. Reports keep demo sales numbers.
{{ prCatLine }}
{{ prCatMsg }}
Staging halted
This staging site is not safely configured
{{ stagingHaltText }}
Nothing will load and no sign-in is possible until it is fixed. The live site is unaffected.
{{ stagingIdText }} Separate test database. Nothing here reaches the live site, the real orders, payroll or Clover.
Offline{{ pendingCount }} waiting{{ offlineMsg }}
{{ localOnlyTitle }}
{{ localOnlyBody }}
Program updated Saved data from a previous version wasn't loaded automatically — you're starting from empty operational data.
{{ appDate }}
{{ user.initials }}
{{ user.name }}
{{ hdrLogoEl }}
{{ hdrTitle }}
{{ hdrSub }}
Add a person
Somebody new turns up mid-fair — give them a code here and they can sign in on their own phone straight away.
Their name
Their 4-digit code
Which stands
Anyone on a Frenchy's stand covers Luella's too.
{{ apErr }}
{{ apMsg }}
Break-glass · PIN reset
Reset any manager's PIN right here, from your phone. The new PIN works the second you set it — no laptop, no server login.
Every reset is logged below — who did it, whose PIN, and when. Saved on this device now; when you're online it also updates the secure server (PINs hashed & rate-limited there), which runs separately from this app.
People
{{ u.initials }}
{{ u.name }}
{{ u.role }} · {{ u.locs }}
{{ u.lastReset }}
6-digit · secure server
Security log
Every PIN reset, newest first. This is the audit trail.
{{ l.text }}
{{ l.at }}
{{ l.syncLabel }}
No PIN resets yet.
Back up all data
Every timesheet plus the full schedule — all booths and days. Download a copy for your records or payroll.
New PIN set
Give this to {{ pinResetDoneName }}. It works right now, and their old PIN no longer does. This is the only time it's shown.
{{ pinResetDonePin }}
Reset {{ pinResetName }}'s PIN
Type a new 4-digit PIN or generate one. The moment you save, their old PIN stops working.
{{ pinResetErr }}
Franklin County Fair
FCF Operations
Franklin County Fair · Malone NY
Enter your PIN
You'll only see what's assigned to you.
{{ sessionMsg }}
Can't sign in to the server
{{ srvLoginErr }}
Offline means nothing you enter reaches the other phones until this device signs in for real.
Incorrect PIN — try again
Too many attempts
Please wait {{ lockoutText }} before trying again
BUILD {{ buildTag }}
{{ appDate }}
{{ vdWho }}
Pick a day — moves the numbers, weather and events together
Today's numbers
Sales today
{{ dashNumGross }}
vs last year
{{ dashNumVsLy }}
Customers today
{{ dashNumCustomers }}
LY {{ dashNumCustLy }} · {{ dashNumCustDelta }}
Today should land estimate
{{ dashNumDayProj }}
{{ dashNumNote }}
Whole ten days on pace for {{ dashNumFairProj }}
{{ b.name }} {{ b.gross }} {{ b.delta }}
Top 3 sellers
{{ g.booth }}
{{ i.rank }} {{ i.name }} {{ i.val }}
Weather Updated {{ dashWxUpdated }}
{{ w.label }}
{{ w.hi }}/ {{ w.lo }}
{{ w.cond }}{{ w.src }}
Not available
{{ dashWxHourly }}
{{ appDate }}
{{ dashDayLine }}
Notes from your managers {{ adminNotesCount }} tonight
{{ n.booth }} {{ n.by }} · {{ n.at }}
{{ n.txt }}
No notes from your managers tonight.
{{ syncText }} {{ syncRefreshMsg }}
{{ evCardTitle }}
{{ ev.t }} {{ ev.n }} {{ ev.w }}
The rush comes before the event, not during it.
Open today — no fair event scheduled.
Tonight's backup isn't saved yet
Counts and hours sit on the phones that typed them until the server is live. Save tonight's file before everyone leaves — {{ dashBackupLast }}.
Schedule changes need you{{ schedPendTotal }}
Today's numbers
Sales today
{{ dashNumGross }}
vs last year
{{ dashNumVsLy }}
Customers today
{{ dashNumCustomers }}
LY {{ dashNumCustLy }} · {{ dashNumCustDelta }}
Today should land estimate
{{ dashNumDayProj }}
{{ dashNumNote }}
Whole ten days on pace for {{ dashNumFairProj }}
{{ b.name }} {{ b.gross }} {{ b.delta }} was {{ b.prevGross }}
Scheduled right now {{ wnNowLabel }}
Weather Updated {{ dashWxUpdated }}
{{ w.label }}
{{ w.hi }}/ {{ w.lo }}
{{ w.cond }}{{ w.src }}
Not available
{{ dashWxHourly }} Sample · test
Booth inventory tonight{{ dashClosedText }}tap a stand to count it or fix a number
Awaiting your approval{{ pendTotal }}
Labor today {{ laborTotalSchedH }}h scheduled across booths {{ laborNotIn }} not clocked in
Sales data delayed
{{ syncDelayText }}
{{ syncRowCount }} sales rows loaded on this device
{{ syncMsg }}
Net sales by booth {{ dashSalesGlanceSub }} Fills during the fair
{{ b.name }} {{ b.gross }}
Each booth's gross shows here at a glance once Clover's live.
Captured once Clover's connected — no numbers invented before then.
Prepped right now
made today at each stand · red = under its prep par
{{ pb.name }}
{{ pl.t }}
Program setup {{ dashSetupLine }}
How saving & syncing works — automatic, on every device
• Changes save themselves to the server about a second after you make them — there is no save button to forget.
• Every signed-in device picks up changes within 45 seconds — and the moment the app is opened or looked at, it checks right then. A manager's counts show up here on their own; your edits show up at the booths the same way.
• Can't reach the server? A red NOT SAVED YET bar shows on every screen and the app retries every 15 seconds until the work lands. Work is held on the device, never dropped.
• Two people typing at once: both are kept — newer work is never overwritten by an older copy.
• On top of that, the server keeps a copy of everything every ~10 minutes of work, for 14 days — "Recover earlier saves" below brings any of them back.
How counting works — one sheet per stand
• Each stand does one closing count — shelf stock and the stand's own storage together, one list. It sorts itself by category in kitchen order (meat → dairy → bread → … → supplies). Every box shows last night's number next to it.
• The prep log is what a stand MADE today; the closing count is what's LEFT. Made − left = used — the prep screen shows it under "Past days," so tomorrow's prep is never a guess.
"Left from last night" on the prep screen comes straight from last night's closing count — nobody types a number twice.
Par = the reorder point: below par at close flags the item for ordering. Prepped par = how much should be made & ready.
Day-long prep log — which stands log as they make
Tap a stand to turn its prep log on or off. Stands without it just do the closing count.
Needs attention {{ dashAttnCount }}
All clear — every booth count is in and nothing is flagged.
{{ a.text }}
Inventory — review & finalize
Only a FINALIZED area feeds the Glazier order — submitted areas sit excluded until you finalize them here. A correction never erases the counter's number: the original stays printed beside every fix, and finalizing archives the whole sheet permanently.
{{ sa.name }} {{ sa.statusLabel }} {{ sa.metaText }}
{{ si.name }} {{ si.unit }}
counted {{ si.origText }} {{ si.corrStamp }}
✓ Feeding the Glazier order · archived permanently · {{ sa.finText }}
{{ sf.name }} {{ sf.unit }} counted {{ sf.origText }} {{ sf.fixText }}
{{ review.statusLabel }}
{{ review.counted }}/{{ review.total }}
{{ review.metaLine }}
{{ review.low }} at/below par ⚑ {{ review.note }}
{{ review.lateTitle }}
{{ review.lateText }}
Closed for tonight{{ review.closedMeta }}
Reopened for corrections
“{{ review.reopenReason }}”
{{ review.reopenedBy }} · {{ review.reopenedAt }}
Finalized — locked for the Glazier order
{{ review.finalizedBy }} · {{ review.finalizedAt }}
This count hasn’t been submitted yet — you’ll be able to finalize it once the counter submits.
Counting this stand yourself?
Opens the same count sheet the managers use — type the numbers, then submit and finalize here.
Counted items
{{ it.name }}
{{ it.unit }} · Last count: {{ it.last }}
{{ it.val }}
Prepared · made in-house
{{ it.name }}
{{ it.unit }} · Last count: {{ it.last }}
{{ it.val }}
{{ review.actionHint }}
Reporting year
Fairs
Reports are showing the {{ fairActiveLabel }}
{{ fairActiveRange }}
{{ fairScopeNote }}
{{ fairMsg }}
Fair records
{{ f.label }}
{{ f.dates }}
{{ f.origin }}
Showing now
What this fair holds
{{ h.label }} {{ h.text }}
{{ h.src }}
{{ f.salesNote }}
{{ f.boothLine }}
Operational fair · what staff are working
{{ opFairLabel }}
{{ opFairSince }}
{{ opFairWhy }}
{{ opFairSuggest }}
Change the fair staff are working?
Working now
{{ opFairFromLabel }}
Would become
{{ opFairToLabel }}
There is open work on {{ opFairFromLabel }}
• {{ ow.text }}
{{ opFairWarnWhy }}
Move staff to another fair
{{ opFairMsg }}
Every change to the operational fair
{{ oh.line }}
{{ oh.sub }}
Payroll rate book · {{ fairActiveLabel }}
{{ pbLabel }}
{{ pbWhy }}
Set up rates for this fair
{{ pbCopyNote }}
{{ pbMsg }}
Schedule · {{ fairActiveLabel }}
{{ stpState }}
{{ stpWhy }}
Start from a previous fair’s shape
{{ stpWarn }}
{{ stpMsg }}
Where every kind of fair data lives
{{ swNote }}
{{ sw.label }} {{ sw.state }}
{{ sw.how }}
Set up a new fair
{{ fairCreateWhat }}
Copy the booth list from
{{ fairCopyHead }}
{{ fairCopyBody }}
{{ fairCopyLimit }}
Which items are Roadie’s?
{{ hbMapStatus }}
{{ hbMapIntro }}
{{ hbMapMsg }}
{{ hbMapEmptyWhy }}
{{ it.name }}
Unmapped
{{ it.stats }}
Master Admin only
Finalize the fair report
{{ finStatus }}
{{ finStatusSub }}
{{ finCounts }}
{{ finWhy }}
Report health
{{ fc.label }} {{ fc.state }}
{{ fc.detail }}
{{ finMsg }}
Finalization history
{{ fh.kind }}
{{ fh.who }}
{{ fh.reason }}
{{ fh.acks }}
{{ finHistNote }}
Nothing reaches reports without your approval
Read an invoice
{{ invWhy }}
{{ invPendCount }}
The invoice
{{ invAttachName }}
{{ invMsg }}
What it found
{{ fd.label }} {{ fd.value }} {{ fd.conf }}
{{ fd.how }}
{{ fd.snip }}
{{ invCatSug }}
{{ invAllocSug }}
{{ invAllocNote }}
Line items
No line items could be picked out of the text.
{{ il.qty }} {{ il.desc }} {{ il.amount }}
Does the invoice add up?
{{ mr.label }} {{ mr.value }}
{{ invMathVerdict }}
{{ invMathPartial }}
Line items are never assumed to equal the invoice total — tax, freight, deposits and credits are separate money.
This may already be entered
{{ invDupeHead }}
{{ dp.line }}
{{ dp.why }}
What you are accepting
Anything marked Needs review starts switched off. A weak guess is never treated as confirmed — tap it to accept it.
{{ pk.label }} {{ pk.value }} {{ pk.state }}
What approving would do
{{ dr.label }} {{ dr.now }} {{ dr.next }} {{ dr.state }}
{{ invDiffNote }}
The original, kept
{{ invAttachLabel }}
the attached invoice
{{ dcYear }} fair · context only
Weather & events
{{ dcWhy }}
Weather · {{ dcDay }}
{{ dcSrc }}
{{ dcMsg }}
Fair events · {{ dcDay }}
Nothing recorded for this day. Add the events you know about — the app will not guess at a schedule.
{{ fyTag }} · not booth sales
ATM income
{{ atmWhy }}
Fee rates
No fee rates yet. Add one per rate charged — or skip this and type the total revenue below.
{{ ar.line }}
From the rates above {{ atmTxns }} transactions {{ atmFromRates }}
Totals
{{ atmMismatchText }}
Net ATM income {{ atmNet }}
{{ atmNetNote }}
{{ atmStamp }}
{{ fyTag }} · no Clover
Speedy Powersports
{{ psWhy }}
The fair
After labor {{ psAfter }}
Sale lines · what made up the total
{{ psUnitSummary }}
{{ psTieText }}
Nothing recorded yet. Add a unit for each sale or lead the fair is credited with — the model and amount are optional.
{{ pu.n }}
{{ psStamp }}
{{ fyTag }}
Clover reported net sales
{{ saWhy }}
{{ saSummedNote }}
{{ saWholeWhy }}
App calculated
{{ sa.calc }}
{{ sa.diff }}
{{ saRefText }}
{{ saStamp }}
Read only · nothing is written, cleared or repaired
Record check
{{ rcHead }}
{{ rcRead }}
Until v24.151, a correction made against a sheet the app was not showing reported success, changed nothing, and left an empty envelope over the row. This lists those records and what clearing one would do. It changes nothing on its own.
{{ rcChanging }}
Nothing matches the signature, so there is nothing to decide. The v24.151 guard stops any new envelope being written.
{{ rc.person }} {{ rc.where }}
Row id
{{ rc.rowId }}
Underlying segments
{{ rc.segs }}
Time span on the row
{{ rc.span }}
Hours claimed
{{ rc.claims }}
Envelope recorded
{{ rc.when }}
Recorded by
{{ rc.who }}
Would clearing it change displayed or paid hours?
{{ rc.hours }}
{{ rc.state }} · recorded as: {{ rc.detail }}
What happens next
Nothing, until you say so. Clearing an envelope restores what its row claims, and that changes hours — so it is a decision per row, made on this list, not a sweep.
Hamburger · {{ fyTag }}
Order types
{{ otWhy }}
What this entry covers
{{ otDaysDone }}
{{ otScopeLabel }}
orders · gross · discounts or comps · net — gross less discounts should equal net
{{ ot.name }} {{ ot.state }}
{{ ot.chkText }}
Entered total {{ otSumOrders }} orders {{ otSumNet }}
{{ otSumGross }} gross
{{ otSumDisc }} in discounts and comps
{{ otIdText }}
{{ otChkBadText }}
Hamburger on Clover {{ otCloverOrders }} orders {{ otCloverNet }}
Clover gross {{ otCloverGross }} · discounts {{ otCloverDisc }}
{{ otTieOrders }}
{{ otTieNet }}
{{ otTieGross }}
{{ otRefundText }}
{{ otNoneText }}
{{ otHalfText }}
{{ otStamp }}
Another order type
If the register lists a type that is not above, add it by the name the register uses.
{{ otMsg }}
{{ fyTag }}
Purchases
Total fair purchases {{ purCountAll }}
{{ purTotalAll }}
{{ b.name }}
{{ b.amount }}
{{ purUnbalText }}
{{ purCredText }}
{{ purCredNote }}
The purchasing window
{{ w.name }} {{ w.sub }} {{ w.count }} {{ w.value }}
{{ purWinNote }}
Statement reconciliation — is any of this counted twice?
{{ purSRHeadline }}
{{ purSRBasis }}
{{ purSRNear }}
{{ v.vendor }} {{ v.verdict }}
{{ s.k }} {{ s.v }}
{{ v.why }}
In Fair purchases after this review {{ purSRTotal }}
{{ purSRTieText }}
{{ purAnOverHead }}
{{ purAnOrdText }}
{{ purAnUnavailHead }}
{{ purAnUnavailBody }}
{{ n.t }} {{ n.s }}
{{ r.item }} {{ r.booth }} {{ r.pct }}
Ordered {{ r.ordered }} Left {{ r.leftover }} {{ r.conv }}
{{ r.overWhy }}
{{ purAnMismatchHead }}
{{ m.item }} {{ m.booth }}
Ordered {{ m.ordered }} Left {{ m.leftover }}
{{ m.why }}
{{ purAnSpendHead }}
{{ s.booth }} {{ s.pct }} {{ s.amount }}
{{ s.why }}
Largest vendors
{{ v.vendor }} {{ v.amount }}
{{ purAnLimit }}
Invoice
Split it between booths
{{ a.name }}
Allocated {{ purAllocTotal }} of {{ purInvTotal }} {{ purDiffText }}
An invoice is only used in booth profit when its allocations add back to the invoice total exactly. Save it short and it is flagged under Needs attention instead of quietly skewing a booth.
Invoices entered
No purchases entered yet. Reports will keep showing "Not entered" for purchases and profit until one is.
{{ p.vendor }} {{ p.invoice }} · {{ p.date }} {{ p.total }}
{{ ch.text }}
{{ p.stateText }} {{ p.attach }}
Setup · Frenchy's
Registers
Frenchy's 1 and Frenchy's 2 share one Clover account, so every sale arrives under "Frenchy's". Tell the program which stand each register sits in and the two split apart everywhere — reports, print and export. These are the registers that actually rang sales; the money and order counts are what each one took.
No Frenchy's sales are loaded on this device yet
Sign in on the live site as an admin so Clover sales load, then come back — the registers appear here on their own.
View only — changing which stand a register belongs to moves money between booths, so it is Master Admin only.
{{ d.device }}
{{ d.lines }} · {{ d.when }}
{{ d.sales }}
{{ d.orders }} orders
{{ d.stateText }} {{ d.claimText }}
Does it add up
{{ b.name }} {{ b.amount }}
Not assigned to a stand {{ regUnassigned }}
In conflict — two stands claim one register {{ regConflict }}
Frenchy's total from Clover {{ regParentTotal }}
{{ regTieText }}
{{ regParentOrders }} distinct Clover orders. Orders are counted by order id, never by line item or payment, so a single order touching two registers can never be counted twice. Sales with no register id are held out on their own and are never divided between the stands.
Reports
{{ rptCtxLine }}
{{ rptFinChip }}
Being built next
{{ rptTabSoonText }}
Labor
{{ rptLbxSub }}
{{ rptLbxNone }}
{{ lk.label }}
{{ lk.value }}
{{ lk.sub }}
Payroll by booth
{{ lr.label }} {{ lr.amount }}
Not tied to any booth {{ rptLbxUnalloc }}
{{ rptLbxNote }}
Hours and efficiency
{{ rptLbxHoursText }}
{{ rptYrCurY }} vs {{ rptYrPrevY }}
{{ rptYrHead }}
{{ rptYrHead }}
Whole fair, year against year
Measure
{{ rptYrCurY }}
{{ rptYrPrevY }}
Change
Change %
{{ yr.label }}
{{ yr.note }}
{{ yr.cur }}
{{ yr.prev }}
{{ yr.change }}
{{ yr.changePct }}
{{ rptYrDetailHead }}
{{ yd.label }} {{ yd.value }}
{{ rptYrDetailNote }}
Items
{{ rptItScope }}
Booth
Day
Net sales
{{ rptItNet }}
app calculated
Units
{{ rptItUnits }}
register line quantities
Orders
{{ rptItOrders }}
distinct Clover orders
Distinct items
{{ rptItCountN }}
as named on the register
Ranked by net sales
{{ rptItCount }}
# Item Units Net sales Avg
{{ it.rank }} {{ it.name }} {{ it.disc }} {{ it.units }} {{ it.net }} {{ it.share }} {{ it.avg }}
{{ rptItRefText }}
{{ rptItUnnamedText }}
{{ rptItBasis }}
{{ rptItNone }}
Hourly
{{ rptHrScope }}
Booth
Day
{{ rptHrNone }}
{{ hc.label }}
{{ hc.value }}
{{ hc.sub }}
Net sales by hour
Fair local time · dark bar sales, light bar orders · — means nothing was rung
Hour Net sales Ord Avg
{{ hh.label }} {{ hh.sales }} {{ hh.orders }} {{ hh.avg }}
{{ rptHrUntimed }}
{{ rptHrTie }}
Day × hour heatmap
{{ hcol.label }} Day
{{ hrow.label }} {{ cel.text }} {{ hrow.total }}
{{ rptHmNote }}
{{ rptHmWhy }}
Day
{{ rptDyTitle }}
{{ rptDySub }}
{{ rptDyCtxDay }}
Weather
{{ rptDyWxLine }}
{{ rptDyWxRain }}
{{ rptDyWxNote }}
{{ rptDyWxSrc }}
Fair events
{{ ev.line }}
{{ ev.notes }}
Not recorded
{{ rptDyCtxNote }}
{{ dc.label }}
{{ dc.value }}
{{ dc.sub }}
Net sales by booth · this day
Booth Net sales Ord Avg
{{ db.label }} {{ db.sales }} {{ db.orders }} {{ db.avg }}
{{ dp.label }}
{{ dp.value }}
{{ dp.sub }}
{{ rptDyNone }}
Hour by hour
Whole fair day, all booths · Fair local time · — means nothing was rung
{{ dh.label }} {{ dh.sales }} {{ dh.orders }} {{ dh.avg }}
{{ rptDyUntimed }}
Hamburger order types · this day
Type Orders Net sales Avg
{{ o2.name }} {{ o2.note }} {{ o2.orders }} {{ o2.pctOrders }} {{ o2.net }} {{ o2.pctNet }} {{ o2.avg }}
{{ rptDyOtTie }}
{{ rptDyOtTieNet }}
{{ rptDyOtNone }}
Findings · this day
{{ di.text }}
Hamburger detail · this day
{{ hy.label }}
{{ hy.value }}
Included in Hamburger totals for this day.
Needs attention · this day
{{ rptDyAttnCount }}
{{ da.text }}
Booth
{{ rptBtName }}
{{ rptBtSub }}
{{ rptBtGateText }}
{{ bc.label }}
{{ bc.value }}
{{ bc.sub }}
Hamburger detail
{{ hbDetReviewText }}
{{ hd.label }}
{{ hd.value }}
Included in Hamburger totals — not additional sales.
{{ hbDetWhy }}
Best day
{{ rptBtBest }}
{{ rptBtBestSub }}
{{ bp.label }}
{{ bp.value }}
{{ bp.sub }}
Sales and orders by day
Dark bar sales, light bar orders · the best day is picked out in blue
{{ bd.label }} {{ bd.sales }} {{ bd.orders }} {{ bd.avg }}
{{ rptBtNone }}
Hourly performance · all ten days
Fair local time · dark bar sales, light bar orders · — means nothing was rung
{{ bh.label }} {{ bh.sales }} {{ bh.orders }} {{ bh.avg }}
{{ rptBtUntimed }}
Frenchy’s 1 against Frenchy’s 2
Stand 1 Stand 2
{{ cr.label }} {{ cr.a }} {{ cr.sa }} {{ cr.b }} {{ cr.sb }}
{{ rptBtCmpNote }}
Manual entry
Net sales
{{ rptPsNet }}
Labor
{{ rptPsLabor }}
After labor
{{ rptPsAfter }}
Units attributed to the fair {{ rptPsUnits }} {{ rptPsUnitVal }}
{{ pv.n }} {{ pv.model }} {{ pv.amount }}
Leads {{ rptPsLeads }}
{{ rptPsNotes }}
{{ rptPsWhy }}
Order types · whole fair
Type Orders Net sales Avg
{{ o1.name }} {{ o1.note }} {{ o1.orders }} {{ o1.pctOrders }} {{ o1.net }} {{ o1.pctNet }} {{ o1.avg }}
Entered total {{ rptOtSumOrders }} {{ rptOtSumNet }}
Hamburger on Clover {{ rptOtCloverOrders }} {{ rptOtCloverNet }}
{{ rptOtTie }}
{{ rptOtTieNet }}
{{ rptOtTieGross }}
{{ rptOtRefund }}
Share is share of the entered order-type total, so the two percentage columns add to 100%. Any difference against Clover is stated above and in Needs Attention rather than spread across the rows. {{ rptOtDays }}
{{ oa.text }}
{{ rptOtNone }}
{{ rptBtInsTitle }}
{{ bi.text }}
{{ bi.src }}
Frenchy’s 1 against Frenchy’s 2 · findings
{{ fi.text }}
{{ fi.src }}
Order type findings
{{ oi.text }}
{{ oi.src }}
Purchases
{{ rptPxSub }}
{{ rptPxNone }}
{{ pk.label }}
{{ pk.value }}
{{ pk.sub }}
By booth
{{ pb.label }}
{{ pb.amount }}
{{ rptPxBoothFoot }}
Purchasing window
{{ pw.label }}
{{ pw.value }}
{{ pr.label }}
{{ pr.amount }}
{{ rptPxWinFoot }}
Largest vendors
Vendor
Records
Total
{{ pv.vendor }}
{{ pv.count }}
{{ pv.total }}
{{ rptPxVendMore }}
Statement reconciliation
statements are evidence, never a second purchase row
Vendor
Statement
Invoices stored
Additional
In fair purchases
Diff
{{ sr.vendor }}
{{ sr.stmt }}
{{ sr.stored }}
{{ sr.addl }}
{{ sr.incl }}
{{ sr.diff }}
All vendors
{{ rptPxSrAll.stmt }}
{{ rptPxSrAll.stored }}
{{ rptPxSrAll.addl }}
{{ rptPxSrAll.incl }}
{{ rptPxSrAll.diff }}
{{ rptPxSrFind }}
{{ rptPxSrFoot }}
{{ rptPxSrNone }}
End of Purchases. Invoice-by-invoice detail stays in Open Purchases and Appendix A of the Owner PDF.
{{ k.label }}
{{ k.value }}
{{ k.sub }}
Operating · booth financials
{{ fo.label }} {{ fo.sub }} {{ fo.value }}
Other fair income
{{ fx.label }} {{ fx.value }}
Final fair result {{ rptFrsFinal }}
{{ rptFrsFinalNote }}
Net sales by booth
BoothNet salesOrdersAvg ticket% total
{{ r.label }} {{ r.sub }} {{ r.sales }} {{ r.orders }} {{ r.avg }} {{ r.pct }}
Clover booths{{ rptOwnSub }} {{ rptOwnTotal }} {{ rptOwnOrders }} {{ rptOwnAvg }}
Total Fair Net Sales{{ rptOwnGrandSub }} {{ rptOwnGrand }} {{ rptOwnGrandSub }}
Frenchy's Total carries both stands plus any sale whose register was not recorded, so it always equals total Frenchy's Clover sales. Unassigned sales are never divided between the stands — they are named under Needs attention.
Profit by booth
BoothNet salesPurchasesGross profitPayrollAfter labor
{{ p.label }} {{ p.sub }} {{ p.sales }} {{ p.purchases }} {{ p.gp }} {{ p.pay }} {{ p.al }}
Whole Fair{{ rptProfFair.sub }} {{ rptProfFair.sales }} {{ rptProfFair.purchases }} {{ rptProfFair.gp }} {{ rptProfFair.pay }} {{ rptProfFair.al }}
{{ rptProfPayNote }}
Gross profit before labor = net sales − included purchases. Net operating profit (after labor) = net sales − included purchases − payroll. A booth with no purchases entered reads "Not entered" and its profit stays Unavailable — never a $0 that would read as free food.
Financial summary
{{ rptFinScope }}
{{ f.label }} {{ f.value }}
{{ k.label }}
{{ k.value }}
This summary follows the booth selector above. Payroll and the labor ratios stay unavailable until payroll is trustworthy for the selected scope — they are never shown as zero.
{{ f.label }} {{ f.value }}
{{ rptFinNote }}
Fair performance by day
{{ rptOvDayNone }}
DayNet salesOrders
{{ od.label }} {{ od.sales }} {{ od.orders }}
Net sales and distinct orders per fair day — the same figures the Daily tab prints. The best day is picked out in blue. A day with a live feed and no rows is a real $0 day.
Purchases by booth
{{ rptOvPurTotal }}
{{ pv.name }} {{ pv.pct }} {{ pv.amount }}
{{ rptOvPurSub }}
Needs attention · ranked by dollars
{{ an.rank }} {{ an.text }} {{ an.src }} {{ an.amount }}
{{ rptAttnFoot }}
Key insights
{{ ki.text }} {{ ki.src }}
{{ rptInsLyOkText }}
{{ rptInsLyText }}
{{ rptInsFoot }}
{{ rptSetupText }}
{{ rptSetupDetail }}
{{ rptSetupWaiting }}
Pasted from Clover · not the live register feed
{{ pc.period }}
{{ pc.total }}
{{ pc.orders }}
{{ pc.by }}
{{ pc.periodSource }}
{{ pc.refundText }}
{{ pc.histText }}
{{ pi.rank }}
{{ pi.name }}
{{ pi.qty }}
{{ pi.rev }}
{{ rptPastedNeverAdded }}
Labor & payroll
{{ rptLabTitle }}
{{ rptLabAttText }}
{{ rptLabIncompleteText }}
Scheduled
{{ rptLabSched }}
Actual
{{ rptLabAct }}
Variance
{{ rptLabVar }}
{{ rptLabPayLbl }}
{{ rptLabPayroll }}
Regular payroll (worked segments)
{{ rptLabReg }}
Cleaning / prep payroll
{{ rptLabClean }}
Bonus & flat pay
{{ rptLabBonus }}
Total payroll — exact earned (cash to pay is on the payroll register)
{{ rptLabTotal }}
{{ rptLabRateNote }}
{{ rptLabUnalloc }} of payroll is not attributed to a stand — it stays visibly unallocated, never guessed onto one.
{{ rptLabPctText }}
⚠ {{ ai.text }}
{{ rptLabAttMore }}
{{ rptLabDayNote }}
{{ rptLabPsNote }}
StandSchedActual+/-Payroll% sales
{{ lb.name }} {{ lb.sched }} {{ lb.act }} {{ lb.varTxt }} {{ lb.pay }} {{ lb.pct }}
DateSchedActual+/-Payroll
{{ ld.label }}{{ ld.sched }}{{ ld.act }}{{ ld.varTxt }}{{ ld.pay }}
{{ rptLabFrLine }}
{{ rptLabFrNote }}
Sort
{{ rptLabPayNote }}
EmployeeSchedActual+/-
RegularClean/prepBonus/flatTotal pay
{{ pr.name }}{{ pr.ind }} {{ pr.sched }} {{ pr.act }} {{ pr.varTxt }}
{{ pr.reg }}{{ pr.clean }}{{ pr.bonus }}{{ pr.total }}
⚠ {{ pr.excText }}
schedule: {{ pr.schedText }}
DateLocation / jobInOutHours
RateAmount
{{ pd.label }}{{ pd.where }}{{ pd.inT }}{{ pd.outT }}{{ pd.hrs }}
{{ pd.rate }}{{ pd.amt }}
No worked segments entered yet — scheduled only.
Nothing in this view.
{{ rptLabSvaLine }}
{{ rptLabSvaFlags }}
EmployeeSchedActual+/-Location
{{ sr.name }} {{ sr.sched }} {{ sr.act }} {{ sr.diff }} {{ sr.loc }}
⚠ {{ sr.flagText }}
{{ sd.date }}{{ sd.sched }}{{ sd.act }}{{ sd.diff }}{{ sd.where }}
⚠ {{ sd.flag }}
Nothing scheduled or worked in this view.
Employee {{ hc.label }} Clean/prepTotal
{{ hrw.name }} {{ hcell.v }} {{ hrw.clean }}{{ hrw.total }}
No hours in this view.
By location
{{ lr.name }}{{ lr.sched }}{{ lr.act }}{{ lr.varTxt }}
Hours come from the same schedule-versus-actual engine the sections above use; payroll by stand from the frozen segments payroll pays; per-person money from the same split the register prints. Employee payroll's Actual column is worked (paid) hours; Schedule vs actual counts approved hours.
Details
Audit · technical material · nothing here changes a figure
Net sales authority{{ rptSaSource }}
Net sales · whole fair
{{ rptSaHeadline }}
{{ rptSaSource }}
Clover reported net sales{{ rptSaRepRow }}
App calculated net sales{{ rptSaCalcRow }}
Difference{{ rptSaDiffRow }}
Refunded value{{ rptSaRefRow }}
{{ rptSaReview }}
Details · how these two figures are built
{{ rptSaWhy }}
{{ rptSaLimit }}
{{ rptSaWholeWhy }}
Sales basis
{{ rptInsBasis }}
Does it reconcilebooths against the whole fair · source of these numbers
Frenchy'sNet salesOrdersAvg ticket
{{ f.label }} {{ f.amount }} {{ f.orders }} {{ f.avg }}
{{ rcnFrMark }} {{ rcnFrText }}
Whole fairNet salesOrdersAvg ticket
{{ b.label }} {{ b.amount }} {{ b.orders }} {{ b.avg }}
Whole Fair {{ rcnFairTotal }} {{ rcnFairOrders }}
{{ rcnFairMark }} {{ rcnFairText }}
Where these numbers came from
{{ rcnSrcRange }}
{{ rcnSrcRows }} {{ rcnSrcSync }}
{{ rcnSrcMode }}
ATM income{{ rptAtmNet }} · counted once, at the final line
ATM income · not booth sales
{{ rptAtmNet }}
Fee revenue
{{ rptAtmRev }}
Costs
{{ rptAtmCost }}
Transactions
{{ rptAtmTxns }}
{{ rptAtmMismatch }}
{{ rptAtmNote }}
Reporting limitationslimits of the data · not problems
{{ lm.text }}
{{ lm.src }}
These are limits of what the data can say — not mistakes, and not ranked as problems.
Real, but cannot be pricednamed, never given a made-up figure
{{ up.text }}
{{ up.src }}
Record check · corrections that may not have applied
Reads the copy on this device and lists any correction that was reported as made and was not made. Read only — it changes nothing. {{ rptRcCount }}
{{ rptFooter }}
Read-only import · nothing is sent to Clover
Once your Netlify sync is running, items and sales flow in automatically — the Reports screen shows a live status. The manual paste below still works as a backup or for a one-time load.
{{ liveConnText }}
Paste Clover Items export
Accepts the Clover Items API JSON (the elements array) or a CSV with columns like name, price, sku/code, category, stock.
{{ cloverError }}
{{ cloverMatchCount }} match existing · {{ cloverNewCount }} new
Preview · what will import
Item
Price
SKU
Category
Stock
Status
{{ r.name }}
{{ r.matchName }}
{{ r.price }}
{{ r.sku }}
{{ r.category }}
{{ r.stock }}
{{ r.status }}
Paste Clover sales export
Accepts the Clover Orders API JSON (orders with line items) or a CSV with columns like item, price/amount, quantity. Aggregated by item and sent to Reports — live counts are never touched.
{{ salesError }}
{{ salesRefundText }}
{{ salesPeriodLabel }}
{{ salesPeriodSource }}
{{ salesUndatedText }}
Which period does this export cover?
This export carried no times, so the period cannot be read from it. Nothing is stored until you say which period it is.
{{ salesPeriodMissingText }}
{{ salesPriorText }}
{{ salesReplaceAskText }}
{{ salesReplaceKeepText }}
{{ salesImportsOnFileText }}
{{ salesOrderCount }} {{ salesOrderNoun }} · {{ salesTotal }} total
Preview · sales by item
{{ s.name }}
×{{ s.qty }}
{{ s.rev }}
Imported items land as Draft — set their locations in the Item Catalog and pars in Par Management before they can be approved or activated.
{{ pkHeadline }}
{{ pkSubcount }}
Type a number beside anything you want. par is what that booth should carry.
{{ syncText }}
{{ pkMsg }}
Save a PDF {{ pkPrintHint }}
One sheet per place — it downloads so you can text it.
{{ nr.name }}
{{ bn.name }}
{{ g.name }} {{ g.n }} · {{ g.picked }} on
{{ it.name }}
{{ c.parLine }} {{ it.src }}
Pickups one PDF
{{ g.name }} {{ g.n }} · {{ g.picked }} on
{{ it.name }} {{ it.unit }}
{{ c.label }} {{ c.parLine }}
Vendors a sheet each
{{ g.name }} {{ g.n }} · {{ g.picked }} on
{{ it.name }} {{ it.unit }}
{{ c.label }} {{ c.parLine }}
Nothing to order yet
In the Item Catalog, give each item an order source — a pickup place (Walmart, Speedway, Cornwall, Sam & Mom) or a vendor (Glazier, Sysco, WB Mason, Webstaurant) — and it appears here.
{{ pkTotal }} to pick up · {{ pkVendorTotal }} to order from vendors
On the print screen choose "Save as PDF" to get a file you can text or email.
Par Management
Enter and update location pars here anytime. This never reopens or rebuilds a catalog item, and it does not approve, activate, or connect anything to live counts or Orders. Enter a separate par per stand. Every par is blank until you enter it; each change is saved with your name, the time, and an optional note.
{{ parSetCount }} pars set
{{ parItemsMissing }} items missing a par
{{ parTotalPars }} location-pars total
{{ parRowCount }} of {{ parTotalScope }} assigned items shown · {{ parSetText }}
{{ parSelCount }} selected
Set par for
Enter a quantity, then Apply. Sets that location's par on the selected items assigned to it, recorded in each item's par history.
The two Frenchy's booths stock the same items
Fill Frenchy's 1 once, then copy it across. Only blanks get filled — any number already typed for Frenchy's 2 is left alone.
Scroll the table sideways to see every location column.
Item
Hamburger
Frenchy's 1
Frenchy's 2
Luella's
Note
{{ r.name }}#{{ r.num }}{{ r.missingText }}
{{ r.category }} · {{ r.source }}
n/a
n/a
n/a
n/a
Hours for {{ r.name }}
Segment {{ sg.num }} {{ sg.hoursText }}
{{ sg.rateFrozenText }} {{ r.segRateHiddenNote }}
{{ tsSegErr }}
Par history
{{ h.detail }}{{ h.by }} · {{ h.at }}
No par changes recorded yet.
No items match these filters
Try clearing the search or a filter, or turn off “Missing pars only.”
“n/a” means the item isn't assigned to that location — assign it in the item's review card first. Pars stay editable here anytime; nothing here touches live counts or Orders.
Orders
One place for every ordering & pickup source. Vendor orders are built to email to a vendor; pickup lists are internal — an employee buys or collects the items. Nothing sends or connects to live counts yet.
Add / edit sources
A new source gets its own card here and its own list screen. Point items at it in the Item Catalog (Edit an item → Order source). Built-in sources can be renamed, or hidden once no items use them.
{{ sr.name }}
{{ sr.kindText }}
More sources
An admin can add or edit vendor orders and pickup lists here.
{{ srcNmSysco }}
A vendor order in the same format as the Glazier Order. Built from finalized counts once the catalog is active — nothing sends yet.
Vendor
{{ srcNmSyscoShort }}
Contact for order day
{{ srcContactText }}
Order preview
Preview only {{ orderPreviewCount }} items · {{ orderPreviewReady }} ready
Items that list {{ srcNmSyscoShort }} as their source. Each flows into the order only once it is approved and active. Nothing here is a live order and nothing sends.
#{{ p.num }}
{{ p.name }}
{{ p.meta }}
{{ ch.t }}
No items list {{ srcNmSyscoShort }} as their source yet. Open the Item Catalog, edit an item, and set its Order source to {{ srcNmSyscoShort }} — it will appear here.
Internal pickup list — not a vendor order
A shopping list for an employee to buy items at {{ srcNmWalmartShort }}. It is not emailed to a vendor and isn't formatted like the Glazier Order — it's a simple buy-list with quantities and check-offs. Items appear here when their order source is set to {{ srcNmWalmartShort }}.
Contact for order day
{{ srcContactText }}
Pickup preview · {{ orderPreviewSrcName }}
Preview only {{ orderPreviewCount }} items
Items whose order source is set to {{ srcNmWalmartShort }} appear here as a buy-list. This is an internal employee list — not a vendor order and not formatted like Glazier.
{{ p.name }}
{{ p.meta }}
{{ ch.t }}
No items assigned to {{ srcNmWalmartShort }} yet. Change an item's Order source to {{ srcNmWalmartShort }} in the Item Catalog and it will show here.
Internal pickup list — not a vendor order
A list of items for an employee to collect from the store or another location. It is not emailed to a vendor and isn't formatted like the Glazier Order. Items appear here when their order source is set to {{ srcNmPickup }}.
Contact for order day
{{ srcContactText }}
Pickup preview · {{ orderPreviewSrcName }}
Preview only {{ orderPreviewCount }} items
Items whose order source is set to {{ srcNmPickup }} appear here as a collect-list. This is an internal employee list — not a vendor order.
{{ p.name }}
{{ p.meta }}
{{ ch.t }}
No items assigned to {{ srcNmPickup }} yet. Change an item's Order source to {{ srcNmPickup }} in the Item Catalog and it will show here.
Vendor order
Same idea as the Glazier Order — built from finalized counts once the catalog is active. Nothing sends from here yet.
Internal pickup list — not a vendor order
A list for an employee to buy or collect items. It is not emailed to a vendor.
Contact for order day
{{ srcContactText }}
Preview · {{ orderPreviewSrcName }}
Preview only {{ orderPreviewCount }} items
Items whose order source is set to {{ orderPreviewSrcName }} appear here.
{{ p.name }}
{{ p.meta }}
{{ ch.t }}
No items assigned to {{ orderPreviewSrcName }} yet. In the Item Catalog, edit an item and set its Order source to {{ orderPreviewSrcName }} and it will show here.
{{ orderReReviewText }}
{{ orderIncompleteText }}
The vendor order emailed to TJ at Glazier Foodservice. Built from finalized counts once the catalog is active — nothing sends yet.
Vendor
Glazier Foodservice
Order preview
Preview only {{ orderPreviewCount }} items · {{ orderPreviewReady }} ready
Items that list Glazier as their source. Each flows into the order only once it is approved and active. Nothing here is a live order and nothing sends.
#{{ p.num }}
{{ p.name }}
{{ p.meta }}
{{ ch.t }}
No items list Glazier as their source yet. Set an item's Order source in the Item Catalog and it will appear here.
Napkins, cups, boats and other paper goods come from a different vendor and aren't part of the Glazier Order. The live order builder and send-to-TJ step unlock once the catalog is approved and activated.
Order sent to Glazier
By {{ emailSentBy }} · {{ emailSentAt }} · {{ emailAttachment }} attached. Recorded on the order snapshot.
Email
To
Subject
Message
PDF {{ emailPdfName }} {{ emailLineCount }} items
Vendor
Configured
Contact
{{ emailVendor.contact }}
Phone
{{ emailVendor.phone }}
Method
{{ emailVendor.method }}
Order cutoff
{{ emailVendor.cutoff }}
PDF preview
Franklin County Fair
Purchase order · Glazier Foodservice
{{ emailFdLabel }}
{{ emailFdDate }}
Vendor
{{ emailVendor.name }}
{{ emailVendor.contact }}
{{ emailVendor.phone }}
Deliver to
Fairgrounds · Malone, NY
Frenchy's 1 & 2 · Hamburger · Drink
Item
Cases
{{ ln.name }}
{{ ln.qty }}
{{ emailLineCount }} items · {{ emailTotalUnits }} cases total
Prepared by {{ emailPrepBy }}
Please confirm receipt and the expected delivery time. Prepared quantities held in-house are not included in this order.
Nothing emails yet — sending isn't wired up
Send this order to Glazier?
Order emailing isn't wired up yet, so nothing actually sends. Confirming records who sent it and when, and locks the order snapshot.
To  {{ emailTo }}
Order  {{ emailLineCount }} items · {{ emailTotalUnits }} cases
Attached  {{ emailPdfName }}
Close the booth for tonight?
{{ closeModalSub }}
{{ unlockModalTitle }}
{{ unlockModalSub }}
Reopen this count?
It goes back to the counter to fix. The original stays in the audit log. A reason is required.
Choose a location
You're assigned to more than one tonight
Let's close out {{ homeLoc.name }}
You're the manager tonight · {{ homeLoc.firstName }}
{{ homeDoneText }}
{{ homeTsRemindTitle }}
{{ homeTsRemindText }}
{{ homeLateTitle }}
{{ homeLateText }}
You're done — go home
Everything for tonight is in. Nothing else is waiting on you.
{{ st.badge }}
{{ st.title }}
{{ st.sub }}
Quick check before you leave
{{ cl.mark }}
{{ cl.t }}
{{ cl.s }}
{{ evCardTitle }}
{{ ev.t }} {{ ev.n }} {{ ev.w }}
The rush comes before the event, not during it.
Open today — no fair event scheduled.
Scheduled right now {{ wnNowLabel }}
Not closed yet
{{ homeMissedText }}
Leave a note for Rickey
Ran short, equipment trouble, someone went home early — type it here and he sees it tonight. Leave it blank if the night was normal.
You can keep typing and send again — he sees the newest one.
{{ noteSaved }}
Mid-day count · optional
{{ cMidNote }}
{{ cLateTitle }}
{{ cLateText }}
Closed for tonight — locked{{ countClosedMeta }}
{{ countProgressText }}
{{ countFlags }} to double-check
Nothing counted yet today — tap Use last count on any line, or type in its box. It saves as you go.
{{ syncText }}
Submitted for review — you can still fix a number. It reopens itself and gets stamped.
Finalized by an admin — you can still fix a number. It will be flagged for them to re-check.
⚠ {{ countReReviewText }}
{{ cntWarnMsg }}
1 · Every item is a line. Didn't change since last night? Tap Use last count — that's it, counted.
2 · Number moved? Tap the box and type it — 2.5 for two and a half, 0 for none — or nudge with + and .
3 · Filled lines get a green dot. Next blank up top jumps to whatever's left. Done? Review & submit. It saves as you go, so you can stop and come back.
No items to count for this booth yet
Items show up here once an admin adds them to the Item catalog and assigns this booth as a location. Nothing to count until then.
{{ it.name }}
{{ it.uMeta }}
{{ it.name }}
{{ it.pMeta }}
Saved automatically on this device
Review before submitting
{{ countProgressText }}
{{ countUncounted }}items still uncounted — you can submit anyway
{{ countFlags }} large change(s) to double-check
{{ f.name }}
Day — log or fix a different day
{{ prepOtherLabel }}
Produced · adds up
Log each batch as you finish it — it adds to today's running total. This is what you MADE today, not what's left. Entries can't be erased; a correction is a new entry.
Left from last night · from the closing count
{{ ln.name }}{{ ln.qty }} {{ ln.unit }}
Already made and on hand — start here before prepping more.
Closed for tonight · locked
Tonight's prep log is locked
{{ prepClosedText }} — fixing after close needs a stamped unlock, then a new entry. The log never silently changes.
Log prep
{{ prepUnitLabel }}
No items to log against yet — add items to this booth in the Item catalog first.
⚠ These items aren't flagged as prepped in the Item catalog yet — showing this booth's items so you can keep logging. Everything you log is saved normally.
⚠ This booth is closed for the day — you can still log. The entry is saved and marked “after close”.
Made today · running total
{{ t.name }} {{ t.total }}{{ t.unit }}
Today's entries · {{ prepCountText }}
+{{ e.qty }}
{{ e.item }}
{{ e.by }} · {{ e.at }}
Saved on phone
Nothing logged yet today. Log your first batch above.
Past days · made / left at close / used — your guide for how much to prep
{{ pd2.label }}
{{ pr.name }} made {{ pr.made }} left {{ pr.left }} used {{ pr.used }} {{ pr.unit }}
Areas
Fair day
{{ invPastText }}
{{ storageAreaName }} · {{ storageProgress }}
Each area saves as its own count for the Glazier order
{{ storageSentBackText }}
⚠ Changed after review — an admin needs to re-check this area.
Submitted for review — you can still fix a number. It reopens itself and gets stamped.
{{ storageReadOnlyText }}
No storage items configured yet
Cooler, Freezer, Dry Stock and Non-Food Storage are set up as separate counts. Items appear here once they're added to the Item catalog and assigned to a storage area.
{{ it.name }}
Count by {{ it.unit }} · Last count: {{ it.last }}
Incomplete{{ storageIncompleteText }}
Submitted{{ storageSubmittedText }}
Finalized{{ storageFinalizedText }}
Submitted areas await Master Admin review · only finalized areas feed the Glazier order
Practice copy — not the live catalog
These items look real because they were copied from your live catalog.
These are practice sample items — not your live catalog.
Anything you add, edit or delete on this screen stays in practice and never reaches the live app.
Your hand-added items are in this list now
{{ catMergedText }}
{{ catDraftCount }} items · {{ catReadyLine }}
{{ syncText }} Changes on this computer have not reached the server yet.
Back up saves everything — items, pars, vendors — to a file on this computer.
{{ catBackupMsg }}
{{ catRestoreErr }}
Restore catalog from this backup?
This file holds {{ catRestoreCount }} catalog items and {{ catRestoreDraftCount }} draft items{{ catRestoreWhenText }}. Restoring replaces the catalog on this device — you currently have {{ catRestoreCurCount }} items — with what's in the file. Your daily counts, prep logs and timesheets are not touched.
Heads up: this file was saved by a different version of the app. The items should still load — double-check them after restoring.
You have read-only access. Only a Master Administrator can add or edit catalog items.
Possible duplicates · {{ dupeCount }}
Name-based check within the same booth. Different-name twins (like 1lb Boat vs Tray #22916) still need eyes.
{{ dp.a }} ↔ {{ dp.b }}
{{ dp.where }}
To merge a real duplicate: keep one, remove the other (Edit → Remove from catalog). "Not a dupe" is remembered.
Vendors
{{ vendCountText }} · feeds the Vendor picker on every item
{{ vr.name }}
{{ vr.countText }}
No vendors yet — add the first one below.
Rename updates every item that uses the vendor. Remove unlocks once no items use it.
{{ catMatchedCount }} items shown by location · an item assigned to several locations appears under each, editing one shared record · Draft items stay out of counts & Orders
{{ catCountText }}
Frenchy's 1 and 2 stock the same items
Fill Frenchy's 1, then copy the column across. Blanks only — anything typed for Frenchy's 2 is left alone.
New item names — all {{ nmCount }}, before and after
Shortest name that is still clear. No ALL CAPS, no vendor codes, no pack size — except where the size is the only thing telling two items apart (the two sugars, the two hot dogs, the two bowls). Read the whole list, then apply.
{{ r.from }} {{ r.to }}
{{ nmUnmappedN }} item(s) added after this list was written keep their current name.
This is an old suggestion list — it doesn't know about names you've already fixed. Removing it changes nothing on your items.
Catalog restructure — {{ catSuggestCount }} items change
Eleven categories built from what you actually carry. Cleaning chemicals split out of Supplies, Mom's and Sam's salads out of Produce, and Condiments split by booth — savoury on the hamburger sheet, sweet on Frenchy's. Read it, then apply. Every item stays editable.
{{ r.name }} {{ r.prep }} {{ r.from }} → {{ r.to }}
The {{ catPlanPrepN }} green-tagged items get two numbers at count time — how much bulk stock, and how much is prepped and ready — so morning crew sees what's left to prep. Onions and tomatoes are deliberately not on this list: the store cuts them, so they are stock only.
{{ catPlanUnmappedN }} item(s) aren't in the plan — they were added after it was built. Set their category by hand.
This is an old suggestion list — it doesn't know about categories you've already fixed. Removing it changes nothing on your items.
Fill in all {{ catBulkCount }} shown Filter the list above, then set a value once for everything showing. Each change is logged per item.
Par for
{{ catBulkBlockedText }} — those are skipped, never activated half-done.
{{ catBulkMsg }}
{{ g.name }}
{{ g.count }} items
{{ gc.cat }}{{ gc.qBlanks }} blank{{ gc.n }}
#{{ c.num }}
{{ c.name }}{{ c.statusLabel }}Imported · check
{{ c.category }} · {{ c.unit }} · {{ c.sourceName }} · {{ c.locs }}
{{ c.parText }}
From the par-sheet import. Booth, vendor and par came from the sheet — category, storage and unit were assigned automatically. Check them, then clear this flag.
Required to count
Item name
Category
Ordering unit
How it's counted
As bought = count the cases only · Prepped here = made at the booth, prep log only · Both = count the cases AND the prepped amount (hot dogs, dough)
Which stand uses it
Pars — reorder point per location
Assign a location above first — each location gets its own par.
{{ pe.locName }} · {{ pe.unit }}
Marked "no par needed" — the raw stock never flags for reorder. Items with a prepared form still use their Prepared par.
Prepared par · made units on hand
Prepped{{ ppc.tagText }}
Below this number at close = flagged to reorder. Changes are stamped in the item's history.
Status — move it along
Everything's filled in — next stop Approve.
Not yet — finish these to move it along:
· {{ sb.t }}
Reviewed and correct — approval is stamped.
Goes live on counts, prep, and ordering.
✓ Active — live on counts, prep, and ordering.
Drops it from counts, prep, and ordering. The record and history stay — restore it anytime from the Status · Not used filter. Marked not used — hidden from counts, prep, and ordering until restored.
Vendor & ordering · optional
Vendor
Vendor item #
Package / case description
Par
Starting par for orders. Per-stand pars are typed on the item's row in the catalog list.
Location pars are entered in Par Management, not here.
Routing & notes · optional
Order source
Notes
No catalog items match these filters.
Editing existing item
New item
Item details
Only Item name is required to save. Leave anything you don't have blank — it shows as “Not configured” until you fill it in. New items start as Draft, out of counts & Orders until approved and activated.
Required to count
Item name
Category
Ordering unit
How it's counted
As bought shows on the closing count (cases, rolls). Prepped here = made at the fair for the fair (gravy, sauce) — no vendor, no order list, it lives on the prep log; just pick which stands make it and set the Prepped par. Both = hot dogs or dough: staff count the cases AND what's prepped — cases feed your ordering, prepped feeds the prep log.
Prep unit
Prepped par
Count the made form at close?
Which stand uses it
Where it comes from · vendor & par
Vendor
Vendor item #
Package / case description
Source of information
Composite / prepared in-house
Status
Possible duplicate
An item with this name already exists in the catalog. Save anyway only if this is genuinely a different item.
{{ catError }}
The catalog is empty
No items have been entered yet. Add the real Glazier items one at a time, or download the blank import template and send it back filled in.
{{ it.name }}{{ it.activeLabel }}
{{ it.vendor }} · {{ it.category }} · {{ it.unit }} · par {{ it.par }}
{{ it.locs }}
{{ it.meta }}
Ready to count Ready to order
Needs before counting: {{ it.cMiss }}
Needs before ordering: {{ it.oMiss }}
Not used for fair · record kept
{{ rt.name }} · {{ rt.vendor }}
Draft from the Glazier price list
{{ draftTotal }} items staged from the Glazier PDF (effective 06/26/2026). Every item is Draft and inactive — none feed booth counts, storage counts, the Glazier order, or the working catalog. Each item moves Draft → Ready for review → Approved → Active. An item can only be marked Ready when every source-supported field, category, classification, each assigned location's par, and any required prepared par are complete with no unresolved flags. Approval and activation are separate actions — approving never activates. Pars are intentionally left blank; they're an operational decision.
{{ dDraft }}
Draft
{{ dReadyApp }}
Ready for review
{{ dApprovedInactive }}
Approved · inactive
{{ dActive }}
Active
{{ dFlagged }}
Flagged
{{ dNotUsed }}
Not used for fair
Preview how these items would appear on the count screens — generated from the catalog config. Preview / test only; the catalog isn't approved or activated, so nothing feeds real counts or ordering.
Par set on {{ dParSet }} of {{ dScope }} items.
Read-only access — only a Master Administrator can configure, approve, or activate draft items.
{{ draftSelCount }} selected Applies to selected only · pars, conversions & rounding stay item-specific
Assign location(s)
Set category (approved)
Set classification
Status
#{{ d.num }} {{ d.statusLabel }} Shared · both booths ⚑ Confirm full name ⚑ Flagged
Display name · editable
Source (as printed): {{ d.sourceDesc }}
Brand · {{ d.brand }} Pack · {{ d.packageDesc }} Order unit · {{ d.orderUnit }} Min price · ${{ d.minPrice }} · eff. {{ d.priceEffectiveDate }}
Vendor · {{ d.vendor }} · Source · {{ d.sourcesText }}
Not ready for review · {{ d.blockerCount }} to resolve
{{ b.text }}
✓ All requirements met — ready to submit for review.
Sent back for corrections
“{{ d.reopenReason }}”
{{ d.reopenedBy }} · {{ d.reopenedAt }}
Approved by {{ d.reviewedBy }} · {{ d.reviewedAt }}
Note: “{{ d.reviewNote }}”
Activated by {{ d.activatedBy }} · {{ d.activatedAt }}
Marked ready by {{ d.readyBy }} · {{ d.readyAt }}
⚑ Flag · {{ d.manualFlagReason }}
{{ d.manualFlagBy }} · {{ d.manualFlagAt }}
Category · required to count
How it's counted · required
Which stand uses it · required to count
Par by location · required to order
{{ p.locName }}
Assign a stand above to set pars.
Prepped par · how much should be made & ready
Prepped{{ dpc.tagText }}
Composite / prepared in-house
Review notes · stays in the draft, not part of the item record
{{ h.tag }}
{{ h.detail }}
“{{ h.note }}”
{{ h.by }} · {{ h.at }}
No changes recorded yet.
Preview / test mode — nothing here is live
This is the count-screen structure generated from the draft catalog configuration — the items assigned to a booth, grouped by category, with their classification and par. Because the catalog isn't approved and activated, these screens don't accept counts and don't feed nightly counts or Glazier ordering.
{{ previewLocName }}
Preview {{ previewItemCount }} items · {{ previewActiveCount }} active
{{ g.cat }}
{{ g.count }}
{{ i.name }}{{ i.statusLabel }}
{{ i.clsLabel }} · counted in {{ i.unit }} · {{ i.parText }}
+ Prepared count
No catalog items assigned here yet
No draft items list {{ previewLocName }} as a location. Assign this stand to items in Draft Catalog Review and they'll appear here.
Fields are shown disabled on purpose. The live count screen unlocks after the catalog is formally approved and activated.
Approve {{ approveItem.numTitle }}?
This item is Ready for review with all requirements met. Approving records you as the reviewer and marks it Approved · inactive. Approval does not activate it — it stays out of counts and orders until you activate it separately.
Item  {{ approveItem.displayName }}
Reviewer  {{ draftApprover }} · {{ draftNowClock }}
Review note · optional
Activate {{ activateItem.numTitle }}?
This item is Approved. Activation is a separate, deliberate step — it makes the item usable once counts and ordering are connected in a later build. It will not appear in any count or order until the catalog is activated. Only a Master Administrator can do this.
Item  {{ activateItem.displayName }}
Approved by  {{ activateItem.reviewedBy }} · {{ activateItem.reviewedAt }}
Send {{ reopenDraftItem.numTitle }} back to Draft?
This returns {{ reopenDraftItem.displayName }} to Draft from {{ reopenDraftItem.statusLabel }} and clears its approval. A reason is required and is recorded in the item's audit history.
Reason · required
Raise a flag on {{ flagModalItem.numTitle }}
Flags mark an open question on {{ flagModalItem.displayName }}. An item with any unresolved flag cannot be marked Ready for review. The reason is recorded in audit history.
Reason · required
Glazier vendor
Fields stay “Not configured” until supported data is provided — no values are invented.
Vendor name
Vendor email on file
Phone · Not configured Order cutoff · Not configured Product #s · Not configured Case conversions · Not configured Rounding rules · Not configured
Glazier order recipient
Where the nightly Glazier order is addressed. Nothing sends yet — emailing isn't wired up.
Report recipients
Who receives approved reports. Nothing sends yet — emailing isn't wired up.
Daily sales goals
A typical day per booth, then the ten fair days shaped around it. Shows as the progress bar in Reports; nothing else uses these.
A typical day
{{ g.name }}$
Where the ten days come from
There is no real last-year sales history yet — Clover starts recording with this fair. So the ten days are the numbers above spread by day of week: Saturdays highest, the Monday–Tuesday lull lowest, opening Friday and closing Sunday softer. They still average exactly what you typed, so no total is invented. Hand over last year's real numbers and these get replaced with the actual thing.
Each fair day · edit any number
Day Hamburger Frenchy's Luella's Day total
{{ gd.day }} · {{ gd.when }} {{ gd.total }}
Whole fair {{ goalFairTotal }} {{ goalMsg }}
Fair-day window · dry run{{ dryPass }}/{{ dryTotal }} pass
Each fair day runs 6:00 AM → 4:00 AM the next morning (America/New_York). After midnight up to 3:59 AM counts to the day that opened that morning; 4:00–5:59 AM is the closed gap. Two jobs, two numbers: the Sales bucket is where a Clover sale lands (nothing sells in the gap); the Timesheet day is where a manager's correction lands — a fix typed in the 4–6 gap still lands on the day that just closed, never nowhere. Clover sends UTC; the sync converts to Eastern first.
{{ c.desc }}
{{ c.utc }} → {{ c.local }}
Sales bucket
{{ c.bucket }}
Timesheet day
{{ c.lands }}
{{ c.mark }}
Test any Clover timestamp (UTC)
{{ dryLocal }}
Sales bucket {{ dryBucket }}Timesheet day {{ dryLands }}
Not a valid timestamp — try e.g. 2026-08-08T09:30:00Z
Clover sync{{ liveConnText }}
The Netlify puller runs on its own schedule and writes register data straight to the database. This card reads the sync's own status row — no need to open Netlify to know sales are flowing.
Last run
{{ setupSyncLastRun }}
Items synced
{{ setupSyncItems }}
Sales rows
{{ setupSyncSales }}
{{ setupSyncErr }}
{{ setupSyncDetail }}
Backend integrity{{ integrityBadgeText }}
These guarantees are enforced in Supabase — deployed and verified outside this prototype. The button runs a live structural check against the deployed instance; the behavioral proof (append-only actually blocking edits, duplicates rejected) is app-backend/verify-integrity.sql, run in the Supabase SQL editor.
{{ g.mark }} {{ g.label }} {{ g.stateLabel }}
{{ integrityStatusText }}
Saved automatically on this device · Build {{ buildTag }}
{{ schedBoothName }}
Fair Day {{ schedFairDayNo }} · {{ schedDayLabel }} · open {{ schedOperatingText }}
As of {{ schedNowLabel }}
{{ st.value }}
{{ st.label }}
Changes you make here are sent to an admin for approval before they go live on the schedule.
{{ schedPropTitle }}
{{ p.name }}{{ p.label }}
{{ p.detail }}
{{ p.meta }}
Schedule changes · this day
{{ c.name }}{{ c.label }}
{{ c.sub }}
{{ c.lastLine }}
Added shifts · this day
{{ a.name }}
{{ a.detail }} · added by {{ a.by }}
ON SHIFT {{ schedOwnerNote }}
{{ g.role }}{{ g.count }}
{{ r.name }}{{ r.roleLabel }}
{{ r.timeText }}
{{ r.clockText }}
{{ r.statusLabel }}
No one scheduled here
Nobody is on the {{ schedBoothName }} roster for this day.
{{ se.name }}
{{ se.note }}
Shift start
Shift end
Position
{{ se.err }}
Who covers it · pick from the roster
Or a new name
{{ se.err }}
Fix payroll problems
{{ fixListSub }}
Nothing is blocking payroll.
{{ fx.who }} {{ fx.tag }} {{ fx.when }}
{{ fx.detail }}
{{ fx.why }}
{{ fixListMsg }}
What went wrong — exact details
{{ errPanelText }}
Payroll reports
{{ pwRptNote }}
{{ pwXlsMsg }}
Whole Fair {{ pwCount }} {{ pwPersonHiddenNote }}
{{ pwDetailHintText }}
EmployeeStatusBoothsHoursRegularClean/prepBonus/flatExactRoundFinal to pay
{{ pw.name }} {{ pw.statusShort }} {{ pw.booths }} {{ pw.hours }}{{ pw.reg }}{{ pw.clean }}{{ pw.bonusFlat }}{{ pw.exact }}{{ pw.rounding }} {{ pw.finalText }}
{{ pw.why }}
DateBoothJobInOutUnique paid hoursFrozen rateAmount
{{ dt.day }}{{ dt.booth }}{{ dt.job }}{{ dt.inT }}{{ dt.outT }}{{ dt.hours }}{{ dt.rate }}{{ dt.amount }}
{{ ex.label }}{{ ex.amount }}
Segments total {{ pw.segSum }}
{{ pw.detailTotalLabel }} {{ pw.detailTotal }}
{{ pwTotalsLabel }}
{{ pwIncompleteText }}
No total is shown until these are resolved — a number here would look final when it is not.
Ready to pay
{{ pwReady }}
Known held
{{ pwKnownHeld }}
Unknown amounts
{{ pwUnknownN }}
Rounding
{{ pwRounding }}
Potential total
{{ pwPotential }}
{{ pwUnknownText }}
{{ pwReconText }}
{{ pwVisLabel }}
Ready {{ pwVisReady }}Held {{ pwVisHeld }}Unknown {{ pwVisUnknown }}
{{ fc.n }}
{{ fc.label }}
Payroll by Booth
{{ pwBoothNote }}
BoothHoursAmountHeldUnknown
{{ bg.label }}{{ bg.hours }}{{ bg.exact }}{{ bg.held }}{{ bg.unknown }}
Where this payroll stands {{ payStatus }} {{ payReadyText }} {{ payReadyText }}
Needs attention before this is paid
{{ a.what }}{{ a.where }}
Reopening a finalized payroll
{{ payReopenErrText }}
{{ payRatesHiddenNote }}
Write down who prepped or cleaned
One line per person, same as the paper: the day, their name, when they came in, when they left. Tap the big button and it lands on the list below — the total up top follows by itself.
{{ pcdErr }}
More people on the same day? The day stays put — just type the next name and times and tap the button again.
Everyone on these days is paid one flat rate — {{ pcdRateText }}, even your $35 fair people.
Written down so far
{{ d.label }} {{ d.countText }}
{{ p.name }} {{ p.time }}
Pay rates
Only you can open this screen. Managers see hours for their own stand and never a rate or a dollar.
{{ payPeopleText }} {{ payLyText }} {{ payWaitText }} {{ paySetText }}
{{ payFloorText }}
New York minimum is $16.00 an hour, and $10.70 only for tipped waitress work. A rate under those is almost always a typo.
{{ payWarnText }}
They are new, or their name is spelled differently from last year. Worth a look so nobody quietly lands on the minimum.
{{ g.logoEl }}
{{ g.name }} {{ g.countText }}
{{ g.emptyText }}
{{ r.name }} {{ r.srcText }}
{{ r.meta }} {{ r.lyText }} {{ r.alsoText }}
{{ r.askText }}
{{ r.warnText }}
{{ r.rateHiddenNote }}
$ /hr
Everyone who preps or cleans
{{ payCleanNote }}
$ /hr
Prep and cleaning hours pay this rate whatever the person makes on the fair. Someone on $35 at a stand still preps and cleans at this number — that is how you paid it last year.
How pay gets worked out
Hours come off the managers' timesheets and always show exact — 8h 12m, and the decimal beside it. Pay is worked out on those exact hours: 3h 30m at $22.00 pays $77.00, never a rounded-up 4 hours. Money is rounded to the cent once, on each line. The rate frozen on a segment is what that segment is paid — a rate you change here applies going forward and never re-prices work that is already done.
Bonuses & kids
Money that is not hours. Bonus money is somebody’s whole pay; a fair bonus rides on top of their hours; the kids get a flat sum you add after the fair. All of it lands on the fair run, never on a stand’s hours.
Bonus money · you type it at payroll time
{{ b.name }}
{{ b.sub }}
$
Ryan, Ricky, George and Bernie are bonus money only — no hours, no rate. The amount you type is their whole pay, and they never appear on a stand's rate list.
Fair bonuses · pick the person, type the amount
{{ b.name }}
{{ b.sub }}
$
$
Who got one last year
{{ b.name }}{{ b.amt }}
Last year's margin does not say which Jenna or which Amanda — so nobody is filled in for you. Pick the person yourself.
Kids · a flat sum each, added after the fair
{{ k.name }} {{ k.amt }}
$
What they got last year
{{ k.name }}{{ k.amt }}{{ k.alias }}
Last year vs this year
Straight off last year’s handwritten sheets, person by person, against what the fair run says today. Only people who are on both years appear — green means this year is lower.
Nothing to compare yet
Nobody has hours on a fair day yet, so there is nothing to hold against last year. This fills in as the managers enter times.
Everyone on both years {{ prLyDelta }}
last year {{ prLyThen }} → {{ prLyNowLabel }} {{ prLyNow }}
Name Last year This year Change
{{ r.name }} {{ r.then }} {{ r.now }} {{ r.delta }}
{{ prLyNote }}
{{ tsBoothName }}
Fair Day {{ tsFairDayNo }} · {{ tsDayLabel }} · timesheet
{{ tsBannerText }}
{{ tsRecDupText }}
Duplicate times · review
{{ tsRecCounts }}
{{ tsRecBeforeText }}
{{ tsRecSelText }}
{{ tsRecMsg }}
Problems first
No duplicates, conflicts or overlaps found on the roster.
{{ pp.name }}
{{ pp.meta }}
{{ sr.line }}
Exact duplicate groups · one KEEP stays active in every group
{{ dd.tag }} {{ dd.label }} {{ dd.why }}
Hand-entered vs imported · your decision, never ticked
{{ cf.day }} · {{ cf.note }}
{{ cf.lTitle }}
{{ cf.lLine }}
{{ cf.lMeta }}
{{ cf.rTitle }}
{{ cf.rLine }}
{{ cf.rMeta }}
Same minutes on two booths · your decision
{{ ov.label }}
{{ fl }}
Fixed-pay timesheet cleanup
{{ tsRecFixCount }}
{{ fp.name }} {{ fp.meta }}
Your marked-up sheet · Aug 19
Each line is one correction from the printout you marked. Applying it patches the existing record — never a re-import, never a copy. Already-corrected lines say DONE; lines whose printed record is not on this device say so.
{{ ci.st }} {{ ci.who }} {{ ci.label }}
Needs your call — marks I will not guess at
{{ cp }}
Reason: {{ tsSentBackReason }}
{{ tsBlockMsg }}
View only — you can see hours but not edit this booth.
{{ tsPrepNote }}
{{ tsFailTitle }}
{{ fl.t }}
{{ tsFailStage }}
{{ tsFailDeviceLine }}
{{ tsSheetForcedNote }}
{{ g.role }}{{ g.count }}
{{ r.name }}AddedManualSelf-edit
{{ r.roleText }} · plan {{ r.planText }}
{{ r.offHoursText }}
{{ r.statusLabel }} {{ r.saveText }}
{{ r.hoursText }}
hours
Segment {{ sg.num }} · {{ sg.job }} · {{ sg.inVal }} → {{ sg.outVal }} · {{ sg.hoursText }}
Hours for {{ r.name }}
Segment {{ sg.num }} {{ sg.hoursText }}
{{ sg.rateFrozenText }}
This day {{ r.dayTotHours }} {{ r.dayTotPay }}
{{ r.dayTotNote }}
{{ tsSegErr }}
{{ h.detail }}self — {{ h.by }} · {{ h.at }}
{{ r.removedText }}
No one scheduled for this day
Nobody is on the {{ tsBoothName }} roster for Fair Day {{ tsFairDayNo }}. If someone worked, use Add a person to this day above to put them on and clock their hours.
Scheduled
{{ tsSchedH }}h
Logged
{{ tsLogH }}h
Clocked in
{{ tsClockedCount }}/{{ tsHeadcount }}
{{ tsMissingOutsText }}
Every edit is stamped with who and when. Hours roll up to the dashboard live · saved on this device.
Add someone to {{ tsBoothName }}
For someone working who wasn't on the schedule. This is recorded in the day's history.
Person
Name
Position · required
Pick a position — the row needs somewhere to go.
Remove {{ tsRemoveName }}?
Takes {{ tsRemoveName }} off this day's timesheet. It stays in history and can be undone. A reason is recorded.
Reason · optional
Reject this change?
The request won't be applied to the schedule. Add a reason so the manager knows why.
Reason
{{ sa.title }}
{{ sa.note }}
Who
New name
Position
Shift start
Shift end
{{ sa.err }}
Send {{ tsBoothName }} back?
Returns this day to the booth manager to fix and re-submit. Add a reason so they know what to change.
Reason
{{ exTotal }} to review
flags across all booths and days · clean days approve fast
{{ c.label }} · {{ c.n }}
All clear
No missing clock-outs, long shifts, manual edits, or unscheduled adds to review.
Fair events
The 176th Franklin County Fair · grandstand and main events with times. Big crowds arrive before the show — that is when the lines hit.
{{ d.label }} {{ d.date }} Today
Open — no fair event this day.
{{ ev.t }} {{ ev.n }} {{ ev.w }}
Lineup from frcofair.com. We are open all ten days, Fri 8/7 through Sun 8/16 — the 7th just has no fair event on it.
Food safety · quick reference
The rules that matter, in plain words. Nothing to fill in — it's just here when you need it.
Admin view. Blue chips are code cites (NY Subpart 14-2); amber Guidance chips are recommended practice, not code. Managers see this screen without any chips.
Hamburger Stand
Cook to14-2.3(e)
Internal temp, °F
Burgers158°F
Sausage158°F
Fried chicken165°F
Pulled pork150°F
Bacon150°F
Hot dogs140°F
Anything else140°F
We cook hot dogs fresh. We don't hold them.
Hold14-2.4
Gravy warmer140°For above
Pulled pork holding140°For above
Cold topping unit45°For below
Nothing sits in between. If it's between 45 and 140 longer than it takes to cook or serve it, it can't be sold.
Hold at 140 or above and there's no clock. There is no 4-hour rule in NY.
14-2.4: food "held between 45°F and 140°F for a period of time beyond that required for preparation are considered to be contaminated." A temporary stand has no time-out-of-temperature allowance.
Reheat14-2.3(e)
Reheat to165°F
All the way through, then hold above 140.
Pulled pork
Way 1 · Same day
Smoke it. Hold at 140 or above. Serve it today.
No cooling. No clock. Nothing to prove to anybody.
This is the way.
Way 2 · For service next day
1
Pull it now
While it's still hot. Before it cools. Not after.
2
Shallow pans
6 lbs max per pan. 4 inches deep max.
3
Uncovered
Into the cooler with no lid, no wrap, no foil.
4
Watch the clock
120° → 70° within 2 hours
70° → 45° within 4 more hours
5
Wrap it
Only once it reads 45.
Next day
Reheat to 165 all the way through, within 2 hours. Then hold above 140.
Never
Never wrap a whole butt and put it in the cooler. It will not cool in time. It gets thrown out.
Cooling clock is 14-1.40(b), borrowed from Subpart 14-1 (14-2 has no cooling section). Reheat is 14-2.3(e). Improperly cooled food is contaminated (14-2.4) and must be discarded.
Inspectors ask how you cooled it. Have an answer.
AllergiesPub 6756
We share fryer oil — fries, poutine, and fried chicken all run through it. If someone asks about an allergy, tell them and get the manager.
Post the allergen notice (NYSDOH publication 6756) where crew can see it.
Frenchy's Fried Dough
Warmers14-2.4
Pizza sauce140°For above
Turnover topping140°For above
Stir them. A pot can read hot where you probe and sit cold somewhere else.
Stirring warmers is recommended practice, not code.
Coolers14-2.4
Cold45°For below
AllergiesPub 6756
We share fryer oil. If someone asks about an allergy, tell them and get the manager.
Post the allergen notice (NYSDOH publication 6756) where crew can see it.
Luella's Drinks
Drinks and ice cream only.
Coolers14-2.4
Cold45°For below
Ice14-2.5
Comes in sealed bags from the plant. Stays in the bag until you scoop it.
We don't make ice here.
Ice used to chill food never goes in a drink.
All stands
Thermometers14-2.3(f) · 14-2.4
One in every cooler and every warmer.
Plus a probe thermometer — and use it.
Accurate to ±2°. Most read 0 to 220.
Wash hands14-2.8
1Wet hands with warm water.
2Add soap.
3Scrub hands and wrists — 20 seconds.
4Rinse.
5Dry with a single-use paper towel.
When
Before starting work
Before putting on gloves
After touching raw beef, poultry, fish, or meat
After the bathroom
After smoking, eating, sneezing, or drinking
After mopping, sweeping, taking out garbage, or using the phone
Any time your hands touch something that could contaminate them
Gloves14-2.3(d)
Wash hands before putting on new gloves.
Change them if they rip, tear, or get contaminated.
Change between raw and cooked.
Gloves, tongs, deli paper, waxed paper, or napkins — no bare hands on anything ready to serve.
Yourself14-2.16
Hair tied back. Clean clothes. No smoking in the booth.
Sick, or have an open cut or sore? You're not on food.
Dry storageGuidance
Food off the floor — 6 inches minimum, in real food containers.
Keep it covered. Storage and display.
6 inches off the ground is brochure 6584 guidance, not a code number; food must be protected from contamination (14-2.4).
Dishes — 3 bay14-2.7
Scrape and pre-rinse first.
1Wash — warm water and detergent
2Rinse — clean water
3Sanitize — 200 ppm quat, water 75° or warmer, one full minute
4Air dry — no towels
Sanitizer below 75 doesn't work. Check it.
Check strength with a strip. Change the water when it reads low or looks dirty.
Code: sanitize sink 75°F for one minute, equivalent to 50 ppm chlorine (14-1.112(a)(4); 14-2.7 defers to the permit-issuing official). Guidance: 200 ppm quat and warm wash/rinse water are from brochure 6584, not code.
Keep it clean14-2.11
Ground in prep and storage areas stays clean. Don't let dust or mud build up.
Garbage in containers with bag liners.
Menu & signage
Pub 6756
Allergen notice posted
Food Allergen/Intolerance Notice (NYSDOH pub 6756) posted where crew who prep and serve can see it.
Menu
Allergen statement on every menu
All menus, including online: "If you have a food allergy or intolerance, please notify us," or a note that ingredient information is available.
No food-safety card for this booth
Ask an administrator if your booth needs one added.
{{ wasteBoothName }}
{{ wasteDayLabel }}
Counted in dough balls
Waste rate
{{ wasteRateText }}
of the dough made was wasted
{{ wasteWastedText }} wasted · {{ wasteSoldText }} sold · {{ wasteDenomText }} made
Wasted so far
{{ wasteWastedText }}
dough balls
Sales pending — {{ wastePendingNote }}
Year over year · {{ wasteYoYText }}
Log waste
Enter what you're wasting now — log any time during the day.
Dough balls wasted
Offline — saved on this phone with the time you logged it, and resends when you're back on signal.
Entries · this day
{{ e.count }} wasted{{ e.time }} · {{ e.by }} {{ e.syncLabel }}
No waste logged for this day yet.
Reference
Look-up screens you don't change — open one when you need it.
Schedule vs actual
{{ svaHead }}
Scheduled
{{ svaSchedText }}
Actual logged
{{ svaActualText }}
Hours variance
{{ svaVarText }}
{{ svaVarSubText }}
Today · {{ svaTodayLabel }}
Needs a look {{ svaFlagCount }} missed clock-outs, no-shows, and days that ran over or short of plan
Every finalized day is within 15% of plan — no missed clock-outs, no-shows, or overages to review.
By booth · all 10 days
{{ b.logoEl }}
{{ b.name }}
{{ b.rollupText }}
{{ b.varText }}
Not entered
Weather log · fair week
What the weather actually did each day — and how it hit the booths. High, low and conditions fill in on their own; you add the part a thermometer can't: the rain that cleared the midway, the night it was perfect.
You can read the log. Managers and admin add the notes.
{{ d.dayLabel }} {{ d.dateText }} Today {{ d.impactShort }}
{{ d.readHi }}/ {{ d.readLo }}
{{ d.readCond }} {{ d.srcLabel }}
{{ d.readHi }}/ {{ d.readLo }}
{{ d.readCond }} Entered
No live weather recorded for this day.
No live weather — enter what you saw
The internet reading didn't come through, so nothing is filled in. Type the day's high, low and sky — the log stays real instead of a guess.
How it hit the booths
Note
{{ d.noteVal }}
{{ d.stampText }}
{{ drReadOnlyText }}
The drawers come back to the plaza — count them here
One count per location — all its physical drawers dumped together as one pile. The bank is the location total (Hamburger $1,800 = five drawers added up). A finished count locks; fixing it later is a stamped reopen, never a silent edit.
Which fair day are these drawers from?
Pick the fair day first. Saturday's drawers counted Sunday morning still belong to Saturday — the app never assumes "today."
{{ dcr.name }}
One count · whole fair {{ dcr.tolText }}
{{ dcr.bankText }}
{{ dcr.stText }} {{ dcr.balText }} not locked yet
Pick day first
Practice only — Speedy Powersports is shown here so you can rehearse all five counts. On the live app it appears on the last fair day, when it's actually counted.
Speedy Powersports appears on the last fair day (Aug 16) — one count for the whole week.
Cash screens only — this login never sees timesheets, schedules, or pay. Adding or removing a location is an office change.
{{ drReadOnlyText }}
{{ dcw.locName }}
{{ dcw.dayLabel }} · {{ dcw.bankLine }}
{{ syncText }} This count has changes that have not been sent yet.
{{ syncMergeText }}
No starting bank set for this location yet — an admin sets it in Drawer settings. Totals treat it as $0 until then.
Bank just for today (optional)
Blank = use the location's set bank. Only fill this if today's starting bank was different.
$
{{ dcw.lockedMeta }}
American cash
Count the pieces — coins and bills the same way. No rolls.
{{ ur.label }}
Count
{{ ur.sub }}
American total
{{ dcw.tUS }}
Canadian cash
{{ dcw.rateText }}
{{ cr.label }}
Count
{{ cr.sub }} {{ cr.ex }}
Canadian total
{{ dcw.tCADonly }} {{ dcw.tExch }}
Left number is what you counted in Canadian dollars. Right number is what it is worth in US — that is the one that counts toward the drawer.
Adjustments — anything that hit the drawer
Payouts, comps, voids, drops to the safe, change coming in — log it here instead of remembering it. New types are added in admin · Drawer settings.
$
{{ ar.signText }}
Net sales — this location
Entered by hand
Cash-only fair — net sales IS the expected cash, no card split. Gross and discounts live in Reports. The Clover feed replaces this box at go-live.
{{ dcw.grossNote }}
$
Counted in the drawer
{{ dcw.tCounted }}
American + Canadian cash{{ dcw.tCounted }}
− Starting bank{{ dcw.tBank }}
+ Left drawer / − came in{{ dcw.tAdjOut }} / {{ dcw.tAdjIn }}
= Should match net sales{{ dcw.tAdjusted }}
Net sales entered{{ dcw.tExpected }}
Over / short
To the safe {{ dcw.tSafe }}
{{ dcw.verdictText }}
{{ dcw.tolNote }}
Notes
{{ da.line }}
Vendors
{{ vendCountText }} · set each one to Pick up or Delivered once, and the order lists sort themselves from then on.
{{ vr.name }}
{{ vr.countText }}
{{ vr.kindLine }}
Rename updates every item that uses it. Remove unlocks once no items use it.
Tonight's order
{{ onCountedText }}
{{ onTypedText }} One sheet per vendor to send · one pickup list showing where each thing comes from.
{{ onMsg }}
{{ onAwaitText }}
{{ onLastTitle }}
{{ onLastSub }}
{{ pg.name }}
{{ pg.kindText }} {{ pg.countText }}
{{ pr.item }}
{{ pr.meta }}
{{ pr.qty }}
Exactly what was in the boxes that night. Read only — tonight's numbers are below.
Nothing to order yet
This fills in as tonight's counts are FINALIZED on your Review screen. A submitted count never feeds the order — finalize it first. Anything under its par then shows up here with how much to order.
{{ g.name }}
{{ g.kindText }} {{ g.countText }}
{{ r.item }}
{{ r.meta }}
{{ r.lastText }}
{{ r.unitWord }}
Setup
{{ dashSetupLine }}
How it works
How counting works — one sheet per stand
• Each stand does one closing count — shelf stock and the stand's own storage together, one list. It sorts itself by category in kitchen order. Every box shows last night's number next to it.
• The prep log is what a stand MADE today; the closing count is what's LEFT. Made − left = used.
Par = the reorder point: below par at close flags the item for ordering. Prepped par = how much should be made & ready.
Day-long prep log — which stands log as they make
Tap a stand to turn its prep log on or off.
How saving & syncing works
• Changes save themselves about a second after you make them — no save button to forget.
• Every signed-in device picks up changes within 45 seconds, and right away when the app is opened.
• Can't reach the server? A red NOT SAVED YET bar shows and the app retries until the work lands.
• The server keeps a copy every ~10 minutes, for 14 days — "Recover earlier saves" above brings any of them back.
Admin only — your record
Nobody else can open this screen. Read-only: the order exactly as you placed it, kept with the fair instead of in a PDF on your phone.
{{ uniSizeVM.heading }}
{{ uniSizeVM.total }}
staff shirts · all booths
{{ uniSizeVM.forWhat }}
{{ bd.k }}
{{ bd.q }}
These do not add up
{{ uniSizeVM.mismatchText }}
{{ sg.g }} · {{ sg.sub }}
{{ sg.shirt }}
{{ sg.qty }} shirts
{{ pr.sz }}
{{ pr.n }}
{{ pr.meta }}
{{ pr.q }}
Spare pool
{{ uniSizeVM.spareQty }} shirts
No name on these — split them where they are needed.
{{ sp.sz }}
{{ sp.q }}
{{ sn.h }}
{{ sn.b }}
{{ uniVM.heading }}
{{ uniVM.total }}
{{ uniVM.pieces }} pieces
{{ uniVM.saved }} under the invoices
{{ uniVM.orig }} billed → {{ uniVM.total }} revised
{{ uniVM.replaces }}
{{ g.booth }}
{{ g.qty }} pieces
{{ g.total }}
{{ r.f }}
{{ r.meta }}
{{ r.cost }}
{{ r.m }}
Unit prices used
Per piece, by size — the big sizes are where a total moves.
StyleS–XL2XL3XL
{{ p.s }} {{ p.p }} {{ p.a }} {{ p.b }} {{ p.c }}
Before you pay
{{ n.h }}
{{ n.b }}
{{ drReadOnlyText }}
Anyone signed in can fix these
The exchange rate, starting banks, tolerances, adjustment types and the drawer list all live here. Every change is saved with your name, the time, and what it was before.
Canadian exchange rate
One rate for the whole fair. Change it if the bank rate moves — every count uses this until you do.
US dollars per CA$1
Starting bank & tolerance — per location
Bank is the whole location's float (all its drawers added up). Tolerance is how far off before a count flags OVER or SHORT.
{{ dsBankNote }}
{{ dsr.name }}
{{ dsr.bankCap }}
Tolerance ±$
Adjustment types
Reasons cash leaves or enters a drawer besides sales. These fill the dropdown on the count screen.
{{ dt2.n }}
{{ dt2.sign }}
Add a type
If a phone dies, the booth runs on paper
Print a count sheet per booth before each day. It lists the same items as the count screen, in the same kitchen-walk order — someone enters it into the app once a phone is back.
Blank count sheets
{{ pb.name }}
{{ pb.meta }}
Drawer count sheet
Same fields, same order as the drawer screen — US and Canadian counts, adjustments, net sales
Blank timesheet
Name · Time in · Time out · Hours — fill the booth and fair day in by hand. Same fields as the app.
If a phone dies · the procedure
Who writes, where the paper goes, who types it back in. Print it once and tape it up in each booth — blank sheets are no use if nobody knows the drill.
1 · Keep going on paper — same numbers you'd have typed, plus your name and the time.
2 · Paper goes to the booth manager at close. One pile for the night, not a pocket.
3 · Next morning the manager types it in — picking that fair day, never "today."
4 · Already finalized? Rickey reopens it. Reason: “entered from paper.”
5 · Keep the paper until the fair is over. It's the original record.
Reference prints
Item catalog
Every in-use item by booth and category — #, unit, vendor, source, par, status
Order & pickup lists
One page per source with check-off boxes, blank qty column, and the contact
Excel downloads
Item catalog (.xls)
All items with pars per booth — sort and filter in Excel
Order & pickup lists (.xls)
One table per source with a blank qty column
Fair-week schedule (.xls)
Employee × Day 1–10 grid, one table per booth
Timesheets · all days (Excel)
Every punch, planned vs actual, for payroll cross-checks
Item sales (Excel)
Row per item per fair day — real numbers once Clover is live
Nightly backup (Excel)
One file with tonight's counts, prep log, and timesheets. Download at close and keep it — a dead phone doesn't lose the day.
After the fair — the wrap-up set
Everything the books need once the gates close. Excel files are real .xlsx — clean columns, no format prompt. Every export comes as Excel and as a print-ready PDF — same numbers, table layout, page numbers.
Hours only — no rates and no dollars on this screen. Pay rates and the payroll report live under Payroll in the menu.
Where are my items?
Two separate item lists can exist on a phone: the live one, and the practice one. Edits made while the amber Practice bar is showing land in the practice list and never reach live. Here is what this phone holds right now.
Live app
{{ catLiveN }}
items · {{ catLiveSub }}
Practice
{{ catPracN }}
items · {{ catPracSub }}
{{ catMoveHint }}
You are in practice on this phone right now. Tap Exit in the amber bar, sign back in, then open this screen again.
{{ catMoveMsgText }}
Every save is kept for 14 days
While anyone is working, the server keeps a copy of the whole app about every 10 minutes. If work ever disappears, pick the copy from before it happened and restore it. Restoring never deletes anything — the copy being replaced is kept in this list too.
Found on this computer — a rescue copy · {{ recRescueWhen }}
Saved automatically the moment the server's copy replaced this device's local work. If your missing changes are in here, restoring makes them the current copy on every device.
{{ ln.t }}
{{ recMsgText }}
{{ recErrText }}
Loading the history…
No copies here yet. History starts collecting the moment this build is on the site and someone saves — from then on, every save can be brought back from this screen.
This copy — {{ recSelWhen }}
{{ ln.t }}
Every device gets this copy on its next sync.
{{ rr.when }}
{{ rr.by }}
When a number looks empty, walk up this chain
Each stage feeds the one below it. An empty stage usually means the step above it hasn't happened yet tonight — not that something broke.
1 · Item catalog
{{ dmItems }} active items. Only Active items reach counts, prep, and ordering — Draft items don't exist to the booths.
2 · Nightly counts & prep
Each booth's numbers come from its own phone. Nothing below fills in until a count is submitted.
{{ db.name }}{{ db.mode }}{{ db.status }}
3 · Par alerts · {{ dmParN }} below par now
Compares each submitted close count against the item's par. No submitted count = no alerts. Made-in-house items never flag here.
4 · Order-ready draft · {{ dmDraftN }} lines now
Rolls below-par items and prep totals into one draft on the dashboard, grouped by booth.
5 · Vendor orders & sending — preview only
Order screens build the list, but nothing sends from the app yet. Emailing, cross-phone visibility, per-day history, live sales, and live weather all arrive with the backend go-live.
Separate chains
· Timesheets → dashboard hours — works on this phone now, app-side.
· Clover register → Reports — real sales numbers wait on the backend sync.
· Weather → dashboard — needs the backend, plus dates within the 16-day forecast window.
{{ rv.title }}
{{ rv.dateLine }}
{{ k.label }}
{{ k.value }}
{{ rv.timeLine }}
{{ bl.title }} {{ bl.meta }}
{{ r.logoEl }} {{ r.name }}
{{ p.label }}
{{ p.value }}
{{ rv.msg }}
Timesheets — Whole Fair
Whole Fair · all employees
{{ wfCountLine }} · one row per person — booth is a line detail. Scheduled time is the plan; pay uses the actual punches only.
{{ p.name }} {{ p.totText }}
{{ ln.dayLabel }} {{ ln.schedText }} {{ ln.actText }} {{ ln.hoursText }} {{ ln.boothJob }} {{ ln.varText }}
Timesheets — Whole Fair · all employees {{ wfStamp }}
{{ wfCountLine }} · Scheduled is the plan — pay uses actual punches only.
{{ p.name }} — {{ p.totText }}
{{ ln.dayLabel }} {{ ln.schedText }} {{ ln.actText }} {{ ln.hoursText }} {{ ln.boothJob }} {{ ln.varText }}
Payroll register — whole fair
{{ appDate }}
{{ pwTotalsLabel }}
{{ pwPersonHiddenNote }}
{{ pwUnknownText }}
Employee Status Booths Hours Regular Clean/prep Bonus/flat Exact Round Final to pay Paid Cash / cheque # Signature
{{ pr.name }} {{ pr.statusShort }} {{ pr.booths }} {{ pr.hours }} {{ pr.reg }} {{ pr.clean }} {{ pr.bonusFlat }} {{ pr.exact }} {{ pr.rounding }} {{ pr.finalText }}    
Ready to pay {{ pwReady }} · known held {{ pwKnownHeld }} · unknown amounts {{ pwUnknownN }} · rounding {{ pwRounding }}
Potential total: {{ pwPotential }}
{{ pwReconText }}
HELD means the amount is not final and must not be paid from this sheet.
Daily Timesheet
Franklin County Fair · Malone NY
{{ printBooth }}
Fair Day {{ printFairNo }} · {{ printDayLabel }}
{{ g.role }}
{{ r.name }}plan {{ r.planText }}{{ r.inText }}{{ r.outText }}{{ r.hours }}h
Total logged hours{{ printTsTotal }}h
{{ printApprovedLine }}
Manager signature
Approval date
Night Count & Prep — Blank Sheet
Franklin County Fair · Malone NY
{{ sh.booth }}
Fair Day ______ · Date ____________
Counted by ______________________Time ________
{{ bc.cat }}
On handPrepped
{{ bi.name }}{{ bi.unit }}  
On hand = what is LEFT at close. Prepped = what you MADE today. Leave a box blank if it does not apply to that item. Enter both columns into the app as soon as a phone is back.
Manager signature
Entered into app by / date
If a phone dies — what to do
Franklin County Fair 2026 · tape this up in the booth
Booth ____________________
Fair day ______
The rule: the booth never stops counting because a phone stopped working.
1Switch to paper and keep working. Use the blank sheet for what you were doing — count sheet, timesheet, or drawer sheet. Write the same numbers you would have typed. Put your name and the time on it, because the app would have asked for both.
2Hand the paper to the booth manager at close. One pile for the whole night, kept in one place — not folded in somebody's pocket, not left on a prep table.
3The manager types it into the app the next morning — before the day gets busy. Pick the fair day the paper is from using the day chips at the top. Do not enter it as today; the numbers would land on the wrong night and the ordering would be wrong.
4If that day was already finalized, Rickey reopens it. A reopen is stamped with who did it and why — write “entered from paper” as the reason. Nothing is ever edited silently, and that is on purpose.
5Keep the paper until the fair is over. Until it is typed in and checked, the paper is the only record. After that it is the proof.
Who does what
Anyone in the booth — writes on paper, signs it, notes the time.
Booth manager — collects it at close, types it in next morning, tells Rickey if the day was finalized.
Rickey — reopens a finalized day, and saves the nightly backup file before everyone leaves.
Two things that are not paper problems: if the phone works but says OFFLINE, keep entering — it saves on the phone and sends itself when signal comes back. If you are logged out, sign back in with your PIN; nothing you already entered is lost.
Daily Timesheet — Blank
Franklin County Fair · Malone NY
Booth ____________________
Fair Day ______ · Date ____________
NameTime inTime outHours
Same fields as the app's timesheet — enter it when a phone is back.Total hours ____________
Manager signature
Entered into app by / date
Timesheet · {{ ps.booth }}
Franklin County Fair · Malone NY · {{ ps.countText }}
{{ ps.dayLine }}
Write the times on here through the day
NameScheduled Time inTime outHours
{{ pg.role }} · {{ pg.count }}
{{ pr.name }} {{ pr.plan }}
Added today
Cross out anyone who did not show. Same order as the app.Total hours ____________
Manager signature
Entered into app by / date
Drawer Counts — nothing counted yet
Franklin County Fair · Malone NY · cash-only
{{ drPSEmptyDay }}
No drawer has been counted for this day yet, so there is nothing to print.
Count the drawers in the app first, or print the blank count sheet and do it on paper.
Drawer Count — {{ ds.loc }}
Franklin County Fair · Malone NY · cash-only
{{ ds.day }}
Counted by {{ ds.by }} · {{ ds.at }}
{{ ds.locked }}
American cash
DenominationCountSubtotal
{{ ur2.n }}{{ ur2.cnt }}{{ ur2.sub }}
US TOTAL{{ ds.tUS }}
Canadian cash · rate {{ ds.rate }}
DenominationCountCAD= USD
{{ cr2.n }}{{ cr2.cnt }}{{ cr2.sub }}{{ cr2.ex }}
Exchanged to USD{{ ds.tExch }}
CAD counted{{ ds.tCAD }}
Adjustments
Type+/−Amount
{{ ax.n }}{{ ax.s }}{{ ax.a }}
None logged.
Notes
{{ ds.notes }}
The math
Counted cash{{ ds.counted }}
− Starting bank{{ ds.bank }}
= Cash from today{{ ds.fromToday }}
+ Left the drawer{{ ds.adjOut }}
− Cash in (not sales){{ ds.adjIn }}
= Should match net sales{{ ds.adjusted }}
Net sales{{ ds.net }}
OVER / SHORT{{ ds.shift }} · {{ ds.verdict }}
Verdict uses tolerance {{ ds.tol }}
To the safe{{ ds.toSafe }}
Drawer Count — Blank Sheet
Franklin County Fair · Malone NY · cash-only
Location ____________________
Fair Day ______ · Date ____________
Starting bank $__________CAD rate __________Counted by ______________________
American cash
DenominationCountSubtotal
{{ up.n }}  
US TOTAL 
Canadian cash
DenominationCountCAD sub× rate = USD
{{ cp.n }}   
EXCHANGED TOTAL (USD) 
Adjustments (type · + or − · amount)
 $
 $
 $
 $
Totals
Counted (US + exchanged) 
− Starting bank 
+ Payouts 
= CASH TO ACCOUNT FOR 
Net sales (cash-only) 
OVER / SHORT 
To the safe (counted − bank) 
One sheet per LOCATION per day — all its physical drawers counted together as one pile. Enter it into the app as soon as you're back at a phone.
Item Catalog — Reference
Franklin County Fair · Malone NY
Pars & vendors as printed · check the app for the latest
{{ cg.name }}{{ cg.n }} items
Item#UnitVendorSourceParStatus
{{ cc.cat }}
{{ ci.name }}{{ ci.num }}{{ ci.unit }}{{ ci.vendor }}{{ ci.src }}{{ ci.par }}{{ ci.status }}
Franklin County Fair · Hamelin Booths
{{ own.head.fair }} Report
{{ own.head.range }}
{{ own.head.basis }}
{{ own.head.status }}
{{ own.head.statusSub }}
01 Executive summary
{{ own.salesGateShort }}
{{ own.salesGateWhy }}
{{ e.label }}
{{ e.value }}
{{ e.sub }}
{{ e2.label }}
{{ e2.value }}
{{ e2.sub }}
02 Final fair result
Operating · booth financials
{{ o.label }} {{ o.sub }} {{ o.value }}
How Total Fair Net Sales is made up {{ own.fairIncPs }}
{{ own.fairIncPsNote }}
{{ own.fairIncPsUnavail }}
Other fair income
{{ x.label }} {{ x.sub }} {{ x.value }}
{{ own.finalLabel }} {{ own.finalValue }}
{{ own.finalNote }}
03 Sales by booth
Booth Net sales Orders Avg ticket Share
{{ b.name }} {{ b.basis }} {{ b.net }} {{ b.orders }} {{ b.avg }} {{ b.share }}
{{ b.checkLine }}
Hamburger detail
{{ h.label }} {{ h.value }}
{{ own.hbDet.note }}
{{ own.hbDet.reviewNote }}
{{ own.hbDet.why }}
{{ own.shareBasis }}
{{ own.unassignedNote }}
04 Financial performance by booth
Booth Net sales Purchases Gross profit Payroll
{{ f.name }} {{ f.basis }} {{ f.net }} {{ f.purchases }} {{ f.gp }} {{ f.gpWhy }} {{ f.pay }}
Gross profit = net sales − included purchases.
Payroll shown by booth only where source data supports it.
05 Daily performance
Day Date Net sales Orders Avg ticket
Day {{ d.n }} {{ d.date }} {{ d.net }} {{ d.orders }} {{ d.avg }}
Day context
{{ cx.rank }} {{ cx.date }} {{ cx.net }} {{ cx.context }}
{{ own.ctxNote }}
06 Charts
Net sales by fair day
{{ db2.label }}
Net sales by booth
{{ sb.name }} {{ sb.value }}
{{ own.chartBasis }}
Orders by fair day
{{ ob2.label }}
Purchases by booth
{{ pb.name }} {{ pb.value }}
Peak period
Busiest hour by sales
{{ own.peak.salesRange }}
{{ own.peak.salesValue }}
Busiest hour by orders
{{ own.peak.ordersRange }}
{{ own.peak.ordersValue }}
{{ own.peak.note }}
Every chart is drawn from the same figures the tables print.
07 Purchases
Total purchases entered {{ own.purEntered }}
Purchases included in profit {{ own.purTotal }}
Purchases held for review {{ own.purHeld }}
{{ own.purHeldNote }}
No invoices are entered for this fair, so there is no gross profit figure.
{{ own.purCount }}
By booth
{{ pbb.name }} {{ pbb.value }}
When it was bought
{{ pwn.name }} {{ pwn.count }} {{ pwn.value }}
{{ own.purWindowNote }}
{{ own.purCreditsLabel }} {{ own.purCredits }}
{{ own.purCreditsNote }}
Largest vendors
{{ pvv.name }} {{ pvv.value }}
Largest unresolved invoices
{{ pw.vendor }} {{ pw.date }} {{ pw.amount }}
{{ pw.why }}
Every invoice is listed in the appendix at the end of this report.
08 Payroll and labor
Total payroll on the ledger {{ own.payTotal }}
{{ own.payWhy }}
Booth payroll shown only where it can be attributed reliably.
09 Hamburger order types
No order-type figures are entered for this fair. The Clover feed carries no order type, so these are entered from the register’s own report and reconciled against it.
{{ own.otCountLine }}
Order type Orders Gross Discounts Net sales
{{ ot.name }} {{ ot.orders }} {{ ot.gross }} {{ ot.disc }} {{ ot.net }}
10 ATM
{{ a.label }} {{ a.sub }} {{ a.value }}
Not booth sales · counted once, at the final fair result.
11 Speedy Powersports
Net sales
{{ own.psNet }}
{{ own.psBasis }}
Labor
{{ own.psLabor }}
Net operating profit
{{ own.psAfter }}
What made up the total
{{ pl.name }} {{ pl.note }} {{ pl.amount }}
Sale lines total {{ own.psLinesTotal }}
{{ own.psLinesTie }}
Manual reporting · no Clover metrics.
12 This fair against last
{{ own.yoyHead }}
{{ yr.label }} {{ yr.cur }} {{ yr.prev }} {{ yr.change }} {{ yr.pct }}
{{ yr.note }}
13 Needs attention
Nothing is flagged for attention on this fair.
{{ at.head }}
{{ at.text }}
14 Reconciliation and audit detail
Where a Clover report figure has been entered, it is the authority and the app’s own calculation is the check. Both are shown, with the exact difference.
Basis and authority
{{ ab.text }}
How gross sales becomes net sales
{{ w.sign }} {{ w.label }} {{ w.sub }} {{ w.value }}
{{ own.wfSame }}
{{ own.wfNote }}
No Clover report figures have been entered for this fair, so every figure in this report is app-calculated and labelled as such.
Booth Clover reported App calculated Difference Status
{{ au.name }} {{ au.reported }} {{ au.calculated }} {{ au.diff }} {{ au.state }}
{{ own.psAudit.name }}
{{ own.psAudit.note }}
Reporting limitations
• {{ li.text }}
Findings in full
{{ af.src }}
{{ af.text }}
A Appendix · every invoice entered
{{ own.purCount }} · the same records the purchases section summarises.
No invoices are entered for this fair.
Date Vendor Invoice Total
{{ p.date }} {{ p.vendor }} {{ p.invoice }} {{ p.amount }}
{{ p.alloc }}
Franklin County Fair · Hamelin booths
{{ rptSheet.title }}
{{ rptSheet.statusLine }}
{{ rptSheet.statusNote }}
{{ rptLogoStrip }}
{{ rptSheet.dateLine }}
{{ rptSheet.meta }}
{{ rptSheet.timeLine }}
{{ rptSheet.srcLine }}
{{ k.label }}
{{ k.value }}
{{ bl.title }} {{ bl.meta }}
{{ h.v }}
{{ r.logoEl }} {{ c.v }}
Franklin County Fair · Hamelin booths
{{ vs.name }}
{{ rptLogoStrip }}
{{ voStampDate }}
{{ vs.totalLabel }}
{{ voStampTime }}
Note · {{ vs.note }}
{{ b.name }} {{ b.countLabel }}
{{ b.name }} · {{ b.note }}
{{ ct.cat }} {{ ct.countLabel }}
{{ it.name }} {{ it.unit }}
{{ it.desc }}
{{ it.qty }}
{{ ppTitle }}
Franklin County Fair · Hamelin food stands
{{ ppDate }}
{{ ppStamp }}
Cash needed
{{ ppTotal }}
Hours
{{ ppHours }}
People
{{ ppPeople }}
Paid
{{ ppPaid }}
{{ ppMissWarn }}
Employee Regular hours Regular pay Cleaning / prep Bonus / flat To pay (rounded)
{{ r.name }} {{ r.regH }} {{ r.reg }} {{ r.clean }} {{ r.bonus }} {{ r.total }}
Grand total {{ ppRegTotH }} {{ ppRegTotReg }} {{ ppRegTotClean }} {{ ppRegTotBonus }} {{ ppRegTotAll }}
{{ ppRegFoot }}
Individual pay is withheld on this copy — group and fair totals only.
{{ g.name }} {{ g.hours }} {{ g.pay }}
{{ p.name }} {{ p.totalPay }}
DateLocation / job InOut HoursRate Amount
{{ d.label }}{{ d.booth }} {{ d.inT }}{{ d.outT }} {{ d.hrs }}{{ d.rate }} {{ d.amt }}
Regular pay{{ p.regPay }} Cleaning / prep{{ p.cleanPay }}
Bonus / flat pay{{ p.bonusPay }} Total pay{{ p.totalPay }}
rate and individual pay withheld on this copy
{{ p.noteLine }}
Flat amounts · no hours
{{ f.name }}{{ f.kind }} {{ f.amt }}
Hours come off the managers' timesheets and are paid EXACTLY as worked — nothing is rounded into or out of anybody's pay, so this sheet and Reports agree to the cent. A day with an in time and no out time is not paid and not guessed; it stays on Needs Attention until it is entered. Cleaning and prep money is kept in its own column, never inside regular pay. No overtime. Everyone is paid cash.
Franklin County Fair · Hamelin booths
Pickup List
{{ rptLogoStrip }}
{{ voStampDate }}
{{ pkSheetPlaces }}
{{ voStampTime }}
{{ g.name }} {{ g.countLabel }}
Note · {{ g.note }}
{{ b.name }} {{ b.countLabel }}
{{ b.name }} · {{ b.note }}
{{ ct.cat }} {{ ct.countLabel }}
{{ it.name }} {{ it.unit }}
{{ it.desc }}
{{ it.qty }}
{{ os.name }}
{{ os.kind }} · Franklin County Fair · Malone NY
Fair Day ______ · Date ____________
Contact: {{ os.contact }}
Item#UnitPackQty to order
{{ oi.name }}{{ oi.num }}{{ oi.unit }}{{ oi.pack }} 
Ordered / picked up by
Date
FRANKLIN COUNTY FAIR · MALONE NY
Daily Schedule
{{ printBooth }}
Fair Day {{ printFairNo }} · {{ printDayLabel }}
SCHEDULE CHANGES — THIS DAY
{{ c.a }} — {{ c.b }}
{{ g.role }}
{{ r.name }}{{ r.timeText }}
{{ pb.name }}
Fair Schedule 2026 · Franklin County Fair · Malone NY
{{ printWeekStamp }}
EMPLOYEE
{{ d.dow }}
{{ d.md }}
{{ g.role }} {{ r.name }}
{{ sg.t }}
{{ sg.p }}
{{ c.mark }}
{{ placeholderTitle }}
This screen is being wired up in the next build step. The login, role routing, and dashboard are live now — the rest of the core workflow lands next.