Google Sheets + Gmail, form tracking you can trust
Manually checking Google Form responses against a roster sounds simple, until you’re doing it every day and still missing people. Someone swears they submitted, your sheet says they didn’t, and now you’re stuck doing detective work instead of follow-up.
This Sheets Gmail automation hits department coordinators hardest, but program managers and small teams running workshops feel it too. You get a live view of who has submitted, who hasn’t, and you can send the right email in minutes, not hours.
You’ll set up an n8n workflow suite that reconciles your roster with responses, shows a simple dashboard, and triggers acknowledgement or reminder emails from Gmail.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Google Sheets + Gmail, form tracking you can trust
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook - send-acknowledgeme.."]
n7@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Student List", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code - Prepare Messages"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond - Confirmation"]
n10@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Google Sheets FormResponses", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n12 --> n8
n10 --> n9
n8 --> n10
n11 --> n12
n7 --> n12
n6 --> n7
n6 --> n11
end
subgraph sg1["Flow 2"]
direction LR
n13@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - FormResponses", pos: "b", h: 48 }
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook - send-acknowledgeme.."]
n15@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Student List1", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code - Prepare Messages1"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond - Confirmation1"]
n18@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message1", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge2"]
n19 --> n16
n18 --> n17
n16 --> n18
n13 --> n19
n15 --> n19
n14 --> n15
n14 --> n13
end
subgraph sg2["Flow 3"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Google Sheets1", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook1"]
n2 --> n4
n3 --> n2
n5 --> n0
n5 --> n1
n0 --> n3
n1 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n7,n11,n13,n15,n0,n1 database
class n6,n9,n14,n17,n4,n5 api
class n8,n16,n2 code
classDef customIcon fill:none,stroke:none
class n6,n8,n9,n12,n14,n16,n17,n19,n2,n3,n4,n5 customIcon
Why This Matters: Roster vs. form mismatches
Tracking submissions is annoying because the “truth” lives in two places: your roster sheet and your form response sheet. You end up filtering, sorting, searching for register numbers, and copy-pasting names into email drafts. It’s not just time. It’s the mental load of remembering who you already nudged, plus the awkwardness of reminding someone who actually did submit (or forgetting someone who didn’t). After a few rounds, the spreadsheet starts to feel like a crime scene.
It adds up fast. Here’s where it breaks down in real life.
- Every manual cross-check turns into 30–60 minutes of filtering and “did I already email them?” second-guessing.
- Roster data and form data rarely match perfectly, so one typo in a register number can hide a submission.
- Acknowledgements get skipped when things get busy, which means more “I submitted, did you get it?” follow-ups later.
- Reminders go out late or not at all, and then you’re chasing responses at the last minute.
What You’ll Build: A live tracking dashboard with one-click emails
This workflow suite turns your Google Sheets into a real-time registration tracker that stays current without babysitting. It starts with a webhook-based dashboard in n8n: you open a simple URL, and n8n pulls your student roster from one sheet and your Google Form responses from another. A small code step compares them using a shared identifier (like Register No.), then generates an HTML dashboard that lists totals, submitted, and pending. From that same dashboard, you can trigger two companion webhooks: one sends a thank-you email to people who completed the form, and the other emails a reminder to the ones still pending. The result is clean tracking plus fast follow-up, with far fewer mistakes.
The workflow begins when you load the live tracking page or press a dashboard button. n8n matches roster rows to form response rows, then prepares the right email content and sends it through Gmail. Finally, it returns a confirmation page so you know the send actually happened.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you’re tracking 120 students. Manually, you might spend about 45 minutes exporting or opening responses, another 45 minutes matching register numbers, then 30 minutes writing and sending emails, so roughly 2 hours per follow-up round. With this workflow, you open the dashboard URL (about a minute), click “Send Acknowledgements” or “Send Reminders,” and wait a few minutes for Gmail to send. You still keep control, but the grind disappears.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store roster and responses.
- Gmail to send acknowledgements and reminders.
- Google OAuth credentials (set up in Google Cloud Console for Sheets/Gmail access).
Skill level: Beginner. You’ll connect Google accounts, confirm sheet columns, and paste in webhook URLs.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A dashboard page gets opened. The “Live Tracking” workflow starts from an n8n webhook endpoint (like /live-tracking), which means you can bookmark it and treat it like an internal tool.
Your two Sheets are pulled in. n8n reads the student roster sheet (Register No., name, email) and reads the form response sheet (timestamp, Reg No., email address). These come in as two data streams.
The roster is reconciled against responses. A merge step aligns the two sets, and a small code step compares keys (usually Register No.) to figure out who is “submitted” and who is “pending.” It then builds an HTML dashboard showing summary stats and two action buttons.
Emails are sent on demand. When you click “Send Acknowledgements” or “Send Reminders,” a companion webhook runs, merges roster + responses again (so it’s always current), generates personalized email copy, sends via Gmail, then returns a confirmation page.
You can easily modify the matching field (Register No., email, or a custom ID) to fit your process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the three incoming webhooks that drive the dashboard view and the email actions.
- Open Incoming Dashboard Hook and set Path to
2235781f-4371-4f6e-8767-41c352ed171f, with Response Mode set toresponseNode. - Open Incoming Acknowledgement Hook and set Path to
send-acknowledgements, with Response Mode set toresponseNode. - Open Incoming Reminder Hook and set Path to
send-reminder, with Response Mode set toresponseNode. - Confirm the parallel execution: Incoming Dashboard Hook outputs to both Fetch Spreadsheet Data and Retrieve Form Responses in parallel.
- Confirm the parallel execution: Incoming Acknowledgement Hook outputs to both Fetch Student Roster and Fetch Response Records in parallel.
- Confirm the parallel execution: Incoming Reminder Hook outputs to both Retrieve Roster Records and Fetch Reminder Responses in parallel.
Step 2: Connect Google Sheets
Attach Google Sheets data sources for student rosters and form responses across the three flows.
- Open Fetch Spreadsheet Data and select the document
1-i55cyu2DKZ_alSlR3Bd7abHn_EfvTpg73hv2y3zb4oand sheetgid=0. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - Open Retrieve Form Responses and select the document
10eIZzrzgRy8PKfyhhVc8eG8lFoAxEqE0h-IOnqHwdVEand sheet1113734691. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - Open Fetch Student Roster and select the document
1-i55cyu2DKZ_alSlR3Bd7abHn_EfvTpg73hv2y3zb4oand sheetgid=0. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - Open Fetch Response Records and select the document
10eIZzrzgRy8PKfyhhVc8eG8lFoAxEqE0h-IOnqHwdVEand sheet1113734691. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - Open Retrieve Roster Records and select the document
1-i55cyu2DKZ_alSlR3Bd7abHn_EfvTpg73hv2y3zb4oand sheetgid=0. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - Open Fetch Reminder Responses and select the document
10eIZzrzgRy8PKfyhhVc8eG8lFoAxEqE0h-IOnqHwdVEand sheet1113734691. Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials.
Register No. and Reg No) to avoid mismatches in merge logic.Step 3: Set Up Dashboard Processing
Merge roster and response data, then generate the HTML dashboard returned to the browser.
- Open Combine Register Streams and set Mode to
combinewith Advanced enabled. - In Combine Register Streams, set Merge By Fields to map
Register No.(field1) withReg No(field2). - Open Build Tracking Dashboard and review the JavaScript that compiles summary stats and the HTML dashboard output.
- Open Return Webhook Output and set Respond With to
textand Response Body to=={{ $json["html"] }}.
https://[YOUR_WEBHOOK_URL] inside Build Tracking Dashboard with your actual webhook base URL for the dashboard buttons.Step 4: Configure Acknowledgement Email Flow
Join roster and response data, build personalized thank-you emails, send them via Gmail, and return an acknowledgement page.
- Confirm Merge Email Sources receives input from both Fetch Student Roster and Fetch Response Records in parallel.
- Open Compose Thank You Emails and verify the subject is
✅ Thank You for Your Submissionand the body template uses{{name}}and{{reg}}placeholders. - Open Dispatch Email Notices and set Send To to
={{$json["Email Address"]}}, Subject to{{ $json.subject }}, and Message to={{ $json.htmlBody }}. Credential Required: Connect yourgmailOAuth2credentials. - Open Return Acknowledgement Page and confirm the HTML response body contains your correct dashboard link.
Step 5: Configure Reminder Email Flow
Identify pending students, prepare reminder messages, send them via Gmail, and return the reminder confirmation page.
- Confirm Merge Reminder Sources receives input from both Retrieve Roster Records and Fetch Reminder Responses in parallel.
- Open Compose Reminder Emails and verify the subject is
⚠️ Reminder: Please Complete Your Formand the template uses{{name}}and{{reg}}placeholders. - Open Send Reminder Emails and set Send To to
={{$json["Email Address"]}}, Subject to={{ $json.subject }}, and Message to={{ $json.htmlBody }}. Credential Required: Connect yourgmailOAuth2credentials. - Open Return Reminder Page and confirm the HTML response body contains your correct dashboard link.
Step 6: Test and Activate Your Workflow
Validate each webhook path, ensure email delivery, and then activate the workflow for production.
- Click Execute Workflow and open the test URL from Incoming Dashboard Hook to confirm the HTML dashboard renders.
- Use the dashboard buttons to trigger Incoming Acknowledgement Hook and Incoming Reminder Hook, confirming each returns the correct HTML confirmation page.
- Verify that Dispatch Email Notices and Send Reminder Emails send messages to the expected email addresses.
- When the test run is successful, toggle the workflow to Active to enable production use.
Troubleshooting Tips
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection inside n8n’s Credentials section first.
- If you’re using webhook buttons from the dashboard, make sure your n8n webhook URLs are correct for your environment (test vs. production). A copied “test” URL is a common reason the button works once and then fails later.
- Gmail can throttle or reject bursts if you send too many emails too quickly. If you’re emailing a big roster, add a short delay between sends and confirm your Gmail account is allowed to send from that address.
Quick Answers
About 30 minutes if your Sheets columns are already clean.
No. You’ll paste in a workflow and connect accounts, and the included code nodes are already set up for the matching and email text.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Google Workspace costs if you’re sending from a managed domain.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Most teams swap the “match key” used in the merge and code steps (for example, using email instead of Register No.), then tweak the “Compose Thank You Emails” and “Compose Reminder Emails” text to match their tone. You can also add a log step that writes each send to a “Mail Logs” sheet. If you want WhatsApp instead of email, replace the Gmail send with an HTTP Request to a provider like Twilio.
Usually it’s expired or changed Google OAuth consent. Reconnect the Google Sheets credential in n8n, then confirm the connected Google account still has access to the spreadsheet. Also check that the sheet name and columns haven’t been renamed, because the workflow may be selecting fields that no longer exist. If you’re running this on a shared drive, permissions can be quirky, honestly.
A few hundred rows per run is normal, and Gmail sending limits tend to be the real cap.
Often, yes, because this setup needs matching logic, “pending vs completed” lists, and an HTML dashboard response, which are awkward in simple two-step tools. n8n handles branching logic without nickel-and-diming you for each path. It also gives you the option to self-host, which matters if you run this daily and don’t want per-task pricing to creep up. Zapier or Make can still work if you only want “new form response → send email,” but that’s not the same as reconciling against a roster. If you’re torn, Talk to an automation expert and we’ll help you pick the simplest option.
Once this is running, your Sheets stay honest and your follow-ups stop slipping through the cracks. Set it up once, then use the time you get back for the work that actually needs you.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.