Client intake automation — form submission to Sheets, confirmation email, and internal notification

I built this to handle the most common first step in client work: someone fills out an intake form, and from there a few things need to happen automatically, the response gets saved somewhere I can reference later, the person gets a confirmation that it went through, and I get notified so I’m not checking a spreadsheet manually.

The workflow:
Form Trigger → Google Sheets (append row) → Gmail (confirmation to submitter) + Gmail (internal notification)

It’s a Form Trigger node, not an external form tool, the form itself lives in n8n, which means the whole thing is self-contained instead of depending on a separate service to feed it. When a submission comes in, it appends a row to a Sheet, then fans out to two Gmail sends: one back to the person who submitted (confirming it was received), one to me (so I know something came in without having to check).

What worked:
The logic itself came together faster than I expected. Mapping the form fields to the Sheet columns and into the email content was mostly straightforward once I understood how data passes between nodes, that part felt close to writing the equivalent in code, just expressed differently.

What didn’t, at first:
The actual friction was authentication. I’d built a version of this same idea in Python before, where I was passing an API key or service account credential directly in code and moving on. In n8n, setting up the OAuth flow for Sheets and Gmail took real trial and error, getting the right scopes, getting the credential actually connected to both nodes, understanding why a credential that worked for one Google service didn’t automatically cover the other. It wasn’t that it’s harder in some absolute sense, it’s that the Python version put the complexity in code I controlled directly, and n8n moves it into a setup flow I had to learn the shape of first.

What I took from comparing the two versions:
The Python version is on my GitHub if anyone wants to see it next to this. The core logic is nearly identical, read a submission, write a row, send two emails. The real difference isn’t the logic, it’s where the hard part lives. In Python the hard part is the code. In n8n the hard part is the credential and connection setup, and once that’s done correctly, the rest is faster to build and easier to see at a glance than the script version was.

Still early with n8n, so if there’s a cleaner way to handle the Gmail auth setup specifically, or a reason to split this into more nodes than I have, I’d want to know.

Workflow JSON is here: GitHub - TeSidrah/Automation-Agency-Intake-Router: n8n workflow - form submission to Google Sheets + client confirmation + agency notification, fully automated · GitHub .
Happy to answer questions on any part of the setup.

1 Like