What's New
The latest features and improvements shipped to Picklebeast.
April 2026
Apr 30, 2026
Leagues
League Sub Pool — Lock In Substitutes Before Game Day
A per-league pool of potential substitutes managed directly by the organizer. Search club members or add free-form contacts (no Picklebeast account required). Queue swaps for any combination of weeks — including weeks whose matches haven't been generated yet — and the substitute is auto-applied when the session runs.
- Add contacts via club-member search (privacy-scoped to the club's active membership) or by typing a name + email/phone
- Auto-link to existing Picklebeast accounts when name AND (email OR phone) match — strict to prevent the wrong-person link
- Phone-based dedupe (digits-only) catches the same person entered with different formatting
- Queued-swap intents persist before matches exist — per-round rung ladders generate Round 1 with the substitute already in the lineup
- Multi-week chip selector: pick 1, several, or all weeks in a single confirmation
- Branded sub-in email + Universal Link 'View Schedule' button (opens the app on mobile, web on desktop)
- Email preview button — see exactly what the substitute will receive before you confirm the swap
- Cancel queued swaps from the sub pool index, with a 'sub for X' badge on the rung roster preview for the affected week
- Push notifications via the existing league_sub_assigned channel when the substitute has the app + push enabled
Apr 28, 2026
Platform
2 Free Events at a Time — Unified Free Tier Pricing
Any user can run up to 2 active small (≤16-player) events at a time for free — leagues or tournaments, any format, any registration mode. The third event charges the platform's standard per-registration fee. Paid Clubs always pay; demo events are excluded.
- Schedule-driven: the platform owner controls the capacity threshold and the next-tier fee at /platform_owner/fee_schedules — not a hardcoded $5
- Decoupled from legacy casual restrictions — any league type, any registration mode, public or private, with or without DUPR
- Tournaments count toward the same 2-cap as leagues (combined active count)
- Soft cap: the third event is allowed to publish, but every registration is charged the next-tier fee — no hard publish block
- Stamped at registration time and forward-only — capacity changes mid-season don't retroactively re-bill
- API: GET /api/v1/me/free_event_slots returns the user's current state for in-app banners
- AI chat: ask 'is my next league free?' and the AI answers with the user's exact slot count
- Demo carve-out: any club marked is_demo never enters the free tier (prevents demo data from masking billing)
Apr 25, 2026
Club Admin
Embeddable Leaderboards — Real-Time Standings on Your Website
Drop real-time league and tournament leaderboards onto any club website with one line of code. Branded in your colors. Updates the moment a match score is entered. Free on every plan.
- Six widget types: league standings, combined leaderboards, tournament brackets, rung ladders, upcoming matches, head-to-head
- Multiple embeds per club, each independently configured (one for your homepage, one for the leagues page, etc.)
- Selector UX for multi-entity embeds — tabs, dropdown, sidebar, or auto-rotating carousel
- Per-embed privacy controls: full name / first initial / first only / opaque (Player 1, Player 2…); hide avatars optional
- Brand inheritance from your existing ClubEmbedConfig — colors, fonts, logo apply automatically
- Real-time updates via ActionCable WebSocket + 30s polling fallback for behind-firewall viewers
- Standalone shareable URL per embed (works in browser tabs, iMessage, Twitter, anywhere)
- Pause / archive states with optional auto-archive 30 days after a league ends
- Mobile share button on existing in-app league/tournament screens uses the OS share sheet
- Free on every tier — no usage limits, no view caps, 'Powered by Picklebeast' footer
Apr 25, 2026
Tournaments
MLP Format — Major League Pickleball Team Tournaments + Leagues
Full Major League Pickleball format support: 4-player teams, men's + women's + 2 mixed sub-matches per matchup, 21-point Dreambreaker on 2-2, organizer-day overrides, and league weekly play. Works across every bracket type (single-elim, double-elim traditional + consolation, round-robin) with no per-bracket configuration.
- 4-player rosters with gender-aware sub-match generation (Men's Doubles, Women's Doubles, Mixed 1, Mixed 2)
- Dreambreaker auto-creates as a 5th sub-match the moment teams tie 2-2; first-to-21 with all 8 players
- Cross-bracket support: single-elim, double-elim (traditional + consolation), round-robin all generate sub-matches automatically when both teams are set
- League weekly play: team_size=4 division produces MLP matchups every week; playoffs inherit MLP format automatically
- Organizer-day overrides: Force Finalize, Void Sub-match, Reset Dreambreaker — all require a written reason for the audit trail
- Mid-tournament substitutions auto-resync sub-match participants to the new roster — no stale references
- Standings count parent matchups (one win per MLP matchup, not five), DUPR submission targets only the playable sub-matches
- Roster gap hints on the registration UI: 'needs 1 more woman' instead of generic 'incomplete'
- Composite indexes on (parent_match_id, mlp_match_type) tuned for the hottest query at 50k scale
- 120+ specs locking in correctness across services, models, controllers, hardening, and performance
Apr 24, 2026
Mobile App
Mobile Playoff Manager — Run Playoff Day From Your Phone
A tournament director's complete toolkit, now on mobile. Three-tab shell (Now / Divisions / Courts), native score entry, court assignment, per-division designation, and a podium reveal at completion — with ActionCable real-time sync across every connected admin device.
- Three-tab shell: Now (live + ready + pending queues), Divisions (per-division detail), Courts (venue-wide grid)
- Native bottom-sheet score entry with dynamic game rows, auto-winner detection, tie rejection, haptic feedback
- Per-match court picker that honors the division's designated court subset
- Per-division court designation modal with cross-division conflict detection and real-time claim-map sync
- Auto-Assign button with diagnostic toast (assigned count · ready · waiting · already on courts)
- Podium card auto-renders when a division's final match completes — gold / silver / bronze with seeds
- ActionCable `LeaguePlayoffChannel` pushes match_scored / court_assigned / division_completed / court_designation_changed / venue_updated / match_ready / court_freed events to every admin device
- Four new admin-only push types: match_ready_overdue (20+ min waiting), division_completed, event_wrapping, score_entered (opt-in)
- Hourly PlayoffReadyMatchScanJob using a partial index on ready_since_at to flag stuck matches
- AsyncStorage cache survives airplane-mode transitions; offline banner surfaces cached state
- JWT auth flows through the existing web mutation endpoints transparently — no shim, no duplicate logic
- Rolled out behind FeatureDefinition flag `mobile_playoff_manager_v1` with a per-user beta allowlist
Apr 21, 2026
Leagues
Per-Round Rung Ladder — Live Rung Shuffling on League Night
A Mexicano-style variant of the rung ladder format where players reshuffle between rungs after every round on the same night, instead of once per week. Toggle on the league setup form.
- New 'Rung Movement Mode' setting: Weekly (classic) or Per Round (Mexicano)
- After every round completes, top half of each rung moves up one rung and bottom half moves down one
- Next round auto-generates with the new rung composition — no admin action needed
- Rung positions persist across sessions — end night 1 on Rung 2, start night 2 on Rung 2
- Optional reset-each-session toggle if the organizer prefers re-seeding every week
- Partner rotation within a rung avoids consecutive-round repeat pairings
- Tiebreakers within a round: wins then point differential then head-to-head then prior rung rank
- Push notification to every affected player when they move up or down
- Live rung state API endpoint powers mobile live rung ladder screen
- Bye handling for rungs with fewer than 4 confirmed players that round
- Backward-compatible: every existing rung ladder defaults to weekly mode, no behavior change
Apr 21, 2026
Platform
Structured Membership Tiers — Every Perk Hits Stripe as Real Dollars
Every membership tier perk now flows through a server-authoritative pricing pipeline that actually reduces the Stripe charge. Nine surfaces, five discount types, five cadences, age + time-of-day eligibility gates, one-time initiation fees, audit-logged grandfathering.
- Nine billable surfaces covered: court reservations, open play, leagues, tournaments, clinics, coaching lessons, ball machine, guest passes, initiation fees
- Five discount types: percentage off, fixed off, free, allowance (first N per cadence), free with cap
- Five cadences: daily, weekly, monthly, quarterly, annually — anchored to the club's clock
- Eligibility gates enforced server-side: age (COPPA-floored at 13), hours, days of week, locations
- One-time initiation fees via Stripe Connect — waivable, with configurable reapplication window
- JSONB schema validator rejects tampered blobs: negative percents, out-of-range values, allowance on non-allowance surfaces, unknown keys
- Immutable audit log on every tier edit — actor, IP, user agent, full before/after JSON
- Grandfathering: existing active members keep their original terms until explicit 'Apply to existing members' action
- Per-club shadow-compare flag runs both legacy and new paths in parallel and logs divergence before flipping
- Backfill rake task translates legacy fields (court_rate_discount_percent, event_pricing JSONB, free_*_per_month) into structured data — Snovalley skipped by default
- New league and tournament resolvers route through ClubPricing for the first time — their discounts now actually apply
- Deterministic perks formatter: structured inputs generate the human-readable perk bullet list
Apr 21, 2026
Platform
Structured Membership Tiers — Every Perk Hits Stripe as Real Dollars
Every membership tier perk now flows through a server-authoritative pricing pipeline that actually reduces the Stripe charge. Nine surfaces, five discount types, five cadences, age + time-of-day eligibility gates, one-time initiation fees, audit-logged grandfathering.
- Nine billable surfaces covered: court reservations, open play, leagues, tournaments, clinics, coaching lessons, ball machine, guest passes, initiation fees
- Five discount types: percentage off, fixed off, free, allowance (first N per cadence), free with cap
- Five cadences: daily, weekly, monthly, quarterly, annually — anchored to the club's clock
- Eligibility gates enforced server-side: age (COPPA-floored at 13), hours, days of week, locations
- One-time initiation fees via Stripe Connect — waivable, with configurable reapplication window
- JSONB schema validator rejects tampered blobs: negative percents, out-of-range values, allowance on non-allowance surfaces, unknown keys
- Immutable audit log on every tier edit — actor, IP, user agent, full before/after JSON
- Grandfathering: existing active members keep their original terms until explicit 'Apply to existing members' action
- Per-club shadow-compare flag runs both legacy and new paths in parallel and logs divergence before flipping
- Backfill rake task translates legacy fields (court_rate_discount_percent, event_pricing JSONB, free_*_per_month) into structured data — Snovalley skipped by default
- New league and tournament resolvers route through ClubPricing for the first time — their discounts now actually apply
- Deterministic perks formatter: structured inputs generate the human-readable perk bullet list
Apr 21, 2026
Platform
Structured Membership Tiers — Every Perk Hits Stripe as Real Dollars
Every membership tier perk now flows through a server-authoritative pricing pipeline that actually reduces the Stripe charge. Nine surfaces, five discount types, five cadences, age + time-of-day eligibility gates, one-time initiation fees, audit-logged grandfathering.
- Nine billable surfaces covered: court reservations, open play, leagues, tournaments, clinics, coaching lessons, ball machine, guest passes, initiation fees
- Five discount types: percentage off, fixed off, free, allowance (first N per cadence), free with cap
- Five cadences: daily, weekly, monthly, quarterly, annually — anchored to the club's clock
- Eligibility gates enforced server-side: age (COPPA-floored at 13), hours, days of week, locations
- One-time initiation fees via Stripe Connect — waivable, with configurable reapplication window
- JSONB schema validator rejects tampered blobs: negative percents, out-of-range values, allowance on non-allowance surfaces, unknown keys
- Immutable audit log on every tier edit — actor, IP, user agent, full before/after JSON
- Grandfathering: existing active members keep their original terms until explicit 'Apply to existing members' action
- Per-club shadow-compare flag runs both legacy and new paths in parallel and logs divergence before flipping
- Backfill rake task translates legacy fields (court_rate_discount_percent, event_pricing JSONB, free_*_per_month) into structured data — Snovalley skipped by default
- New league and tournament resolvers route through ClubPricing for the first time — their discounts now actually apply
- Deterministic perks formatter: structured inputs generate the human-readable perk bullet list
Apr 21, 2026
Platform
Structured Membership Tiers — Every Perk Hits Stripe as Real Dollars
Every membership tier perk now flows through a server-authoritative pricing pipeline that actually reduces the Stripe charge. Nine surfaces, five discount types, five cadences, age + time-of-day eligibility gates, one-time initiation fees, audit-logged grandfathering.
- Nine billable surfaces covered: court reservations, open play, leagues, tournaments, clinics, coaching lessons, ball machine, guest passes, initiation fees
- Five discount types: percentage off, fixed off, free, allowance (first N per cadence), free with cap
- Five cadences: daily, weekly, monthly, quarterly, annually — anchored to the club's clock
- Eligibility gates enforced server-side: age (COPPA-floored at 13), hours, days of week, locations
- One-time initiation fees via Stripe Connect — waivable, with configurable reapplication window
- JSONB schema validator rejects tampered blobs: negative percents, out-of-range values, allowance on non-allowance surfaces, unknown keys
- Immutable audit log on every tier edit — actor, IP, user agent, full before/after JSON
- Grandfathering: existing active members keep their original terms until explicit 'Apply to existing members' action
- Per-club shadow-compare flag runs both legacy and new paths in parallel and logs divergence before flipping
- Backfill rake task translates legacy fields (court_rate_discount_percent, event_pricing JSONB, free_*_per_month) into structured data — Snovalley skipped by default
- New league and tournament resolvers route through ClubPricing for the first time — their discounts now actually apply
- Deterministic perks formatter: structured inputs generate the human-readable perk bullet list