A free, truly open-source WordPress plugin for running club-level USCF chess tournaments end to end: setup guide, roster import, pairing aid, round-by-round result entry, standings with USCF tiebreaks, and USCF DBF export for upload to ratings.uschess.org.
No monthly fees and no desktop software needed. You can actually run entire rated and unrated tournaments from your phone using your existing WordPress login.
Tournament Manager was built for the McMinnville Chess Club as an alternative to online and desktop tournament software, and it's been generalized for clubs that want tournament management on their own WordPress site with unlimited tournaments and unlimited players.
If you find this plugin useful, consider making a donation to the McMinnville Chess Club!
- WordPress 5.0 or later
- PHP 7.4 or later
- The
zipPHP extension (php-zip), to build the USCF export download
Tournament Manager runs stand-alone for manual tournament administration, but for the roster import and displaying results and standings on event pages you will need:
- The Events Calendar (TEC)
- Event Tickets (ET)
- Event Tickets Extra Custom Fields (ETECF)
- Event Tickets Registrations (ETR)
Tournament Manager pulls in a club's existing online registration from ET (enhanced with extra custom fields from ETECF) and straight into a tournament manager with sections, pairings, wall charts, standings, and final results.
Registration import
- Bring a roster in from ETR's "Pairing export" CSV, uploaded by hand, or (with ETR 5.2.3+) pulled straight over with one click with the "Import to Tournament Manager" button on the event's "Registrations" tab.
- Players marked "No-show" (in advance of the import) on their player card in ETR are skipped.
- A USCF ID with anything non-numeric (like a parent requesting a new USCF ID for a youth player) is imported with a blank member ID and alerts the TD to fill it in once USCF issues their new membership.
- Exact-duplicate rows import just once with a warning instead of doubling a player up. The preview page shows every detected section with create-new / map-to-existing / skip choices and a rated toggle before anything is saved, and the importer warns before a re-import would append onto a section that already has players.
- Sections can be marked rated or unrated individually, and an oversized section can be auto-split into 4-player round robin quads at import time.
Section types
- Swiss, Round Robin, and Quads are supported. A round robin section still submits to USCF in ordinary Swiss round-by-round format (the USCF TD / Affiliate FAQ treats the round robin grid and the Crenshaw-Berger Swiss-style report as equivalent for rating purposes, so Tournament Manager doesn't need a separate submission format for it).
Pairing aid and round entry directly on the event page
- Score groups, color due, and opponents already played for Swiss sections.
- A "Still to play" list is shown in place of score groups for round robin sections since those pair by a fixed schedule instead of standings.
- Byes and withdrawals: withdrawing a player freezes their score as of the round they left and drops them out of future pairing without deleting any of their play history.
- Saving a round replaces that round's results outright, and re-submitting the same form twice is harmless and doesn't duplicate results.
Standings
- Support for all four US Chess rulebook 34E tiebreaks, in order: Modified Median, Solkoff, Cumulative, and Cumulative of Opposition, falling back to rating then name.
- Shown on the linked event page automatically and available anywhere via the
[wpmtm_standings]shortcode (addtournament="123"to point at a specific tournament, or leave it off on the event page itself). - Note that the event page's "Standings" tab is the official live view and that a shortcode placed elsewhere can lag behind it until that page's own cache entry expires.
USCF export
- A clean report exports as a single zip containing
THEXPORT.DBF,TSEXPORT.DBF, andTDEXPORT.DBFfiles, ready to upload in the TD / Affiliate area at ratings.uschess.org. This is a manual upload in order to keep Tournament Manager lean and mean for v1.0, but submitting directly to USCF may be added in the future if I get access to the USCF MUIR API. - A readiness report runs a pre-export validator against the tournament's rated sections and explains errors and warnings. Errors block the download and warnings don't.
USCF status validation
- On-demand checks against the USCF ratings API, so a bad membership surfaces before the upload bounces: a "Validate players" button on the event's "Registrations" tab (with ETR 5.2.5+) checks every registered player's USCF membership through the event's end date, and "Validate TDs" buttons in Settings and on the tournament edit page check the club affiliate ID plus each TD's membership, TD certification, and Safe Play certification.
- Results show PASS or FAIL per person with the reason spelled out ("Expired 2025-01-31", "Not a certified TD", "No Safe Play certification on file"), plus a "renew soon" heads-up when something passes but expires within 30 days of the tournament's last day.
- Advisory only: nothing in Tournament Manager is ever blocked by a validation result.
Settings
- One Settings page for the USCF affiliate ID, chief and assistant TD member IDs, default city / state / ZIP for new tournaments, time control presets, and whether tournament data is kept or deleted on uninstall (default is off, so data is kept by default).
- Any individual tournament can override the chief or assistant TD ID for that one event, and leaving either blank pulls in the club default's defaults set up in Settings.
FIDE flag
- A section can be marked FIDE rated, which passes a flag through to the USCF export header and adds a reminder that FIDE rating is a separate submission Tournament Manager does not handle. It's a flag only, not a FIDE-format export.
Profile pictures
- A per-tournament "Show profile pictures" toggle adds a player profile photo to the public standings table, the wall chart, and the TD's pairing aid.
- Photos come from the registrant's event registration (ETR 5.2.3 / ETECF 5.2.3 or newer), are carried in automatically by the one-click "Import to Tournament Manager" button, and are saved in the WordPress media library for reuse across multiple registrations, tournament recap blog posts, and so on.
- Players imported from a CSV or with no photo on file get a neutral silhouette instead.
- A new tournament created from an event defaults the "Show profile pictures" toggle to match that event's own "Show photos" setting.
Performance
- Everything the public sees (a saved round, a withdrawal, a settings change) flushes that event page across whichever page caching plugin is active (W3 Total Cache, WP Super Cache, WP Rocket, and LiteSpeed Cache).
- TD-only pages are never cached. The public always sees a cached page when using a compatible caching plugin.
- Using ETR's "Demo mode", Tournament Manager has been performance tested up to 200 players with 5 rounds. In a test with 100 players and 5 rounds, database queries were under 10ms (40ms for the USCF export), memory around 2MB, and page size was just 81KB.
- Note that putting hundreds of players in the same section will have a performance cost for TDs. Tournaments don't really ever have mega sections, though, so this would never happen in reality.
Permissions
- All tournament admin pages require the
wpmtm_manage_tournamentspermission, and administrators are granted automatically on activation. - The Settings page requires the
manage_optionspermission.
A quick tour of a tournament with test data - from setup to USCF upload. Click any image for the full-size version.
Settings - USCF affiliate ID, chief and assistant TD member IDs, default city / state / ZIP, time control presets, the delete-on-uninstall switch, and the optional "Tournament Manager" role for a volunteer TD.
Import preview - every detected section with its own rated toggle, a split-into-quads option, and create-new / map-to-existing / skip actions. Nothing is written until you confirm, and re-importing onto a section that already has players is flagged.
Sections editor - each section carries its own rating system (Swiss, Round Robin, or Quad), time control, round count, and rated flag, so one event can mix rated and unrated sections.
Sections editor's Manage registrants - Preview and optionally edit the roster, change Withdrawn status, and show Family name first everywhere a name is displayed.
Pairing aid - score groups with the color due and the opponents already played, so a TD can pair each round by hand from the top down (or let "Suggest pairings" do it).
Round entry - set each board's result, assign a bye, or withdraw a player. Saving a round replaces that round's results outright and updates the standings immediately.
Standings - Standings with all four US Chess 34E tiebreaks in order (Modified Median, Solkoff, Cumulative, Cumulative of Opposition), shown live on the event page.
Wall chart - each player's opponent and result with a running score, round by round.
USCF export - a readiness report validates the rated sections first, then downloads the three-DBF zip (THEXPORT / TSEXPORT / TDEXPORT) ready to upload to ratings.uschess.org.
- Get Tournament Manager from the releases page, and upload the plugin to
wp-content/plugins/wp-tournament-manager(or install the zip through Plugins > Add New > Upload Plugin). - Activate it. Activation creates the plugin's database tables and grants the
wpmtm_manage_tournamentspermission to administrators. - If you plan to run rated events, visit Tournament Manager > Settings and enter your club's USCF affiliate ID and TD member IDs before your first export.
First, an event for the tournament needs to be created (using The Events Calendar, or TEC) and tickets and registrations need to be enabled for it (using Event Tickets, further enhanced by ETECF). Then a typical TD's first tournament, start to finish, goes like this:
- Settings
- Tournament Manager > Settings: set the affiliate ID and TD IDs (rated events only), default city / state / ZIP, and time control presets so you don't retype them per section.
- Create a tournament
- Add a tournament, link it to the event's page, and set rated / unrated and confirm its date range. This is what turns on the pairing aid, wall charts, results, and standings on the event page itself.
- Import the roster
- Click "Import to Tournament Manager" right on the event's "Registrations" tab, or upload ETR's "Pairing export" CSV in the tournament's edit page. Review the preview (sections, rated flags, no-shows skipped, any blank USCF IDs) and confirm.
- A "Family name first" option is available to reverse the display of First and Last names for individual registrants.
- Enter rounds
- On the event's page, use the pairing aid under the "Round entry" tab to pair each round either by hand or with the "Suggest pairings" button, then enter results (or byes or a withdrawal) and save. Standings are updated immediately for anyone viewing the page. The "Suggest pairings" button pairs all the players and populates the pairing aid for you to review, modify, and save. Pairings are determined by closeness in rating, a player is never paired against the same player twice, and family members (players sharing a family key or a last name) are not paired against each other when an alternative exists.
- Check standings
- The event page shows live standings with tiebreaks under the "Standings" tab.
- Export
- For rated tournaments, the tournament's edit page runs a readiness report. Review errors and warnings (e.g. a registrant's USCF ID is missing due to them registering before getting one). Errors block the download and warnings don't.
- Once it's error-free, download the DBF zip. Upload the zip file's three DBF files at the USCF TD / Affiliate area at ratings.uschess.org.
What about walk-ins?
The moment that event registrations are imported into Tournament Manager, no new entrants can be added. Tournament Manager doesn't go out of its way to handle situations involving walk-ins or late registrations, and your event registration end date ("ticket sell date") is controlled by Event Tickets and ETR's global checkbox for allowing registrations after an event has started.
Multiple player profile support
Registrations are viewable / editable by the person who paid during registration (perfect for parents), and this is managed by ETECF outside of Tournament Manager. Note that registration data edited after event registrations have been imported by CSV or the "Import into Tournament Manager" button do get saved but those changes are reflected in ETR and not in Tournament Manager post-import.
The "Import to Tournament Manager" button is missing
The "Import to Tournament Manager" button on ETR's "Registrations" tab needs ETR 5.2.3 or later. Older ETR versions will still work with Tournament Manager but only through the manual CSV upload.
The USCF export worked, but importing to USCF doesn't
Check that all players in rated sections have active USCF memberships and that your club's affiliate ID, your TD's USCF membership, and your TD's Safe Play certifications are active and up to date. If any of these are incorrect or expired, the USCF import won't work. According to USCF guidelines, a player's USCF membership must be active up to and including the date of the last day of your tournament.
This can be a show-stopper, so check everything before importing registrants into Tournament Manager. Tournament Manager now does these checks for you, on demand, against the USCF ratings API: a "Validate players" button on the event's "Registrations" tab (with ETR 5.2.5+) checks every registered player's membership through the event's end date, and "Validate TDs" buttons in Tournament Manager Settings and on the tournament edit page check the club affiliate ID, TD USCF memberships, TD certifications, and Safe Play certifications. These checks are advisory only and nothing is blocked by their results, so a no-go verdict can be handled your usual way (renew, or mark the player as a no-show in ETR). One caveat: the USCF MUIR API v1 these checks use is unsupported by USCF, and v2 is supposedly coming in late Summer, 2026. What a fun time for tournament software developers!
I don't know what is happening, what just happened, or what to do next
Tournament Manager explains things as you go in admin notices, so you might not see them if you have notices hidden with a third-party plugin like Admin & Site Enhancements. On the upside, you can enable a third-party plugin like ASE to hide notices if you no longer wish to see them. I recommend something like Unnotifier to dismiss individual notices rather than the all or nothing method that ASE and others use.
There's also an optional setup guide that will walk you through setting up and managing a tournament. (This is still a work-in-progress, and feedback is welcome.) If you accidentally dismissed the setup guide admin notice, click the "Show setup guide" button in Tournament Manager Settings for it to reappear.
Tournament Manager creates five tables (prefixed with your WordPress table prefix): wpmtm_tournaments, wpmtm_sections, wpmtm_players,
wpmtm_games, and wpmtm_byes. It also saves the wpmtm_options option (affiliate ID, TD IDs, defaults, time control presets, and delete-on-uninstall flag) and the wpmtm_db_version option used to run schema upgrades.
The first m in wpmtm is a nod to the McMinnville Chess Club for which Tournament Manager was originally created.
Uninstalling removes wpmtm_options, wpmtm_db_version, and the wpmtm_manage_tournaments permission from every role. Drops the five
wpmtm_* tables only if "On uninstall" in Settings is set to delete tournament data. This is off by default, so a club's tournament history survives an accidental deactivate and delete.
See CHANGELOG.md.
GPL v2 or later. See https://www.gnu.org/licenses/gpl-2.0.html