What's New
The latest features and improvements shipped to Picklebeast.
May 2026
May 28, 2026
Tournaments
Standings Preview — Award-Winning Live Standings
Tournament standings now read like real tournament software: clear column labels, a tap-(ⓘ)-for-legend chip, a stage-aware contextual banner, per-pool grouping when divisions split into 2+ pools, and a green pulsing 'Live' indicator while matches are running. Available on every doubles round-robin AND individual-rotating mixer division. Includes a server-side fix for the bench-leak bug that surfaced removed players as still-registered, and a new REGISTERED · UNASSIGNED chip so removed players can see their state.
- Columns renamed: PS/SD/PE/PD → Rank/Seed/PF/+/-, with a tap-for-legend chip
- Stage-aware banner: 'Registration open' → 'Schedule published' → live pulse → 'Final standings'
- Per-pool sections for multi-pool divisions with 'Top N advance' chip
- Tap any column header to sort; tap twice to reverse, three times to clear
- Doubles RR and IR both consume the same standings_state contract
- Bench leak fixed: benched players no longer surface in the live preview
- New REGISTERED · UNASSIGNED chip on the division selector for removed players
- Mobile detection now consumes a single /my_status call (was N+1)
May 27, 2026
Tournaments
Mixer Multi-Pool — Split Big IR Fields Into Parallel Pools
Individual-rotating (mixer / rotating-partners) tournament divisions can now be split into 1–8 pools. Each pool runs its own rotating-partner schedule with its own round target and per-pool standings; top N from each pool advance via snake-seeded cross-pool bracket. Single-pool back-compat fully preserved.
- 1–8 pools per IR division with admin-set count
- Auto-balance by DUPR snake-draft, random shuffle, or manual drag/drop
- Per-pool target_pool_rounds override (Pool A=3 rounds, Pool B=5)
- Three playoff modes: top-N-per-pool · all-from-all-pools · single-pool back-compat
- Snake cross-pool seeding (1A·1B·1C·1D · 2D·2C·2B·2A) protects top seeds
- Cross-pool court allocation keeps all courts in play across pools
- Mobile: pool filter chip rail on standings + Pool A chip on match cards
- ResetPoolPlayService is pool-aware — reset one pool without touching others
May 23, 2026
Leagues
Drop-In Rung Ladder — Drop-In Mexicano with One Cumulative Leaderboard
A new league format combining drop-in registration with rung ladders. Every week is a fresh Mexicano session; one cumulative season leaderboard ranks every player by W → Win% → Point Differential → H2H.
- Per-week registration — players sign up week-by-week, no season commitment
- Variable rung count each week based on who actually shows up
- Auto-suggested seeding from rolling standings, DUPR, or Club Rating
- One cumulative leaderboard across the season
- Optional rung point multipliers for higher-rung wins
- Sub credit attribution preserves season points when players fill in
- Full mobile parity — register, view week schedule, browse cumulative standings
May 20, 2026
Club Admin
Camp Sales Tax — Charge, Track, and Remit
Charge a club-configured sales-tax percentage on top of camp registrations, tracked separately and reported for filing — with a built-in remittance report and CSV export.
- Club-wide default rate + per-camp override (set 0% to mark a camp untaxed)
- Tax line itemized on the embed widget checkout and in the in-app PaymentSheet
- Refunds return the proportional tax automatically; platform fee never reversed
- Sales Tax remittance report by date range, broken down per camp (gross / refunded / net) with CSV export
- Tax money lands in the club's Stripe Connect account — Picklebeast keeps zero of it
- Off by default; opt-in with a one-time responsibility acknowledgment
May 20, 2026
Mobile App
Camp Admin in the Mobile App — Run Camps from Your Phone
The full camp management surface — list, create, edit, sessions, intake forms, badges, challenges, day-of operations, sales tax, recaps — now lives in the mobile app alongside parent and coach surfaces. Coach drop-off, parent broadcasts, attendance, and Kid Mode all on one device.
- Every web camp-admin action now available in the React Native app under Club Admin → Camps
- Coach day-of: roster check-in/out, attendance, emergency contacts, pickup PIN, parent broadcast, page-a-parent
- Two-panel mobile intake form editor with library + drag-reorder + single save
- Kid Mode inside the parent app — parent-attest challenges, streaks, XP, level, passport, badges (no AI, no minor data collection)
- Full session lifecycle: open registration → start → complete → cancel-with-refunds, all from mobile
- Sales tax settings + remittance report mobile parity
May 17, 2026
Club Admin
Camp Intake Forms — Collect Exactly What Each Camp Needs
Build a per-camp intake form from reusable building blocks, then let parents finish the detailed disclosures after they register — with automatic reminders until every required item is done.
- Two-panel drag-and-drop intake form editor with a reusable question library
- Built-in modules: medical & allergies, emergency contact, pickup authorization, photo consent, t-shirt size
- Custom toggle, free-text, and dropdown questions plus a custom liability-waiver document
- Parents complete the form via a secure magic link or in the app — no login required
- Automatic 7/3/1-day completion reminders that stop once the form is done
May 15, 2026
Mobile App
Kids Camps in the Parent App — Register, Check In, and Track Your Camper
Parents now run their kids' camp life entirely from the Picklebeast app — browse a club's camps, register and pay, sign the waiver, and pull up a QR check-in code for every camp day.
- Browse a club's open camps, see day-by-day or full-camp pricing, and read the cancellation policy before registering
- Multi-select drop-in days and pay for all of them in one Stripe payment
- Add a camper inline during registration — no separate setup step
- My Camps screen with Active and Past tabs and a next-day hint
- A scannable QR check-in code for every camp day, plus inline waiver signing
- Camp days surface in the home imminent panel and sync to your device calendar (siblings collapse into one event)
- Co-parents see the same registrations; cancel with an upfront refund estimate
May 14, 2026
Club Admin
Tournament & League Templates — Spin Up Recurring Events in 10 Seconds
Save any finished tournament or league as a reusable template. Spin up new instances with name + start date — every other config decision copies over. Personal vs. club-shared visibility, library at Programs → Templates, and a Start-from-a-template picker on New Tournament.
- Save as template button on every tournament & league admin page (show, edit) and the index 3-dots menu
- Re-save flow detects an existing template from the same source and offers Update existing / Save as new — never silent duplicates
- Personal templates are private to the creator; Club-shared templates are visible to every admin of the club
- Templates library at /club_admin/:club_id/templates with three tabs (Tournaments / Leagues / Events) and per-card usage_count + last-used date
- Click Use on any card → modal collects name + start date → POST /instantiate → redirect to the new event's edit page in seconds
- Start-from-a-template picker appears at the top of New Tournament — skips the form entirely when you have at least one accessible template
- Time offsets are relative — a division scheduled 2h after the earliest in the template stays 2h after the new anchor, regardless of your new start time
- Caps: 100 templates per club, 50 personal templates per user — no runaway library growth
- Atomic usage_count increment (DB-level UPDATE, no Ruby-side race) + last_used_at on every instantiation
- Soft-fails on missing locations: instantiate without a location and let the operator pick one in the editor
- Platform-owner dashboard at /platform_owner/templates_dashboard surfaces total templates, total instantiations, adopting clubs, and the top templates by usage
- Demo seed mints 3 tournament + 3 league templates per club so the library has realistic content on a freshly-reset demo
- Full TDD: 80+ specs across services, requests, system, and demo-seed coverage. Two end-to-end Capybara flows verify the JS glue.
May 14, 2026
Club Admin
Camp Registration Embed Widget — Sell Summer Camps from Your Own Website
Drop a single iframe on your club's marketing site. Parents pick weeks, enter their camper, pay via Stripe Connect — no Picklebeast account needed to book. Every paying parent auto-creates a Picklebeast account and receives a magic-link welcome email to finish setup.
- Single-line iframe embed with brand-color theming (CSS variables flow through into the Stripe Elements iframe too)
- N campers × M weeks in one cart with sibling discounts applied intra-cart
- Pessimistic 30-minute capacity hold during payment so a parent on Stripe Elements doesn't lose their seat
- Stripe Connect destination charges route to your connected account; widget bundles N registrations under one PaymentIntent
- Auto-created parent accounts use a magic-link 6-digit code (no temp passwords ever transmitted) — every authenticated surface gates on password_set_at until claimed
- Deferred waiver / medical / pickup completion with T+1d/T+3d/T+7d reminder cadence; CampCheckInService blocks attendance until done
- Existing email matches an existing User: attach without duplicate; member discount only after explicit sign-in (no email-enumeration leak)
- Optional co-parent fields (both become full Users with equal management rights via a join table)
- Admin embed-config KPI strip: registrations, revenue, avg cart size, abandonment % — last 30 days
- WL parity: WL clubs get noreply@{slug}.picklebeast.com sender + branded claim-account page
- Cloudflare-style abuse controls: rack_attack throttles per IP + per email, reCAPTCHA v3 on initiate_payment, 40-line cart cap
- Webhook-delivery safety net: every 5 min reconciler queries Stripe directly to catch stuck payment_processing sessions
May 13, 2026
Leagues
League Ties — Time-Capped & Single-Game Formats
Tied regular_season matches are now a first-class result. The score modal shows a 'Complete as Tie' confirmation when the game count is even; standings credit point differential without W/L; DUPR receives each game as its own submission so ratings still move.
- Tied matches recorded honestly — winner_id stays null, status='completed', tied?=true
- Rung ladder ordering unchanged — existing wins → PD → H2H → prior_rung_rank chain handles ties naturally
- Win percentage now follows USTA convention — ties excluded from the denominator (1W-1T = 1.000, not 0.500). No-tie leagues unchanged.
- DUPR per-game submission — each LeagueMatchGame submitted as its own DUPR match with its own dupr_match_id; retries skip games already accepted (idempotent)
- Parent dupr_submission_status='partial' when some game submissions fail; the next batch sweep retries only the failed games
- Playoff, MLP encounter, and challenge-ladder matches still require a winner — validation rejects ties on those formats
- Mobile + web scoring modals show 'Complete as Tie?' confirmation only when match.tieable is true (server-resolved per match)
- Parity tripwire spec locks in the documented asymmetry: leagues allow ties, tournaments do not