Publishing match results to your club’s WordPress site.
Install the free plugin, connect it once, and a locked match on your Snapshot club becomes a real page on your own site — overall standings, per-category results, stage-by-stage detail. This is the whole process in order, with the screen names you will actually see.
// snapshot-results · free · GPLv2 · requires WordPress 6.0+ and PHP 8.0+
Before you start
- Administrator access to the club’s WordPress site. The plugin’s settings screen is administrator-only.
- The site has to be reachable over HTTPS from the public internet. Snapshot pushes results to your site, so a site behind a VPN or sitting on localhost cannot receive them.
- A Snapshot account that is owner or manager of the club. The connect screen only offers clubs where you hold one of those two roles.
- WordPress 6.0 or newer, on PHP 8.0 or newer.
Steps 1 and 2 take about fifteen minutes and you do them once per site. After that, publishing a match is one button.
Six steps, start to published.
The first three are one-time. The last three are what you repeat on match day.
Upload the plugin
Download snapshot-results.zip, then in WP admin go to Plugins → Add New Plugin → Upload Plugin, choose the zip, install, activate. Activating registers two post types, Clubs and Matches, and refreshes your permalinks so their pages resolve straight away.
Link the site to your club
Go to Settings → Snapshot. The page opens on Not Connected; press Connect with Snapshot. Your browser is handed to Snapshot to sign in, then shows a consent screen headed “Select clubs to connect” listing every club where you are an owner or a manager. Tick the ones this site should publish and press Allow. (Deny backs out without connecting anything.)
Check the Synced Clubs table
You land back on Settings → Snapshot reading Connected, with a Synced Clubs table listing each club you ticked. Nothing was copied and pasted: the handshake is OAuth 2.0 with PKCE, and your site holds an access token and a refresh token that it renews on its own.
Connecting takes about a minute. Press Connect with Snapshot in the plugin settings, approve access on the consent screen, and tick the club(s) to link — OAuth 2.0 PKCE, no copy-paste API keys. Then press Refresh to pull your clubs down. Stuck? Email clubs@snapshotscoring.com.
Run the match in the app
Create the match, add stages, enroll shooters, score every stage. If this is your first one, Scoring your first match walks the whole match day. Nothing publishes while a match is still being scored, so there is no risk of a half-finished leaderboard appearing on the site.
Lock the match
Press Lock Match on the match screen. Owners and managers can do this; scorekeepers cannot. Locking is what makes a match publishable, and it freezes the scores — once locked, any attempt to write a score is refused. A manager can unlock it to make a correction, but the match has to be locked again before you sync: only matches that are locked at the moment you press Sync Now have their results sent.
Press Sync Now
Back in Settings → Snapshot → Synced Clubs, press Sync Now on the club’s row. That one press sends the club record, every match belonging to the club, and full results for every match you have locked. The Last Sync column shows when the sync ran — read it as a timestamp, not a verdict. It records a success whenever Snapshot accepted the request, even if the individual pushes back to your site then failed. Open the match page to confirm the results actually landed.
On the Auto-Push columns. Tick Auto-Push Matches and Auto-Push Results in the Synced Clubs table and a match is pushed to your site the moment it is locked in the app, with no Sync Now needed. Sync Now still works for a manual re-push, and is the step to use if a push was missed.
Where the results land
Each synced club becomes a page at /clubs/<club-name>/ and each synced match a page at /matches/<match-name>/, both published immediately. Re-syncing the same match updates the page it already made rather than creating a second one, so you can sync as often as you like. Matches that are not locked still come across, as schedule entries with no results attached, which is what puts your upcoming matches on the site.
The plugin ships styled templates for both post types and uses them by default. The results table is built from the ruleset the match was scored under, so a Hit Factor match and a Time Plus match each get the columns they need, under the right membership-number heading. If you would rather your own theme render these pages, switch off Built-in Templates under Display Settings, or drop a single-snapshot_match.php into your theme — a theme file always wins over the plugin’s.
Results are stored on the match post, not on a Snapshot server your site has to call. Once a match has synced, its page keeps working whether or not Snapshot is reachable.
Putting results on a page you already have
If you want results inside an existing page rather than on the plugin’s own, the plugin registers shortcodes that emit plain unstyled HTML for your theme to style:
[snapshot_results]— the overall standings table.[snapshot_results_by_category]— one table per category.[snapshot_match_name],[snapshot_match_date],[snapshot_match_stage_count],[snapshot_match_shooter_count]— single match fields.[snapshot_club_name],[snapshot_club_location],[snapshot_club_match_dates]— single club fields.
On a match or club page they pick up the current post on their own. Anywhere else, pass the Snapshot id: [snapshot_results match_id="42"].
One caveat, if the member number matters to you: [snapshot_results] hardcodes a SASS heading for that column and reads a field the backend does not send, so on any match the column is empty, and on a non-SASS match it is mislabeled as well. The built-in match template does not have this problem — it reads the real field under the right heading. Use the template where the member number needs to be right, and the shortcodes where it does not.
Troubleshooting.
“No clubs connected yet.”
No club was ticked on the “Select clubs to connect” screen during the handshake. Press Connect with Snapshot again and tick at least one, then press Refresh on the settings page to pull the list down.
A match synced, but its page shows no results.
Check two things, in this order. First, was the match locked at the moment you pressed Sync Now? An unlocked match arrives as a schedule entry with no results. Second, Sync Now can report success while the pushes back to your site failed, so confirm Snapshot can reach https://yourclubsite.com/wp-json/snapshot/v1/…. The usual blockers are a security plugin disabling the WordPress REST API, HTTP Basic auth in front of a staging site, or a firewall. Load /wp-json/ on your own site in a browser: if the REST API is reachable it answers with JSON rather than a 404 page.
Last Sync shows an error.
That indicator covers the outbound leg only: your site could not reach Snapshot at all, so the request never arrived. Check the site can make outbound HTTPS calls and that the connection has not been revoked, then press Refresh. A sync that reaches Snapshot but fails on the way back does not show up here — see the entry above.
Club and match pages return 404.
The permalink rules did not refresh. Go to Settings → Permalinks and press Save Changes without changing anything.
Can one site publish more than one club?
Yes. Tick every club you want on the consent screen. Each gets its own row in the Synced Clubs table, with its own Sync Now button and its own last-sync state.
Does the plugin cost anything, ever?
No. The plugin is free and GPLv2, and stays that way. The $20/year club seat is on the Snapshot side, and founding clubs never pay it. See pricing.
Next
If you have not run a match through the app yet, start with Scoring your first match. It ends where this guide begins, at the lock.
Founding status is open until the iPhone app is on the App Store: run a match with us before then and your club keeps full access free for life. Every other club runs on a $20/year seat, with no per-shooter or per-match fees.