Map Veto System¶
The map veto system allows teams to ban and pick maps in a professional Counter-Strike format, just like FaceIT and HLTV matches.
When Veto is Used¶
Map veto is only available for:
- ✅ Best of 1 (BO1) tournaments
- ✅ Best of 3 (BO3) tournaments
- ✅ Best of 5 (BO5) tournaments
Round Robin and Swiss tournaments use preset maps and don't require veto.
Veto Flow¶
BO1 Format (7 Steps) - CS Major Standard¶
1. Team A removes 1 map (first of 2)
2. Team A removes 1 map (second of 2)
3. Team B removes 1 map (first of 3)
4. Team B removes 1 map (second of 3)
5. Team B removes 1 map (third of 3)
6. Team A removes 1 map
7. Team B chooses starting side on remaining map
Result: 1 map with chosen side
BO3 Format (9 Steps) - CS Major Standard¶
1. Team A removes 1 map
2. Team B removes 1 map
3. Team A picks Map 1
4. Team B chooses starting side on Map 1
5. Team B picks Map 2
6. Team A chooses starting side on Map 2
7. Team B removes 1 map
8. Team A removes 1 map
9. Team B chooses starting side on Map 3 (decider)
Result: 2 picked maps + 1 decider map (with side chosen by Team B)
BO5 Format (10 Steps)¶
1. Team A bans a map
2. Team B bans a map
3. Team A picks Map 1
4. Team B picks starting side on Map 1
5. Team B picks Map 2
6. Team A picks starting side on Map 2
7. Team A picks Map 3
8. Team B picks starting side on Map 3
9. Team B picks Map 4
10. Team A picks starting side on Map 4
Result: 4 picked maps + 1 decider (with knife round)
Custom Veto Formatting¶
Coming Soon
Custom veto orders are currently only available via API. A user interface for configuring custom veto orders in tournament settings is planned for a future release.
The backend system supports custom veto orders that comply with CS Major rules. Tournament organizers can define custom veto sequences via the API while ensuring they follow professional Counter-Strike standards.
CS Major Compliance¶
All veto formats are validated to ensure compliance with the Counter-Strike Major Supplemental Rulebook:
- ✅ BO1: Must ban 6 maps (leaving 1), then pick starting side
- ✅ BO3: Must pick 2 maps with side picks, ban 4 maps (2 initial + 2 final, leaving 1 decider)
- ✅ BO5: Must pick 4 maps with side picks, ban 2 maps (leaving 1 decider)
- ✅ Side picks must come after map picks
- ✅ Sequential step numbering starting from 1
- ✅ Valid team assignments (team1/team2) and actions (ban/pick/side_pick)
Using Custom Veto Orders (API Only)¶
Custom veto orders can be configured when creating a tournament via the API by including a settings.customVetoOrder object in the request body. If a custom order is provided and passes validation, it will be used instead of the standard format. If validation fails, the system automatically falls back to the standard CS Major format.
Example API Request with Custom BO3 Format:
POST /api/tournament
{
"name": "My Tournament",
"type": "single_elimination",
"format": "bo3",
"maps": ["de_mirage", "de_inferno", "de_ancient", "de_anubis", "de_dust2", "de_vertigo", "de_nuke"],
"teamIds": ["team1", "team2"],
"settings": {
"customVetoOrder": {
"bo3": [
{ "step": 1, "team": "team1", "action": "ban" },
{ "step": 2, "team": "team2", "action": "ban" },
{ "step": 3, "team": "team1", "action": "pick" },
{ "step": 4, "team": "team2", "action": "side_pick" },
{ "step": 5, "team": "team2", "action": "pick" },
{ "step": 6, "team": "team1", "action": "side_pick" },
{ "step": 7, "team": "team2", "action": "ban" },
{ "step": 8, "team": "team1", "action": "ban" },
{ "step": 9, "team": "team2", "action": "side_pick" }
]
}
}
}
How Teams Complete Veto¶
1. Tournament Must Be Started¶
Admin must click "Start Tournament" first. Until then, teams see:
Waiting for Tournament to Start
Your match is ready, but the tournament hasn't started yet. The map veto will become available once the tournament administrator starts the tournament.
2. Teams Access Veto Interface¶
Each team navigates to their public team page:
They see the map veto interface with:
- Match header: "Team Alpha VS Team Beta"
- Progress indicator: "Step 3 of 8"
- Current action: "Team Alpha: PICK A MAP" (colored header)
- Map grid: All 8 CS2 maps displayed
3. Turn-Based Actions¶
!!! example "Your Turn" - Header shows: "Your turn to ban a map" - Maps are clickable with hover effects - Click a map to ban/pick it
!!! info "Not Your Turn" - Header shows: "Waiting for Team Beta to pick a map..." - All maps are grayed out and disabled - No error messages, just visual feedback
4. Map States¶
Available Maps:
- Full color, clickable
- Hover effect shows intent
Banned Maps:
- 50% opacity
- Grayscale filter
- Red block icon overlay
- Still visible (not hidden)
Picked Maps:
- Green border with thickness
- "MAP ½/3" chip in corner
- Side indicator (CT/T) if chosen
- Green checkmark icon
5. Side Selection¶
After picking a map, the team choosing the side sees:
Choose Your Starting Side
Select which side you want to start on for Mirage
[Counter-Terrorist (CT)] [Terrorist (T)]
!!! tip "Side Selection Strategy" - CT-sided maps: Nuke, Vertigo (often pick CT) - T-sided maps: Mirage, Inferno (often pick T) - Balanced maps: Dust2, Ancient (either side works)
Real-Time Synchronization¶
Both teams see the veto progress live via WebSocket:
- ✅ When Team A bans Ancient, Team B's page instantly shows Ancient as banned
- ✅ Progress bar updates: "Step 2 of 8"
- ✅ Turn indicator updates: "Team Beta: BAN A MAP"
- ✅ Veto history updates: "Team Alpha BANNED Ancient"
No page refresh needed!
After Veto Completes¶
- ✅ Veto marked complete in database
- ✅ Match config generated with picked maps
- ✅ Server allocation attempted — System tries to allocate from available server pool
- ⏳ If no server available — Backend polls every 10 seconds for available servers
- ✅ Server auto-allocated when one becomes available
- ✅ Match loaded via RCON (
matchzy_loadmatch_url) - ✅ Teams notified via WebSocket — Match status updates in real-time to "Loaded"
- ✅ Connect info shown — Server IP, port, connect command
Server Allocation
If no servers are available immediately after veto completion, the system automatically polls every 10 seconds in the background. Teams will see "WAITING FOR SERVER" status, and the match will be assigned as soon as a server becomes available. All updates are sent via WebSocket, so no page refresh is needed!
Teams then connect to the server and play!
Veto Timeline¶
Both teams and admins can see the complete veto history:
BO3 Example:
Veto History
Step 1: Team Alpha BANNED Ancient
Step 2: Team Beta BANNED Vertigo
Step 3: Team Alpha PICKED Mirage (Starting T)
Step 4: Team Beta PICKED SIDE on Mirage (Starting CT)
Step 5: Team Beta PICKED Dust2 (Starting CT)
Step 6: Team Alpha PICKED SIDE on Dust2 (Starting T)
Step 7: Team Beta BANNED Nuke
Step 8: Team Alpha BANNED Inferno
Step 9: Team Beta PICKED SIDE on Anubis (Decider, Starting CT)
Decider: Anubis (Side chosen by Team Beta)
Admin Capabilities¶
Admins can:
- ✅ View veto progress for any match (Matches page, Match modal)
- ✅ Skip veto if needed (Admin Controls → Skip Veto)
- ✅ Reset veto via API:
POST /api/veto/{matchSlug}/reset - ✅ See who's turn it is in match status
Security¶
!!! success "Turn-Based Enforcement" - Backend validates which team is making each action - Returns 403 Forbidden if wrong team tries to act - Frontend disables UI when it's not your turn - No way for teams to cheat or act out of order
No Authentication Required
Team pages are public (no login). Security is based on:
- **Team identification** from URL (`/team/team-alpha/match`)
- **Turn validation** on backend
- **Visual UI hints** on frontend
Troubleshooting¶
Veto not showing for teams?
Check:
- Tournament status is `in_progress` (admin must start it)
- Match status is `ready`
- Match format is BO1, BO3, or BO5
**Fix:** Admin clicks "Start Tournament" button
Can't click any maps?
Cause: It's not your turn
**Solution:** Wait for other team to complete their action. You'll see:
"Waiting for {Other Team} to ban a map..."
Match not loading after veto?
Check:
- At least one server is online and available
- Check server logs: `Admin Tools → Server Events Monitor`
- Check API logs for allocation errors
**Fix:** Ensure the webhook URL in the dashboard **Settings** points to the tournament API
Next Steps¶
- 📊 Feature Overview — See all features in detail
- 🎮 Running Matches — Match management guide
- 🎯 First Tournament — Step-by-step tutorial