Any @sunvalleylanes.com Microsoft account is an admin — sign in from Admin Access on the public site (login.html). There's no separate password to manage: a new staff member just signs in with their SVL Microsoft account and everything works. Non-SVL accounts are rejected automatically.
Public pages (Leaderboard, Weekly Results, Averages, Patterns, Player Profiles, League Flyer, Register) are what bowlers see — no sign-in. Admin pages (everything in this sidebar) require sign-in. The Public Pages group at the bottom of this sidebar opens the bowler-facing pages in a new tab so you can see what they see.
Every admin page shows a small version stamp in the bottom-right corner (e.g. v277 · 2026-07-10). If two devices show different versions, the older one is serving a cached copy — refresh once and it catches up. After any app update, one normal refresh is all a device needs.
The floating 🌙 / ☀ button at the bottom-right toggles light mode on admin pages. Public pages are always dark.
When any display is toggled ON in Customer Display, a green pulsing Live pill appears next to Customer Display in this sidebar, and the toggled-on displays are mirrored as links under Public Pages — on every admin page.
This is the full weekly sequence, in order. The Dashboard's Weekly Checklist card tracks these same steps per week — several tick themselves when the data proves they're done, the rest are manual checkboxes. Each row there also has a ? button with the same walk-through.
The tab bar mirrors the season. The dot marks the auto-detected current week; 🔒 tabs are locked (read-only across the whole app). The dashboard remembers the last tab you viewed.
The run-of-show above, per week. Items with a data signal (lanes exist, a display toggle is on, brackets drawn, payouts applied) check themselves; the rest are manual checkboxes that sync across devices. Each row has a Go → link to the right page and a ? walk-through.
Shows the week's pool split into Weekly Bank (paid out tonight) and Season Tournament Bank (held for year-end) — the two always sum to the pool exactly. Click the $X total to open the per-week bank breakdown. The same engine drives Scores, Financials, and this card, so the numbers agree everywhere.
Last 10 adds for the active week with a source badge — gold SQ = paid through Square, green ADMIN = added manually. If someone was removed then re-added, the list reflects their current state.
When a Square payment couldn't be matched to a roster bowler, a "Map Names" button appears here — it deep-links into Registration and opens the mapping modal automatically.
Locks the finished week and bumps the app's current week. Locked weeks show 🔒 on every page, and edit actions on them (scores, lanes, registration, brackets) are blocked with a toast until unlocked. This is the main protection against "edited the wrong week" accidents.
Downloads a single JSON file containing every collection in the database — keep one before any risky bulk change (rename sweeps, big imports, season transitions). Separately, the database keeps 7 days of continuous point-in-time recovery plus daily backups, so full disaster recovery is possible even without a manual file.
Pick the week tab, then check/uncheck names. Every change writes just that one name (not the whole list), so two devices working at the same time can't wipe each other's changes. Removals and adds are all recorded in the Activity Log.
When a Square payment arrives with a bowler name that isn't on the roster (typo, nickname, missing modifier), it lands in pending. Open the map modal (or the Dashboard's Map Names button), and the input pre-fills with the buyer's name — matching an alias shows a green "✓ Matched alias" hint. Confirming registers them for every week on that payment and logs each one as Square – Manual Map.
🧹 Sweep Stale Pendings deletes leftover pending log rows whose payment was already resolved. Purge All Dismissed permanently clears dismissed pendings.
Every add/remove/map/pending event with time, source, and the Square payment ID (click it to open that payment in the Square dashboard). The view loads the newest 500 rows — typing a bowler's name in the search also queries the full history, so old events (months back) are found too.
When a week sells out, bowlers can self-join the waitlist from the public Register page. The Waitlist section here groups them by week with tap-to-call phone links and a ✓ Remove per entry. Calling them is manual — no automatic texts.
On league days between 3:00–4:15 PM, the page auto-refreshes every 60s (an Auto · HH:MM:SS pill shows in the header) to catch the pre-league registration crunch.
🎲 Randomize Lanes seats everyone fairly (the shuffle is statistically unbiased). ⚡ Reduce All automatically swaps out repeat matchups from earlier weeks; 🔄 One Swap does one at a time. Drag-and-drop moves a bowler by hand.
Per-game movement boxes (G1→2 / G2→3 / G3→4) override the global default; gold = overridden. 📋 Movement Schedule shows the whole night's table and flags duplicate matchups or wraparounds. Movement syncs to the cloud, so the public standings compute the same matchups you see here.
The lane-pair controls let you take physical pairs out of service — bowlers stay on contiguous "logical" lanes while the export, display board, and texts all use the remapped physical lane numbers. Removing a middle pair renumbers the rest automatically.
For a non-standard night, the custom schedule box accepts a hand-typed per-game lane plan and honors the configured games-per-week.
Writes the R00/B00 lineup files to the Secy share. Close Conqueror's League Module first — the export modal reminds you. Entering averages and lane remaps are baked in automatically.
Each type card defines entry fee, payouts, scoring (scratch/handicap), and size. The Available Week N · ON/OFF toggle hides a type for a single week without losing its entries — flip it back on and they return. A type with entries in a locked week can't be deleted.
The registration grid lists the week's bowlers (🔍 search box filters live). Bright white names are in no bracket yet; green-edged rows are entered. The +/− buttons set entries per type; the $ due column totals what each bowler owes across visible types.
🎲 Draw [type] builds the brackets — repeat matchups are minimized and byes are balanced so frequent entrants don't keep drawing free passes. ↺ Undo re-draws. Drawing prompts about refunds for unfilled entries.
Champion/runner-up and payouts come from the same engine the public Brackets page uses, so what you pay always matches what bowlers see. Refund checkmarks (entry-fee refunds for unfilled brackets) sync across devices so a refund can't be paid twice. Editing a bracket type later never changes an already-drawn week's payouts — each week keeps a snapshot of the rules it was drawn under.
🖨 Print Sign-up Sheet for the counter; the paid-modal print report itemizes each bracket's places and amounts.
The Live Score Import panel reads the night's .s00 file. The app remembers the file location after the first pick — on later visits it silently re-reads it and shows a preview; you still click Apply Scores to commit. Applying auto-creates the week if needed.
The row editor accepts scores 0–300 and has per-game 🚫 Vacant checkboxes for no-shows: a vacant game auto-fills the configured vacant score, still counts for the opponent's matchup, but never counts in the bowler's own average, scratch, or W-L. The _pts override fields force specific point values — leave blank for automatic.
The cash line pays 1 in 6 of the paid (registered) count — a paid no-show still counts toward how many places pay.
Prefer the Files page to delete an imported week — it removes the file record and the week's data together.
Everything on this page respects week locks: edits, imports, deletes, and payout changes on a 🔒 week are blocked until it's unlocked on the Dashboard.
Turn playoffs on in Setup → General → Playoffs (weeks) (set it to 1). A gold 🏆 Week 14 tab appears on Scores / Registration / Lanes / Brackets, and the Playoffs page in the sidebar becomes the control center. Season stats freeze at Week 13 — playoff scores never touch averages, points, or the leaderboard.
Bowled 9+ of the 13 regular weeks OR earned 400+ season points — either path. On the Playoffs page click Compute from season data, adjust if needed, then Publish. Publishing is what lets bowlers claim their free Week-14 spot on the public Register page (non-qualifiers are blocked; nobody is charged).
1. Reserve the championship pair(s) on Lane Assignments (🚫 out-of-service, e.g. lanes 19–24), then Randomize — the top 8 are automatically excluded from the consolation lanes. 2. Export to Conqueror + send lane texts as usual. 3. The top 8 bowl the championship: snake pools (1·4·5·8 vs 2·3·6·7), 3 round-robin games (scratch + hdcp + 30/win, 15/tie), pool 4ths take 7th/8th, survivors seed 1–6 by combined total into single-game bracket matches (ties = 9th/10th-frame roll-off). Type each round's scores on the Playoffs page — the cut, seeds, bracket, and final placings compute automatically. 4. Import the consolation .s00 on the Scores playoff tab like a normal week — consolation standings add +20/win, +10/tie matchplay pins plus each bowler's one-time series bonus (groups of 6 down the season standings: 125, 110, 95…10).
Week 14 is funded by the season bank (the 50% put aside weekly). On the Playoffs page you type every bucket by hand: championship places 1st–8th, consolation spots (# paid + each amount — ties split the combined money), Food/Drinks, Special Awards, and the Points Pool, which splits across ALL qualifiers proportional to season points (amounts editable per bowler). The page warns when the buckets don't add up to the bank. 🖨 Print Season-End Report makes the payout sheet.
Click a bowler to edit: name, entering average, contact info, aliases (other names/spellings that should match them — Square payments and score imports check aliases too), the 🎓 Youth bowler flag (their winnings are tracked as SMART scholarship money instead of cash), linked 🟦 Square Customer IDs, and a read-only Registered Weeks summary (green pills = upcoming).
Changing a bowler's name propagates everywhere — registrations, score rows, and history follow the new spelling automatically, using fresh data so another device's recent changes aren't lost.
Bowlers with a linked Square ID get a 📊 button — it shows their center purchases on the days they bowl, with league fees tagged FEE and a "hide league fees" toggle. 🟦 Link Square IDs (header) bulk-imports ID↔name pairs by paste.
Chips filter to bowlers missing an average / email / phone / address / Square ID. CSV re-import updates averages without wiping aliases, youth flags, or Square links. The inline avg cell on each row saves on blur.
Card 1 📺 Lane Display, Card 2 🏆 Live Standings, Card 3 🥊 Brackets — each has a Show on Public Nav toggle. ON = bowlers get that page in their phone menu with a green Live pill (and the link mirrors into this sidebar's Public Pages). Turn them off after the night.
The TV boards themselves are launched from the Streaming 1 computer (F11 = full screen). Live Standings auto-scrolls at the configured px/sec, shows the clock, and rotates ads.
Upload JPG/PNG slides (auto-sized to 1920×1080). Standings Duration = seconds of standings between ads; Ad Duration = seconds per ad. Reorder, rename, toggle, or delete slides in the list. With no standings data the board loops ads continuously.
Upload/replace the flyer's Front and Back images here (drag-drop or click; auto-shrunk to fit). They appear instantly on the public flyer.html page — linked from the bowlers' menu and the home page. 🗑 Remove clears a side.
Season length + per-week dates (with overrides), weekly fee, lineage, games per week, and the scoring knobs: handicap base / % / max (210 / 85% / 51), the games-for-current threshold (12 — when a bowler's computed average takes over from their book average), and the points values (show-up 5, win 5, cash 5). Structural counts are validated so a typo can't zero the league.
Assign the oil pattern per week — it shows on Weekly Results and the public Patterns page.
SID, from-number, enabled flag, and the SMS template live here. The Auth Token is not stored in the app — it stays server-side. Send Test Text sends a one-off to any number through the exact same pipeline as lane texts — use it to verify texting end-to-end before league.
Season totals (Prize Pool, Cash Paid Out, 🎓 SMART Paid Out, Tournament Bank, House Lineage, House Brackets), a per-week breakdown (weeks without saved payouts show PROJ estimates), and the SMART by Bowler scholarship ledger for youth bowlers. 🖨 Print Report makes the black-on-white copy. These numbers come from the same engine as the Dashboard and Scores — they always agree.
The hand-set prize chart: one column per bowler-count, one row per place. The PF Calculator reads this chart, so editing here changes what future weeks pay. + Add Row extends it for turnouts outside the current range; Reset restores the built-in defaults. Save writes it to the cloud for every device.
The 📁 Files page lists every imported score file — view the raw contents, see which game slots it carried, jump to its week, or delete it (the sanctioned way to remove a week's import). The ad-slide list lives here too.
The public Register page takes card, Apple Pay, Google Pay, and Cash App Pay — all live and proven. Bowlers pick weeks, pay once for all of them, and are registered automatically within seconds. Sold-out and past-cutoff weeks grey out by themselves (self-serve closes at 4:01 PM CT on the day; you can always register anyone manually here regardless).
The app ignores Square's refund-triggered webhook re-fires, so a refunded payment can't sneak the bowler back onto the roster — but it also doesn't unregister anyone for you; that's your step 2.
Each league week must be mapped to its Square catalog item before the register page can sell it: open Square Catalog → Refresh from Square → Auto-detect → review → Save. Unmapped weeks refuse payment on purpose (that's what keeps Square's inventory/sold-out counts honest). Takes about 30 seconds a season.
📱 Send Lane Texts on Lane Assignments texts every bowler their lane for the night. The modal refreshes the contact list on open, shows exactly who'll get what, and logs every send (per-week history). Send Update is for after a re-shuffle.
Bowlers who reply STOP are handled automatically at the carrier level — they simply stop receiving texts, no action needed. The 🚫 Opt-Outs button (Send-Lane-Texts header) lists every textable bowler and lets you manually mark/unmark someone who asks in person.
Setup → Communications → Send Test Text — same pipeline, one number, instant verification.
| Symptom | Fix |
|---|---|
| Page looks outdated / missing a new feature | Refresh once. Check the version tag (bottom-right) matches your other devices — the app serves instantly from cache and updates in the background, so one reload after an update is normal. |
| A Square payment didn't register anyone | Check Registration → Map Unmatched (or the Dashboard's Map Names button). The name on the order probably didn't match the roster — map it once and it's learned forever. Consider adding the variant as an alias on the bowler. |
| Bowler says texts stopped | They likely replied STOP at some point. Open 🚫 Opt-Outs (Send Lane Texts header) and unmark them — and have them text START to the league number. |
| Import preview warns "looks like Week X data" | The .s00 file on disk is from a previous week. Load the right file before applying — the warning exists because applying it would duplicate last week's scores into tonight. |
| Edit blocked with a 🔒 toast | The week is locked. Unlock from the Dashboard if the edit is genuinely needed, re-lock after. |
| Numbers differ between two pages | They shouldn't — all money/points math runs through shared engines. First rule out a stale tab (refresh both). If it persists, note the two pages + week and report it. |
| The public site looks wrong at the center but fine on your phone | The office network's DNS caches hard — changes can lag on-site while being live everywhere else. Give it time or test on cellular. |
| Rule | Value |
|---|---|
| Handicap | 85% of (210 − average), capped at 51. No established average = 0 handicap. |
| Entering vs current average | Book (entering) average is used until a bowler has 12 league games; computed average takes over after. |
| Weekly points | 5 show-up · 5 per match win (ties = 2.5) · position points = field size − place + 1 · 5 for cashing. |
| Cash line | 1 in 6 of the paid/registered count (paid no-shows count toward spots), minimum 1. |
| Season ranks | Ties share a place — except the top 8, which is strictly ordered (tie-break: season wins → weeks bowled → average). |
| Season tournament eligibility | 400 points or bowl 9 weeks. |
| Self-serve registration cutoff | 4:01 PM CT on the day of bowling (admin manual registration works anytime). |
| Vacant score | Configured in Setup (default 200). Counts for the opponent's matchup; never for the vacant bowler's own stats. |
| League fee | $25/week (display comes from Setup; the charge amount comes from the Square catalog item). |
| Conqueror files | Lineups (R00/B00) export to \\192.168.254.99\Secy · scores come back as the night's .s00 file. |