Volunteer Signups

R
Data Analysis
Pawpaw Analytics
A look at volunteer shift registration patterns for a large summer event managed on the Pawpaw Analytics platform.
Author

Kent Orr

Published

April 29, 2026

If you don’t know that I run the Pawpaw Analytics Platform which comprises event management software I haven’t been marketing very well. This post is going to be just some idle musing looking at the registration for shifts at an event. This is real data from a table generated by joining a User with a Shift. Users are volunteers, and shifts are a set timespan within a Location. So for example, shift abc-123 might be 8am to 12pm at the Concessions stand, or bcd-234 might be 9pm-1am the following morning at Parking.

Code
shifts |>
    head()
# A tibble: 6 × 5
  id      shift_id user_id timestamp               i
  <chr>   <chr>    <chr>   <dttm>              <int>
1 VTa-FZz Mnh-8Vu  GYG-27U 2026-02-07 03:10:40     1
2 nNY-Wtu 1JS-cz5  GYG-27U 2026-02-07 03:10:40     2
3 A1i-YNl D0q-COz  GYG-27U 2026-02-07 03:10:40     3
4 HmT-x3I YMy-lKb  6nV-2R0 2026-02-07 03:11:07     4
5 78z-w10 2Nq-JOk  6nV-2R0 2026-02-07 03:11:07     5
6 xGi-3Zl 6eY-YoC  6nV-2R0 2026-02-07 03:11:07     6

So let’s just get a broad look at the overall signup progression. We can simply sort by timestamp and count rows to see the cumulative sum of shifts.

Code
shifts |>
    ggplot(aes(x = timestamp, y = i)) + 
    geom_point() + 
    theme_classic() +
    scale_x_datetime(date_breaks = '1 month', date_labels = '%b') +
    labs(x = 'Timestamp', y = 'Cumulative Shifts', title = 'Signup Volume over Time')

I worked very closely with this organization so I have a little inside knowledge about the progression we’re looking at. The initial launch was sent out to shift supervisors. These are high level volunteers who oversee Locations. This allowed the event organizers to ensure that their top volunteers could view their areas, check on the shift times, descriptions, and so on, as well as preview what the typical volunteer signup would look like so they could help troubleshoot in their areas.

You can then see in late February the email for all past volunteers went out, and there was a rush of registrations. Then we got a second spike a bit after that. That would mark when the word went out to the overall public that volunteer registration was live.

Code
returning_volunteers = as_datetime('2026-02-21')
public_release = as_datetime('2026-03-04')
shifts |>
    mutate(release_frame = ordered(
        case_when(
            timestamp <= returning_volunteers ~ 'Shift Supervisors',
            timestamp <= public_release ~ 'Returning Volunteers',
            timestamp > public_release ~ 'General Public'
                )
        , levels = c('Shift Supervisors', 'Returning Volunteers', 'General Public'))
        ) |>
    ggplot(aes(x = timestamp, y = i, color = release_frame)) + 
    geom_point() + 
    theme_classic() +
    theme(
        legend.position = 'bottom', 
        panel.background =element_rect(fill='gray'),
        plot.background = element_rect('gray'),
        legend.background = element_rect('gray')
        ) +
    scale_x_datetime(date_breaks = '1 month', date_labels = '%b') +
    scale_color_viridis_d(option = 'H') +
    labs(x = 'Timestamp', y = 'Cumulative Shifts', title = 'Volunteer Registrations', color = NULL)

What we’re looking at is a very mature and healthy volunteer base. This event takes place mid-summer, and as of right now they (April 29) are over 80% of shift capacity.

One of the ways this organization handles ensuring coverage is to gradually open locations so that instead of a scattershot they can concentrate volunteers in the most crucial areas before opening the floodgates.

You can see some gaps in the general public fill-in. Some of those gaps are the result of shift restrictions abutting the dwindling availability. So for example this organization started with a rule that volunteers must register all shifts in the same location which allows for consistency and reduces the training strain on shift supervisors. They also require 3 shifts total and 4 points on the point system. Night shifts (when the bands are playing) are 2 points to incentivize evening volunteers. As the shifts get consumed, the ability to register while meeting those requirements gets to a slimmer set of shifts.

Ultimately the restrictions were loosened over time to allow for two locations. This is a great strategy for ensuring that you get less desirable shifts filled. The tradeoff of course being that you have some friction with volunteers who feel they’re looking at slimmer pickings than they would have hoped for.