It's Thursday afternoon. Sunday is three days away. You open a blank spreadsheet — or worse, last week's schedule — and start the familiar process: check who's available, who served last week, who has the right skills, who's already serving in another ministry that morning.
Two hours later, you have a draft. Then someone replies to say they can't make it, and you start again.
GraceSquad built the auto-fill engine to end this. Here's exactly how it works.
The Scoring Algorithm
When you click "Auto-Fill" on a scheduled service, GraceSquad runs a scoring pass for every unfilled role slot. For each slot, it queries every active volunteer in your org and passes them through two layers of filtering.
Layer 1: Hard Filters (SQL)
Before any volunteer even reaches the scoring phase, they must pass all of these in the database query:
- Active status — inactive, suspended, or pending volunteers are excluded
- No blackout date — if a volunteer has marked this date unavailable, they don't appear
- Shift cap — if they've already hit their max shifts for the week, they're excluded
- Not double-booked — if they're already assigned to an overlapping shift that day, they're excluded
- Recurring availability — if they've set availability windows and this service falls outside them, they're excluded (unless they haven't set any windows yet)
This happens in a single optimized SQL query with CTEs, so it's fast even for organizations with hundreds of volunteers.
Layer 2: Scoring (Go)
Everyone who passes the hard filters gets a score. Here's the full scoring rubric:
- +10 — volunteer is a member of the ministry that owns this slot
- +8 — volunteer has served this exact role slot before (familiarity)
- −5 — volunteer served this slot last week (rotation penalty)
- −10 — volunteer served this slot the last two consecutive weeks (stronger rotation penalty)
- +3 — volunteer has fewer total lifetime hours than the org median (load spreading)
- +2 — volunteer has confirmed their last 3 assignments without declining (reliability bonus)
Candidates are then sorted descending by score, with alphabetical last name as the tiebreaker, and the top 3 are returned per slot.
What You See
The admin sees a suggestion panel for each unfilled slot with the top three candidates, their score, and the reasons behind it — "ministry member," "served this role 4×," "building service hours." You click to approve, or drag in someone else. When you're happy, you publish — and the notification queue kicks in automatically.
Why 45 Seconds
A typical Sunday service with 14–20 role slots across 4–5 ministries processes in under two seconds of server time. The "45 seconds" is the total coordinator workflow: review suggestions, make a few swaps, publish. Not the compute time — the human decision time.
That's the real win. The algorithm does the search. You make the judgment calls.
The Rotation Fairness Problem
Most scheduling tools are stateless — they don't know or care that Marcus has worked sound tech three Sundays in a row. GraceSquad tracks every completed assignment in a slot_history table and uses it to actively penalize consecutive-week repeats. This isn't just fairness — it's burnout prevention built into the algorithm.
Coordinators who use this for a few months typically report that their "always-scheduled 20" expands naturally to 40+ active volunteers, because the algorithm actively surfaces people who haven't served recently.