Every match-day touchpoint. Every competitor action. Zero paper.
Five scoring engines composed from eight swappable modules. Capability-based RBAC with stage-scoped volunteer grants that work offline. Equipment validation at registration. Per-match requirement enforcement (alias, age, membership). Director-side analytics layer (Match Analytics, Operations Dashboard, Score Audit). Six-mechanism offline-first sync stack — every device stays current whether you have full LTE, the bay’s flaky Wi-Fi, or nothing at all. A free WordPress plugin that auto-publishes results.
From sign-up sheet to scoresheet
Every match-day touchpoint — how shooters sign up, how they check in, how they get assigned to squads, how scores get locked — runs through a single app. No clipboard. No paper. No “wait, who’s in posse 3?”
One code, infinite pre-sign-ups
Each match generates its own QR code. Post it to your club email, website, or clubhouse bulletin. Shooters scan, fill a mobile-friendly form, land in your queue.
Day-of registration in two taps
New shooter shows up unannounced? Manager hits the walk-up button, fills alias + SASS# + category. Auto-approved in one step for managers.
Live roster, live count
“12/45 checked in” live at the top. Searchable by alias or SASS#. Not-checked-in entries float to the top. One-tap toggle per shooter. Batch check-in button clears the whole queue at once.
Auto-balance & auto-rotate
Auto-balance distributes checked-in shooters evenly across squads. Auto-rotate assigns each squad its starting stage and computes the rotation schedule per squad. Batch-assignment tools for when you’re handling 60+ shooters.
Sport-correct vocabulary
Same workflow, correct word for the discipline. SASS matches call them posses, USPSA / IDPA call them squads — the app uses the right term everywhere based on the sport picked for the match.
Checked-in only on the scoring grid
Shooters who haven’t checked in don’t appear in squad setup or scoring screens. No-shows don’t clutter the line.
Requirements, equipment, notes
Dedicated screen surfaces match requirements, equipment constraints, dress code, and director notes for shooters at registration time. Replaces the inline-modal pattern that didn’t scale to multi-day matches.
Recurring matches in one tap
Clone last weekend’s match (stages, requirements, sport, settings) in one tap; new date, same setup. The QR regenerates for the new match. Monthly cadences stop being weekly setup.
Atomic score lock
One tap freezes a stage. Bulk-lock all stages atomically when the match is done. Scores can’t be edited; squads can’t be moved. Every change timestamped with an actor.
Every match your club has run, at a glance.
Upcoming match at the top with a prominent “Score Stage 1” CTA. Completed matches show 100% scoring progress with a lock icon. Scoring status bar tells you what’s live, what’s done, and what’s still waiting.

Catch problems before match day
The equipment system, match-level requirement toggles, and DOB-derived age checks turn registration into a gate. Ineligible shooters land in a review queue rather than on the line. Match directors stop saying “sorry, your firearm isn’t legal in this division” on Saturday morning.
Per-shooter profile
Each shooter has equipment slots on their profile — firearm, holster, ammo, optics. Updated once on the profile, validated against every match they sign up for.
Per-match equipment rules
Directors set per-match equipment constraints — caliber range, capacity, optics rules, division compliance. The constraint set is part of the match definition; duplicating a match carries them forward.
Block ineligible registrations
On registration, the app validates the shooter’s equipment slots against the match’s constraints. Failures show the specific failed rule, so the shooter can update their slots and re-submit before match day.
Per-match enforcement
Directors toggle per-match: alias required, age minimum (computed from DOB), valid SASS/USPSA/IDPA membership, equipment compliance. Each toggle is independent — set the policy that fits the match.
Age minimums computed live
Shooters store DOB once on their profile. Match directors set an age minimum on the match. The app blocks under-age registrations automatically — no manual ID checks at the desk.
Valid SASS/USPSA/IDPA only
Toggle “valid membership required” per match for sanctioned events. Shooters with expired or missing numbers see a blocking message at registration with what’s missing.
The match-day analytics layer
Six dedicated director screens that turn match-day data into action — not just a CSV. From the moment a match locks, you have the breakdowns you used to compute by hand, plus the audit trail to defend any score change.
Stage / entry / group breakdowns
Stage-by-stage analytics, per-entry analytics, group analytics, performance trends, segmented standings. See where the time went, which stages broke the field, and how this match compared to last month’s.
Live match-day air-traffic-control
Director-side live view of check-in pace, stage progress, scorer assignments, audit alerts, and equipment-validation queue. The single screen the director keeps open all day.
Every edit, every actor, one page
Per-match Score Audit screen surfaces every score edit, the actor who made it, and the before/after delta. Filter by shooter, stage, or actor. Defend any score change with one screenshot.
Structured DQ reasons
DQs are recorded with structured reasons (Cold Range, Unsafe Handling, 180 Violation, etc.) — not free-form notes. Match Analytics shows DQ rate per stage, per category, per season.
Match participant breakdown
Match participant demographics, sport-data summary across the season, segmented standings. The numbers you bring to a club board meeting.
Atomic stage lock
Lock all stages atomically when the match is done — no need to walk stage by stage. Audit log captures the bulk-lock as a single event with the actor.
Migrate in bulk
Import scores from external scoring formats in batch — useful for migrating an in-progress season from another scoring app. CSV bulk import is supported with all-or-nothing rollback on row-level failures.
Defend any score change
Full audit log CSV export covering every score edit, unlock, ownership transfer, grant action, and admin operation — with actor, timestamp, and before/after deltas. Useful for season records, sanctioning bodies, or insurance.
.psc exportHand off to PractiScore.com
Export any locked match as a PractiScore .psc SQLite file (GET /api/matches/{id}/export/practiscore) and upload it to PractiScore.com if your shooters expect to find results there. The only non-PractiScore app that reads and writes the format.
At the bay
Where Snapshot Scoring earns its keep — built specifically for outdoor range conditions, gloved hands, and the chaos of an active stage. Permanent scorekeepers and day-of volunteers get the same tools. Volunteers can keep scoring even at remote bays without signal.
Outdoor-readable layout
High-contrast layouts with oversized stage cards. Readable in direct sun without holding the phone at a weird angle.
Color-coded status bar
Horizontal shooter pills at the top of every scoring screen. Unseen (gray) → in-progress (yellow) → scored (green) → locked (red). Tap any pill to jump to that shooter; auto-scrolls into view on select.
Hit-factor scoring UI
A/C/D zone counters with ± buttons. No-shoots and miss fields. Major/minor power-factor toggle that recalculates zone values live. Hit factor shown in real time as you tap.
Points-down UI
Raw time + points-down counter + procedurals + FTDR + Hit-on-Non-Threat. Each field shows its time penalty preview inline — “+3s” next to procedurals, “+5s” next to FTDR.
5-string drop-worst UI
Five string inputs in milliseconds, auto-formatted to X.XX seconds. Worst-string auto-marked DROPPED. Anything over 30s tagged MAX. Final time updates as you enter.
Auto-reconnect + haptics + undo
Pairs with AMG Commander, Shooters Global SG Timer, and Special Pie M1A2. Stage times land directly in the scoring screen. Auto-reconnects when the radio drops, haptic feedback on shot detection, undo for the last shot, staleness guard prevents stale readings from being applied to the wrong shooter.
Score remote bays without signal
Volunteer permission grants cache on device. Scan the grant QR with signal at sign-in, walk to a remote bay with no signal, keep scoring. A persistent banner shows you’re running on cached perms.

Score a stage in under a minute.
Editing a previously-saved score? The banner tells you before you overwrite. Sport-specific form below. BLE-synced time at the top with auto-reconnect. Miss steppers with “+5s each” preview next to them. Save & Next opens a shooter picker so you can jump directly to the next shooter — no accidental stage change.
Six independent offline mechanisms
Match-day networks are a mess. Snapshot Scoring assumes that and ships a sync stack with six independent mechanisms layered together — every device current whether you have full LTE, the bay’s flaky Wi-Fi, or nothing at all. Each mechanism does one job; together they cover the rest.
5,000 ops, encrypted at rest
Every score, registration, check-in, and lock saves to device storage first. 5,000-operation capacity sized for a 200-entry × 10-stage match × 2 ops/score. 14-day retention for multi-day events. Payloads obfuscated at rest with a key in the device Keychain (iOS) / Keystore (Android). Mutex-protected, listener-broadcasting, retry-with-exponential-backoff up to 10 attempts per op.
Same Wi-Fi, no server roundtrip
Multiple phones on the same Wi-Fi exchange scores directly without going to the server. Port 8847, QR-bootstrap session (snapshot://sync/<ip>:<port>/<token>), 30-minute timeout. Director phone, four scoring phones — all current with each other regardless of internet.
Only changed entities transit
ETag-based HTTP caching plus per-entity modifiedSince timestamps across nine entity types (matches, shooters, scores, stages, groups, entries, organizations, rulesets, check-ins). Phone joins mid-day on a slow tether? Catches up in seconds, not minutes.
Foreground / background reconciliation
Auto-syncs when the app returns to foreground. Configurable: foreground interval (default 5 min), WiFi-only mode, low-battery skip, pause/resume, exponential retry up to 5 minutes. Pause for the awards ceremony if you want.
NDEF tags, 5 payload types
NDEF tags up to 8 KB, private MIME so other apps don’t intercept. Five payload types: shooter, match, stage, club, scores. Tap a phone to a programmed tag and the right action runs — check in, follow a club, claim a stage, ingest a score bundle.
12 transfer types, chunked
Compact QR (~2.9 KB chunked, JSON-with-version-prefix): SCORE / SHOOTER / SHOOTERS / MATCH / STAGE / STAGES / ENTRY / ENTRIES / GROUP / GROUPS / CLUB / BUNDLE. Transfer a full match, a single stage, a roster, or a single shooter — chunked automatically when the payload exceeds one QR.
Score offline immediately on install
Sport rules cached on device at install time. A freshly-installed phone can score offline immediately — no first-load round-trip, no “please connect to download rulesets.”
Cached perms for remote bays
Permission grants persist on device. Volunteer scans the QR with signal at sign-in, walks to a remote bay with no signal, keeps scoring. Persistent banner reminds them they’re on cached perms.
Replay in order on reconnect
When a phone returns to signal, queued ops replay in order; conflicts resolve by latest write timestamp. Ops are dropped only after 10 retry attempts, with an explicit alert so you know nothing was silently lost.
Results everywhere at once
The whole point of match day is the scoreboard. Snapshot Scoring puts it in five places at once — on your club website, in every follower’s feed, in every competitor’s match history, in an email to every shooter, and on print-ready awards certificates.
WordPress auto-publish
Free publishing plugin for any WordPress club site. OAuth 2.0 PKCE pairing — enter a pairing code once, no copy-paste API keys. Locked matches auto-publish as custom post types with overall + per-division leaderboards, and styled club + match pages work out of the box.
Many clubs, one account
Pair multiple WordPress sites from one director account. Per-site auto-push toggles, per-site connection status, per-site OAuth tokens. Run results for two clubs from the same phone — or help a neighboring club without sharing accounts.
In the app, automatically
Every follower of your club sees the match in their Events feed. Their match history updates if they shot it. Their career stats and classifier rank recalculate. Zero action required.
Per-shooter breakdowns
One tap emails each shooter their own results — per-stage breakdown, match total, category rank, clean-match flag. Nobody asks “where do I see my scores?”
Multiple export formats
Generate clean PDF results (landscape letter, repeating headers), raw CSV exports, and full audit log CSV for season records. Signed download URLs for mobile-friendly sharing.
.pscDirect interop, no conversion
Export any locked match as a PractiScore .psc SQLite file. Hand it to a director who lives on PractiScore.com and they upload it natively. We’re the only non-PractiScore app that reads and writes the format.
Print-ready top-3 per category
Generate awards certificates in PDF — one page per top-3-per-category, landscape format, leather + brass design. Print Sunday afternoon for the awards ceremony.
Shareable, SEO-friendly
Locked matches at public clubs get a public results URL — shooters can link their category placement to anyone, indexed by search engines, no login required.
One screen, every output.
36/36 scored, six shooters, six stages, zero clean. PDF, CSV, Awards, Publish, Email, .psc — every button is a one-tap final action. By-category leaderboards with SASS# and per-stage drill-down. Results on the club site before the awards ceremony starts.

Your shooting, tracked
Every match you’ve shot, every drill you’ve run, every division you compete in — aggregated, searchable, and attached to every membership number you hold across every club that uses the app. Plus classifier progression so you can see your rank trajectory across seasons.
Career dashboard
Total matches, total stages, clean-match rate, avg / best / worst match total, best stage time. Numbers are live from your actual scored matches — no manual entry.
Rank progression across seasons
Watch your USPSA classification, IDPA class, or SASS skill level progress across seasons. Pulled live from scored matches; no manual entry. See trajectory by sport on one screen.
Multi-org auto-link + alias
Hold SASS, USPSA, and IDPA numbers on the same profile, with per-org aliases. Scores from each discipline auto-link to the right ID and the right alias — including matches shot at other clubs before you signed up for the app. Travel shooter in three disciplines? One profile, not three.
Stage times, placements, misses
Drill into any match — stage-by-stage times, hit factor, points down, category placement, overall finish, clean/MDQ flags. Email the full results PDF in one tap.
Practice tracking with targets
Log draws, transitions, reloads, sweeps, stage runs, dry-fire sessions — with firearm, time, location, and notes. Set target time + accuracy goals per drill type; trajectory chart shows progress. Best + average per drill type.
Year-to-date leaderboards
Season standings per club, per category. See your rank, total match time, clean count across every match in the season.
One profile, every match
Per-shooter equipment slots (firearm, holster, ammo, optics) on the profile. Match registration validates against per-match constraints automatically.
Verified email & password reset
Real account management. Verify your email at signup, reset your password via 6-digit code if you forget it.
Profile Card QR — one code, every touchpoint
Unified QR codes for users, clubs, matches, and grants. The same minimal TYPE:ID format means the same scan does different things depending on where you scan it — check in, enroll, follow a club, claim a volunteer grant. No external barcode app needed.
Check in with a scan
Settings → My QR Code. Your personal card is on screen — show it at any club’s check-in desk and they scan you straight onto the squad. Travel to a match at a club you’ve never been to? Same flow, no extra registration forms.
Shareable club card
From Club Settings, directors get a QR for the club itself. Post it next to the entrance; shooters who scan it land on the public profile ready to follow.
Two taps to register
Each match has its own QR. Scan → pre-filled registration form with your profile info, SASS#, per-org alias, and category already populated.
Volunteer access in one scan
Director creates a stage-scoped grant, taps share. Volunteer scans, authenticates, and lands on the scoring screens they’re assigned to. Permissions cache on device so they keep working at remote bays without signal.
Same scan, different action
Scan a shooter’s Profile QR on the Check-In screen → check them in. Scan it on the Posse Setup screen → enroll them. Scan it on a public club profile → follow the club.
Tap a programmed tag
Same five payload types as QR (shooter, match, stage, club, scores) on NFC NDEF tags up to 8 KB.
The loop that grows your club
Every feature on the competitor side also does double duty as marketing for your club. Followers see your matches. Searchers find your profile. Inline registration closes the loop from “saw it” to “signed up.”
Find clubs
Search public clubs by name, abbreviation, or location. See member count, follower count, upcoming matches.
Every club, its own page
Name, location, description, website, member + follower counts, next 10 matches.
One tap to subscribe
Shooters tap “Follow” on a club profile. Your matches now land in their Events feed as soon as you create them.
Your matches, in their app
Every match you create appears in the Events feed of every follower, sorted by date with registration CTA inline.
See a match → register → done
Interested shooters register from the feed without leaving it. Profile info + member numbers + per-org alias + category pre-fill themselves.
Calendar subscriptions
Every public club exposes an iCal feed (RFC 5545). Shooters subscribe in Apple Calendar, Google Calendar, or Outlook.
Five sports. Five engines. Eight composable modules.
Not a single generic engine with sport-shaped lipstick. Each discipline has its own scoring method, its own scoring form built around how that sport actually scores, its division set, and its penalty model. Underneath, eight reusable scoring modules (time_plus, hit_factor, points_down, raw_time, drop_worst, power_factor, bonus_targets, detailed_misses) compose every engine — so a new league year or a house variant is a config row, not a code change. Match directors pick the league + ruleset per match in the match-creation wizard, with Club Defaults pre-selected.
Cowboy Action Shooting
43 official SASS category codes seeded from the 2024 handbook (Buckaroo through La Reina, plus all duelist, gunfighter, costume, and Frontier Cartridge variants). Time Plus scoring with misses (+5s), procedurals (+10s), and spirit-of-the-game penalties (+30s).
Practical Pistol
Full USPSA divisions across three leagues (Production, Steel Challenge, Multi-Gun). Dedicated scoring form with A/C/D zone counters, no-shoots, misses, procedurals, and a major/minor power-factor toggle that recalculates points live.
Defensive Pistol
IDPA divisions with points-down scoring. Dedicated form: raw time + points down (0.5s each) + procedurals (3s) + FTDR (5s) + Hit-on-Non-Threat (5s).
Multi-gun
Time Plus scoring across pistol, rifle, and shotgun stages. Per-firearm miss tracking, MOA penalties, firearm-specific round counts and division rules.
Steel Challenge
SCSA-style speed shooting. Five strings per stage, drop-worst auto-marked, 30s string max auto-capped. Final time computed live.
Config, not code
As of April 2026, adding a new league year or a house variant is a config task, not a code release. Email clubs@snapshotscoring.com.
Capability-based access control
Permissions follow the role — not the person. A capability model with twelve discrete permissions and three system roles, plus stage-scoped temporary grants for one-off volunteers.
Discrete, auditable capabilities
manage_club · manage_members · manage_matches · manage_stages · manage_groups · manage_entries · score_matches · delete_scores · view_scores · manage_shooters · export_data · check_in. Each is individually grantable, auditable, and revocable.
Owner · Match Director · Scorekeeper
System-immutable bundles of permissions. Owners get everything; Match Directors get everything except club/member management; Scorekeepers get score_matches + view_scores + check_in only.
Stage-scoped volunteer access
Directors create a grant with selected permissions scoped to specific stages. Share via QR code or invite link.
Cached perms for remote bays
Permission grants persist on device. Volunteer scans the QR with signal at sign-in, walks to a remote bay with no signal, keeps scoring.
Match end + 12 hours
Grants auto-expire 12 hours after the match end date. Creator can revoke earlier from the Grants screen.
Permanent + temporary layers
Permission checks look for active match grants first (for volunteers), then fall back to permanent club membership.
Clean handoff, full audit
Explicit ownership transfer flow with audit log. No shared admin passwords.
Under the hood
The boring-but-important stuff that makes the whole system reliable across devices, networks, and seasons.
iOS & Android
Native React Native build for both platforms. Same data model, same UI, same scoring engines.
JWT with auto-refresh
Token-based authentication with automatic refresh. Sign in once, stay signed in. Capability checks on every mutation.
Scope-gated REST surface
Separate /api/admin/ REST surface backs internal staff tooling — bearer-token ServiceAccount auth, scope-gated, audit-logged on every call. Ten admin ViewSets plus 14 custom actions.
FCM + APNs registered
Device tokens managed server-side with auto-deactivation on bad tokens.
OAuth 2.0 + multi-site pairing
Free GPL plugin (snapshot-results v2.6.1) pairs via OAuth 2.0 PKCE — no copy-paste API keys. Pair multiple WordPress sites from one director account, with per-site auto-push toggles.
Every mutation timestamped
Score edits, unlocks, ownership transfers, grant revocations, admin CRUD ops — all captured with actor + timestamp + before/after deltas.
Bring it to your next match.
Free to install. No setup fee. Full feature access from day one.