Captain-driven tournaments, built for the Washington Cup.
A new format for elite team play: a DUPR-screened combine, invite-only Pro Team-Captain divisions, and standard amateur divisions in the same event. Captains form rosters, share invite links, and pay for everyone in one Stripe charge. Built end-to-end with the same hardening discipline behind Player Hub and Kids Camps.
Three division types, one tournament
Team Cup composes a single tournament out of three division kinds. Run any combination — a pro-only event, a community-only event, or both at once with a combine in front.
Combine
Players register individually. DUPR-sync gate optional. Org splits the field into divisions (banded, snake, post-play, or manual) — or converts the top N to a singles playoff bracket.
Pro Team-Captain
Invite-only. Captains receive an email invite, register, get a shareable team-invite link, and recruit teammates. Captain-pays bundles N teammates' fees in a single Stripe charge.
Standard amateur
Existing tournament division behavior. DUPR-sync and invite-only gates ship to all division kinds — opt-in per division.
How a captain runs a team
- Receive an invite. Org issues a DivisionInvite (single or bulk CSV up to 500). Captain gets an email with both deep-link and web URLs to claim.
- Register the team. Captain consumes the invite, the team scaffolding is created, and they get a shareable TeamInvite link to send teammates.
- Recruit + pay in one charge. Captain creates a captain-pays bundle covering themselves + N teammates. One Stripe PaymentIntent. Platform fees are non-refundable to teammates per pre-beta legal review; entry-fee refunds flow back to the captain's card.
- Submit lineups per round. Drag-drop slot builder validates 2M2F gender (when set), captain_required_seats, no duplicate players, and roster membership. Captains have until 1 hour before each round's scheduled start to submit; reminders push at the deadline window.
How an org runs the event
- Set up divisions. Pick the kinds you want, set DUPR caps + buffer + gender rules per division, set
captain_required_seatsif a specific seat is reserved for the captain. - Run the combine. Open registration, watch real-time fill, then split into divisions when the field is set.
- Issue captain invites. Single or CSV bulk. The system idempotently dedupes — clicking "Invite alice@example.com" twice produces one invite, not two.
- Buffer-flag review. Teams in the buffer zone (over cap but within tolerance) are flagged for org review with three actions: approve / reject-with-refund / allow-reform.
- Atomic round publish. Org draws the bracket privately. Click publish — lineups lock, per-seed pairings materialize, the round-published push fans out to every team member, and matchups reveal in one transaction.
What's built in
- Pairings stay private until publish. Hardening Round 8 + 16 closed the bracket-leak surface on every API endpoint that returns rounds. Captains can see their own team's matchup at publish time, never before.
- Captain-pays Stripe Connect bundles. One PaymentIntent for N teammates. Stripe fees absorbed by the club per CLAUDE.md §3.1; entry-fee refunds use
reverse_transfer: true+refund_application_fee: false; per-line refund granularity. - Click-through legal acknowledgment. Captain-pays teammates click-through that platform fees are non-refundable to them and refunds flow back to the captain's card. Pre-beta legal review required this surface; the API endpoint records ToS version + acknowledgment platform.
- Lineup deadline reminders. Hourly Sidekiq job pushes captains who haven't submitted as the deadline approaches. Per-team Rails.cache dedup ensures one push per round, not one per cron tick.
- Force-republish power tool. Org can re-fanout the round-published push after a lineup edit, with a 30-minute dedup window so fans don't get spammed on rapid edits.
- Find-a-team discovery. Players in the same division can browse public-join teams whose roster has open slots and whose MLP rules they fit. No org-side configuration; just opt in per team.
- Buffer-flag review queue. Combined-DUPR over cap+buffer triggers a review state. Org approves, refunds with dissolve, or lets the captain shuffle the roster.
- Team chat per Pro team. Created when the team is registered. Teammates are added at acknowledgment time so they only see the chat after consenting to the captain-pays terms.
How it was hardened
5 audit pushes, 25 rounds, 42 production bugs found and fixed across data integrity, concurrency, billing, atomicity, privacy, notifications, and authorization. The audit caught — among others — the Stripe webhook missing the captain-pays branch (CRIT), pre-publish pairing leaks on two parallel endpoints (CRIT × 2), the inverted-visibility logic on combine show (HIGH), and three Stripe-in-DB-transaction sites that would have left orphan refund state in production. The full audit log lives in developer_documentation/team_cup/.
Built for the Washington Cup, June 26, 2026
Ungated for v1 — every Picklebeast tournament can run a Team Cup format. Captain-pays per-division org choice, atomic round publish, full mobile + web admin parity in flight.
Talk to us about hosting one