App Overview & Core Concepts
ChurchScore is a SwiftUI iOS application for tracking church members, assigning them to classes, awarding points for activities, viewing individual member progress, importing data, and generating reports. The main app opens to a splash screen and then shows four tabs.
Startup Behavior
When the app launches, these steps happen in order:
- 1A splash screen appears for approximately 2.5 seconds.
- 2If Server Mode is enabled, the app attempts to connect to the configured sync server.
- 3If a server URL is configured, the app triggers a full sync pull from the server.
- 4The main tab view opens. A synced installation may refresh its local database shortly after launch.
Members Tab
The Members tab is the roster view. It shows all members for the currently selected class with their lifetime point totals.
What You See
- A class picker at the top
- A list of members in the selected class
- Each member's lifetime point total shown as
X pts - Members are sorted alphabetically by name
How to Filter the Roster
- 1Open the Members tab.
- 2Tap the class picker at the top.
- 3Choose a class. The list refreshes immediately.
Member Detail Screen
Tap any member in the roster to open that member's full detail page.
What the Detail Screen Shows
- Member name and current tier
- Profile photo (tap to change)
- Current class and class change control
- Last month attendance — unique days with point entries, not the number of records
- Lifetime points — sum of all point records for this member
How Tier Is Determined
- 1The app loads all tiers and sorts them from highest threshold to lowest.
- 2It picks the first tier whose threshold is less than or equal to the member's lifetime points.
- 3If no threshold is met, the tier display shows "None".
How to Change a Member's Class
- 1Open the member detail page.
- 2Tap the Change Class To menu.
- 3Select a new class. The change is written locally and synced to the server.
How to Add or Change a Profile Photo
- 1Open the member detail page.
- 2Tap the circular profile image.
- 3Choose or capture an image. Editing is enabled in the picker.
- 4Close the picker. The app saves the image as a JPEG. If a server is connected, the photo syncs to the server and other iPads.
photos/ folder.Reports Tab
The Reports tab provides two modes: quick template reports and a fully custom report builder.
Quick Template Reports
Available templates with their date ranges (calculated from the current calendar year):
| Template | Date Range |
|---|---|
| Monthly | One month ago through today |
| Q1 | January 1 – March 31 |
| Q2 | April 1 – June 30 |
| Q3 | July 1 – September 30 |
| Q4 | October 1 – December 31 |
What a Generated Report Contains
Reports are grouped by member and show total points for the period plus dated activity lines. Example:
Jane Smith - 45 pts Apr 10, 2026 - Attendance: 10 Apr 17, 2026 - Bible Verse: 15 Apr 24, 2026 - Memory Verse: 20
Class Summary Report
Tap Quick Generate Class Summary to see total points grouped by class, sorted highest to lowest.
Class Summary Report Youth – 820 pts Adults – 675 pts Choir – 310 pts
Custom Report Builder
- 1Choose PDF or CSV export format.
- 2Set a start date and end date.
- 3Tap member chips to include only specific members, or leave all unselected for all members.
- 4Tap action chips to filter by specific actions, or leave all unselected.
- 5Tap Generate Custom Report. The iOS share sheet opens for AirDrop, email, or Files.
Points Tab
The Points tab is the primary data-entry screen used during or after a service. It provides a grid interface for awarding points to multiple members at once.
How to Award Points
- 1Open the Points tab.
- 2Select a class from the class picker. Members in that class appear as rows; actions appear as columns.
- 3Check the boxes for each member/action combination you want to award.
- 4Tap Submit. All checked combinations are recorded at once with today's date.
How Submitted Points Are Stored
For each checked member/action combination, the app creates one point record containing the member ID, action ID, the action's point value, and the current date and time. In Server Mode, each record is also emitted as a sync event to all connected iPads instantly.
Settings
The Settings tab is where all administrative management happens. It is divided into sections: Sync Mode, Live Sync, Classes, Members, Actions, Tiers, and Import.
Sync Mode Toggle
At the top of Settings is a toggle between Local Only Mode and Server Mode.
| Mode | Behavior |
|---|---|
| Local Only | All data stays on this iPad. No network activity. No server required. |
| Server Mode | All writes sync to the server and broadcast to other iPads in real time. Switching on triggers a full sync. |
Classes
- View all classes in a scrollable list
- Add a class: enter a name and tap Add Class
- Edit a class name: tap Edit on the row, change the name, tap Save
- Delete a class: swipe left on the row
Members
- View all members with their class assignment
- Add a member: enter a name, choose a class, tap Add Member
- Edit a member's name: tap Edit, change the name, tap Save
- Delete a member: swipe left
- Move a member to a different class: open their detail page and use the class change menu
Actions
- View all actions with their point values
- Add an action: enter a name and point value, tap Add Action
- Edit an action: tap Edit, change name or points, tap Save
- Delete an action: swipe left
Tiers
- View all tiers with their point thresholds
- Add a tier: enter a name and minimum point threshold, tap Add Tier
- Edit a tier: tap Edit, change name or threshold, tap Save
- Delete a tier: swipe left
Live Sync
When Server Mode is enabled, ChurchScore connects to your self-hosted server over Tailscale and syncs changes in real time.
Connection States
| Status | Meaning | Action |
|---|---|---|
| Connected | Server is reachable. Changes sync instantly. | None needed |
| Connecting | App is attempting to establish connection. | Wait a moment |
| Offline | Server unreachable. Changes are queued locally. | Check server / Tailscale |
| Disconnected | Not attempting to connect. | Tap Connect or check URL |
Offline Queue
If the app loses connection mid-session, all changes are saved locally and queued. When the connection is restored, the queue is automatically flushed in order. The Settings screen shows how many changes are pending.
Pull Full Sync from Server
Use this button in Settings → Live Sync when an iPad is missing data. It downloads the entire server database state and merges it with local data. Safe to run at any time — existing local data is not wiped.
How to Configure the Server URL
- 1Go to Settings and enable Server Mode.
- 2In the Live Sync section, tap Edit next to Server URL.
- 3Enter your server's Tailscale IP:
ws://100.x.x.x:8080 - 4Tap Save. The app connects automatically.
Import Guide
Settings → Import supports both .csv and .xlsx files. The importer detects what to load based on file structure and sheet names.
CSV Import Rules
CSV files are detected by their header row. The app checks which columns are present and treats the file accordingly.
Members CSV
Required headers: name and class
name,class Jane Smith,Youth Michael Brown,Adults Sarah Jones,Choir
Actions CSV
Required headers: name and points
name,points Attendance,10 Bible Verse,15 Invite a Guest,20
Tiers CSV
Required headers: name and threshold
name,threshold Bronze,100 Silver,250 Gold,500
Excel Import Rules
Excel import is sheet-based. The app loops through all worksheets and checks each sheet name. The sheet name must contain one of the recognized keywords.
| Sheet Name Contains | Required Headers | What Gets Imported |
|---|---|---|
| member | name, class, action, points, date | Members + historical point records |
| action | name, points | Actions only |
| tier | name, threshold | Tiers only |
Members Sheet Layout
Name | Class | Action | Points | Date Jane Smith | Youth | Attendance | 10 | 2026-04-13T00:00:00Z Jane Smith | Youth | Bible Verse | 15 | 2026-04-13T00:00:00Z Michael Brown | Adults | Attendance | 10 | 04/13/2026
Supported date formats: ISO 8601 (e.g. 2026-04-13T00:00:00Z) and MM/dd/yyyy (e.g. 04/13/2026).
Critical Import Caveats
Best Practice Import Strategy
- 1Import or create actions first.
- 2Import or create tiers next.
- 3Use CSV for simple member imports when you do not need historical point rows.
- 4Use Excel only when you need all three recognized worksheet types with exact headers.
- 5Avoid repeated member names on Excel member-history sheets unless you plan to clean up duplicates.
- 6After any import, verify the roster in the Members tab immediately.
Recommended Workflows
First-Time Setup Workflow
For a new installation, follow this order for the cleanest results:
- 1Open Settings. Configure Sync Mode and server URL if using multiple iPads.
- 2Add or import classes.
- 3Add or import actions with their point values.
- 4Add or import tiers with their thresholds.
- 5Add or import members assigned to classes.
- 6Open the Members tab and verify roster data by class.
- 7Award a few test points to confirm the grid is working.
- 8Check a member detail page for tier and stats accuracy.
- 9Generate a quick report to confirm records are appearing correctly.
Weekly Operating Workflow
- 1Open the app and confirm sync status is Connected.
- 2Go to the Points tab.
- 3Select the class for the current meeting.
- 4Check boxes for attendance and activity points earned.
- 5Tap Submit.
- 6Review a few members in the roster to confirm point totals updated.
- 7Generate a monthly or custom report as needed.
Troubleshooting
- 1Open Settings.
- 2Add at least one class.
- 3Return to the Points tab.
- 1Add a class first if none exist.
- 2Select a class from the picker.
- 3Enter the member name and tap Add Member.
- Use only the recognized sheet names: member, action, tier
- Keep exact header names (lowercase, exact spelling)
- Ensure points and thresholds are whole numbers
- Use
MM/DD/YYYYor ISO 8601 dates
- 1Review imported members in Settings.
- 2Swipe to delete duplicates.
- 3Prefer CSV for simple member-only imports going forward.
- 1Confirm Tailscale is running on both the server and the iPad.
- 2Check the server URL starts with
ws://and includes port 8080. - 3Visit
http://YOUR_IP:8080/healthin a browser to confirm the server is running. - 4Tap Connect then Pull Full Sync from Server after connection is restored.
- 1Verify both iPads show Connected in Settings → Live Sync.
- 2Confirm Server Mode is enabled on both devices.
- 3On the iPad missing data, tap Pull Full Sync from Server.
Admin Checklist
Use after setup or after any large import to confirm the app is in a clean state.
- Classes exist and are spelled correctly
- Members appear in the expected class
- Actions display correct point values
- Tiers display correct thresholds
- Award a small test action successfully
- Open one member detail screen
- Confirm lifetime points changed
- Confirm tier display makes sense
- Generate a quick report
- Confirm report shows correct data
- Sync status shows Connected (if using server)
- Pull Full Sync on each new iPad