Admin Guide
The Challenge Admin
❓ Admin Guide Everything about running The Challenge from the admin side — league night, payments, scoring, displays, and the safety rules.
🔑

Access & Basics

Who can sign in

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.

The two sides of the app

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.

The version tag

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.

Light / dark mode

The floating 🌙 / ☀ button at the bottom-right toggles light mode on admin pages. Public pages are always dark.

Live pills

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.

📅

League Night Run-of-Show

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.

  1. Print Bracket Sign-up Sheet — Open 🥊 Brackets, select the current week tab, click 🖨 Print Sign-up Sheet. Set the number of rows and check the bracket types to include (types that are OFF this week start unchecked — check them to force-include). Click 🖨 Print, then print from the preview window.
  2. Randomize Lanes — Open 🎳 Lane Assignments, select the current week tab. Confirm the registered bowlers are listed, then click 🎲 Randomize Lanes (reads 🎲 Re-randomize Lanes once lanes exist). Check the matchups for repeat opponents and click ⚡ Reduce All to swap them out automatically (🔄 One Swap applies a single best swap). To fix a slot by hand, drag-and-drop a bowler, or use the slot's 🚫 to mark a no-show as Vacant.
  3. Set the Movement Schedule — On the week tab, use the bar above the lane cards. Set Pairs to move for the global default, or set the per-game G1→2 / G2→3 / G3→4 boxes individually (overridden games turn gold; ↻ Reset clears them). The Swap odd/even checkbox controls the odd/even start rule. Click 📋 Movement Schedule to preview the full table and confirm there are no duplicate-matchup or wraparound warnings.
  4. Export to Conqueror — Click 🎳 Export to Conqueror. A warning modal reminds you to close the League Module in Conqueror first — close it, then click 🎳 Confirm Export. The R00/B00 files are written to the Secy share (\\192.168.254.99\Secy) so Conqueror can load the lineup.
  5. Conqueror: closing delay to 15 seconds — In Conqueror: Front Desk → Leagues → BLS Leagues, select the current "The Challenge" league (most recent ID #), OK. Then Setup → Technical, change "Delay in closing lanes (sec)" to 15, and Save.
  6. Conqueror: set lane options — From the League Setup page click Options. In the "Custom Options Set" menu on the left choose "League", click Set to league, then Yes to confirm.
  7. Send Lane Texts — On the Lane Assignments week tab, click 📱 Send Lane Texts. The modal reloads the customer list first so overnight STOP opt-outs are respected. Review recipients + message preview, then Send. Use Send Again / Send Update if assignments change after the first send.
  8. Open the Lane Display Board — from the Streaming 1 computer: open Customer Display and click 📺 Open Display Board (Card 1: 📺 Lane Display), or open display.html directly. Press F11 for full screen. It shows each lane's bowlers, defaulting to the "By Name" view.
  9. Show Lane Display on Public Nav — Customer Display, Card 1 (📺 Lane Display): turn Show on Public Nav ON. Bowlers get a Lane Assignments link with a green Live pill on their phones.
  10. Calculate Prizefund + Print Forms — Open 📊 Scores, current week tab, click 💰 PF Calculator, review the spots/amounts, click ✓ Apply to Payouts. Then use ✂ Print Slips and 💵 Print Bill Breakdown (and 🖨 Print Payouts) for the paperwork. Can be done at any point — not only after all 4 games are in.
  11. Draw Brackets — Open 🥊 Brackets, current week tab. Once entries are in, click 🎲 Draw [type name] for each bracket type and confirm. ↺ Undo [type name] redoes a draw. Matchups are assigned and byes balanced automatically.
  12. Show Brackets on Public Nav — Customer Display, Card 3 (🥊 Brackets): turn Show on Public Nav ON.
  13. Show Live Standings on Public Nav — Customer Display, Card 2 (🏆 Live Standings): turn Show on Public Nav ON.
  14. After Game 1 — Display Standings — from the Streaming 1 computer: Customer Display → 📺 Display Standings (Card 2), or open standings.html directly; F11 for full screen. It auto-scrolls, rotates ads, and updates live as scores import.
After the night is finalized (scores imported, payouts applied), use Lock & Advance on the Dashboard — it locks the week against accidental edits everywhere and moves the app to the next week.
🏠

Dashboard (admin.html)

Week tabs

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.

Weekly Checklist card

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.

Prize Pool card

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.

Recent Registrations

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.

Map Names buttons

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.

Lock & Advance

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.

💾 Backup Now

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.

📋

Registration

Adding / removing bowlers

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.

Map Unmatched Registrations (Square pendings)

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.

Mapping a name once teaches the app permanently — the next payment with the same raw name auto-registers (Square – Auto Map in the log).

🧹 Sweep Stale Pendings deletes leftover pending log rows whose payment was already resolved. Purge All Dismissed permanently clears dismissed pendings.

Activity Log

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.

Waitlist

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.

Auto-refresh

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.

🎳

Lane Assignments

Building the night

🎲 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.

Two ways to clear a slot — they are different

  • Slot 🚫 (Mark Vacant): the bowler comes off the lane and a VACANT placeholder fills the slot. They stay registered. Use for a no-show after texts went out.
  • Slot ✕ (Remove): clears the slot only — bowler stays registered, back in the pool.
  • Pool ✕: this one unregisters the bowler from the week (and writes an audit-log entry).

Movement

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.

Out-of-service lanes

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.

Custom schedule

For a non-standard night, the custom schedule box accepts a hand-typed per-game lane plan and honors the configured games-per-week.

🎳 Export to Conqueror

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.

🥊

Brackets

Bracket types

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.

Entering bowlers

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.

Drawing

🎲 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.

Money

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.

Paperwork

🖨 Print Sign-up Sheet for the counter; the paid-modal print report itemizes each bracket's places and amounts.

📊

Scores & Prize Fund

Importing scores (.s00 from Conqueror)

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.

If the loaded file looks like a different week's data (e.g. last week's file still in the folder), a red banner + confirm modal warn you before anything is applied. Don't click through it without checking.

Editing rows

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.

💰 PF Calculator → payouts

  1. Click 💰 PF Calculator on the week panel. Spots and amounts come from the operator-edited Payout Chart keyed to the week's paid-bowler count.
  2. Review, adjust if needed, then ✓ Apply to Payouts — this saves the official payouts for the week (what Financials and the public boards treat as final).
  3. Print: ✂ Print Slips (cuttable signature slips, ties split evenly), 💵 Print Bill Breakdown (denominations $20/$10/$5/$1 + bank order), 🖨 Print Payouts (the summary sheet).

The cash line pays 1 in 6 of the paid (registered) count — a paid no-show still counts toward how many places pay.

Deleting a week

Prefer the Files page to delete an imported week — it removes the file record and the week's data together.

Locks

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.

🏆

Playoffs (Week 14)

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.

Who qualifies

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).

Playoff night — run of show

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).

The money

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.

The side ($5) brackets on playoff night are consolation-only — the top 8 are hidden from the Week-14 bracket grid automatically once the qualifier list is published.
🎳

Bowlers (Roster)

The edit modal

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).

Renames are safe

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.

Deleting a bowler: remove them from their registered weeks FIRST, then delete the name. Deleting first leaves their name stranded in those weeks (it even shows on the Brackets grid) with nothing to manage it by. The delete confirm warns you with the exact weeks if they're still registered — don't ignore it.

Square purchase history

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.

Filters & import

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.

📡

Customer Display

The three live displays

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.

Standings 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.

📄 League Flyer

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.

Setup

League configuration

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.

Patterns

Assign the oil pattern per week — it shows on Weekly Results and the public Patterns page.

Communications (Twilio)

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.

💰

Financials & Payout Chart

Financials

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.

Payout Chart

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.

Files

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.

💳

Square Payments & Refunds

How bowlers pay

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).

What the automation does

  • Registers the bowler for every week on the payment, matching the roster by name or alias (stray double-spaces and casing are normalized).
  • Payments that can't be matched go to pending → the Map Names flow in Registration.
  • Duplicate webhook fires, retries, and double-submits are all de-duplicated — a payment registers a bowler exactly once.
  • The payer's Square customer account is linked to the bowler automatically (powers the 📊 purchase history).
  • A branded confirmation email goes to the bowler with weeks, total, and their Square receipt.

Refunds — the right order

  1. Issue the refund in the Square Dashboard (the app never moves money itself).
  2. Then remove the bowler from the week(s) on the Registration page.

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.

🟦 Square Catalog (once per season)

Each league week must be mapped to its Square catalog item before the register page can sell it: open Square CatalogRefresh from SquareAuto-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.

📱

Texting (SMS)

Lane texts

📱 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.

Opt-outs

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.

Testing

Setup → Communications → Send Test Text — same pipeline, one number, instant verification.

🛟

Data Safety Rules

  1. Unregister before you delete. Removing a bowler from the roster while they're still registered for weeks strands their name in those weeks. Remove them from every week first — the delete confirm warns you which weeks are affected.
  2. Lock finished weeks. Lock & Advance after each night. Locks are what stop a stray click from editing history — every page honors them.
  3. Don't edit the same week from two devices at once. Different weeks are safe; the same week simultaneously is last-save-wins.
  4. Watch for the red toast. "⚠ cloud sync FAILED — saved on this device only" means the change did NOT reach the other devices. Fix the connection and redo the action.
  5. 💾 Backup Now before anything bulky — big imports, roster surgery, end-of-season work. One click on the Dashboard, one JSON file, cheap insurance (plus 7-day point-in-time recovery behind the scenes).
  6. Refunds: Square first, then unregister. See the Square section — the app blocks the re-add, you do the removal.
🔧

Troubleshooting

SymptomFix
Page looks outdated / missing a new featureRefresh 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 anyoneCheck 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 stoppedThey 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 🔒 toastThe week is locked. Unlock from the Dashboard if the edit is genuinely needed, re-lock after.
Numbers differ between two pagesThey 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 phoneThe office network's DNS caches hard — changes can lag on-site while being live everywhere else. Give it time or test on cellular.
📖

Quick Reference

RuleValue
Handicap85% of (210 − average), capped at 51. No established average = 0 handicap.
Entering vs current averageBook (entering) average is used until a bowler has 12 league games; computed average takes over after.
Weekly points5 show-up · 5 per match win (ties = 2.5) · position points = field size − place + 1 · 5 for cashing.
Cash line1 in 6 of the paid/registered count (paid no-shows count toward spots), minimum 1.
Season ranksTies share a place — except the top 8, which is strictly ordered (tie-break: season wins → weeks bowled → average).
Season tournament eligibility400 points or bowl 9 weeks.
Self-serve registration cutoff4:01 PM CT on the day of bowling (admin manual registration works anytime).
Vacant scoreConfigured 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 filesLineups (R00/B00) export to \\192.168.254.99\Secy · scores come back as the night's .s00 file.
Admin Guide · last updated v277 · 2026-07-10 — if the app has visibly changed since this date, trust the app and flag the guide for an update.