How to run a fantasy golf game
What it is, how to set one up, and how bidding actually works.
What this is
A fantasy golf game run as a live auction — mobile-first, realtime, zero friction. Instead of drafting or filling out a bracket, you bid on players. Whoever owns each player at the end of the auction owns them for the event, and the leaderboard tracks how well those players finish.
It’s sport-agnostic. The PGA Championship ships with the 2026 field pre-seeded; other events are a few rows of seed data away. One person creates a pool, everyone else joins with a 6-digit code.
How it works in 90 seconds
- A commissioner creates a pool — title, event, bid increment, starting bid, snipe rules, optional budget cap.
- They share a 6-digit code. Anyone with the link enters a display name and they’re in. No passwords, no accounts.
- Commissioner presses Start auction. Every player in the field opens for bidding simultaneously, each with its own countdown clock.
- Bidders tap a + on any card to place the next valid bid. Other devices see the update in milliseconds.
- Bids in the snipe window (last 5 min by default) extend that card’s clock by the snipe extension (3 min by default). Nobody steals at the buzzer.
- When all clocks hit zero, each leader becomes the owner. Scores sync every 15 min throughout the event.
Creating a pool (commissioners)
- From the home page click Create a pool.
- Fill in the form:
- Pool title — what your friends see.
- Your name — you’re the commissioner.
- Sport — picks the default player pool and event name.
- Starting bid — the floor for any player (typically 1 pt).
- Bid increment — minimum raise per bid.
- Snipe window / extension — 5 min / 3 min is a good default.
- Budget per member — optional cap. Leave blank for unlimited.
- Global end time — optional hard deadline.
- Submit. You land on the admin panel with your 6-digit code and a shareable URL.
- Send the URL to your friends:
app.com/join/XXXXXX - When everyone’s in, click Start auction with a duration (e.g. 60 minutes).
OPEN— bids are rejected. After Start, it’s ACTIVE and bidding is live.Managing your pool (commissioners)
Once your pool exists, the admin panel is your control surface. Everything except the join code itself is editable — including the name and the entire player roster — right up until you hit Start auction.
Renaming the pool
On the admin page, the Pool name card lets you change the title at any time (except after the pool is archived). The new name shows up in the nav, on the shared home page, and on the OG share card. The 6-digit join code never changes.
Managing players
Click Manage players → on the admin panel to open the full editor. There you can:
- Add players — click + Add player, fill in name (required), optional subtitle, ranking, and country code, then Save.
- Edit anything— name, subtitle, ranking, country. Edits don’t persist until you hit Save on that row.
- Upload custom images— drag any image onto a player’s avatar tile (or click to browse). PNG/JPEG/WebP/GIF, 2 MB max. Replaces the initials avatar everywhere — auction cards, bidder strip, share cards.
- Delete — only available before any bids land on that player. Once someone bids, the player is locked.
Subtitles
The subtitle field is a free-text caption that appears under the player name on every auction card — replacing the default “#rank” line. Use it for context that helps bidders: recent form (“3 top-10s in last 5 starts”), past results at this venue, injury notes, anything you’d want them to read at a glance before bidding.
Joining a pool (bidders)
- Open the link your commissioner shared, or enter the 6-digit code on the home page.
- You see a preview: title, event, current member count.
- Enter a display name (must be unique in the pool).
- You’re in. You land on the Auction tab.
You don’t need an account. Your browser remembers your membership in every pool you’ve joined. If you clear cookies you’ll need to rejoin with a fresh display name (if yours is now taken).
How bidding works
Every player is a card showing:
- Name, rank, country flag, initials avatar
- Current winning bid + who placed it
- A countdown clock
- + places the minimum next bid
- ★ adds to your watchlist (My Bids tab)
- ⚡ sets an auto-bid cap
Tapping + placescurrentBid + bidIncrement— no amount to type.
Card colors
- Green — you’re leading.
- Red — you were leading but got outbid.
- Neutral — no bids yet, or you haven’t bid.
- Gold glow — defending champion.
- Grey — closed.
Snipe window & extensions
If a bid lands within the snipe window (default 5 min),that card’s clock extends by the snipe extension (default 3 min). This fires every time — not just once — so a bidding war plays out cleanly. Other cards are unaffected. Cards inside their snipe window pulse with an amber glow.
Bidder strip
Right under the auction header, a horizontal row of pills shows everyone in the pool. Each pill: avatar, display name, and a small green count of how many cards that person is currently leading. Your own pill is gold-ringed and labeled “You.” The strip pulses in someone’s color the moment they steal a card — great for small groups where part of the fun is sweating who’s going for what.
Closing
A player’s auction closes when its clock hits zero. Whoever leads at that moment becomes the owner; the bid amount becomes the final price. The commissioner can also close the whole auction early from the admin panel.
Auto-bid (proxy bidding)
Auto-bid is eBay-style proxy bidding. You set a maximum cap on a player, and the system bids on your behalf just enough to keep you in the lead, up to that cap. If nobody bids against you, you pay less than your cap.
- Tap ⚡ on a player card. Enter your max.
- If your cap is above the current bid, the system immediately bids the minimum-next on your behalf.
- When someone else bids, the system checks for higher-cap auto-bids. Highest cap always wins, and pays just enough to beat the second-highest by the increment.
- Cancel or adjust any time from the same popover.
Outbid notifications
Mobile browsers support real-time push. A 🔔 Enable outbid alerts button sits in the auction header.
- First tap prompts for permission and subscribes you.
- Outbid anywhere in the pool → push with player name + new bid.
- Tapping the push opens the auction board right to that player.
- Tap the bell again to unsubscribe.
Scoring & the leaderboard
Once the auction closes, live scoring kicks in. For supported sports, the app pulls from ESPN every 15 minutes:
- Golf majors (Masters, U.S. Open, The Open, PGA Championship, Ryder Cup) — ESPN PGA.
- NFL / NCAA / F1 — adapter stubs; needs per-sport scoring rules configured.
The Leaderboard page shows every player by current position with their owner, round scores, and what they paid at auction. Commissioners can hit Sync scores now in admin to force an immediate refresh.
Commissioner runbook
Before auction day
- Create the pool a day or two ahead. Share the code.
- Open Manage players → from admin to review the field. Add late commits, delete withdrawals, upload images, tweak subtitles. Locked once you hit Start auction.
- Rename the pool from the admin panel if the default title isn’t what you want your group to see.
- Test the join flow from a second device.
At the auction
- Click Start auction with a duration (45–90 min typical).
- Snipe extensions handle the end of each card; you don’t usually need to intervene.
- If you need to end early → Close auction now, every open card locks at its current leader.
After auction
- Scores sync every 15 min automatically.
- Monitor the Leaderboard throughout the event — rosters and round splits update live.
Glossary
- Pool
- One event, one auction, one group of members. Identified by a 6-digit join code.
- Member
- Anyone who's joined a pool — authenticated commissioner or guest bidder.
- Commissioner
- The pool's creator. One per pool. Has access to start/close/sync controls.
- Guest
- A bidder who joined without creating an account. Identified by session cookie + display name.
- Bid
- An accepted currentBid + bidIncrement on a specific player.
- Bid attempt
- Every try — accepted or rejected — logged for audit.
- Snipe window
- How close to a card's end-time a bid triggers an extension. Default 5 min.
- Snipe extension
- How much time gets added when a bid lands in the snipe window. Default 3 min.
- Auto-bid
- A saved max cap that proxy-bids on your behalf up to that amount.
FAQ
- Can I run this with real money?
- The app doesn't process payments — "pts" are just labels. You and your group agree on what a point is worth and settle up off-platform.
- What if someone loses connection mid-bid?
- Bids are submitted to the server before the UI confirms. If the request never lands, the bid never happened. On reconnect the user sees the actual state and can retry.
- Can two people bid at the same time?
- Yes. The server serializes every bid with a row-level lock, so exactly one lands first. The other returns a "minimum bid is X" error and can re-tap to try again.
- What if ESPN is down?
- Score sync fails silently and retries on the next cron (15 min). The leaderboard keeps showing the last-known data.
- Can I edit a pool after creating it?
- The pool name and the entire player roster (add, edit, image, delete) are editable from the admin panel until you hit Start auction. Snipe window/extension, bid increment, and end time are also editable. Sport and event name aren't.
- Can I kick a member?
- Not in the UI yet. Delete the PoolMember row in the DB; their bids cascade. Their session stops recognizing the membership on next reload.
- Why did my auto-bid fire immediately?
- By design — eBay-style. If your cap is above the current bid, the system bids up to the minimum needed to lead. That's what you asked for when you set the cap.
- Can I bid on behalf of someone else?
- Only if they're logged in on your device. Each member is tied to a single session cookie.
- What if the commissioner disappears?
- The auction keeps running — each card closes on its own clock. DB-level intervention can transfer commissioner status if needed.