Workflow Overview
Lead Enrichment & Email Send Pipeline
Visual representation of all nodes and connections
Editor
Executions
Evaluations
All Nodes Used
On Form Submission
Section 1 · Trigger
HTTP Request
Section 1 · Data Fetch
Filter
Section 1 · Logic
Information Extractor
Section 2 · AI Node
IF
Section 2 · Logic
Append Row in Sheet
Section 2 · Google Sheets
No Operation
Section 2 · Fallback
Google Gemini Chat Model
Section 2 · AI Sub-node
Loop Over Items
Section 3 · Control
Wait
Section 3 · Delay
Information Extractor 1
Section 3 · AI Node
Edit Fields1
Section 3 · Transform
Send a Message
Section 3 · Gmail
Append / Update Row
Section 3 · Google Sheets
Google Gemini Chat Model 1
Section 3 · AI Sub-node
Node Parameters
01 · On Form Submission
Section 1
▼
| Parameter | Value | Description |
|---|---|---|
| Trigger Type | On Form Submission | Fires when a form is submitted |
| Form Fields | company_name, website, etc. | Define fields matching your form |
| Authentication | None (public form) | Can add Basic Auth if needed |
| Respond | Using Respond to Webhook node | Controls when response is sent |
ℹ️ This is the entry point. All subsequent data is based on what this form captures.
02 · HTTP Request
Section 1
▼
| Parameter | Value | Description |
|---|---|---|
| Method | GET | Fetches data from the API |
| URL | https://api.shopify.com/v2/... | Your data source API endpoint |
| Authentication | Header Auth | Pass API key in header |
| Header Name | X-Shopify-Access-Token | Standard Shopify auth header |
| Header Value | {{ $credentials.apiKey }} | Reference stored credential |
| Response Format | JSON | Parse the returned body as JSON |
💡 Store API keys in n8n Credentials, never hardcode them in the URL or node.
03 · Filter
Section 1
▼
| Parameter | Value | Description |
|---|---|---|
| Conditions | AND | All conditions must be true |
| Field | {{ $json.status }} | Check the status field |
| Operation | equals | Exact match |
| Value | active | Only pass active records |
💡 Add a second condition:
{{ $json.email }} is not empty — to filter out records without emails early.
04 · Information Extractor
Section 2
▼
| Parameter | Value | Description |
|---|---|---|
| Text | {{ $json.description }} | The raw text to extract email from |
| Attribute Name | What to name the extracted field | |
| Attribute Type | string | Expected output type |
| Attribute Desc | Email address of the contact | Helps AI know what to look for |
| Language Model | Google Gemini Chat Model | Connected sub-node (Node 08) |
ℹ️ You can add multiple attributes — e.g., also extract
first_name, company, phone.
05 · IF
Section 2
▼
| Parameter | Value | Description |
|---|---|---|
| Condition | {{ $json.email }} | The email field from extractor |
| Operation | is not empty | Check if AI found an email |
| True Branch | → Append row in sheet | Email found — save it |
| False Branch | → No Operation | No email — skip record |
06 · Append Row in Sheet
Section 2
▼
| Parameter | Value | Description |
|---|---|---|
| Resource | Sheet | Operating on a spreadsheet |
| Operation | Append | Add new row to sheet |
| Spreadsheet | Leads Database | Select your Google Sheet |
| Sheet | Sheet1 | Target tab name |
| Column: email | {{ $json.email }} | Map extracted email |
| Column: company | {{ $json.company }} | Map company name |
| Column: date | {{ $now }} | Timestamp of entry |
07 · No Operation, Do Nothing
Section 2
▼
⚠️ No parameters required. This node simply terminates the false branch of the IF node gracefully. It prevents n8n from throwing an error when no further action is needed.
08 · Google Gemini Chat Model
Section 2 · Sub-node
▼
| Parameter | Value | Description |
|---|---|---|
| Credential | Google Gemini API Key | Set up in n8n Credentials |
| Model | gemini-1.5-flash | Fast, cost-efficient model |
| Max Output Tokens | 1024 | Limit response length |
| Temperature | 0.2 | Low temp = more deterministic extraction |
ℹ️ This is a sub-node — it plugs into the Information Extractor node above it, not directly into the main flow.
09 · Loop Over Items
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Batch Size | 1 | Process one item at a time |
| Options | Reset (off) | Keep loop running until all items done |
💡 Batch size of 1 combined with the Wait node controls send rate effectively.
10 · Wait
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Resume | After Time Interval | Pauses execution for set duration |
| Amount | 2 | Duration value |
| Unit | Minutes | 2-minute delay between sends |
⚠️ Do not set this below 1 minute — very fast email loops can trigger spam filters.
11 · Information Extractor 1
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Text | {{ $json.raw_text }} | Input data to extract from |
| Attribute 1 Name | first_name | Person's first name |
| Attribute 2 Name | company_name | Company name |
| Attribute 3 Name | product_interest | What they're interested in |
| Language Model | Google Gemini Chat Model 1 | Connected sub-node (Node 15) |
ℹ️ These extracted fields are used to personalise the email body in the next nodes.
12 · Edit Fields1
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Mode | Manual | Define fields manually |
| Field: email_to | {{ $json.email }} | Recipient email address |
| Field: subject | Hi {{ $json.first_name }}, ... | Personalised subject line |
| Field: body | Hi {{ $json.first_name }}, I noticed {{ $json.company_name }}... | Full personalised email body |
| Keep Original | false | Only pass the new fields forward |
13 · Send a Message (Gmail)
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Credential | Gmail OAuth2 | Authorised Gmail account |
| Resource | Message | Send an email message |
| Operation | Send | Send operation |
| To | {{ $json.email_to }} | Recipient from Edit Fields node |
| Subject | {{ $json.subject }} | Subject from Edit Fields node |
| Message | {{ $json.body }} | Body from Edit Fields node |
| Body Content Type | HTML | Allows formatted HTML emails |
⚠️ Make sure Gmail OAuth2 credentials are connected. You must allow n8n access in your Google account settings.
14 · Append or Update Row in Sheet
Section 3
▼
| Parameter | Value | Description |
|---|---|---|
| Resource | Sheet | Google Sheets operation |
| Operation | Append or Update | Create row or update if exists |
| Spreadsheet | Leads Database | Same sheet as node 06 |
| Lookup Column | Unique key to match existing rows | |
| Column: email_sent | true | Mark email as sent |
| Column: sent_at | {{ $now }} | Timestamp of send |
💡 Using "Append or Update" with email as lookup key prevents duplicate rows.
15 · Google Gemini Chat Model 1
Section 3 · Sub-node
▼
| Parameter | Value | Description |
|---|---|---|
| Credential | Google Gemini API Key | Same API key as Node 08 |
| Model | gemini-1.5-flash | Fast and capable model |
| Max Output Tokens | 1024 | Enough for name/company extraction |
| Temperature | 0.2 | Deterministic for structured output |
ℹ️ This is a separate sub-node instance from Node 08 — it's dedicated to the email personalisation extraction in Section 3.