Features

Features

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.

When you’re running a match

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?”

▸ QR registration

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.

▸ Walk-up flow

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.

▸ Check-in desk

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.

▸ Squad builder

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.

▸ Posse vs Squad

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.

▸ Filtered scoring

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.

▸ Match Info screen

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.

▸ Match duplication

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.

▸ Lock & bulk-lock

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.

At a glance

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.

Snapshot Scoring match list with three monthly matches and progress bars
Equipment & requirements

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.

▸ Equipment slots

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.

▸ Match constraints

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.

▸ Validation at signup

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.

▸ Requirement toggles

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 from DOB

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.

▸ Membership check

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.

Director power tools

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.

▸ Match Analytics

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.

▸ Operations Dashboard

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.

▸ Score Audit

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.

▸ DQ analysis

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.

▸ Demographics + sport summary

Match participant breakdown

Match participant demographics, sport-data summary across the season, segmented standings. The numbers you bring to a club board meeting.

▸ Bulk score lock

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.

▸ Batch score import

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.

▸ Audit log CSV export

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.

▸ PractiScore .psc export

Hand 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.

When you’re scoring

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.

▸ UI

Outdoor-readable layout

High-contrast layouts with oversized stage cards. Readable in direct sun without holding the phone at a weird angle.

▸ Shooter pills

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.

▸ USPSA form

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.

▸ IDPA form

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.

▸ Steel form

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.

▸ BLE timer

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.

▸ Offline grants

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.

Live stage scoring with shooter pills, BLE-synced time, and miss steppers
At the bay

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.

Offline-first

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.

▸ 14-day mutation queue

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.

▸ Local-network HTTP peer sync

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.

▸ Delta sync with ETags

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.

▸ Configurable background sync

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.

▸ NFC tap-to-transfer

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.

▸ QR transfer codec

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.

▸ Embedded scoring defaults

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.”

▸ Offline volunteer grants

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.

▸ Latest-write-wins reconciliation

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.

When the match ends

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.

▸ Club site

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.

▸ Multi-site pairing

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.

▸ Follower feeds

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.

▸ Email results

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?”

▸ PDF + CSV + audit

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.

▸ PractiScore .psc

Direct 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.

▸ Awards certs

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.

▸ Public match page

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.

After the match

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.

Match results screen with category leaders, publish and email actions
When you’re competing

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 stats

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.

▸ Classifier tracking

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.

▸ Match history

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.

▸ Per-match detail

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.

▸ Drill log + goals

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.

▸ Standings

Year-to-date leaderboards

Season standings per club, per category. See your rank, total match time, clean count across every match in the season.

▸ Equipment slots

One profile, every match

Per-shooter equipment slots (firearm, holster, ammo, optics) on the profile. Match registration validates against per-match constraints automatically.

▸ Account

Verified email & password reset

Real account management. Verify your email at signup, reset your password via 6-digit code if you forget it.

Scan anywhere

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.

▸ Your shooter QR

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.

▸ Club QR

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.

▸ Match QR

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.

▸ Grant QR

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.

▸ Context-aware

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.

▸ NFC tap

Tap a programmed tag

Same five payload types as QR (shooter, match, stage, club, scores) on NFC NDEF tags up to 8 KB.

Discovery & growth

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.”

▸ Search

Find clubs

Search public clubs by name, abbreviation, or location. See member count, follower count, upcoming matches.

▸ Public profile

Every club, its own page

Name, location, description, website, member + follower counts, next 10 matches.

▸ Follow button

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.

▸ Events feed

Your matches, in their app

Every match you create appears in the Events feed of every follower, sorted by date with registration CTA inline.

▸ Inline registration

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.

▸ iCal feed

Calendar subscriptions

Every public club exposes an iCal feed (RFC 5545). Shooters subscribe in Apple Calendar, Google Calendar, or Outlook.

Disciplines

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.

SASS · Time Plus

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).

USPSA · Hit Factor

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.

IDPA · Points Down

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).

3-Gun · Time Plus

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 · Raw Time

Steel Challenge

SCSA-style speed shooting. Five strings per stage, drop-worst auto-marked, 30s string max auto-capped. Final time computed live.

+ Any ruleset

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.

Permissions & RBAC

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.

▸ 12 permissions

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.

▸ 3 system roles

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.

▸ Match grants (Temp Auth)

Stage-scoped volunteer access

Directors create a grant with selected permissions scoped to specific stages. Share via QR code or invite link.

▸ Offline grants

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.

▸ Auto-expiry

Match end + 12 hours

Grants auto-expire 12 hours after the match end date. Creator can revoke earlier from the Grants screen.

▸ Dual-mode check

Permanent + temporary layers

Permission checks look for active match grants first (for volunteers), then fall back to permanent club membership.

▸ Ownership transfer

Clean handoff, full audit

Explicit ownership transfer flow with audit log. No shared admin passwords.

Platform

Under the hood

The boring-but-important stuff that makes the whole system reliable across devices, networks, and seasons.

▸ Platforms

iOS & Android

Native React Native build for both platforms. Same data model, same UI, same scoring engines.

▸ Auth

JWT with auto-refresh

Token-based authentication with automatic refresh. Sign in once, stay signed in. Capability checks on every mutation.

▸ Admin API

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.

▸ Push infra

FCM + APNs registered

Device tokens managed server-side with auto-deactivation on bad tokens.

▸ WordPress plugin

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.

▸ Audit trail

Every mutation timestamped

Score edits, unlocks, ownership transfers, grant revocations, admin CRUD ops — all captured with actor + timestamp + before/after deltas.

Ready when you are

Bring it to your next match.

Free to install. No setup fee. Full feature access from day one.