A volunteer hours tracking spreadsheet in Google Sheets, with approvals
A volunteer hours tracking spreadsheet only earns trust if every hour in the total was checked by someone. This guide builds one in Google Sheets: volunteers log hours through a form, a coordinator approves each entry in a review tab, and formulas produce totals by volunteer and month plus a dollar value using the current Independent Sector rate.
By Raj Kumar, Founder, Zunoform

Short answer
To track volunteer hours in Google Sheets, collect one entry per activity and date through a form, send responses to a sheet, and add a separate review tab with a status column (Pending, Approved, Rejected, Replaced). Convert the hours and dates to real numbers there, then total only approved rows with SUMIFS or a QUERY pivot. Multiply approved hours by $36.14, the Independent Sector national value for 2026, if you report the value of volunteer time.
- Keep the raw responses tab untouched; do all cleanup and approvals in a review tab.
- Record hours as decimals: 1 hour 30 minutes is 1.5.
- Group by the activity date, not the date the form was submitted.
- Report pending hours separately from approved hours.
What columns does a volunteer hours spreadsheet need?
Two groups: what the volunteer submits, and what the coordinator adds. Keeping them apart is what makes corrections and audits possible.
| Column | Filled by | Example | Why it matters |
|---|---|---|---|
| Response ID | Form (automatic) | r_8f2k1 | A unique key for each entry, so duplicates and corrections can be matched. |
| Timestamp | Form (automatic) | 2026-09-05T18:02:11Z | When the entry arrived. Not the same as when the work happened. |
| Volunteer name and email | Volunteer | Sam Ortiz, [email protected] | Email is a better key than name; names get typed differently. |
| Program or activity | Volunteer | Saturday food pantry | Lets you report hours by program for funders. |
| Activity date | Volunteer | 2026-09-04 | The date the work happened; use this for monthly totals. |
| Hours | Volunteer | 1.5 | Decimal hours, one date per entry. |
| Entry type | Volunteer | New entry / Correction | Flags a correction so the coordinator can find the original. |
| Status | Coordinator | Approved | Only approved rows count toward totals. |
| Replaces | Coordinator | r_7c1q9 | Links a correction to the entry it supersedes. |
| Reviewed by, date | Coordinator | J. Lee, 2026-09-06 | Shows who signed off, for audits and grant reports. |
How do you get volunteer hours into Google Sheets automatically?
Use a form that writes each submission as a new row. Google Forms does this through its linked response sheet. In Zunoform, you open the form's Integrations tab, authorize Google Sheets, and Zunoform creates a spreadsheet named after the form with a tab called Responses. The integration is on the free plan. It sends new completed responses from the moment you enable it; earlier responses are not backfilled, but you can export them as CSV from the dashboard.
Each Zunoform row starts with Timestamp and Response ID, then one column per question in form order, then Location and User Agent (left blank if the form runs in anonymous mode). Multi-part answers such as a contact block are split into separate columns. If you later add or rename questions, the header row is rewritten to match, but rows already in the sheet do not move, so older rows can sit under different headings. Finish the question list before you go live, and if you must change it, note the date.
Why won't my hours column add up?
Because it is probably text. Many form integrations write values as plain text so that nothing is reinterpreted on the way in; Zunoform writes every cell with the Sheets API's RAW input option, which Google documents as storing values exactly as sent without parsing them. “1.5” arrives as the text 1.5, and SUM ignores text. QUERY is stricter still: Google's help says that in a column with mixed types, the majority type wins and the minority values are treated as null, so a few text cells in a numeric column silently drop out of a total.
The fix is to convert once, in a review tab, with VALUE for numbers and DATEVALUE for dates, and to point every total at the converted columns. Check your spreadsheet locale under File, Settings too. In locales that use a comma as the decimal separator, VALUE may not read 1.5 correctly; wrap it as VALUE(SUBSTITUTE(cell, ".", ",")) there.
Source: Google Sheets API: ValueInputOption (RAW)
Source: Google Docs Editors Help: QUERY function
Source: Google Docs Editors Help: VALUE
Source: Google Docs Editors Help: Set a spreadsheet's location and calculation settings
Review tab formulas (paste into row 2)
Assumes the Volunteer Hours Submission template's column order in the Responses tab: B = Response ID, C = Volunteer name, D = Email, E = Program, F = Activity date, G = Hours. Check your own header row and change the letters if yours differ. A2 Response ID =ARRAYFORMULA(IF(Responses!B2:B="",,Responses!B2:B)) B2 Volunteer key (lower-case email) =ARRAYFORMULA(IF(A2:A="",,LOWER(TRIM(Responses!D2:D)))) C2 Program =ARRAYFORMULA(IF(A2:A="",,TRIM(Responses!E2:E))) D2 Activity date (format column D as Date) =ARRAYFORMULA(IF(A2:A="",,DATEVALUE(Responses!F2:F))) E2 Month label =ARRAYFORMULA(IF(A2:A="",,TEXT(D2:D,"yyyy-mm"))) F2 Hours as a number =ARRAYFORMULA(IF(A2:A="",,VALUE(Responses!G2:G))) G2 Repeated delivery? (TRUE on the second and later copies of the same Response ID) =ARRAYFORMULA(IF(A2:A="",,COUNTIFS(A2:A,A2:A,ROW(A2:A),"<="&ROW(A2:A))>1)) H Status: typed by the coordinator; add a dropdown with Pending, Approved, Rejected, Replaced I Replaces: the Response ID a correction supersedes J Reviewed by and date
Columns A to G fill themselves as rows arrive. Columns H to J are typed. Because the typed columns line up with the formula rows by position, never sort, insert or delete rows in either tab; use filter views to look at subsets.
How should the approval column work?
Give every new row a status of Pending, then have a named coordinator change it. Approved means the hours happened as described. Rejected means they did not count, with a short reason in a notes column. Replaced means a later correction supersedes this entry; put the correction's status to Approved and its Replaces column to the old Response ID.
Set the status column up as a dropdown (Insert, Dropdown) so nobody types “approved ” with a trailing space that SUMIFS will not match. Protect the Responses tab (Data, Protect sheets and ranges) so only the integration and one owner can edit it; that way the original submissions stay as evidence. Mark rows where column G is TRUE as Rejected with the note “repeat delivery”.
Source: Google Docs Editors Help: Create an in-cell dropdown list
Source: Google Docs Editors Help: Protect, hide and edit sheets
Illustration: reconciling one volunteer's September entries
A made-up example showing why summing every received row gives the wrong answer.
Scroll sideways to read all three columns.
| Entry | Coordinator decision | Hours counted |
|---|---|---|
| A: 2 hours on 4 September | Replaced by B | 0 |
| B: correction of A to 1.5 hours | Approved; Replaces = A | 1.5 |
| B again (same Response ID) | Rejected: repeat delivery | 0 |
| C: 1 hour on 6 September | Approved | 1.0 |
| D: 3 hours on 9 September, activity unclear | Pending | 0 now; shown separately as pending |
How do you total volunteer hours by volunteer and month?
In the illustration above, summing every row gives 9 hours. The approved total is 2.5, with 3 hours pending. Use SUMIFS so the status is part of every total. On a Summary tab, list volunteers in column A with =SORT(UNIQUE(FILTER(Review!B2:B, Review!H2:H="Approved"))), type month labels such as 2026-09 across row 1, and put this in B2, then fill right and down:
=SUMIFS(Review!$F:$F, Review!$B:$B, $A2, Review!$E:$E, B$1, Review!$H:$H, "Approved")
If you would rather have one formula build the whole grid, QUERY can pivot it: =QUERY(Review!A1:J, "select B, sum(F) where H = 'Approved' group by B pivot E", 1). That returns one row per volunteer and one column per month. Swap B for C in the select and group by clauses to get hours by program instead, which is the view most funders ask for.
Source: Google Docs Editors Help: SUMIFS
Source: Google Docs Editors Help: COUNTIFS
Source: Google Docs Editors Help: FILTER
How do you calculate the value of volunteer time?
Independent Sector and the University of Maryland's Do Good Institute put the national value of a volunteer hour at $36.14, released on 21 April 2026 from 2025 data, a 3.9% rise on the previous year. The figure is average hourly earnings for production and non-supervisory workers on private non-farm payrolls, from the Bureau of Labor Statistics, plus a 15.3% uplift for benefits. State values are published alongside it and range widely, so use your state's figure when reporting locally.
Put the rate in its own cell, for example Settings!B1, and multiply approved hours only: =SUMIFS(Review!F:F, Review!H:H, "Approved", Review!E:E, "2026-09") * Settings!B1. As an illustration, 412.5 approved hours in a month is worth 412.5 × $36.14 = $14,907.75. Update the cell each April when the new rate comes out, and state which year's rate a report uses.
Use this number for board reports, grant applications and thank-you messages, not your financial statements. Independent Sector's methodology notes that under FASB rules, volunteer services can only be recognized in the accounts in narrow cases, such as when a volunteer provides a specialized skill the organization would otherwise have paid for. Ask your accountant before booking any of it.
Source: Independent Sector: New value of volunteer time of $36.14 per hour (2026)
Source: Independent Sector: Value of volunteer time methodology
Decimal hours or start and end times?
Decimal hours are simpler for volunteers and for formulas. Ask for one entry per activity and date, with a hint that 1 hour 30 minutes is 1.5, not 1.30. The Volunteer Hours Submission template validates the number to more than 0 and no more than 24.
If a program needs start and end times, for example for supervision ratios, collect both and compute hours in the review tab: (end − start) × 24 converts a Sheets time difference to decimal hours. Shifts that cross midnight need MOD(end − start, 1) × 24. Either way, split work that spans two dates into two entries so monthly totals land in the right month.
Set it up in 30 minutes
Create the form
Start from the Volunteer Hours Submission template. Edit the program list and coordinator field, then save the form.
Connect Google Sheets
In the form's Integrations tab, authorize Google Sheets and open the spreadsheet Zunoform creates. Confirm the integration is enabled.
Send a test entry
Publish, submit a sample with fictional details and 1.5 hours, and check the row. Template previews do not send rows; a saved, published form does.
Build Review and Summary tabs
Paste the formulas above, add the status dropdown, protect the Responses tab and put the value-of-time rate in a Settings cell.
Agree the review routine
Pick who approves, how often (weekly works for most programs), and what counts as a reason to reject. Write it in a note on the Review tab.
Where Zunoform fits (and where it doesn't)
Zunoform gives you the intake side for free: a validated hours form, a correction branch, and Google Sheets delivery on the free plan, which includes 500 responses a month. That is 500 hours entries a month before you need Pro. Google Forms is a reasonable alternative with no response cap, and its response sheet also writes numbers you should check before summing.
Neither is a volunteer management system. They do not check people in at a site, reconcile against a rota, or give volunteers a login to see their own totals. If your program needs those, a dedicated volunteer hours app is worth paying for. If a form plus a spreadsheet with an approval column is enough, this setup costs nothing.
Templates for volunteer hours
Record one volunteer's activity and decimal hours for one date, ready for coordinator review and correction checks.
Understand role clarity, preparation, support and improvements from the volunteer's perspective, with optional follow-up.
Collect orientation session preferences, role context and practical questions before confirming attendance details.
Questions people ask
How do I track volunteer hours in Google Sheets?
Collect hours through a form linked to a sheet, one entry per activity and date. In a separate review tab, convert hours and dates to numbers, add a status column for approvals, then total approved rows with SUMIFS by volunteer and month. Protect the raw responses tab so original submissions stay intact as evidence.
What is the value of a volunteer hour in 2026?
Independent Sector and the Do Good Institute put the national value at $36.14 per hour, released in April 2026 from 2025 data, up 3.9% on the previous year. State figures differ. The rate is based on average private non-farm, non-supervisory hourly earnings plus a 15.3% benefits uplift.
Why does SUM return 0 for my volunteer hours?
The hours are almost certainly stored as text, which SUM skips. This is common when a form integration writes values as plain text. Convert them with VALUE in a separate column and total that column. If your spreadsheet locale uses comma decimals, replace the dot with a comma before converting.
How do I total volunteer hours by month?
Add a month label column with TEXT(activity date, "yyyy-mm"), then use SUMIFS with the hours column, the volunteer column and the month label, plus a status criterion of Approved. Group by the activity date, not the submission timestamp, because people often log hours days after the work.
Should volunteers enter hours as decimals or times?
Decimals are easier: 1 hour 30 minutes is 1.5. If you need start and end times, compute hours as (end minus start) multiplied by 24, and use MOD(end minus start, 1) multiplied by 24 for shifts that cross midnight. Split work spanning two dates into two entries.
Can volunteer hours be recorded as revenue on financial statements?
Usually not. Under FASB rules, contributed services are recognized only in narrow cases, such as specialized skills the organization would otherwise buy, or services that create or enhance nonfinancial assets. Most general volunteering is reported in narrative and impact reports instead. Check with your accountant before recording any value.
Is there a free volunteer hours tracking spreadsheet template?
You can build one from this page in about 30 minutes: a free form template for intake, a Responses tab filled automatically, a Review tab with the formulas above, and a Summary tab for totals. Zunoform's Google Sheets integration is free, and Google Forms also works if you prefer it.
Raj Kumar · Founder, Zunoform
Raj Kumar is the founder of Zunoform, the form builder made by Symphonic Grow. He builds the product and writes these guides, checking every competitor price and feature claim against the vendor's own pages before publishing.
Raj Kumar on LinkedInKeep reading
Nonprofit operations
Nonprofit forms
Google Sheets workflow
Integration setup
Free plans

Ready when you are
Better forms.
Better data.
Start with a conversation, a document or a single page.
Unlimited forms and 500 responses per month on Free.
No card required.
- No credit card
- Unlimited forms
- 500 responses / month