Reference for the n8n Google Forms Trigger node -- configuration, response data structure, and common patterns.
The Google Forms Trigger node starts a workflow when a new response is submitted to a Google Form. It polls the Google Forms API at regular intervals to detect new submissions.
Google Forms Trigger requires Google OAuth2 credentials with access to Google Forms.
Note
The Google Forms API is separate from the Google Sheets API. Even if your form writes responses to a sheet, this trigger reads directly from the Forms API, not from the linked sheet.
| Parameter | Description |
|---|---|
| Form | Select the Google Form to watch. The dropdown lists all forms accessible to the authenticated account. You can also enter a Form ID directly. |
| Poll Times | How frequently n8n checks for new responses. Set using a cron expression or the simple interval selector. Default is every minute. |
Tip
If immediate processing is not critical, set the poll interval to every 5 or 15 minutes to reduce API quota usage.
Each form submission arrives as a single n8n item. The data structure includes:
| Field | Type | Description |
|---|---|---|
responseId |
String | Unique identifier for this submission |
createTime |
String | ISO 8601 timestamp of when the response was submitted |
lastSubmittedTime |
String | ISO 8601 timestamp of the last modification |
answers |
Object | Key-value map of question IDs to answer objects |
The answers object is keyed by the internal question ID (a hex string like 6f2b3c1a), not the question text. Each answer object contains:
{
"questionId": "6f2b3c1a",
"textAnswers": {
"answers": [
{ "value": "The submitted response text" }
]
}
}
Warning: Question IDs are not human-readable
The raw output uses internal question IDs, not the question titles. You will almost always need a Code node or Set node after this trigger to rename the fields into meaningful keys. To find the mapping between question IDs and question text, run the trigger once and inspect the output data.
Process form responses into a spreadsheet or database:
Google Forms Trigger --> Code (map fields) --> Google Sheets (Append Row)
The Code node extracts answer values from the nested structure and creates a flat object with readable field names:
const answers = $json.answers;
return {
json: {
name: answers['6f2b3c1a'].textAnswers.answers[0].value,
email: answers['7d4e5f2b'].textAnswers.answers[0].value,
feedback: answers['8a1c9d3e'].textAnswers.answers[0].value,
submitted_at: $json.createTime
}
};
Send a notification on each submission:
Google Forms Trigger --> Code (map fields) --> Slack (Send Message)
Transform the response data and post a formatted message to a Slack channel for each new submission.
Conditional processing by answer value:
Google Forms Trigger --> Code (map) --> Switch (route by answer) --> [different actions]
After mapping the fields, use a Switch or IF node to route submissions based on specific answer values (e.g., department selection, priority level).
If you only need the response data and your form is linked to a Google Sheet, you can use the Google Sheets Trigger node on the response sheet instead. This approach provides data with readable column names automatically (from the sheet headers), avoiding the question ID mapping step.
| Approach | Pros | Cons |
|---|---|---|
| Google Forms Trigger | Direct access to form metadata, does not require a linked sheet | Question IDs require manual mapping |
| Google Sheets Trigger | Readable column names, simpler data structure | Requires a linked response sheet, slight delay |
textAnswers.answers array. Loop through the array or join values in a Code node.Google Forms API has not been used in project XXXXX before (403).
The Google Forms API is not enabled in your Google Cloud Console project. Go to APIs & Services > Library, search for "Google Forms API", and enable it. Also enable the "Google Drive API" in the same project.
Trigger fires but output data uses internal question IDs instead of question text. This is expected behavior. The Google Forms API returns answers keyed by internal question IDs (hex strings), not the human-readable question titles. Add a Code node or Edit Fields node after the trigger to map question IDs to meaningful field names. Run the trigger once to see the actual IDs in the output.
Quota exceeded for quota metric error after running for some time.
The Google Forms API has usage limits. If you are polling frequently across many forms, you may exceed your quota. Increase the poll interval (e.g., from every minute to every 5 or 15 minutes) or consolidate questions into fewer forms.
I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.