n8n Workflow Templates: 15 Ready-to-Use Automations for Your Business

Last Updated: Jan 27, 2026

No items found.
No items found.
18 min read

This article is part of a larger content collection. Start with our ultimate guide.

n8n Workflow Templates: 15 Ready-to-Use Automations for Your Business

Building automations from scratch takes time. These 15 n8n workflow templates give you working starting points you can import, customise, and deploy in minutes rather than hours.

Each template includes the actual JSON you can copy directly into n8n. We have organised them by use case: quick wins for beginners, finance and operations workflows, marketing and sales automations, and AI-powered templates for teams ready to add intelligence to their processes.

Quick Summary: All 15 Templates

| Template | Category | Complexity | Time to Deploy |

|----------|----------|------------|----------------|

| Webhook to Slack Notification | Quick Start | Beginner | 5 minutes |

| Form Submission to Google Sheets | Quick Start | Beginner | 10 minutes |

| Scheduled Report Email | Quick Start | Beginner | 15 minutes |

| Stripe Payment to Xero Invoice | Finance | Intermediate | 20 minutes |

| Expense Receipt OCR | Finance | Intermediate | 25 minutes |

| Invoice Data Extraction | Finance | Intermediate | 30 minutes |

| QuickBooks Invoice from Sheets | Finance | Intermediate | 20 minutes |

| Lead Capture to HubSpot | Marketing | Intermediate | 20 minutes |

| Lead Scoring Workflow | Marketing | Intermediate | 30 minutes |

| CRM Data Enrichment | Marketing | Intermediate | 25 minutes |

| Social Media Scheduler | Marketing | Intermediate | 30 minutes |

| Email Classification with GPT | AI-Powered | Advanced | 35 minutes |

| Document Summary Generator | AI-Powered | Advanced | 30 minutes |

| AI Content Generator | AI-Powered | Advanced | 35 minutes |

| Customer Support Triage | AI-Powered | Advanced | 45 minutes |

What Makes a Good n8n Workflow

Before diving into templates, understanding what separates reliable workflows from fragile ones will help you customise these examples effectively.

Error Handling

Every production workflow needs error handling. External APIs fail, data formats change, and rate limits get hit. Configure these settings on nodes that call external services:

Retry on Fail: Enable this for any node calling an external API. Set 3 to 5 retries with a 5-second wait between attempts. This handles temporary network issues and brief API outages without failing the entire workflow. Error Workflows: Create a dedicated workflow that starts with the Error Trigger node. This workflow can send Slack alerts, log failures to a database, or notify your team via email. Link it to your production workflows in the workflow settings. Error Branches: For non-critical steps, use "Continue using error output" to route failures to an alternative path rather than stopping the workflow entirely.

Modularity

Break complex automations into smaller, focused workflows. A single workflow doing 50 things is harder to debug than five workflows doing 10 things each. Use the Execute Workflow node to chain them together.

Benefits of modular design:

  • Easier to test individual components
  • Failures are isolated to specific workflows
  • Reusable components across multiple automations
  • Simpler to maintain and update

Documentation with Sticky Notes

Add sticky notes at the start of each logical section explaining what that section does. Future you (or your colleagues) will appreciate knowing why a particular IF node exists or what format an API expects.

Quick Start Templates

These three workflows take under 15 minutes to deploy and demonstrate core n8n concepts.

1. Webhook to Slack Notification

Use case: Get instant Slack alerts when something happens in another system, such as a form submission, payment, or status change. How it works: A webhook URL receives incoming data, extracts the relevant fields, and posts a formatted message to your Slack channel.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "notify-slack",

"responseMode": "onReceived",

"responseData": "allEntries"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"channel": "#notifications",

"text": "=New event received:\n\nType: {{ $json.event_type }}\nDetails: {{ $json.message }}\nTime: {{ $now.format('DD MMM YYYY HH:mm') }}",

"otherOptions": {}

},

"name": "Slack",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [450, 300],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "Slack", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Import the JSON into n8n

2. Create Slack credentials (OAuth2 or API token)

3. Update the channel name to your target channel

4. Activate the workflow and copy the webhook URL

5. Configure your source system to POST to that URL

2. Form Submission to Google Sheets

Use case: Log all form submissions to a spreadsheet for tracking, analysis, or as a simple database. How it works: Receives form data via webhook, formats it consistently, and appends a row to Google Sheets with timestamp.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "form-to-sheets",

"responseMode": "onReceived",

"responseData": "allEntries"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"values": {

"string": [

{"name": "timestamp", "value": "={{ $now.format('YYYY-MM-DD HH:mm:ss') }}"},

{"name": "name", "value": "={{ $json.name }}"},

{"name": "email", "value": "={{ $json.email }}"},

{"name": "message", "value": "={{ $json.message }}"}

]

},

"options": {}

},

"name": "Set Fields",

"type": "n8n-nodes-base.set",

"typeVersion": 2,

"position": [450, 300]

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Sheet1"},

"columns": {

"mappingMode": "defineBelow",

"value": {

"Timestamp": "={{ $json.timestamp }}",

"Name": "={{ $json.name }}",

"Email": "={{ $json.email }}",

"Message": "={{ $json.message }}"

}

}

},

"name": "Google Sheets",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [650, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "Set Fields", "type": "main", "index": 0}]]

},

"Set Fields": {

"main": [[{"node": "Google Sheets", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Import the JSON

2. Create a Google Sheet with columns: Timestamp, Name, Email, Message

3. Connect your Google account in n8n credentials

4. Update the spreadsheet ID and sheet name

5. Activate and test with sample data

3. Scheduled Report Email

Use case: Send daily, weekly, or monthly summary emails pulling data from an API or database. How it works: Runs on a schedule, fetches data from your source, formats it into readable HTML, and sends via email.

```json

{

"nodes": [

{

"parameters": {

"rule": {

"interval": [{"field": "hours", "hoursInterval": 24}]

}

},

"name": "Schedule Trigger",

"type": "n8n-nodes-base.scheduleTrigger",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"method": "GET",

"url": "https://api.example.com/daily-stats",

"authentication": "predefinedCredentialType",

"nodeCredentialType": "httpHeaderAuth",

"options": {}

},

"name": "Fetch Data",

"type": "n8n-nodes-base.httpRequest",

"typeVersion": 4,

"position": [450, 300],

"credentials": {

"httpHeaderAuth": {

"id": "YOURCREDENTIALID",

"name": "API Auth"

}

}

},

{

"parameters": {

"fromEmail": "reports@yourcompany.com",

"toEmail": "team@yourcompany.com",

"subject": "=Daily Report - {{ $now.format('DD MMM YYYY') }}",

"emailType": "html",

"html": "=

Daily Summary

Here are today's numbers:

  • Total Orders: {{ $json.totalorders }}
  • Revenue: {{ $json.revenue }}
  • New Customers: {{ $json.newcustomers }}

Generated automatically at {{ $now.format('HH:mm') }}

",

"options": {}

},

"name": "Send Email",

"type": "n8n-nodes-base.emailSend",

"typeVersion": 2,

"position": [650, 300],

"credentials": {

"smtp": {

"id": "YOURCREDENTIALID",

"name": "SMTP Account"

}

}

}

],

"connections": {

"Schedule Trigger": {

"main": [[{"node": "Fetch Data", "type": "main", "index": 0}]]

},

"Fetch Data": {

"main": [[{"node": "Send Email", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Import and adjust the schedule interval

2. Replace the API URL with your data source

3. Configure SMTP credentials

4. Customise the HTML template with your metrics

5. Test manually before activating the schedule

Finance and Operations Templates

These workflows handle the repetitive financial tasks that consume hours each week.

4. Stripe Payment to Xero Invoice

Use case: Automatically create invoices in Xero when Stripe payments complete, keeping your accounting in sync without manual data entry. How it works: Listens for Stripe payment events, extracts customer and payment details, creates or finds the contact in Xero, and generates a matching invoice.

```json

{

"nodes": [

{

"parameters": {

"events": ["payment_intent.succeeded"]

},

"name": "Stripe Trigger",

"type": "n8n-nodes-base.stripeTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"stripeApi": {

"id": "YOURCREDENTIALID",

"name": "Stripe Account"

}

}

},

{

"parameters": {

"resource": "customer",

"operation": "get",

"customerId": "={{ $json.data.object.customer }}"

},

"name": "Get Stripe Customer",

"type": "n8n-nodes-base.stripe",

"typeVersion": 1,

"position": [450, 300],

"credentials": {

"stripeApi": {

"id": "YOURCREDENTIALID",

"name": "Stripe Account"

}

}

},

{

"parameters": {

"resource": "contact",

"operation": "upsert",

"name": "={{ $json.name }}",

"email": "={{ $json.email }}",

"additionalFields": {}

},

"name": "Upsert Xero Contact",

"type": "n8n-nodes-base.xero",

"typeVersion": 1,

"position": [650, 300],

"credentials": {

"xeroOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Xero Account"

}

}

},

{

"parameters": {

"resource": "invoice",

"operation": "create",

"contactId": "={{ $json.ContactID }}",

"lineItems": {

"lineItemProperties": [

{

"description": "=Payment via Stripe - {{ $('Stripe Trigger').item.json.data.object.description }}",

"quantity": 1,

"unitAmount": "={{ $('Stripe Trigger').item.json.data.object.amount / 100 }}",

"accountCode": "200"

}

]

},

"additionalFields": {

"status": "AUTHORISED",

"reference": "={{ $('Stripe Trigger').item.json.data.object.id }}"

}

},

"name": "Create Xero Invoice",

"type": "n8n-nodes-base.xero",

"typeVersion": 1,

"position": [850, 300],

"credentials": {

"xeroOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Xero Account"

}

}

}

],

"connections": {

"Stripe Trigger": {

"main": [[{"node": "Get Stripe Customer", "type": "main", "index": 0}]]

},

"Get Stripe Customer": {

"main": [[{"node": "Upsert Xero Contact", "type": "main", "index": 0}]]

},

"Upsert Xero Contact": {

"main": [[{"node": "Create Xero Invoice", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Connect your Stripe account with webhook permissions

2. Connect your Xero account via OAuth2

3. Update the account code to match your Xero chart of accounts

4. Test with a small Stripe payment

5. Enable retry on fail for the Xero nodes

5. Expense Receipt OCR

Use case: Extract expense data from receipt images automatically, eliminating manual data entry for expense reports. How it works: Receives receipt images via email or upload, uses AI vision to extract vendor, amount, date, and category, then logs to a spreadsheet.

```json

{

"nodes": [

{

"parameters": {

"pollTimes": {"item": [{"mode": "everyMinute", "minute": 5}]},

"filters": {

"subject": "Expense:",

"readStatus": "unread"

}

},

"name": "Gmail Trigger",

"type": "n8n-nodes-base.gmailTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"gmailOAuth2": {

"id": "YOURCREDENTIALID",

"name": "Gmail Account"

}

}

},

{

"parameters": {

"resource": "message",

"operation": "get",

"messageId": "={{ $json.id }}",

"options": {"attachments": true}

},

"name": "Get Attachments",

"type": "n8n-nodes-base.gmail",

"typeVersion": 2,

"position": [450, 300],

"credentials": {

"gmailOAuth2": {

"id": "YOURCREDENTIALID",

"name": "Gmail Account"

}

}

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o",

"messages": {

"values": [

{

"content": "=Analyse this receipt image and extract the following in JSON format: {\"vendor\": \"\", \"amount\": 0.00, \"currency\": \"\", \"date\": \"YYYY-MM-DD\", \"category\": \"\"}. Categories should be one of: Travel, Meals, Office Supplies, Software, Other."

}

]

},

"options": {

"responseFormat": "json_object"

}

},

"name": "OpenAI Vision",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [650, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Expenses"},

"columns": {

"mappingMode": "defineBelow",

"value": {

"Date Submitted": "={{ $now.format('YYYY-MM-DD') }}",

"Vendor": "={{ JSON.parse($json.message.content).vendor }}",

"Amount": "={{ JSON.parse($json.message.content).amount }}",

"Currency": "={{ JSON.parse($json.message.content).currency }}",

"Category": "={{ JSON.parse($json.message.content).category }}",

"Receipt Date": "={{ JSON.parse($json.message.content).date }}"

}

}

},

"name": "Log to Sheets",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [850, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Gmail Trigger": {

"main": [[{"node": "Get Attachments", "type": "main", "index": 0}]]

},

"Get Attachments": {

"main": [[{"node": "OpenAI Vision", "type": "main", "index": 0}]]

},

"OpenAI Vision": {

"main": [[{"node": "Log to Sheets", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Connect Gmail with access to read emails

2. Connect OpenAI with GPT-4o access (required for vision)

3. Create a Google Sheet with columns: Date Submitted, Vendor, Amount, Currency, Category, Receipt Date

4. Update the sheet ID

5. Test by emailing a receipt image with "Expense:" in the subject

6. Invoice Data Extraction

Use case: Extract structured data from PDF invoices and populate your accounting system or spreadsheet automatically. How it works: Monitors a folder for new invoices, extracts text using AI, parses key fields, and logs to your system of choice.

```json

{

"nodes": [

{

"parameters": {

"pollTimes": {"item": [{"mode": "everyMinute", "minute": 10}]},

"folderId": "YOURFOLDERID"

},

"name": "Google Drive Trigger",

"type": "n8n-nodes-base.googleDriveTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"googleDriveOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Drive Account"

}

}

},

{

"parameters": {

"fileId": {"__rl": true, "mode": "id", "value": "={{ $json.id }}"},

"options": {"binaryPropertyName": "data"}

},

"name": "Download File",

"type": "n8n-nodes-base.googleDrive",

"typeVersion": 3,

"position": [450, 300],

"credentials": {

"googleDriveOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Drive Account"

}

}

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o",

"messages": {

"values": [

{

"content": "=Extract the following fields from this invoice in JSON format: {\"invoicenumber\": \"\", \"vendorname\": \"\", \"vendoraddress\": \"\", \"invoicedate\": \"YYYY-MM-DD\", \"duedate\": \"YYYY-MM-DD\", \"subtotal\": 0.00, \"tax\": 0.00, \"total\": 0.00, \"currency\": \"\", \"lineitems\": [{\"description\": \"\", \"quantity\": 0, \"unit_price\": 0.00, \"amount\": 0.00}]}"

}

]

},

"options": {"responseFormat": "json_object"}

},

"name": "Extract with GPT",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [650, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Invoices"},

"columns": {

"mappingMode": "defineBelow",

"value": {

"Invoice Number": "={{ JSON.parse($json.message.content).invoice_number }}",

"Vendor": "={{ JSON.parse($json.message.content).vendor_name }}",

"Invoice Date": "={{ JSON.parse($json.message.content).invoice_date }}",

"Due Date": "={{ JSON.parse($json.message.content).due_date }}",

"Total": "={{ JSON.parse($json.message.content).total }}",

"Currency": "={{ JSON.parse($json.message.content).currency }}",

"Processed": "={{ $now.format('YYYY-MM-DD HH:mm') }}"

}

}

},

"name": "Log to Sheets",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [850, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Google Drive Trigger": {

"main": [[{"node": "Download File", "type": "main", "index": 0}]]

},

"Download File": {

"main": [[{"node": "Extract with GPT", "type": "main", "index": 0}]]

},

"Extract with GPT": {

"main": [[{"node": "Log to Sheets", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Create a Google Drive folder for incoming invoices

2. Connect Google Drive and Sheets

3. Connect OpenAI with GPT-4o access

4. Create a sheet with the required columns

5. Test with a sample PDF invoice

This workflow pairs well with flowmondo's invoice data extraction automation solutions.

7. QuickBooks Invoice from Sheets

Use case: Generate QuickBooks invoices from a Google Sheet, useful for batch invoicing or integrating with systems that export to spreadsheets. How it works: Reads new rows from a spreadsheet, validates data, creates customers if needed, and generates invoices in QuickBooks.

```json

{

"nodes": [

{

"parameters": {

"pollTimes": {"item": [{"mode": "everyMinute", "minute": 15}]},

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Invoices to Create"},

"options": {}

},

"name": "Google Sheets Trigger",

"type": "n8n-nodes-base.googleSheetsTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

},

{

"parameters": {

"conditions": {

"string": [

{"value1": "={{ $json['Customer Email'] }}", "operation": "isNotEmpty"},

{"value1": "={{ $json['Amount'] }}", "operation": "isNotEmpty"}

]

}

},

"name": "Validate Data",

"type": "n8n-nodes-base.if",

"typeVersion": 1,

"position": [450, 300]

},

{

"parameters": {

"resource": "customer",

"operation": "upsert",

"displayName": "={{ $json['Customer Name'] }}",

"additionalFields": {

"primaryEmailAddress": "={{ $json['Customer Email'] }}"

}

},

"name": "Upsert Customer",

"type": "n8n-nodes-base.quickbooks",

"typeVersion": 1,

"position": [650, 300],

"credentials": {

"quickbooksOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "QuickBooks Account"

}

}

},

{

"parameters": {

"resource": "invoice",

"operation": "create",

"customerRef": "={{ $json.Id }}",

"line": {

"lineValues": [

{

"amount": "={{ $('Google Sheets Trigger').item.json['Amount'] }}",

"description": "={{ $('Google Sheets Trigger').item.json['Description'] }}",

"detailType": "SalesItemLineDetail"

}

]

},

"additionalFields": {

"customerMemo": "={{ $('Google Sheets Trigger').item.json['Notes'] }}"

}

},

"name": "Create Invoice",

"type": "n8n-nodes-base.quickbooks",

"typeVersion": 1,

"position": [850, 300],

"credentials": {

"quickbooksOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "QuickBooks Account"

}

}

}

],

"connections": {

"Google Sheets Trigger": {

"main": [[{"node": "Validate Data", "type": "main", "index": 0}]]

},

"Validate Data": {

"main": [

[{"node": "Upsert Customer", "type": "main", "index": 0}],

[]

]

},

"Upsert Customer": {

"main": [[{"node": "Create Invoice", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Create a sheet with columns: Customer Name, Customer Email, Description, Amount, Notes

2. Connect QuickBooks via OAuth2

3. Update the spreadsheet ID

4. Add rows to test

5. Enable the workflow

Marketing and Sales Templates

Automate lead management, CRM updates, and content distribution.

8. Lead Capture to HubSpot

Use case: Automatically create or update HubSpot contacts when leads submit forms on your website. How it works: Receives form data via webhook, enriches with available data, checks for existing contact, and creates or updates accordingly.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "lead-capture",

"responseMode": "onReceived",

"responseData": "allEntries"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"values": {

"string": [

{"name": "email", "value": "={{ $json.email.toLowerCase().trim() }}"},

{"name": "firstName", "value": "={{ $json.first_name }}"},

{"name": "lastName", "value": "={{ $json.last_name }}"},

{"name": "company", "value": "={{ $json.company }}"},

{"name": "source", "value": "={{ $json.form_name || 'Website Form' }}"},

{"name": "submittedAt", "value": "={{ $now.toISO() }}"}

]

}

},

"name": "Normalise Data",

"type": "n8n-nodes-base.set",

"typeVersion": 2,

"position": [450, 300]

},

{

"parameters": {

"resource": "contact",

"operation": "search",

"filterGroups": {

"filterGroupsValues": [

{

"filtersValues": [

{"propertyName": "email", "operator": "EQ", "value": "={{ $json.email }}"}

]

}

]

}

},

"name": "Search Contact",

"type": "n8n-nodes-base.hubspot",

"typeVersion": 2,

"position": [650, 300],

"credentials": {

"hubspotOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "HubSpot Account"

}

}

},

{

"parameters": {

"conditions": {

"number": [

{"value1": "={{ $json.total }}", "operation": "larger", "value2": 0}

]

}

},

"name": "Contact Exists?",

"type": "n8n-nodes-base.if",

"typeVersion": 1,

"position": [850, 300]

},

{

"parameters": {

"resource": "contact",

"operation": "update",

"contactId": "={{ $('Search Contact').item.json.results[0].id }}",

"additionalFields": {

"company": "={{ $('Normalise Data').item.json.company }}",

"lifecycleStage": "lead"

}

},

"name": "Update Contact",

"type": "n8n-nodes-base.hubspot",

"typeVersion": 2,

"position": [1050, 200],

"credentials": {

"hubspotOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "HubSpot Account"

}

}

},

{

"parameters": {

"resource": "contact",

"operation": "create",

"email": "={{ $('Normalise Data').item.json.email }}",

"additionalFields": {

"firstName": "={{ $('Normalise Data').item.json.firstName }}",

"lastName": "={{ $('Normalise Data').item.json.lastName }}",

"company": "={{ $('Normalise Data').item.json.company }}",

"lifecycleStage": "lead",

"leadSource": "={{ $('Normalise Data').item.json.source }}"

}

},

"name": "Create Contact",

"type": "n8n-nodes-base.hubspot",

"typeVersion": 2,

"position": [1050, 400],

"credentials": {

"hubspotOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "HubSpot Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "Normalise Data", "type": "main", "index": 0}]]

},

"Normalise Data": {

"main": [[{"node": "Search Contact", "type": "main", "index": 0}]]

},

"Search Contact": {

"main": [[{"node": "Contact Exists?", "type": "main", "index": 0}]]

},

"Contact Exists?": {

"main": [

[{"node": "Update Contact", "type": "main", "index": 0}],

[{"node": "Create Contact", "type": "main", "index": 0}]

]

}

}

}

```

Setup steps:

1. Connect HubSpot via OAuth2

2. Configure your form to POST to the webhook URL

3. Map additional form fields as needed

4. Test with a sample submission

5. Add Slack notification node for real-time alerts (optional)

9. Lead Scoring Workflow

Use case: Automatically score leads based on criteria like company size, role, and engagement level to prioritise sales follow-up. How it works: Receives lead data, applies scoring rules, categorises as hot/warm/cold, and routes to appropriate handling.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "score-lead",

"responseMode": "onReceived"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"jsCode": "// Lead scoring logic\nlet score = 0;\nconst lead = $input.first().json;\n\n// Company size scoring\nconst employees = parseInt(lead.companysize) || 0;\nif (employees >= 500) score += 30;\nelse if (employees >= 100) score += 20;\nelse if (employees >= 20) score += 10;\n\n// Role scoring\nconst role = (lead.jobtitle || '').toLowerCase();\nif (role.includes('ceo') || role.includes('founder') || role.includes('owner')) score += 25;\nelse if (role.includes('director') || role.includes('vp') || role.includes('head')) score += 20;\nelse if (role.includes('manager')) score += 15;\n\n// Industry fit scoring\nconst targetIndustries = ['technology', 'finance', 'healthcare', 'saas'];\nconst industry = (lead.industry || '').toLowerCase();\nif (targetIndustries.some(i => industry.includes(i))) score += 20;\n\n// Engagement scoring\nif (lead.downloadedresource) score += 10;\nif (lead.attendedwebinar) score += 15;\nif (lead.requesteddemo) score += 25;\n\n// Determine category\nlet category = 'cold';\nif (score >= 60) category = 'hot';\nelse if (score >= 35) category = 'warm';\n\nreturn {\n ...lead,\n leadscore: score,\n leadcategory: category,\n scoredat: new Date().toISOString()\n};"

},

"name": "Calculate Score",

"type": "n8n-nodes-base.code",

"typeVersion": 2,

"position": [450, 300]

},

{

"parameters": {

"rules": {

"rules": [

{"outputKey": "hot", "conditions": {"conditions": [{"leftValue": "={{ $json.lead_category }}", "rightValue": "hot", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "warm", "conditions": {"conditions": [{"leftValue": "={{ $json.lead_category }}", "rightValue": "warm", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "cold", "conditions": {"conditions": [{"leftValue": "={{ $json.lead_category }}", "rightValue": "cold", "operator": {"type": "string", "operation": "equals"}}]}}

]

}

},

"name": "Route by Category",

"type": "n8n-nodes-base.switch",

"typeVersion": 3,

"position": [650, 300]

},

{

"parameters": {

"channel": "#sales-hot-leads",

"text": "=:fire: Hot Lead Alert!\n\nName: {{ $json.firstname }} {{ $json.lastname }}\nCompany: {{ $json.company }}\nRole: {{ $json.jobtitle }}\nScore: {{ $json.leadscore }}/100\n\nFollow up immediately!"

},

"name": "Alert Hot Lead",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [850, 200],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Scored Leads"},

"columns": {

"mappingMode": "autoMapInputData"

}

},

"name": "Log All Leads",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [850, 400],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "Calculate Score", "type": "main", "index": 0}]]

},

"Calculate Score": {

"main": [[{"node": "Route by Category", "type": "main", "index": 0}]]

},

"Route by Category": {

"main": [

[{"node": "Alert Hot Lead", "type": "main", "index": 0}, {"node": "Log All Leads", "type": "main", "index": 0}],

[{"node": "Log All Leads", "type": "main", "index": 0}],

[{"node": "Log All Leads", "type": "main", "index": 0}]

]

}

}

}

```

Setup steps:

1. Adjust scoring weights in the Code node to match your ICP

2. Connect Slack for hot lead alerts

3. Create a Google Sheet for lead tracking

4. Test with sample lead data

5. Connect to your form or CRM as the trigger

For advanced lead scoring implementations, consider working with automation specialists.

10. CRM Data Enrichment

Use case: Automatically enrich CRM contacts with company data, social profiles, and other intelligence. How it works: Triggered when new contacts are created, looks up additional data from enrichment APIs, and updates the CRM record.

```json

{

"nodes": [

{

"parameters": {

"events": ["contact.creation"],

"additionalFields": {}

},

"name": "HubSpot Trigger",

"type": "n8n-nodes-base.hubspotTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"hubspotDeveloperApi": {

"id": "YOURCREDENTIALID",

"name": "HubSpot Developer"

}

}

},

{

"parameters": {

"method": "GET",

"url": "=https://api.clearbit.com/v2/people/find?email={{ $json.properties.email }}",

"authentication": "predefinedCredentialType",

"nodeCredentialType": "httpHeaderAuth",

"options": {}

},

"name": "Clearbit Lookup",

"type": "n8n-nodes-base.httpRequest",

"typeVersion": 4,

"position": [450, 300],

"credentials": {

"httpHeaderAuth": {

"id": "YOURCREDENTIALID",

"name": "Clearbit API"

}

},

"continueOnFail": true

},

{

"parameters": {

"conditions": {

"string": [

{"value1": "={{ $json.person }}", "operation": "isNotEmpty"}

]

}

},

"name": "Data Found?",

"type": "n8n-nodes-base.if",

"typeVersion": 1,

"position": [650, 300]

},

{

"parameters": {

"resource": "contact",

"operation": "update",

"contactId": "={{ $('HubSpot Trigger').item.json.objectId }}",

"additionalFields": {

"jobtitle": "={{ $json.person.employment.title }}",

"company": "={{ $json.company.name }}",

"linkedinBio": "={{ $json.person.linkedin.handle }}",

"twitterUsername": "={{ $json.person.twitter.handle }}",

"website": "={{ $json.company.domain }}",

"numEmployees": "={{ $json.company.metrics.employees }}"

}

},

"name": "Update Contact",

"type": "n8n-nodes-base.hubspot",

"typeVersion": 2,

"position": [850, 300],

"credentials": {

"hubspotOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "HubSpot Account"

}

}

}

],

"connections": {

"HubSpot Trigger": {

"main": [[{"node": "Clearbit Lookup", "type": "main", "index": 0}]]

},

"Clearbit Lookup": {

"main": [[{"node": "Data Found?", "type": "main", "index": 0}]]

},

"Data Found?": {

"main": [

[{"node": "Update Contact", "type": "main", "index": 0}],

[]

]

}

}

}

```

Setup steps:

1. Connect HubSpot with developer API access

2. Get a Clearbit API key (or substitute with another enrichment provider)

3. Map enriched fields to your HubSpot properties

4. Enable "Continue on Fail" for the lookup node to handle missing data gracefully

5. Test with a new contact creation

11. Social Media Content Scheduler

Use case: Schedule and post content across multiple social platforms from a single content calendar. How it works: Reads approved content from a spreadsheet, posts to configured platforms at scheduled times, and logs results.

```json

{

"nodes": [

{

"parameters": {

"rule": {

"interval": [{"field": "hours", "hoursInterval": 1}]

}

},

"name": "Schedule Trigger",

"type": "n8n-nodes-base.scheduleTrigger",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"operation": "read",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Content Calendar"},

"filters": {

"filters": [

{"column": "Status", "operator": "equals", "value": "Scheduled"},

{"column": "Scheduled Time", "operator": "lessThanOrEqual", "value": "={{ $now.toISO() }}"}

]

}

},

"name": "Get Scheduled Posts",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [450, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

},

{

"parameters": {

"batchSize": 1

},

"name": "Loop Posts",

"type": "n8n-nodes-base.splitInBatches",

"typeVersion": 3,

"position": [650, 300]

},

{

"parameters": {

"rules": {

"rules": [

{"outputKey": "linkedin", "conditions": {"conditions": [{"leftValue": "={{ $json.Platform }}", "rightValue": "LinkedIn", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "twitter", "conditions": {"conditions": [{"leftValue": "={{ $json.Platform }}", "rightValue": "Twitter", "operator": {"type": "string", "operation": "equals"}}]}}

]

}

},

"name": "Route by Platform",

"type": "n8n-nodes-base.switch",

"typeVersion": 3,

"position": [850, 300]

},

{

"parameters": {

"resource": "post",

"operation": "create",

"text": "={{ $json.Content }}",

"additionalFields": {}

},

"name": "Post to LinkedIn",

"type": "n8n-nodes-base.linkedIn",

"typeVersion": 1,

"position": [1050, 200],

"credentials": {

"linkedInOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "LinkedIn Account"

}

}

},

{

"parameters": {

"text": "={{ $json.Content }}",

"additionalFields": {}

},

"name": "Post to Twitter",

"type": "n8n-nodes-base.twitter",

"typeVersion": 2,

"position": [1050, 400],

"credentials": {

"twitterOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Twitter Account"

}

}

},

{

"parameters": {

"operation": "update",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Content Calendar"},

"columns": {

"mappingMode": "defineBelow",

"value": {

"Status": "Posted",

"Posted At": "={{ $now.format('YYYY-MM-DD HH:mm') }}"

}

},

"options": {"rowIndex": "={{ $('Loop Posts').item.json.row_number }}"}

},

"name": "Update Status",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [1250, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Schedule Trigger": {

"main": [[{"node": "Get Scheduled Posts", "type": "main", "index": 0}]]

},

"Get Scheduled Posts": {

"main": [[{"node": "Loop Posts", "type": "main", "index": 0}]]

},

"Loop Posts": {

"main": [[{"node": "Route by Platform", "type": "main", "index": 0}]]

},

"Route by Platform": {

"main": [

[{"node": "Post to LinkedIn", "type": "main", "index": 0}],

[{"node": "Post to Twitter", "type": "main", "index": 0}]

]

},

"Post to LinkedIn": {

"main": [[{"node": "Update Status", "type": "main", "index": 0}]]

},

"Post to Twitter": {

"main": [[{"node": "Update Status", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Create a content calendar sheet with columns: Content, Platform, Scheduled Time, Status, Posted At

2. Connect LinkedIn and Twitter accounts

3. Update the spreadsheet ID

4. Add your scheduled content with Status = "Scheduled"

5. Activate the workflow

AI-Powered Templates

These templates leverage AI to handle tasks that previously required human judgement.

12. Email Classification with GPT

Use case: Automatically categorise incoming emails and route them to appropriate handlers, draft responses for common queries. How it works: Monitors inbox, uses GPT to classify email intent, routes to the right team or queue, and optionally drafts responses.

```json

{

"nodes": [

{

"parameters": {

"pollTimes": {"item": [{"mode": "everyMinute", "minute": 2}]},

"filters": {"readStatus": "unread"}

},

"name": "Gmail Trigger",

"type": "n8n-nodes-base.gmailTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"gmailOAuth2": {

"id": "YOURCREDENTIALID",

"name": "Gmail Account"

}

}

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o-mini",

"messages": {

"values": [

{

"content": "=Classify this email and respond in JSON format:\n\nFrom: {{ $json.from }}\nSubject: {{ $json.subject }}\nBody: {{ $json.text.substring(0, 2000) }}\n\nClassify into exactly one category: support, sales, billing, partnership, spam, other\n\nAlso determine:\n- urgency: high, medium, low\n- sentiment: positive, neutral, negative\n- requiresresponse: true/false\n\nRespond only with JSON: {\"category\": \"\", \"urgency\": \"\", \"sentiment\": \"\", \"requiresresponse\": boolean, \"summary\": \"one sentence summary\"}"

}

]

},

"options": {"responseFormat": "json_object"}

},

"name": "Classify Email",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [450, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"jsCode": "const classification = JSON.parse($input.first().json.message.content);\nconst email = $('Gmail Trigger').first().json;\n\nreturn {\n ...email,\n ...classification,\n classified_at: new Date().toISOString()\n};"

},

"name": "Merge Data",

"type": "n8n-nodes-base.code",

"typeVersion": 2,

"position": [650, 300]

},

{

"parameters": {

"rules": {

"rules": [

{"outputKey": "support", "conditions": {"conditions": [{"leftValue": "={{ $json.category }}", "rightValue": "support", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "sales", "conditions": {"conditions": [{"leftValue": "={{ $json.category }}", "rightValue": "sales", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "billing", "conditions": {"conditions": [{"leftValue": "={{ $json.category }}", "rightValue": "billing", "operator": {"type": "string", "operation": "equals"}}]}},

{"outputKey": "other", "conditions": {"conditions": [{"leftValue": "={{ $json.category }}", "rightValue": "other", "operator": {"type": "string", "operation": "equals"}}]}}

]

}

},

"name": "Route by Category",

"type": "n8n-nodes-base.switch",

"typeVersion": 3,

"position": [850, 300]

},

{

"parameters": {

"channel": "#support-inbox",

"text": "=:email: New Support Email\n\nFrom: {{ $json.from }}\nSubject: {{ $json.subject }}\nUrgency: {{ $json.urgency }}\nSentiment: {{ $json.sentiment }}\n\nSummary: {{ $json.summary }}"

},

"name": "Alert Support",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [1050, 150],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

},

{

"parameters": {

"channel": "#sales-inbox",

"text": "=:moneybag: New Sales Inquiry\n\nFrom: {{ $json.from }}\nSubject: {{ $json.subject }}\nUrgency: {{ $json.urgency }}\n\nSummary: {{ $json.summary }}"

},

"name": "Alert Sales",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [1050, 300],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Email Log"},

"columns": {"mappingMode": "autoMapInputData"}

},

"name": "Log Email",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [1050, 500],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

}

],

"connections": {

"Gmail Trigger": {

"main": [[{"node": "Classify Email", "type": "main", "index": 0}]]

},

"Classify Email": {

"main": [[{"node": "Merge Data", "type": "main", "index": 0}]]

},

"Merge Data": {

"main": [[{"node": "Route by Category", "type": "main", "index": 0}]]

},

"Route by Category": {

"main": [

[{"node": "Alert Support", "type": "main", "index": 0}, {"node": "Log Email", "type": "main", "index": 0}],

[{"node": "Alert Sales", "type": "main", "index": 0}, {"node": "Log Email", "type": "main", "index": 0}],

[{"node": "Log Email", "type": "main", "index": 0}],

[{"node": "Log Email", "type": "main", "index": 0}]

]

}

}

}

```

Setup steps:

1. Connect Gmail and OpenAI

2. Create Slack channels for each category

3. Set up a logging spreadsheet

4. Adjust categories in the classification prompt

5. Test with various email types

13. Document Summary Generator

Use case: Automatically summarise long documents, reports, or PDFs and distribute summaries to stakeholders. How it works: Receives documents via email or upload, extracts text, generates executive summary with AI, and distributes via email or Slack.

```json

{

"nodes": [

{

"parameters": {

"pollTimes": {"item": [{"mode": "everyMinute", "minute": 10}]},

"filters": {

"subject": "Summarise:",

"readStatus": "unread"

}

},

"name": "Gmail Trigger",

"type": "n8n-nodes-base.gmailTrigger",

"typeVersion": 1,

"position": [250, 300],

"credentials": {

"gmailOAuth2": {

"id": "YOURCREDENTIALID",

"name": "Gmail Account"

}

}

},

{

"parameters": {

"resource": "message",

"operation": "get",

"messageId": "={{ $json.id }}",

"options": {"attachments": true}

},

"name": "Get Attachments",

"type": "n8n-nodes-base.gmail",

"typeVersion": 2,

"position": [450, 300],

"credentials": {

"gmailOAuth2": {

"id": "YOURCREDENTIALID",

"name": "Gmail Account"

}

}

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o",

"messages": {

"values": [

{

"content": "=Analyse this document and provide:\n\n1. Executive Summary (2-3 paragraphs)\n2. Key Points (5-7 bullet points)\n3. Action Items (if any)\n4. Questions/Concerns (potential issues or ambiguities)\n\nDocument:\n{{ $json.text || $json.content }}"

}

]

},

"options": {}

},

"name": "Generate Summary",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [650, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"fromEmail": "summaries@yourcompany.com",

"toEmail": "={{ $('Gmail Trigger').item.json.from }}",

"subject": "=Summary: {{ $('Gmail Trigger').item.json.subject.replace('Summarise:', '').trim() }}",

"emailType": "html",

"html": "=

Document Summary

\n\n{{ $json.message.content.replace(/\\n/g, '
').replace(/\\\\(.+?)\\\\/g, '$1').replace(/^- /gm, '• ') }}\n\n
\n

Generated automatically by flowmondo document processing

",

"options": {}

},

"name": "Send Summary",

"type": "n8n-nodes-base.emailSend",

"typeVersion": 2,

"position": [850, 300],

"credentials": {

"smtp": {

"id": "YOURCREDENTIALID",

"name": "SMTP Account"

}

}

}

],

"connections": {

"Gmail Trigger": {

"main": [[{"node": "Get Attachments", "type": "main", "index": 0}]]

},

"Get Attachments": {

"main": [[{"node": "Generate Summary", "type": "main", "index": 0}]]

},

"Generate Summary": {

"main": [[{"node": "Send Summary", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Connect Gmail and OpenAI

2. Configure SMTP for sending summaries

3. Test by emailing a document with "Summarise:" in the subject

4. Adjust the summary prompt for your needs

This template demonstrates capabilities similar to flowmondo's document data extraction services.

14. AI Content Generator

Use case: Generate blog post drafts, social media content, or marketing copy from briefs or outlines. How it works: Receives a content brief via form or spreadsheet, uses AI to generate a first draft, and delivers for human review.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "generate-content",

"responseMode": "onReceived"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o",

"messages": {

"values": [

{

"content": "=You are a professional content writer. Generate a {{ $json.contenttype }} based on this brief:\n\nTopic: {{ $json.topic }}\nTarget Audience: {{ $json.audience }}\nTone: {{ $json.tone || 'professional and helpful' }}\nKey Points to Cover: {{ $json.keypoints }}\nTarget Word Count: {{ $json.word_count || 800 }}\nKeywords to Include: {{ $json.keywords }}\n\nProvide the complete content with proper headings and formatting. Use UK English spelling."

}

]

},

"options": {}

},

"name": "Generate Content",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [450, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"values": {

"string": [

{"name": "content", "value": "={{ $json.message.content }}"},

{"name": "topic", "value": "={{ $('Webhook').item.json.topic }}"},

{"name": "contenttype", "value": "={{ $('Webhook').item.json.contenttype }}"},

{"name": "generated_at", "value": "={{ $now.toISO() }}"},

{"name": "word_count", "value": "={{ $json.message.content.split(' ').length }}"}

]

}

},

"name": "Format Output",

"type": "n8n-nodes-base.set",

"typeVersion": 2,

"position": [650, 300]

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Generated Content"},

"columns": {"mappingMode": "autoMapInputData"}

},

"name": "Save to Sheets",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [850, 300],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

},

{

"parameters": {

"channel": "#content-drafts",

"text": "=:pencil: New Content Draft Ready\n\nType: {{ $json.contenttype }}\nTopic: {{ $json.topic }}\nWord Count: {{ $json.wordcount }}\n\nReady for review in the Content Drafts sheet."

},

"name": "Notify Team",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [1050, 300],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "Generate Content", "type": "main", "index": 0}]]

},

"Generate Content": {

"main": [[{"node": "Format Output", "type": "main", "index": 0}]]

},

"Format Output": {

"main": [[{"node": "Save to Sheets", "type": "main", "index": 0}]]

},

"Save to Sheets": {

"main": [[{"node": "Notify Team", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Connect OpenAI (GPT-4 recommended for quality)

2. Create a Google Sheet for storing drafts

3. Connect Slack for notifications

4. Test by POSTing a content brief to the webhook

5. Build a simple form to submit briefs

15. Customer Support Triage

Use case: Automatically categorise support tickets, assess urgency, suggest responses, and route to appropriate agents. How it works: Receives support requests, analyses with AI, categorises and prioritises, suggests responses, and routes to the right queue.

```json

{

"nodes": [

{

"parameters": {

"httpMethod": "POST",

"path": "support-triage",

"responseMode": "onReceived"

},

"name": "Webhook",

"type": "n8n-nodes-base.webhook",

"typeVersion": 1,

"position": [250, 300]

},

{

"parameters": {

"resource": "chat",

"operation": "message",

"modelId": "gpt-4o-mini",

"messages": {

"values": [

{

"content": "=Analyse this customer support request and respond in JSON format:\n\nCustomer: {{ $json.customername }} ({{ $json.customeremail }})\nSubject: {{ $json.subject }}\nMessage: {{ $json.message }}\nAccount Type: {{ $json.accounttype || 'unknown' }}\n\nProvide:\n1. category: billing, technical, account, featurerequest, complaint, general\n2. urgency: critical (system down), high (blocking issue), medium (needs attention), low (general query)\n3. sentiment: positive, neutral, frustrated, angry\n4. suggestedresponse: A helpful draft response (2-3 sentences)\n5. escalationneeded: true/false\n6. estimatedresolutiontime: quick (under 1 hour), standard (1-4 hours), extended (requires investigation)\n7. relatedtopics: array of relevant help article topics\n\nJSON only: {\"category\": \"\", \"urgency\": \"\", \"sentiment\": \"\", \"suggestedresponse\": \"\", \"escalationneeded\": boolean, \"estimatedresolutiontime\": \"\", \"relatedtopics\": []}"

}

]

},

"options": {"responseFormat": "json_object"}

},

"name": "AI Triage",

"type": "n8n-nodes-base.openAi",

"typeVersion": 1,

"position": [450, 300],

"credentials": {

"openAiApi": {

"id": "YOURCREDENTIALID",

"name": "OpenAI Account"

}

}

},

{

"parameters": {

"jsCode": "const triage = JSON.parse($input.first().json.message.content);\nconst ticket = $('Webhook').first().json;\n\nreturn {\n ticketid: `TKT-${Date.now()}`,\n ...ticket,\n ...triage,\n triagedat: new Date().toISOString()\n};"

},

"name": "Build Ticket",

"type": "n8n-nodes-base.code",

"typeVersion": 2,

"position": [650, 300]

},

{

"parameters": {

"conditions": {

"boolean": [

{"value1": "={{ $json.escalation_needed }}", "value2": true}

]

}

},

"name": "Needs Escalation?",

"type": "n8n-nodes-base.if",

"typeVersion": 1,

"position": [850, 300]

},

{

"parameters": {

"channel": "#support-escalations",

"text": "=:rotatinglight: Escalation Required\n\nTicket: {{ $json.ticketid }}\nCustomer: {{ $json.customer_name }}\nCategory: {{ $json.category }}\nUrgency: {{ $json.urgency }}\nSentiment: {{ $json.sentiment }}\n\nIssue:\n{{ $json.message.substring(0, 500) }}...\n\nAI Assessment: This ticket requires immediate attention."

},

"name": "Alert Escalation",

"type": "n8n-nodes-base.slack",

"typeVersion": 2,

"position": [1050, 200],

"credentials": {

"slackApi": {

"id": "YOURCREDENTIALID",

"name": "Slack Account"

}

}

},

{

"parameters": {

"operation": "append",

"documentId": {"_rl": true, "mode": "id", "value": "YOURSPREADSHEET_ID"},

"sheetName": {"__rl": true, "mode": "list", "value": "Support Tickets"},

"columns": {"mappingMode": "autoMapInputData"}

},

"name": "Log Ticket",

"type": "n8n-nodes-base.googleSheets",

"typeVersion": 4,

"position": [1050, 400],

"credentials": {

"googleSheetsOAuth2Api": {

"id": "YOURCREDENTIALID",

"name": "Google Sheets Account"

}

}

},

{

"parameters": {

"fromEmail": "support@yourcompany.com",

"toEmail": "={{ $json.customer_email }}",

"subject": "=Re: {{ $json.subject }} [{{ $json.ticket_id }}]",

"emailType": "text",

"text": "=Hi {{ $json.customername }},\n\nThank you for contacting us. We've received your request and assigned ticket number {{ $json.ticketid }}.\n\n{{ $json.suggested_response }}\n\nWe'll be in touch shortly.\n\nBest regards,\nSupport Team",

"options": {}

},

"name": "Auto-Acknowledge",

"type": "n8n-nodes-base.emailSend",

"typeVersion": 2,

"position": [1250, 400],

"credentials": {

"smtp": {

"id": "YOURCREDENTIALID",

"name": "SMTP Account"

}

}

}

],

"connections": {

"Webhook": {

"main": [[{"node": "AI Triage", "type": "main", "index": 0}]]

},

"AI Triage": {

"main": [[{"node": "Build Ticket", "type": "main", "index": 0}]]

},

"Build Ticket": {

"main": [[{"node": "Needs Escalation?", "type": "main", "index": 0}]]

},

"Needs Escalation?": {

"main": [

[{"node": "Alert Escalation", "type": "main", "index": 0}, {"node": "Log Ticket", "type": "main", "index": 0}],

[{"node": "Log Ticket", "type": "main", "index": 0}]

]

},

"Log Ticket": {

"main": [[{"node": "Auto-Acknowledge", "type": "main", "index": 0}]]

}

}

}

```

Setup steps:

1. Connect OpenAI for AI triage

2. Create a support tickets spreadsheet

3. Configure Slack for escalation alerts

4. Set up SMTP for auto-acknowledgement emails

5. Connect your support form or helpdesk to the webhook

How to Import and Customise Templates

Getting these templates into your n8n instance takes just a few steps.

Importing JSON

1. Open n8n and click "Add workflow"

2. Click the three dots in the upper right corner

3. Select "Import from File" or copy-paste the JSON

4. The workflow appears with all nodes connected

Connecting Credentials

Templates include credential references but not actual authentication data. For each node requiring authentication:

1. Click the node

2. In the credentials dropdown, select "Create new"

3. Follow the authentication flow (usually OAuth2 or API key)

4. Test the connection

Customising for Your Use Case

Most customisation involves:

Changing field mappings: Update the Set node values to match your data structure. Adjusting triggers: Replace webhook triggers with app-specific triggers (HubSpot, Stripe, etc.) for automated activation. Modifying AI prompts: Edit the OpenAI node prompts to match your categories, tone, and output format. Adding error handling: Enable "Retry on Fail" for external API nodes and add error workflow references.

When to Get Help

These templates handle common scenarios, but your business likely has specific requirements that need customisation:

Complex integrations: When you need to connect systems with unusual APIs or legacy software. High-volume processing: Workflows processing thousands of items daily need optimisation for performance and cost. Compliance requirements: Healthcare, finance, and other regulated industries need workflows that meet specific security and audit standards. AI customisation: Training AI components on your specific terminology, products, or processes. Enterprise deployment: Multi-team rollouts with proper access controls, monitoring, and governance.

The flowmondo n8n experts team has delivered automation projects across industries. We can help you adapt these templates or build custom solutions for your specific needs.

For broader business process automation strategy, our consultants help identify high-impact automation opportunities across your organisation.

FAQ

How do I import an n8n workflow from JSON?

Click the three dots menu in the upper right of any workflow, then select "Import from File" to upload a JSON file or paste JSON directly. The workflow will appear with all nodes and connections intact. You will need to create and connect your own credentials for each service.

Why do imported workflows fail?

Around 40% of imports fail due to credential issues or version mismatches. The most common causes are missing credentials (the JSON includes references but not actual auth data), version differences (workflows from newer n8n versions may use features unavailable in older versions), and node name mismatches in connections. Always test imported workflows before activating them.

Can I edit the JSON directly?

Yes, but it is easier to import first and edit visually. If you edit JSON directly, ensure node names in the connections object exactly match those in the nodes array. Use a JSON validator before importing to catch syntax errors.

How much does it cost to run these workflows?

n8n charges per workflow execution, not per node or action. A 15-node workflow costs the same as a 2-node workflow to run. Self-hosted n8n is free with unlimited executions. Cloud plans start at $20/month for 2,500 executions. AI-powered workflows also incur OpenAI API costs (typically $0.01-0.10 per workflow run depending on model and prompt length).

Which workflows should I start with?

Begin with the Quick Start templates (1-3) to learn n8n fundamentals. Once comfortable, move to the category that matches your most pressing business need. Finance workflows typically show ROI fastest due to time savings on repetitive tasks.

How do I handle errors in production?

Enable "Retry on Fail" on all nodes calling external APIs (3-5 retries with 5-second delays). Create a dedicated error workflow using the Error Trigger node that sends Slack or email alerts when workflows fail. For critical workflows, use "Continue using error output" to handle failures gracefully rather than stopping entirely.

Can these templates work with tools other than those shown?

Yes. n8n nodes are interchangeable. Replace HubSpot with Pipedrive, Slack with Microsoft Teams, or Google Sheets with Airtable. The workflow logic remains the same; you just swap the nodes and update field mappings. The HTTP Request node can connect to any API not covered by native nodes.

Do I need coding skills to use these templates?

Basic templates work without code. The Code nodes in advanced templates use JavaScript for data transformation, but you can often achieve similar results with Set and IF nodes. Understanding JSON structure helps when debugging and customising. For complex modifications, basic JavaScript knowledge accelerates development significantly.

Start Automating Today

These 15 templates cover the most common automation scenarios businesses face. Import one, connect your credentials, and you will have a working automation in under an hour.

Start with something simple. The webhook-to-Slack notification takes five minutes to deploy and immediately demonstrates the power of automation. From there, tackle the workflows that save the most time in your specific role.

If you hit complexity beyond these templates or need enterprise-grade implementations, the flowmondo team is here to help. We build production-ready n8n solutions that scale with your business.

Work smarter with AI & automation that fits perfectly

Join 975+ businesses saving 20+ hours weekly with proven automation systems.