A volunteer hours tracker in SharePoint for a nonprofit
Short answer: a spreadsheet works for a handful of volunteers, with one row per shift: name, date, hours and approved. Past that, use a Volunteers list and an Hours list in SharePoint, fed by a Microsoft Forms sign-in and a Power Automate flow, so totals by month need no typing.
Keep personal details to the minimum, and remember that a view does not hide data from anyone. The columns are listed below, and they work in Excel or in SharePoint. For a similar two-list setup, see "How to set up a training record in SharePoint".
Starter columns and sample rows
Hours list, one row per shift. Row numbers are only for reference.
- Row 1: Volunteer Person A, Date 10/04, Hours 3, Activity 1 Events, Status 2 Approved
- Row 2: Volunteer Person B, Date 10/04, Hours 1.5, Activity 2 Office help, Status 1 Logged
- Row 3: Volunteer Person A, Date 10/11, Hours 4, Activity 3 Driving, Status 1 Logged
Volunteers list: one row per person, with Name and Active (Yes/No). To start in Excel, make one sheet with the Hours columns and a second with the Volunteers columns.
Where hours get lost between the shift and the grant report
A sheet is a first step. One person types in hours at the end of the month from paper sign-in pages, texts and memory. It works until it does not.
Problems:
- Hours are typed late, so some shifts are lost or guessed.
- Each volunteer is spelled three ways, so totals split across rows.
- Nobody approves the hours, so no one knows which numbers are final.
- The whole sheet is shared, so every helper can see every volunteer's details.
- A grant or board report needs totals by month, and building them takes an afternoon.
Step 1. Create the Volunteers list
Microsoft's page on creating a list shows how to start from a blank list. Exact names may differ in your version.
- Create a new list and name it "Volunteers".
- Use the Title column for the volunteer's full name. You can rename the column to "Name" in the column settings.
- Add only the columns you really need. One more column is enough to start: "Active" as a Yes/No column.
A privacy tip: collect only what you need. If you only need hours by person, you do not need a home address, a birth date or a phone number in this list. If you need a way to reach people, keep that in the tool you already use for contact. Less data means less to protect.
Step 2. Create the Hours list
Create a second list named "Hours". Add these columns. Microsoft's page on creating a column lists the column types.
- Title: use it for a short label such as "Food pantry shift" or "Garden day". Or rename it to "Shift".
- Volunteer: a Lookup column. Point it at the Volunteers list and show the Title column (the name). Microsoft's lookup page says the source column must be a type such as single line of text, number or date, so a name in Title works. It also says lookup columns must be created and used within the same site, so keep both lists on the same site.
- Date: a Date column, date only.
- Hours: a Number column. Allow decimals so that 1.5 hours works.
- Activity: a Choice column with numbered choices:
- 1 Events
- 2 Office help
- 3 Driving
- 4 Other
- Status: a Choice column with these choices:
- 1 Logged
- 2 Approved
Set the default to 1 Logged.
If the Volunteer column shows blank or too few fields later, see "SharePoint lookup column shows blank or too few fields".
Step 3. Add a Month column for the totals
A grouped view groups by exact values. If you group by Date, you get one group for each day. You want one group for each month. One way to start is a calculated column:
- Add a column named "Month".
- Choose the Calculated type.
- Use this formula: =YEAR([Date])*100+MONTH([Date])
- Set the data type to Number with 0 decimal places.
Microsoft's examples page shows YEAR and MONTH used on date columns in formulas. For October 2026 this should give 202610. Test it with a few rows before you rely on it. A calculated column cannot use today's date, because SharePoint blocks [Today] in formulas. This formula does not need it, since it only reads the Date column in the same row.
For other formulas, see "SharePoint calculated column formulas for due dates and status".
Step 4. Build the sign-in form
Create a form in Microsoft Forms. Microsoft's page on creating a form shows how. Add these questions:
- Your full name (text). Ask volunteers to type their name the same way each time.
- Date of shift (date).
- Hours worked (a number, if your form offers a number-type question).
- What did you help with? (choice). Use exactly the same words as the Activity choices in the list: 1 Events, 2 Office help, 3 Driving, 4 Other.
Why the names must match: the list only accepts a Choice value that matches one of its choices. A different spelling makes the flow fail.
Because typed names can drift, give volunteers a way to find their exact spelling, such as a name printed on the sign-in poster. Another option is a Choice question with the active volunteer names. That list then needs updating when people join.
Who can fill in the form is a setting. In the form, select Collect responses and pick Anyone can respond, or Only people in my organization can respond. Volunteers without a work account need the first one.
Step 5. Build the flow
For the full flow steps, see "Save Microsoft Forms answers to a SharePoint list". The trigger and the "Get response details" action are the same. Only the middle step is new here: finding the volunteer row.
- Trigger: "When a new response is submitted". Pick your sign-in form. Microsoft's Forms connector page says the connector only works with organizational accounts, so the person who builds the flow needs a work or school account. For a group form, Microsoft says the Form Id needs to be added manually, and to paste only the part after "FormId=" from the address bar when you edit the form.
- Action: "Get response details", with the Response Id from the trigger.
- Action: SharePoint "Get items" on the Volunteers list. In Advanced options, set Filter Query to match the name. Microsoft's page on Get items shows filter queries like Location eq 'Midwest'. Use Title eq and put the form answer for the name inside the quotes. If the name has an apostrophe, the filter can break, so test with one.
- In the same action, set Top Count to 1. Only one match is needed. Microsoft says Get items returns 100 items by default and that you can raise the limit with Top Count, up to 5,000. If you ever read the whole volunteer list, set Top Count above your volunteer count. Microsoft says to turn Pagination on only for lists over 5,000 items with a filter query.
- Action: SharePoint "Create item" on the Hours list. Map the fields:
- Title: the activity answer or a short label.
- Volunteer: the ID of the row found in step 3. Microsoft's Get items output includes an ID for each row. Exact names may differ.
- Date: the date answer.
- Hours: the hours answer.
- Activity: the activity answer.
- Status: 1 Logged.
- Save the flow and submit one test sign-in.
If no volunteer matches the name, Get items returns nothing and the Create item step has no ID to use. Add a Condition step that checks whether Get items returned a row. In the "no" branch, send an email to the coordinator. This is one way to catch typos instead of losing the shift.
Microsoft lists a limit on the Forms connector of 300 calls per connection every 60 seconds.
Step 6. Build the monthly totals view
Microsoft's page on views says a view can group items by a column and show totals, such as count, average, maximum and minimum. A Microsoft Q&A answer shows Sum in the Totals section of the view settings for a Number column. Exact names may differ in your version.
- Open the Hours list and create a new view named "Hours by month".
- Group by: Month. Then by Volunteer if you want a second level.
- Totals: in the Totals section, set Hours to Sum. Sum appears only for a Number column, so if it is missing, check that Hours is a Number column, not text.
- Save the view.
Excel export, for grant and board reports: Microsoft's page on exporting to Excel says that with no items selected, you choose Export, then Export to Excel from the command bar. In Excel, a PivotTable or a SUM gives you the total hours for each month, which is useful for grant and board reports. Microsoft says the data has a one-way connection to the original list and that changes made to the Excel table are not sent to the SharePoint list.
For a filter that shows only one status, such as 1 Logged, you can use the view filter. Microsoft says filters with [Today] or [Me] need the classic view editor (Edit current view, then Filters). Our advice, not a Microsoft rule: use the classic view editor for blank and "is not equal to" filters too. Select Edit current view, then scroll to Filters. Microsoft's page on filtering views says [Today] and [Me] cannot be used from a column header.
A note on size: Microsoft says the maximum number of items in a view is 5,000. Add an index to the Date column if your Hours list grows toward that. For more, see "SharePoint list export to Excel fails or misses rows".
Step 7. Approve the hours
A coordinator checks the Hours list once a week and changes Status from 1 Logged to 2 Approved. A simple view filtered on Status equal to 1 Logged shows what still needs a check. Then use "Hours by month" with a filter on Status equal to 2 Approved for reports.
For a log with a clear approval step and a history of changes, see "Change request log in a SharePoint list".
Volunteer records: who can open them
A volunteer list is personal data. Think about who needs to see it before you share the site.
- A view is not security. A view only changes what is shown on screen. Anyone with access to the list can still open the list another way and see the rows.
- Microsoft's page on sharing and permissions says that giving people permissions to a site gives them access to all content on the site. So the people you add to the site can see both lists.
- If only the coordinator should see the Volunteers list, put the lists on a site with a small membership, or ask your admin about unique permissions for the list. See "Keep one column private (like pay or notes) in a shared list" and "Let each person see only their own items in a SharePoint list".
- Microsoft Forms answers also sit in the form itself. Check who owns the form and who can view responses.
- Keep the data to what you need. Delete or archive rows when your own policy says to. Your organization may have rules about volunteer records, so check with your board or your admin.
What to avoid
- Do not collect more than you need. Each extra column is more data to protect.
- Do not rely on a hidden column or view for privacy. Views are not security.
- Do not let the form accept free text for the activity. Use a choice so that the words match the list.
- Do not leave Get items on its defaults when you read a whole list. Microsoft says the default item limit is 100.
- Do not use a calculated column with today's date. SharePoint blocks [Today] in formulas.
- Do not run the flow under one person's account without a plan. If that person leaves, the flow can stop.
- Do not count hours with test rows still in the list. Delete them first.
Honest limits
This setup does not check that a volunteer really worked the shift. It records what they say. Approval by a coordinator is the check. The flow copies new sign-ins only. If someone edits a form answer later, the list does not change. The Excel total is a copy of the data at the time of export. And if your sign-in volume is high, or you need hours by grant, the design may need more columns.
When to get help
You can build all of this yourself in Microsoft 365. If you would rather have it built and tested for your team, I do that. A tracker like this is a fixed price: $5,000 for one, built in 2 weeks. See "What a SharePoint tracker costs to build". Bring one example of the problem to a free call.
I am Al Davies. I run 250 High Street LLC and build SharePoint trackers and Power Automate flows for operations teams. I work remotely. The first call is free, and I will not try to sell you anything.
See trackers I built: Tools I built
FAQ
Does the volunteer need a Microsoft account?
Not to fill in the form, if it is set to Anyone can respond. Microsoft's connector page says the Forms connector works only with organizational accounts, so whoever builds the flow needs a work or school account.
Can I track volunteer hours in a spreadsheet?
Yes, with one row per shift (name, date, hours, approved), and move to SharePoint lists when several people need the data.
What columns does a volunteer tracking template need?
A Volunteers list with Name and Active, and an Hours list with Volunteer, Date, Hours, Activity and Status, as in the starter columns above.
How do I set up a volunteer tracker in Excel?
Make one sheet for Hours and one for Volunteers with the starter columns, then add a SUM or PivotTable for monthly totals.
Why does my Hours total not show a sum?
Sum is offered for Number columns, so check that Hours is a Number column and set its total to Sum in the view settings.
Sources
- Microsoft Q&A, Calculations in list
- Microsoft Support, Choose who can fill out a form or quiz
- Microsoft Support, Create a list
- Microsoft Support, Create a column in a list or library
- Microsoft Support, Create list relationships by using lookup columns
- Microsoft Support, Examples of common formulas in SharePoint lists
- Microsoft Support, Create a form with Microsoft Forms
- Microsoft Learn, Microsoft Forms connector reference
- Microsoft Learn, SharePoint connector reference
- Microsoft Learn, Get items and Get files actions in Power Automate
- Microsoft Support, Create, change, or delete a view of a list or library
- Microsoft Support, Use filtering to modify a SharePoint view
- Microsoft Support, Export to Excel from SharePoint or Lists
- Microsoft Learn, Sharing and permissions in the SharePoint modern experience