Google Forms to Google Sheets, interviews logged clean
Interview responses are supposed to be the easy part. But once the form closes, you’re stuck with scattered notes, half-copied quotes, and that one “where did we save it?” thread.
Marketing managers feel it when customer interviews pile up. Founders trying to validate a new offer run into the same mess. And researchers doing discovery calls? They need Forms interview logging that doesn’t fall apart the moment volume increases.
This workflow turns a Google Form into a guided AI interview and writes the full transcript into Google Sheets, neatly. You’ll see what it automates, what you need, and where teams usually trip up.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Forms to Google Sheets, interviews logged clean
flowchart LR
subgraph sg0["Start Interview Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Stop Interview?", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Generate Row", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Generate Row1", pos: "b", h: 48 }
n3@{ icon: "mdi:memory", form: "rounded", label: "Clear For Next Interview", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Send Reply To Agent", pos: "b", h: 48 }
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/form.svg' width='40' height='40' /></div><br/>Start Interview"]
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/form.svg' width='40' height='40' /></div><br/>Get Answer"]
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Interview Topic", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "UUID", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Generate Row2", pos: "b", h: 48 }
n10["<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/redis.svg' width='40' height='40' /></div><br/>Create Session"]
n11["<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/redis.svg' width='40' height='40' /></div><br/>Update Session"]
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/redis.svg' width='40' height='40' /></div><br/>Update Session1"]
n13["<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/redis.svg' width='40' height='40' /></div><br/>Update Session2"]
n16@{ icon: "mdi:memory", form: "rounded", label: "Window Buffer Memory2", pos: "b", h: 48 }
n17@{ icon: "mdi:memory", form: "rounded", label: "Window Buffer Memory", pos: "b", h: 48 }
n18["<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/form.svg' width='40' height='40' /></div><br/>Redirect to Completion Screen"]
n21@{ icon: "mdi:robot", form: "rounded", label: "AI Researcher", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Parse Response", pos: "b", h: 48 }
n23@{ icon: "mdi:brain", form: "rounded", label: "Groq Chat Model", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Save to Google Sheet", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "Session to List", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-vertical", form: "rounded", label: "Messages To JSON", pos: "b", h: 48 }
n29["<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/redis.svg' width='40' height='40' /></div><br/>Get Session"]
n8 --> n10
n6 --> n1
n29 --> n26
n1 --> n12
n21 --> n22
n2 --> n13
n9 --> n11
n10 --> n9
n22 --> n0
n11 --> n7
n23 -.-> n21
n26 --> n27
n5 --> n8
n0 --> n2
n0 --> n6
n12 --> n4
n13 --> n3
n27 --> n25
n4 --> n21
n7 --> n21
n17 -.-> n3
n16 -.-> n21
n3 --> n18
n18 --> n29
end
subgraph sg1["Flow 2"]
direction LR
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Valid Session?", pos: "b", h: 48 }
n15["<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"]
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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n20["<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/html.dark.svg' width='40' height='40' /></div><br/>404 Not Found"]
n24["<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/html.dark.svg' width='40' height='40' /></div><br/>Show Transcript"]
n28["<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/redis.svg' width='40' height='40' /></div><br/>Query By Session"]
n19 --> n28
n20 --> n15
n14 --> n24
n14 --> n20
n24 --> n15
n28 --> n14
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 n5 trigger
class n21 ai
class n23 aiModel
class n3,n16,n17 ai
class n0,n14 decision
class n10,n11,n12,n13,n25,n29,n28 database
class n15,n19 api
classDef customIcon fill:none,stroke:none
class n5,n6,n10,n11,n12,n13,n18,n29,n15,n19,n20,n24,n28 customIcon
The Challenge: Interviews that turn into cleanup work
Running interviews sounds simple until you do it more than a couple times a week. Someone writes questions in one place, the respondent answers in another, and then you stitch the story together from browser tabs, email notifications, and whatever got pasted into a doc. If you’re doing market research, that “stitching” becomes the real job. It’s also where errors creep in: missing context, misquoted wording, and transcripts that never make it into a dataset your team can actually review.
It adds up fast. Here’s where it breaks down in day-to-day work.
- You end up copying answers from multiple pages into one “master” file, and it’s always slower than you expect.
- When interviews are longer, people stop taking clean notes, which means insights are lost or watered down.
- There’s no reliable session transcript, so two teammates can interpret the same respondent completely differently.
- Sharing raw responses is awkward because the data isn’t in a review-friendly format, especially for stakeholders who live in spreadsheets.
The Fix: An AI interviewer that writes clean rows to Sheets
This n8n workflow turns a multi-page n8n Form into an interactive interview that can run as long as the respondent wants. The interview begins when someone opens your published form, and the workflow creates a unique session ID behind the scenes. As the person answers, an AI agent (powered by a chat model such as Groq, though you can swap providers) responds with the next question based on your topic and the conversation so far. Every question-and-answer pair is appended to a session transcript stored in Redis, so nothing gets lost between pages. When the respondent chooses to end, the workflow closes the loop, renders a completion screen, and saves the full transcript into Google Sheets as structured data your team can review immediately.
The workflow starts with a form trigger, then uses Redis as a session “memory” for the transcript while the AI agent continues the conversation. Once the interview ends, n8n converts that session log to JSON and appends it into Google Sheets (or Microsoft Excel 365 if you prefer), creating tidy rows that are ready for analysis.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you run 10 interviews a week, and each one has 15 question-and-answer turns. Manually, you might spend about 10 minutes per interview cleaning up notes and pasting key quotes into a spreadsheet, plus another 10 minutes just formatting things so they’re readable. That’s roughly 3 hours a week in cleanup. With this workflow, the respondent drives the interview in the form, Redis captures the transcript live, and Google Sheets gets a clean session log at the end. You still review, but the busywork mostly disappears.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing transcripts in rows.
- Redis (or compatible) to store interview sessions safely.
- LLM API access (get it from Groq or your chosen provider)
Skill level: Intermediate. You’ll connect accounts, add credentials, and lightly adjust prompts and sheet columns.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
The interview starts from a published form. The n8n form trigger opens the session, generates a unique ID, and prepares storage so each respondent’s transcript stays separate.
Session memory is created and continuously updated. Redis stores the start marker, then appends each new answer as the respondent moves through the form pages. If the session can’t be found (expired key, wrong ID), the workflow renders a “missing” page instead of failing silently.
The AI agent asks and adapts questions. The workflow sets the interview topic, passes recent context through a memory buffer, and lets the agent generate the next question. The user replies, the answer is saved, and the loop continues until the user chooses to end.
The transcript is compiled and written to Sheets. When the interview ends, the session log is split and converted into JSON, then appended to Google Sheets (and optionally Microsoft Excel 365) as a clean record for analysis and sharing.
You can easily modify the interview topic and the stopping rules to match your survey style based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the interview entry point so participants can start the session and provide their name.
- Open Begin Interview Form and set Form Title to
UK Practical Driving Test Satisfaction Interview. - In Form Fields, add a required field labeled
What is your name?with placeholderie. Sam Smith. - Under Options, set Path to
driving-lessons-surveyand Button Label toBegin Interview!. - Set Response Mode to
lastNodeand paste the provided interview description into Form Description.
Step 2: Connect Session Storage (Redis)
Initialize and maintain a session log for each interview using Redis. Several Redis nodes work together to store interview start, answers, and stop events.
- Open Create Unique ID and keep Action set to
generateto create a session identifier. - In Initialize Session Store, set Key to
=session_{{ $('Create Unique ID').item.json.data }}, TTL to{{ 60 * 60 * 24 }}, and Value to{{ [] }}. - Confirm Initialize Session Store, Append Session Log, Append Session Log 2, Append Session Log 3, Lookup Session Data, and Retrieve Session List all point to the same Redis instance and use the list key
session_{{ $('Create Unique ID').first().json.data }}. - Credential Required: Connect your redis credentials in Initialize Session Store, Append Session Log, Append Session Log 2, Append Session Log 3, Lookup Session Data, and Retrieve Session List.
session_{{ $('Create Unique ID').first().json.data }}.Step 3: Set Up the AI Interview Agent
Configure the AI interview flow so the model asks questions, parses responses, and checks for the stop condition.
- Open Define Interview Topic and set the answer assignment to
Hello, my name is {{ $('Begin Interview Form').first().json['What is your name?'] }}, and interview_topic toYour experience preparing for and taking the UK practical driving test. - In AI Interview Agent, set Text to
{{ $json.answer }}, keep Prompt Type asdefine, and enable Has Output Parser. - Ensure Groq Chat Engine is connected as the language model with Model set to
llama-3.2-90b-text-preview. Credential Required: Connect your groqApi credentials in Groq Chat Engine. - In Parse Agent Output, set the output assignment to
{{$json.output.replace('```json', '').replace('```', '').parseJson()}}to parse the model’s JSON response. - In Check End Interview, keep the boolean condition
{{ $json.output.stop_interview }}to route either to next question or stopping the interview.
Step 4: Configure Question Loop & Session Logging
Store each question/answer pair in Redis and route the conversation back into the agent until the user ends the interview.
- In Build Start Row, set timestamp to
{{ $now.toISO() }}, type tostart_interview, question toWhat is your name?, and answer to{{ $('Begin Interview Form').first().json['What is your name?'] }}. - In Build Row Data, set timestamp to
{{ $now.toISO() }}, type tonext_question, question to{{ $('Parse Agent Output').item.json.output.question }}, and answer to{{ $('Collect Answer Form').item.json.answer }}. - In Return Answer To Agent, set answer to
{{ $('Collect Answer Form').item.json.answer }}so the response is fed back into AI Interview Agent. - In Build Stop Row, set timestamp to
{{ $now.toISO() }}, type tostop_interview, and both question and answer toNone. - Verify the execution flow: Collect Answer Form → Build Row Data → Append Session Log 2 → Return Answer To Agent → AI Interview Agent.
stop_interview as a boolean.Step 5: Configure Transcript Retrieval & Web Response
Render transcripts through a webhook-based HTML response after a session completes.
- In Incoming Transcript Webhook, keep Path set to
ai-interview-transcripts/:session_idand Response Mode toresponseNode. - In Lookup Session Data, set Key to
session_{{ $('Incoming Transcript Webhook').first().json.params.session_id }}and Property Name todata. - In Validate Session Exists, keep the condition checking
{{ $json.data }}exists to route either to Render Transcript Page or Render Missing Page. - In Send Webhook Reply, set Respond With to
textand Response Body to{{ $json.html }}.
/webhook/ai-interview-transcripts/<session_id> to test retrieval in a browser.Step 6: Configure Output to Google Sheets
Split and format session entries, then append them to your spreadsheet for analytics and long-term storage.
- In Retrieve Session List, set Key to
session_{{ $('Create Unique ID').first().json.data }}and Property Name tosession. - In Split Session Items, set Field To Split Out to
session. - In Session To JSON, set JSON Output to
{{ { ...$json.session.parseJson(), session_id: `session_${$('Create Unique ID').first().json.data}`, name: $('Begin Interview Form').first().json['What is your name?'], } }}. - In Append To Sheets, select the target Document and Sheet Name, and map columns using the existing auto-map configuration.
- Credential Required: Connect your googleSheetsOAuth2Api credentials in Append To Sheets.
Step 7: Configure Completion & Session Reset
When the interview ends, clean memory, redirect the user to the transcript, and finalize the session log.
- In Reset For Next Session, set Mode to
deleteand Delete Mode toall. - In Route To Completion Page, set Operation to
completionand Redirect URL tohttps://<host>/webhook/<uuid-if-using-n8n-cloud>/ai-interview-transcripts/{{ $('Create Unique ID').first().json.data }}. - Confirm the flow Append Session Log 3 → Reset For Next Session → Route To Completion Page → Retrieve Session List is intact.
Step 8: Test and Activate Your Workflow
Run a full interview session to verify that questions, logs, transcripts, and sheet entries are all working as expected.
- Click Execute Workflow, open the Begin Interview Form link, and submit a name to start a session.
- Answer several questions via Collect Answer Form, then enter
STOPto end the interview. - Verify the transcript page loads from Incoming Transcript Webhook and shows your question/answer history from Render Transcript Page.
- Confirm the spreadsheet receives appended rows in Append To Sheets.
- When ready, switch the workflow to Active so the forms and webhooks are available in production.
Watch Out For
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and the target spreadsheet sharing settings first.
- Redis sessions can “disappear” if your TTL (expiration) is too short or your Redis instance restarts. If respondents report missing transcripts, check Redis persistence settings and session key expiry.
- Default AI prompts are generic. Add your brand voice and research goal early, or you will spend your time rewriting questions and cleaning messy answers later.
Common Questions
About an hour if your Sheet, Redis, and AI credentials are ready.
Yes, but someone should be comfortable connecting credentials and testing a full interview end-to-end. No coding is required.
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 LLM API costs (often a few cents per interview, depending on length).
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.
You can swap the chat model without changing the overall flow by replacing the Groq Chat Engine with another provider node (including an OpenAI Chat Model) and keeping the AI Interview Agent inputs the same. Most teams customize the “Define Interview Topic” and the agent prompt so it asks on-brand questions, probes deeper, and stops in the right place. If you want different outputs, adjust “Build Row Data” and “Append To Sheets” so your columns match how you analyze interviews. You can also change the completion page text in “Route To Completion Page” to set expectations about follow-up.
Usually it’s expired credentials or the spreadsheet isn’t shared with the connected Google account. Update the Google Sheets credential in n8n, then confirm the target sheet and tab still exist. If you recently changed columns, “Append To Sheets” may also be writing to a range that no longer matches your headers.
If you self-host, there’s no execution limit; capacity mostly depends on your server and your AI provider’s rate limits. On n8n Cloud, your plan sets monthly executions, and interviews can use multiple executions because the workflow loops through question-and-answer turns. Practically, most small teams can run dozens of interviews a week without thinking about it, then scale up by shortening the interview or reducing how often the agent calls the model.
Often, yes. This workflow relies on a looped interaction (question, answer, save, ask again) plus session storage in Redis, which is awkward in most “linear” automation builders. n8n also gives you more control over branching with If/Switch logic, and you can self-host when volume grows. Zapier or Make can still be fine for simple “Form submission → add row” flows, but this is more than that. Talk to an automation expert if you want help choosing the simplest tool for your situation.
Once interviews automatically land in Google Sheets as clean transcripts, research stops feeling fragile. The workflow handles the repetitive capture so you can focus on patterns, decisions, and what to do next.
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.