Send monthly volunteer hour statements from Google Sheets with Gmail
Ready for 3.0Ready for 3.0. This template uses no nodes that n8n 3.0 removes. No removed nodes, versions or helpers found. Static check, last run 2026-10-19.
Nodes used (8)
- Schedule Trigger
n8n-nodes-base.scheduleTrigger - Edit Fields (Set)
n8n-nodes-base.set - Data table
n8n-nodes-base.dataTable - If
n8n-nodes-base.if - Google Sheets
n8n-nodes-base.googleSheets - Code
n8n-nodes-base.code - Gmail
n8n-nodes-base.gmail - Loop Over Items (Split in Batches)
n8n-nodes-base.splitInBatches
What it does
Quick overview This workflow runs monthly and reads a Google Sheets volunteer-hours ledger to generate per-volunteer hour statements and an in-kind valuation summary, then emails volunteers and a coordinator via Gmail while logging each issued period in an n8n Data Table to prevent duplicate sends. How it works 1. Runs on a monthly schedule and calculates the previous calendar month’s start/end dates and period key. 2. Checks the “Volunteer Statements Issued Log” n8n Data Table for the current period and stops if statements were already issued. 3. Loads valuation settings (hourly in-kind rate, milestone thresholds, and zero-hour policy) from the “Volunteer Statement Config” n8n Data Table. 4. Reads verified volunteer entries from Google Sheets and groups them by volunteer to compute monthly hours, year-to-date hours, milestone progress, in-kind value, and an HTML statement. 5. Sends each volunteer their HTML statement by Gmail one at a time, continuing even if individual sends fail. 6. Builds a coordinator program summary (totals, in-kind value, milestones, and send status), emails it via Gmail, and appends the period record to the issued-log Data Table. Setup 1. Connect Google Sheets OAuth2 credentials and set the ledger spreadsheet ID and tab name in the workflow configuration values. 2. Connect Gmail OAuth2 credentials for the account that sends volunteer statements and the coordinator summary. 3. Create and populate the n8n Data Tables “Volunteer Statement Config” (inkindhourlyrate, milestonethresholds, includezerohourvolunteers) and “Volunteer Statements Issued Log” (period and totals columns). 4. Update the coordinator email address and organization name in the workflow configuration values. 5. Ensure your Google Sheets ledger contains columns for date, volunteer name, email, hours, and activity, and that dates are ISO-formatted (YYYY-MM-DD) or consistently parseable. Requirements - Read access is enough for the Google credential, as the workflow only reads the ledger tab and never writes a sent flag or timestamp back to it. - A Gmail account you are willing to have volunteers reply to, since the connected account is the from address and no send-as alias is configured; only the display name on the volunteer email is overridden, using orgname. - An n8n version that includes Data Tables, with both tables in the same project as the workflow, because they are referenced by name rather than by id. - A ledger tab that already holds only approved entries, since no status or verified column is read anywhere in the workflow. - One consistent email address per volunteer, as rows are grouped by lowercased email and a second address produces a second statement for the same person. - A single Volunteer Statement Config row carrying all three settings, because the code takes the first row that has a milestonethresholds value and ignores every other row. - An in-kind hourly rate your funder will accept, agreed before the first run, since the same figure drives every volunteer statement and the coordinator's grant match total. Customization - Change the hour and day in "Monthly Run on the 1st", currently hour 6 with no day set so it fires on the 1st; moving it later in the month gives verifiers more time and still covers the same month. - Edit milestonethresholds in the Volunteer Statement Config table as a comma-separated list, keeping in mind the values are tested against year-to-date hours rather than hours in the period; leaving it empty falls back to 25, 50, 100. - Set includezerohourvolunteers to boolean true or the string "true" to keep volunteers with a year-to-date balance but no hours this period on the send list, where their statement shows a single no-hours line in place of activity rows. - Reword the statement in "Compute Volunteer Statements": the subject line, the greeting that uses only the first word of the name, the milestone sentence, and the sign-off. Keep any styling inline, as the HTML carries no style block. - Cha