Entry Booth Reconciliation System
Select Your Role
Who is signing in?
👷 Employee
🏛 Manager
Galveston Fishing Pier
Entry Booth Reconciliation
Clover: off Employee
Pending Shifts
Reconcile
Shift Log
💰 Bag Count
🏦 Deposit
Settings
📱 Clover Setup Guide
📖 README
Shift Start — Opening counts & band numbers
Shift Start — Your Info
Drawer Count

Enter the quantity of each denomination — not the dollar value. Totals calculate automatically.

¢1¢5¢10¢25 $1$5$10$20$50$100 Total
Start
Rod Rental Count

List how many rods are rented out and how many are available on the pier.

Rented Out Available Total
Start
Opening Band Numbers

Enter the first band number on each roll as you begin the shift. For Shift 3, enter both the midnight changeover set (Set A — start of shift) and the morning set (Set B — after midnight swap).

Adult
Senior
Child
Shift End — Closing counts, exceptions & drawer
Shift End — Closing Band Numbers

Enter the last band number on each roll at end of shift — the closing band is still on the roll and is not counted as sold. Bands sold = Close # − Open #.

TierClosing Band #Sold (auto)
Adult
Senior
Child
Band Changes (Mid-Shift Roll Swaps)

If any roll was swapped mid-shift, log the old closing # and new opening # here.

Exception Bands

Log every band that left the roll without a clean paid sale.

0
Voided
0
Damaged
0
Refunds
0
Total
Cash Out Time
Notes / Shortages
📋
No pending shifts.
Shifts submitted by employees will appear here.
Quick Stats
Pending review0
Reconciled today0
Issues today0
Total shifts in log0
Start a Manual Reconciliation

If an employee didn't use the app, you can manually enter a shift here.

Shift Information
Band Counts — All Three Rolls
Adult Roll
Senior Roll
Child Roll
Clover Sales Data

Configure Clover in Settings → Clover API to enable auto-pull.

Exception Bands

Bands not resulting from a clean paid sale.

0
Voided
0
Damaged
0
Refunds
0
Total
Reconciliation
New Count Entry
Date Assigned Total Ret. Pennies Nickels Dimes Quarters Ones/2s Fives Tens Twenties Fifties Hundreds Over/Short Counted By Shrt Owed Shrt Paid Balance
Select an employee to view history
Reports
Auto-filled from shift totals below — edit to override
Cash Downstairs
Cash Payouts
Refund
Less: Tips
Total
Shifts
Shift Cashier Cash Sales Refunds Payouts Tips S/B Actual Difference
7a – 3p $0.00 $0.00
3p – 11p $0.00 $0.00
11p – 7a $0.00 $0.00
Total $0.00 $0.00 $0.00 $0.00 $0.00 $0.00 $0.00
Difference $0.00
Deposit
Denomination Qty Amount
$100 $0
$50 $0
$20 $0
$10 $0
$5 $0
$1 $0
Coins $0.00
Total $0.00
S/B $0.00
Difference $0.00
Submitted Deposits
Date Prepared By Cash Down. Payouts Refund Tips Rpt Total Total S/B Actual Shift Diff Dep. Total Dep. Diff
No deposits submitted yet
Shift Log
📋
No shifts logged yet.
Employee PIN Setup
Assign each employee a unique 4-digit PIN. When they enter it on the sign-in screen, their name is automatically selected in the shift form. PINs must not match the shared Employee PIN or Manager PIN.
Loading employee list…
Reconciliation Thresholds
Flag refunds/voids processed this many minutes after original sale
Diff ≤ this = review; diff > this = mismatch
Used to correctly convert shift times when pulling Clover data
Thresholds saved.
Clover API Configuration
Not configured
CORS note: Clover's API works natively when this app runs in the Clover terminal's browser. For external browsers, you may need a local proxy.
Log in at clover.com/dashboard
Go to Account & Setup → API Tokens and create a token with Orders: Read and Inventory: Read
Copy your Merchant ID from the dashboard URL
Paste both values below and click Save
Item Names in Clover (for SKU matching)
Clover configuration saved.
Error Log
0 entries
No log entries.
Live App URL
Active

🌐 https://gfp-recon.netlify.app

This is your deployed app. Open this URL on any device — Clover terminal, manager phone, office computer. The PIN gate controls what each person sees. All shift data is stored locally on whichever device submits it.

Step 1 — Open the App on the Clover Terminal
At the Pier
On the Clover terminal, tap the Web Browser app from the home screen (or find it in the app drawer).
Tap the address bar and type: gfp-recon.netlify.app — tap Go.
The app loads with the PIN screen. Confirm you see Galveston Fishing Pier — Entry Booth Reconciliation System.
Tap the browser menu (three dots ⋮) → Add to Home Screen. Name it GFP Reconciliation. It will now appear as an icon on the Clover home screen for one-tap access.
Step 2 — First-Time Configuration (Manager, One Time)
Do Once
Tap 🏛 Manager → enter PIN 9999 → tap the Settings tab.
PIN Management: Change the Employee PIN to something staff will remember. Change the Manager PIN to something only managers know. Tap Save PINs.
Clover API Configuration: Enter the Merchant ID and API Token from your printed setup sheet. Tap Save Configuration.
Tap Test Connection — it should say "✓ Connected — GALVESTON FISHING PIER". If it says "off", double-check the Merchant ID and token for typos.
Reconciliation Thresholds: Set your location name if desired. Leave the refund delay threshold at 5 minutes unless you want to adjust it. Tap Save Thresholds.
Step 3 — Test One Full Cycle Before Going Live
Recommended
Employee test: Sign in as Employee → select any name → Shift 1 → enter a fake day code → enter fake opening band numbers (e.g. Adult 1000, Senior 400, Child 50) → Continue → enter closing numbers a few higher → Submit Shift.
Manager test: Sign in as Manager → Pending Shifts tab → tap the test shift → Reconcile tab → set today's time window → Pull from Clover → Run Reconciliation → Save to Shift Log.
Clean up: Go to Shift Log tab → click the test entry → Delete to remove it before going live.
Updating the App in the Future
When a new version of the HTML file is ready, deploy it to Netlify to update all devices instantly — no action needed on the terminal.
Go to app.netlify.com → log in → click the gfp-recon site → click the Deploys tab.
Scroll to the bottom of the Deploys page — drag the new gfp_reconciliation.html file onto the drag-and-drop zone.
Wait ~15 seconds for "Published" confirmation. Refresh the app on any device — it's instantly updated everywhere.
Note: Settings (PINs, Clover credentials) are stored in the browser's localStorage — they are NOT wiped by a Netlify update. They only reset if you clear the browser data.
Credentials — Keep This Secure
App URL: gfp-recon.netlify.app
Merchant ID: 1WDBH5DM562K4
API Token: cc00a456-b01b-8405-e12d-f56774e5d5f7
Default Employee PIN: 1234 — change on first setup
Default Manager PIN: 9999 — change on first setup
Lockout: 5 failed attempts → 30 sec cooldown
Shift Schedule
Shift Hours
Shift 1 6:30 AM – 3:30 PM
Shift 2 2:30 PM – 11:30 PM
Shift 3 10:30 PM – 7:30 AM
Employee Workflow — Every Shift
1 Open app → tap 👷 Employee → enter PIN
2 Shift Start: Select your name, pick shift, enter day code from manager, enter opening band # for Adult / Senior / Child rolls
3 Tap Continue to End of Shift — work your shift
4 Shift End: Enter closing band #s (issued count auto-calculates), log any exception bands, count the cash drawer by denomination
5 Add any notes / shortages → tap ✓ Submit Shift to Manager → sign out → lock register
⚠ Employee never sees Clover totals or reconciliation results
Manager Workflow — After Each Shift
1 Open app (any browser / device) → tap 🏛 Manager → enter PIN
2 Pending Shifts tab → tap the submitted shift to load it into the Reconcile form
3 Set the shift time window → tap Pull from Clover ↓ to auto-fill Adult / Senior / Child / Early Bird / Season Pass counts
4 Tap Run Reconciliation ▶ — review result and any flags
5 Tap Save to Shift Log — done. Use Shift Log tab to review history, filter by status, and export CSV
Flag meanings: 🚨 Red = band count mismatch — investigate immediately  |  ⚠ Yellow = review recommended (late refund, sequential gap, solo child sale)
📖
GFP Entry Booth Reconciliation
Galveston Fishing Pier · v1.0 · Single-file web app · No server required

A daily shift reconciliation system for the Galveston Fishing Pier entry booth. Employees submit wristband counts and cash drawer totals at the end of each shift. Managers pull live sales data from Clover POS and reconcile band counts against actual admissions — flagging discrepancies, late refunds, and sequential band gaps automatically.

Quick Facts
Live URL: https://gfp-recon.netlify.app
File: gfp_reconciliation.html (single file, ~125 KB)
Dependencies: None — vanilla HTML/CSS/JS
Storage: Browser localStorage (per-device)
Clover Merchant ID: 1WDBH5DM562K4
API Token name: GFP (read-only, all 6 scopes)
Default Employee PIN: 1234
Default Manager PIN: 9999
Architecture

The entire app is a single self-contained HTML file. No build step, no npm, no backend. Drop it anywhere — a web host, a local network server, or a USB drive — and it runs.

Data Layer
  • gfp_pending — submitted employee shifts awaiting manager review
  • gfp_shifts — reconciled shift history log
  • gfp_config — PINs, Clover credentials, thresholds
  • gfp_fails — PIN lockout tracking

All stored in localStorage on the device. Data persists across sessions but is device-specific. Export CSV from Shift Log to back up.

Clover API Calls
  • GET /v3/merchants/{mid}/orders — pulls paid orders in shift window, paginated at 200/page
  • GET /v3/merchants/{mid}/employees — populates employee name dropdown

All calls use Bearer token auth. Read-only scopes only. Works from any origin (no CORS issue with Clover's API).

Roles & Access
Role PIN Can See / Do Cannot See
Employee Set in Settings Shift Start form, Shift End form, Exception log, Drawer count, Submit shift Clover totals, reconciliation results, shift history, manager tabs
Manager Set in Settings All tabs: Pending Shifts, Reconcile, Shift Log, Settings, Clover Setup Guide, README Nothing hidden

Lockout: 5 failed PIN attempts triggers a 30-second cooldown. Tracked per-role in localStorage.

Shift Data Flow
Employee submits Saved to Pending queue Manager loads & pulls Clover Reconcile & save to log
  • Step 1 — Shift Start (Employee): Date, shift (1/2/3), name from dropdown, day code, Cash In time, opening band # for Adult / Senior / Child rolls
  • Step 2 — Shift End (Employee): Closing band # per roll (issued count auto-calculates as Close − Open (closing band is still on roll)), band changes if roll swapped mid-shift, exception bands (void / damaged / refund) with band number, denomination-level cash drawer count, notes / shortages
  • Submit → Lock: Employee taps Submit — data is written to gfp_pending, the form resets, and the employee is shown a confirmation screen. Data cannot be edited after submission.
  • Manager Reconcile: Manager selects pending shift, sets shift time window, taps Pull from Clover (auto-fills Adult / Senior / Child / Early Bird / Season Pass counts from live order data), reviews, runs reconciliation math, reviews flags, saves to Shift Log.
  • Shift Log: Permanent record. Filterable by status / shift / date. Per-record detail overlay. CSV export. Delete individual records.
Reconciliation Math
Per Roll (Adult / Senior / Child)
  • Issued = Close # − Open # (closing band stays on roll)
  • Exceptions = voided + damaged + refunded bands for that roll
  • Clean Sales = Issued − Exceptions
  • Roll Diff = Clean Sales − Clover net for that tier
Overall
  • Total Issued = sum of all 3 rolls issued
  • Total Clean Sales = Total Issued − all exceptions
  • Clover Net = Adult + Senior + Child + Early Bird + Season Pass − Refunds
  • Total Diff = Total Clean Sales − Clover Net
  • Status: Diff = 0 → Clean · Diff ≠ 0 → Mismatch
Reconciliation Flags
Flag Severity Meaning
Band count mismatch 🚨 Critical Physical bands issued ≠ Clover net sales. Investigate immediately.
Sequential gap ⚠ Warning (Close − Open) ≠ Clover + exceptions. A band was pulled from the middle of a roll without being logged.
Refund mismatch ⚠ Warning Clover refund count ≠ physical refund exception bands logged by employee.
Refund / void delay ⚠ Warning A refund or void was processed more than N minutes after the original sale. Threshold configurable in Settings (default 5 min). Common theft indicator.
Solo child sale ⚠ Info Child bands sold with no adult or senior in same shift. Unusual — may indicate a data entry error or an unsupervised minor.
Clover Item Name Mapping

The app matches Clover order line items using case-insensitive partial string matching against the configured item names. Configurable in Settings → Clover API → Item Names.

Tier Default Match String Counts Toward
AdultNEW Adult Day PassAdult column + Total wristbands
SeniorNEW Senior Day PassSenior column + Total wristbands
Child (5–10)NEW Kids 5-10 Day PassChild column + Total wristbands
Early BirdEARLY BIRDEarly Bird column + Total wristbands
Season PassCurrent Season Pass HolderSeason Pass column + Total wristbands (free but gets a band)
Settings Reference
Section Field Notes
PIN ManagementEmployee PIN4-digit, shared with all booth staff. Default: 1234.
Manager PIN4-digit, managers only. Default: 9999.
Reconciliation ThresholdsLocation NamePrinted on reports. e.g. "Entry Booth".
Refund Delay ThresholdMinutes after sale before a refund/void is flagged. Default: 5.
Band Diff WarningNon-zero diff threshold before showing a warning (default 0 = any diff flagged).
Clover APIMerchant ID1WDBH5DM562K4
API TokenGFP token (read-only). From Clover Dashboard → Setup → API Tokens.
Item NamesPartial match strings for Adult / Senior / Child / Early Bird / Season Pass.
Test ConnectionVerifies Merchant ID + token. Should return "✓ Connected — GALVESTON FISHING PIER".
Deployment & Updates

The app is hosted on Netlify as a static file deploy. No CI/CD — updates are drag-and-drop.

To update the live site:
  1. Go to app.netlify.com → log in
  2. Click gfp-reconDeploys tab
  3. Scroll to bottom → drag new gfp_reconciliation.html onto the drop zone
  4. Wait ~15 sec for "Published" — all devices update instantly

Settings (PINs, credentials) are in localStorage — NOT wiped by a Netlify deploy.

To add to Clover terminal home screen:
  1. Open Clover terminal browser
  2. Go to gfp-recon.netlify.app
  3. Tap ⋮ → Add to Home Screen
  4. Name it GFP Reconciliation
Employee List

Loaded live from Clover. To add or remove employees, update them in Clover — the app picks up changes automatically on next load.

Loading…
Known Limitations & Notes
  • localStorage is per-device. A shift submitted on the Clover terminal must be reconciled from the same terminal (or any device that opens the same URL — pending shifts are only on the submitting device's localStorage). For multi-device shared state, a backend would be needed.
  • Clover API requires credentials. The Pull from Clover button will not function until Merchant ID and API Token are entered in Settings. The employee form and all manual entry features work without credentials.
  • Clover OAuth not used. The app uses a static API token rather than OAuth. This means it cannot auto-identify the logged-in Clover user. PIN-based role selection is used instead. OAuth is only available for published Clover App Market apps.
  • Senior item name typo. The Clover item is named "NEW Senior Day Pass (Miltary, Veteran) CHECK ID" — note "Miltary" (not "Military"). The app matches on "NEW Senior Day Pass" so it works correctly, but the typo exists in Clover itself.
  • No server-side backup. Data lives in browser localStorage. Clear browser data = lose shift history. Export CSV regularly from Shift Log as a backup.
Context for AI / New Chat Sessions

Copy this block into a new chat to give an AI assistant full context about this app.

## GFP Entry Booth Reconciliation App **File:** gfp_reconciliation.html (~125KB, single file, no dependencies) **Live URL:** https://gfp-recon.netlify.app **Hosted on:** Netlify (drag-and-drop deploy — no CI/CD) **Source location:** /Users/jimmymcclure/Desktop/gfp_reconciliation.html ### What it does Daily shift reconciliation for the Galveston Fishing Pier entry booth. Employees submit wristband counts + cash drawer at end of shift. Managers pull live Clover POS data and reconcile band counts vs admissions, flagging discrepancies, late refunds, and sequential band gaps. ### Tech stack Vanilla HTML/CSS/JS · No build step · No npm · No server localStorage keys: gfp_pending, gfp_shifts, gfp_config, gfp_fails Clover API: GET /v3/merchants/{mid}/orders + /employees (Bearer token, read-only) ### Clover credentials (already configured in Settings) Merchant ID: 1WDBH5DM562K4 API Token: cc00a456-b01b-8405-e12d-f56774e5d5f7 Token name: GFP · Permissions: Customers, Employees, Inventory, Merchant, Orders, Payments (all read) ### Clover item names (partial match, case-insensitive) Adult: NEW Adult Day Pass ($16) Senior: NEW Senior Day Pass (Miltary, Veteran) CHECK ID ($10) Child (5-10): NEW Kids 5-10 Day Pass ($8) Early Bird: EARLY BIRD ($17) Season Pass: Current Season Pass Holder ($0, still gets wristband) ### Shift schedule Shift 1: 6:30 AM – 3:30 PM Shift 2: 2:30 PM – 11:30 PM Shift 3: 10:30 PM – 7:30 AM ### Roles Employee PIN: configurable (default 1234) — sees shift entry forms only, never sees Clover totals Manager PIN: configurable (default 9999) — sees all tabs including reconcile, history, settings ### Pages / tabs (manager view) - Pending Shifts — submitted employee shifts awaiting reconciliation - Reconcile — band count entry + Clover pull + reconciliation math + flags - Shift Log — history, filterable, CSV export, per-record detail overlay - Settings — PINs, Clover API config, thresholds - Clover Setup Guide — pier setup instructions - README — this document ### Employee flow (2 steps) Step 1 (Shift Start): name dropdown (from Clover), date, shift, day code, opening band # per roll (Adult/Senior/Child) Step 2 (Shift End): closing band # per roll, band changes, exceptions (void/damaged/refund), drawer count by denomination, notes → Submit & lock ### Reconciliation flags - Band count mismatch (critical) — physical bands ≠ Clover net - Sequential gap (warning) — band pulled from middle of roll - Refund mismatch (warning) — Clover refund count ≠ logged exception bands - Refund/void delay (warning) — refund processed >N min after sale (configurable, default 5 min) - Solo child sale (info) — child bands with no adult/senior ### Employee list Loaded live from Clover API on every sign-in. No hardcoded fallback. Manage employees in Clover — changes appear automatically on next load. ### Known limitations - localStorage is per-device (pending shifts only visible on submitting device) - No Clover OAuth (static token only — OAuth requires App Market approval) - No server-side backup — export CSV regularly - Senior item name has typo in Clover: "Miltary" not "Military" (app works around this)
Shift Detail