Skip to content

cgaritac/n8n_processes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

15 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

n8n Workflow Examples

A collection of n8n automation workflow examples ready to import and use. This repository serves as a reference library of practical workflows demonstrating different n8n capabilities and integrations.

πŸ“Œ This is an n8n project!
n8n is a powerful workflow automation tool that allows you to connect different services and automate tasks without writing code. This repository contains exportable workflows that you can import directly into your n8n instance.

n8n Examples Google Sheets PostgreSQL Discord OpenAI


πŸ“š Available Workflows

# Workflow File Description
1 Pokemon Scraper Pokemon Scraper.json Fetches PokΓ©mon data from PokΓ©API and stores it in Google Sheets
2 Forms - T-Shirt Forms - T-Shirt.json Manages t-shirt orders from Google Forms with inventory control (Google Sheets)
3 T-Shirts - PostgreSQL T-Shirts - PostgreSQL.json Manages t-shirt orders with PostgreSQL database for inventory
4 Time Off Time Off.json Employee vacation request system with HR approval via Discord (Form Trigger)
5 Time Off Webhook Time Off Webhook.json Employee vacation request system with HTTP Webhook API trigger
6 Scraping - Course Scraping - Course.json Web scraping with AI extraction for course data from websites
7 Google Maps - Scraping Google Maps - Scraping.json Business lead generation from Google Maps using Apify
8 Wikipedia - Agent Wikipedia - Agent.json + n8n - chatbot/ AI chatbot with Wikipedia search using LangChain agents
9 Personal Assistant n8n - agents and MCP/Personal Assistant.json AI Assistant for Email and Calendar using MCP tools
10 MCP Servers n8n - agents and MCP/ Model Context Protocol servers for Gmail and Calendar
11 Online Store Agent n8n agents with BE/Online store agent.json Customer service agent connected to local backend (mi-tienda)
12 RAG Standard System RAG standard system.json RAG system with in-memory vector store for document Q&A
13 RAG Standard System PostgreSQL RAG standard system PostgreSQL.json RAG system with PostgreSQL PGVector for scalable document Q&A
14 Voice Agent voice - agent/ Voice AI agent with ElevenLabs for customer service via phone
15 Telegram Bot n8n-telegram-bot/ AI-powered Telegram bot with text, image, and voice message support
16 WhatsApp Bot n8n-whatsapp-bot/ AI-powered WhatsApp bot with text, image, document, and voice message support

πŸš€ How to Import a Workflow

  1. Open n8n
  2. Go to Workflows β†’ Import from File
  3. Select the desired .json file
  4. Click on each node showing a credential error and configure them
  5. Save and activate the workflow

πŸ”΄ Pokemon Scraper

An n8n automation workflow that extracts PokΓ©mon data from the PokΓ©API and automatically stores it in Google Sheets, sending an email summary upon completion.

Pokemon

πŸ“‹ Description

This n8n workflow automates the following process:

  1. Read PokΓ©mon IDs from a Google Sheets document
  2. Filter only records that don't have complete information
  3. Query the PokΓ©API to fetch detailed data for each PokΓ©mon
  4. Extract relevant information: ID, name, type, and sprites (images)
  5. Update Google Sheets with the obtained data
  6. Send an email with a summary of processed PokΓ©mon

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Click  │───▢│ Google Sheet │───▢│   Filter   │───▢│  HTTP Requestβ”‚
β”‚ (Manual)β”‚    β”‚  (Read IDs)  β”‚    β”‚ (No data)  β”‚    β”‚  (PokΓ©API)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                            β”‚
                                                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Send Email  │◀───│    Group     │◀───│ Google Sheet │◀───│  Set Fields  β”‚
β”‚   (Gmail)   β”‚    β”‚ (Aggregate)  β”‚    β”‚   (Update)   β”‚    β”‚  (Extract)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Google Sheet Structure

Your spreadsheet must have the following columns:

Column Description
ID Numeric PokΓ©mon ID (1, 2, 3, etc.)
Name PokΓ©mon name (will be auto-filled)
Type Primary PokΓ©mon type (will be auto-filled)
Sprite Front Front image URL (will be auto-filled)
Sprite Back Back image URL (will be auto-filled)

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Google Sheet ID YOUR_GOOGLE_SHEET_ID Your Google Sheets document ID*
Google Sheets Credential ID YOUR_CREDENTIAL_ID Your Google Sheets OAuth2 credential ID
Google Sheets Email your-email@example.com Email associated with the credential
Gmail Credential ID YOUR_GMAIL_CREDENTIAL_ID Your Gmail OAuth2 credential ID
Gmail Email your-email@example.com Email associated with Gmail credential
Recipient Email your-email@example.com Email where you'll receive the summary
Webhook ID YOUR_WEBHOOK_ID Webhook ID (generated by n8n)
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

* The Google Sheet ID can be found in the document URL:
https://docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit

πŸ“¦ Data Extracted per PokΓ©mon

{
  "id": 25,
  "name": "pikachu",
  "type": "electric",
  "photos": {
    "front": "https://raw.githubusercontent.com/.../25.png",
    "back": "https://raw.githubusercontent.com/.../back/25.png"
  }
}

πŸ‘• Forms - T-Shirt

An n8n automation workflow that manages t-shirt orders from a Google Form, verifies available stock using Google Sheets, and sends email notifications.

πŸ“‹ Description

This n8n workflow automates the following process:

  1. Detect new responses in a Google Form (Google Sheets Trigger)
  2. Read t-shirt requests from Google Sheets
  3. Filter unverified records
  4. Get current inventory of t-shirt stock from Google Sheets
  5. Process orders by checking availability per size
  6. Update responses marking orders as verified
  7. Update inventory reducing stock
  8. Send email with a summary of changes made

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Google Sheets    │───▢│ Get T-Shirt       │───▢│ Filter No Data │───▢│  Aggregate   β”‚
β”‚ Trigger          β”‚    β”‚ Requests          β”‚    β”‚ Entries        β”‚    β”‚  Requests    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                              β”‚
                                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Update Stock     │◀───│ Aggregate Stock   │◀───│ Get Stock      │◀───│              β”‚
β”‚ (Code)           β”‚    β”‚                   β”‚    β”‚                β”‚    β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β–Ό                                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Verify Order     β”‚                 β”‚ Update Stock β”‚
β”‚ (Google Sheets)  β”‚                 β”‚ (Inventory)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                                   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚ Merge Branches   │───▢│ Send Email   β”‚
              β”‚                  β”‚    β”‚ (Gmail)      β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Google Sheets Structure

Responses Sheet (T-Shirt - Responses)

Column Description
Timestamp Form submission timestamp
Email Address Requester's email
Name Requester's name
Shirt size Requested size (S, M, L, XL, etc.)
Aditional comments Additional comments
Verified Verification status (TRUE/FALSE)
Verification date Verification date

Inventory Sheet (T-Shirt Stock)

Column Description
Product Product name
Size Size (S, M, L, XL, etc.)
Stock Available quantity

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Google Sheet Responses ID YOUR_GOOGLE_SHEET_RESPONSES_ID Form responses document ID*
Google Sheet Stock ID YOUR_GOOGLE_SHEET_STOCK_ID Inventory document ID*
Google Sheets Credential ID YOUR_GOOGLE_SHEETS_CREDENTIAL_ID Google Sheets OAuth2 credential ID
Google Sheets Trigger Credential ID YOUR_GOOGLE_SHEETS_TRIGGER_CREDENTIAL_ID Trigger OAuth2 credential ID
Gmail Credential ID YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2 credential ID
Email your-email@example.com Email for credentials and recipient
Webhook ID YOUR_WEBHOOK_ID Webhook ID (generated by n8n)
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

* The Google Sheet ID can be found in the document URL:
https://docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit


🐘 T-Shirts - PostgreSQL

An n8n automation workflow that manages t-shirt orders from a Google Form, verifies available stock using a PostgreSQL database, and sends email notifications. This is an alternative to the Google Sheets version, demonstrating database integration.

PostgreSQL

πŸ“‹ Description

This n8n workflow automates the following process:

  1. Detect new responses in a Google Form (Google Sheets Trigger)
  2. Filter unverified records
  3. Loop over each request processing them one by one
  4. Query PostgreSQL to check inventory by size
  5. Verify stock availability and branch accordingly
  6. Update PostgreSQL reducing stock for successful orders
  7. Update Google Sheets marking orders as verified or rejected
  8. Send email with a summary of processed requests

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Google Sheets    │───▢│ Filter No Data │───▢│ Loop Over New    β”‚
β”‚ Trigger          β”‚    β”‚ Entries        β”‚    β”‚ Requests         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                      β”‚
                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚                             β”‚                     β”‚
                        β–Ό                             β–Ό                     β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
              β”‚ Aggregate Work   β”‚         β”‚ Get Inventory    β”‚            β”‚
              β”‚                  β”‚         β”‚ By Size (SQL)    β”‚            β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
                        β”‚                             β”‚                     β”‚
                        β–Ό                             β–Ό                     β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
              β”‚ Send Email       β”‚         β”‚ Have Stock?      β”‚            β”‚
              β”‚ (Gmail)          β”‚         β”‚ (IF Condition)   β”‚            β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
                                                  β”‚    β”‚                   β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    └──────────┐        β”‚
                                    β–Ό                             β–Ό        β”‚
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
                          β”‚ Subtract Stock   β”‚         β”‚ Update Answers   β”‚β”‚
                          β”‚ (Set Node)       β”‚         β”‚ Without Stock    β”‚β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
                                    β”‚                             β”‚        β”‚
                                    β–Ό                             β”‚        β”‚
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚        β”‚
                          β”‚ Update Stock DB  β”‚                    β”‚        β”‚
                          β”‚ (PostgreSQL)     β”‚                    β”‚        β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚        β”‚
                                    β”‚                             β”‚        β”‚
                                    β–Ό                             β”‚        β”‚
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚        β”‚
                          β”‚ Update Answers   β”‚                    β”‚        β”‚
                          β”‚ (Google Sheets)  β”‚                    β”‚        β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚        β”‚
                                    β”‚                             β”‚        β”‚
                                    β–Ό                             β–Ό        β”‚
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚
                          β”‚ Loop End         β”‚β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Data Structures

Google Sheets - Responses (T-Shirt - Responses)

Column Description
Timestamp Form submission timestamp
Email Address Requester's email
Name Requester's name
Shirt size Requested size (S, M, L, XL, etc.)
Aditional comments Additional comments
Verified Verification status (TRUE/FALSE)
Verification date Verification date

PostgreSQL - Inventory Table

CREATE TABLE inventory (
    id SERIAL PRIMARY KEY,
    product_name VARCHAR(255),
    size VARCHAR(10),
    in_stock INTEGER
);
Column Type Description
id SERIAL Primary key
product_name VARCHAR Product name
size VARCHAR Size (S, M, L, XL, etc.)
in_stock INTEGER Available quantity

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Google Sheet Responses ID YOUR_GOOGLE_SHEET_RESPONSES_ID Form responses document ID*
Google Sheets Credential ID YOUR_GOOGLE_SHEETS_CREDENTIAL_ID Google Sheets OAuth2 credential ID
Google Sheets Trigger Credential ID YOUR_GOOGLE_SHEETS_TRIGGER_CREDENTIAL_ID Trigger OAuth2 credential ID
PostgreSQL Credential ID YOUR_POSTGRES_CREDENTIAL_ID PostgreSQL credential ID
PostgreSQL Database Name your-database-name Name for your PostgreSQL connection
Gmail Credential ID YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2 credential ID
Email your-email@example.com Email for credentials and recipient
Webhook ID YOUR_WEBHOOK_ID Webhook ID (generated by n8n)
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

* The Google Sheet ID can be found in the document URL:
https://docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit

PostgreSQL Connection

To configure PostgreSQL in n8n, you'll need:

  • Host: Your database host (e.g., db.neon.tech)
  • Database: Database name
  • User: Database username
  • Password: Database password
  • Port: Usually 5432
  • SSL: Enable if required (recommended for cloud databases)

πŸ–οΈ Time Off

An n8n automation workflow that manages employee vacation/time-off requests with a complete approval flow. Features a custom form, multiple validations, Discord notifications to HR, and automatic calendar event creation.

Discord PostgreSQL Google Calendar

πŸ“‹ Description

This n8n workflow automates the complete vacation request process:

  1. Employee submits request via n8n Form Trigger (custom styled form)
  2. Validate request timing (must be 7+ days in advance)
  3. Validate date range (end date must be after start date)
  4. Check available days in PostgreSQL database
  5. Notify HR via Discord with request details and approval link
  6. Wait for HR response (48-hour timeout with approval form)
  7. If approved: Create Google Calendar event + Update database + Send confirmation email
  8. If rejected: Send rejection email with reason

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Form Trigger     │───▢│ Get Request        │───▢│ Is It Higher Than  β”‚
β”‚ (Time Request)   β”‚    β”‚ Variables          β”‚    β”‚ 7 Days?            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                          β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚ YES                                   NO  β”‚
                                    β–Ό                                           β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚ Dates Ok?        β”‚                    β”‚ Add Error -      β”‚
                          β”‚ (End > Start)    β”‚                    β”‚ Request Time     β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚                                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
                    β”‚ YES                       NO  β”‚                          β”‚
                    β–Ό                               β–Ό                          β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
          β”‚ Get Free Days    β”‚         β”‚ Add Error -      β”‚                   β”‚
          β”‚ (PostgreSQL)     β”‚         β”‚ Wrong Dates      β”‚                   β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β”‚
                    β”‚                               β”‚                          β”‚
                    β–Ό                               β”‚                          β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β”‚                          β”‚
          β”‚ Have Enough      β”‚                     β”‚                          β”‚
          β”‚ Vacations?       β”‚                     β”‚                          β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     β”‚                          β”‚
                    β”‚                               β”‚                          β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  β”‚                          β”‚
        β”‚ YES               NO  β”‚                  β”‚                          β”‚
        β–Ό                       β–Ό                  β”‚                          β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚                          β”‚
β”‚ Discord      β”‚    β”‚ Add Error -      β”‚          β”‚                          β”‚
β”‚ (Notify HR)  β”‚    β”‚ Not Enough Days  β”‚          β”‚                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚                          β”‚
        β”‚                       β”‚                  β”‚                          β”‚
        β–Ό                       └──────────────────┴───────────────────────────
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                          β”‚
β”‚ Wait HR Response β”‚                                                          β”‚
β”‚ (48 Hours Form)  β”‚                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                          β”‚
        β”‚                                                                     β”‚
        β–Ό                                                                     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                          β”‚
β”‚ Request          β”‚                                                          β”‚
β”‚ Approved?        β”‚                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                          β”‚
        β”‚                                                                     β”‚
    β”Œβ”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                     β”‚
    β”‚ YES           NO  β”‚                                                     β”‚
    β–Ό                   β–Ό                                                     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                             β”‚
β”‚ Create     β”‚  β”‚ Add Error -  β”‚                                             β”‚
β”‚ Calendar   β”‚  β”‚ Rejected     β”‚                                             β”‚
β”‚ Event      β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚                                                     β”‚
    β”‚                   β–Ό                                                     β”‚
    β–Ό           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ Send HR      │◀───────────────────│ Send Reject      β”‚β—€β”€β”€β”€β”€β”˜
β”‚ Update     β”‚  β”‚ Reject Email β”‚                    β”‚ Message          β”‚
β”‚ Vacation   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Days (DB)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Send HR    β”‚
β”‚ Approve    β”‚
β”‚ Email      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Data Structures

n8n Form Fields (Request Form)

Field Type Required Description
Full Name Text Yes Employee's full name
Email Email Yes Employee's email address
Start date Date Yes First day of time off
End date Date Yes Last day of time off
Comments Textarea No Additional request comments

PostgreSQL - Days Off Table

CREATE TABLE days_off (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE,
    vacation_days INTEGER,
    sick_days INTEGER
);
Column Type Description
id SERIAL Primary key
email VARCHAR Employee's email (unique)
vacation_days INTEGER Available vacation days
sick_days INTEGER Available sick days

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
PostgreSQL Credential ID YOUR_POSTGRES_CREDENTIAL_ID PostgreSQL credential ID
PostgreSQL Database Name your-database-name Name for your PostgreSQL connection
Gmail Credential ID YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2 credential ID
Google Calendar Credential ID YOUR_GOOGLE_CALENDAR_CREDENTIAL_ID Google Calendar OAuth2 credential ID
Calendar Email your-email@example.com Calendar to create events in
Form Webhook ID YOUR_FORM_WEBHOOK_ID Form Trigger webhook ID
Discord Webhook ID YOUR_DISCORD_WEBHOOK_ID Discord notification webhook ID
Wait Webhook ID YOUR_WAIT_WEBHOOK_ID Wait node webhook ID
Gmail Webhook ID YOUR_GMAIL_WEBHOOK_ID Gmail webhook ID
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

Discord Configuration

This workflow uses Discord webhook authentication. To set it up:

  1. Go to your Discord server settings
  2. Navigate to Integrations β†’ Webhooks
  3. Create a new webhook for your HR channel
  4. Copy the webhook URL and configure it in the Discord node

Validation Rules

The workflow includes these built-in validations:

  • ⏰ Request must be submitted at least 7 days before start date
  • πŸ“… End date must be after start date
  • πŸ–οΈ Employee must have enough vacation days available
  • ⏳ HR has 48 hours to respond before request times out

πŸ”— Time Off Webhook

An n8n automation workflow similar to Time Off, but triggered via an HTTP Webhook API instead of a form. This version is ideal for integrating vacation requests from external systems, mobile apps, or custom frontends.

Webhook Discord PostgreSQL Google Calendar

πŸ“‹ Description

This n8n workflow provides an API endpoint for vacation requests:

  1. Receive POST request via HTTP Webhook with header authentication
  2. Validate request body using JavaScript (name, email, dates format)
  3. Return HTTP response (200 OK or 400 Bad Request with errors)
  4. Validate request timing (must be 7+ days in advance)
  5. Validate date range (end date must be after start date)
  6. Check available days in PostgreSQL database
  7. Notify HR via Discord with request details and approval link
  8. Wait for HR response (48-hour timeout via webhook callback)
  9. If approved: Create Google Calendar event + Update database + Send confirmation email
  10. If rejected: Send rejection email with reason

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Webhook POST     │───▢│ Validate Webhook   │───▢│ Has Necessary      β”‚
β”‚ (API Trigger)    β”‚    β”‚ Data (JavaScript)  β”‚    β”‚ Fields?            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                          β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚ YES                                   NO  β”‚
                                    β–Ό                                           β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚ Respond 200 OK   β”‚                    β”‚ Respond 400      β”‚
                          β”‚                  β”‚                    β”‚ Bad Request      β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
                                    β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚ Get Request      β”‚
                          β”‚ Variables        β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
                                    β–Ό
                    (Same flow as Time Off workflow)
                                    β”‚
                                    β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚ Validations β†’    β”‚
                          β”‚ HR Approval β†’    β”‚
                          β”‚ Calendar + Email β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š API Specification

Endpoint

POST /webhook/vacation/ask/form/001

Headers

Header Required Description
Authorization Yes Header authentication token

Request Body

{
  "Full Name": "John Doe",
  "Email": "john.doe@company.com",
  "Start date": "2025-01-15",
  "End date": "2025-01-20",
  "Comments": "Family vacation (optional)"
}

Response - Success (200)

{
  "valid": true,
  "status": 200,
  "data": {
    "fullName": "John Doe",
    "email": "john.doe@company.com",
    "startDate": "2025-01-15",
    "endDate": "2025-01-20",
    "comments": "Family vacation"
  }
}

Response - Error (400)

{
  "valid": false,
  "status": 400,
  "errors": [
    "Name is required.",
    "Start date needs to have a format: YYYY-MM-DD."
  ]
}

Validation Rules (API Level)

  • βœ… Full Name - Required, non-empty
  • βœ… Email - Required, valid email format
  • βœ… Start date - Required, format YYYY-MM-DD
  • βœ… End date - Required, format YYYY-MM-DD, must be after start date
  • βœ… Comments - Optional, max 500 characters

πŸ“Š Data Structures

PostgreSQL - Days Off Table

CREATE TABLE days_off (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE,
    vacation_days INTEGER,
    sick_days INTEGER
);

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Header Auth Credential ID YOUR_HEADER_AUTH_CREDENTIAL_ID HTTP Header authentication credential
PostgreSQL Credential ID YOUR_POSTGRES_CREDENTIAL_ID PostgreSQL credential ID
PostgreSQL Database Name your-database-name Name for your PostgreSQL connection
Gmail Credential ID YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2 credential ID
Google Calendar Credential ID YOUR_GOOGLE_CALENDAR_CREDENTIAL_ID Google Calendar OAuth2 credential ID
Calendar Email your-email@example.com Calendar to create events in
HTTP Webhook ID YOUR_HTTP_WEBHOOK_ID Main webhook endpoint ID
Form Webhook ID YOUR_FORM_WEBHOOK_ID Form Trigger webhook ID (disabled)
Discord Webhook ID YOUR_DISCORD_WEBHOOK_ID Discord notification webhook ID
Wait Webhook ID YOUR_WAIT_WEBHOOK_ID Wait node webhook ID
Gmail Webhook ID YOUR_GMAIL_WEBHOOK_ID Gmail webhook ID
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

Header Authentication Setup

  1. In n8n, go to Credentials β†’ New
  2. Select Header Auth
  3. Configure:
    • Name: Header Auth Secret
    • Header Name: Your header name (e.g., X-API-Key)
    • Header Value: Your secret token

Differences from Time Off (Form Version)

Feature Time Off Time Off Webhook
Trigger n8n Form HTTP POST Webhook
Input Validation n8n Form validation JavaScript validation
Response Form submission page JSON response
Authentication None (public form) Header authentication
HR Approval Wait Form-based Webhook callback
Use Case Employee self-service System integration

πŸ•·οΈ Scraping - Course

An n8n automation workflow that performs web scraping with AI-powered data extraction for online courses. It scrapes course websites, uses OpenAI to extract structured information, fetches additional data from Udemy using Firecrawl, and stores everything in Google Sheets and Google Docs.

OpenAI Firecrawl Google Sheets Google Docs

πŸ“‹ Description

This n8n workflow automates the process of extracting course information from websites:

  1. Read websites list from Google Sheets (can run on schedule or manually)
  2. Filter websites that have valid URLs
  3. Fetch HTML from each website
  4. Convert to Markdown for easier AI processing
  5. Send to OpenAI (o3-mini) to extract structured course data
  6. Parse and aggregate the extracted information
  7. Update Google Sheets with course details (name, instructor, URLs, description)
  8. Scrape Udemy using Firecrawl for additional course details
  9. Create Google Doc for each course syllabus
  10. Use OpenAI again to format syllabus content
  11. Update Google Doc with formatted syllabus

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Schedule/Manual  │───▢│ Get Websites     │───▢│ Filter Valid   β”‚
β”‚ Trigger          β”‚    β”‚ (Google Sheets)  β”‚    β”‚ URLs           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                        β”‚
                                                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OpenAI Extract   │◀───│ Convert to       │◀───│ HTTP Request   β”‚
β”‚ Course Data      β”‚    β”‚ Markdown         β”‚    β”‚ (Get HTML)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Parse JSON &     │───▢│ Split Courses    │───▢│ Update Google  β”‚
β”‚ Aggregate        β”‚    β”‚ (Loop)           β”‚    β”‚ Sheets         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                        β”‚
                                                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OpenAI Format    │◀───│ Create Google    │◀───│ Firecrawl      β”‚
β”‚ Syllabus         β”‚    β”‚ Doc              β”‚    β”‚ (Scrape Udemy) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Update Google    │───▢│ Update Syllabus  β”‚
β”‚ Doc Content      β”‚    β”‚ URL in Sheets    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Data Structures

Google Sheets - Websites to Search

Column Description
Website URL of the website to scrape

Google Sheets - Results

Column Description
Course name Name of the course
Teacher Instructor's name
DevTalles DevTalles course URL
Udemy Udemy course URL
Description Course description
GoogleDocs - Syllabus Link to generated syllabus document

AI-Extracted Data Structure

{
  "courseName": "Course Title",
  "instructor": "Instructor Name",
  "devtallesUrl": "https://devtalles.com/...",
  "udemyUrl": "https://udemy.com/...",
  "description": "Course description...",
  "category": "Programming",
  "additionalInformation": "Extra details..."
}

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Google Sheet ID YOUR_GOOGLE_SHEET_ID Google Sheets document ID*
Google Sheets Credential ID YOUR_GOOGLE_SHEETS_CREDENTIAL_ID Google Sheets OAuth2 credential ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential ID
Firecrawl Credential ID YOUR_FIRECRAWL_CREDENTIAL_ID Firecrawl API credential ID
Firecrawl API Key YOUR_FIRECRAWL_API_KEY Firecrawl API key (for HTTP requests)
Google Docs Credential ID YOUR_GOOGLE_DOCS_CREDENTIAL_ID Google Docs OAuth2 credential ID
Google Drive Folder ID YOUR_GOOGLE_DRIVE_FOLDER_ID Folder ID for created documents
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

* The Google Sheet ID can be found in the document URL:
https://docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit

OpenAI Configuration

This workflow uses the o3-mini model for:

  1. Extracting structured course data from scraped content
  2. Formatting syllabus content for Google Docs

Configure in n8n:

  1. Go to Credentials β†’ New
  2. Select OpenAI
  3. Add your OpenAI API key

Firecrawl Configuration

Firecrawl is used to scrape Udemy pages (which have anti-scraping protection):

  1. Sign up at firecrawl.dev
  2. Get your API key
  3. Configure in n8n Credentials

Google Drive Folder

The workflow creates Google Docs for each course syllabus. Configure:

  • Create a folder in Google Drive
  • Get the folder ID from the URL: https://drive.google.com/drive/folders/FOLDER_ID
  • Update the folderId parameter

Features

  • πŸ•’ Scheduled execution - Can run automatically on a schedule
  • πŸ”„ Manual trigger - Also supports manual execution
  • πŸ€– AI-powered extraction - Uses OpenAI for intelligent data extraction
  • πŸ›‘οΈ Anti-scraping bypass - Firecrawl handles protected sites like Udemy
  • πŸ“„ Document generation - Automatically creates formatted Google Docs

πŸ—ΊοΈ Google Maps - Scraping

An n8n automation workflow that scrapes Google Maps for business leads using Apify, extracts contact information from business websites using Firecrawl, and stores all data in Google Sheets. Perfect for lead generation and market research.

Apify Firecrawl Google Sheets Google Maps

πŸ“‹ Description

This n8n workflow automates business lead generation from Google Maps:

  1. Read search queries from Google Sheets (Query + Location)
  2. Start Apify scraping job using the Google Places Crawler
  3. Wait for job completion with polling loop
  4. Check scraping status until SUCCEEDED
  5. Fetch scraped results from Apify dataset
  6. Save business data to Google Sheets (title, category, address, phone, website)
  7. Filter businesses that have websites
  8. Scrape websites using Firecrawl for contact information
  9. Extract contact details (emails, social media, etc.)
  10. Save contact information to Google Sheets

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Schedule/Manual  │───▢│ Read Pending     │───▢│ Start Apify        β”‚
β”‚ Trigger          β”‚    β”‚ Queries          β”‚    β”‚ Scraping Job       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                         β”‚
                                                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Check Scraping   │◀───│ Wait for Job     │◀───│                    β”‚
β”‚ Status           β”‚    β”‚ to Succeed       β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         NO
β”‚ Loop Until       │─────────────────┐
β”‚ Complete?        β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
        β”‚ YES                        β”‚
        β–Ό                            β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”‚
β”‚ Fetch Scraped    β”‚β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Results          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Save Business    │───▢│ Filter Businesses│───▢│ Batch Processing   β”‚
β”‚ Data             β”‚    β”‚ with Websites    β”‚    β”‚ Logic              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                         β”‚
                                                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Save Contact     │◀───│ Extract Contact  │◀───│ Firecrawl Scrape   β”‚
β”‚ Details          β”‚    β”‚ Information      β”‚    β”‚ Website            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Data Structures

Google Sheets - Query Sheet

Column Description
Query Search term (e.g., "restaurants", "dentists")
Location Geographic location (e.g., "New York, NY")

Google Sheets - Data Sheet (Results)

Column Description
searchString Original search query + location
title Business name
categoryName Business category
address Full address
phone Phone number
website Business website URL
status Scraping job status

Google Sheets - Contacts Sheet

Column Description
business_name Business name
email Extracted email address
social_media Social media links
additional_contacts Other contact information

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Google Sheet ID YOUR_GOOGLE_SHEET_ID Google Sheets document ID*
Google Sheets Credential ID YOUR_GOOGLE_SHEETS_CREDENTIAL_ID Google Sheets OAuth2 credential ID
Apify Credential ID YOUR_APIFY_CREDENTIAL_ID Apify Bearer Auth credential ID
Firecrawl Credential ID YOUR_FIRECRAWL_CREDENTIAL_ID Firecrawl Bearer Auth credential ID
Webhook ID YOUR_WEBHOOK_ID Wait node webhook ID
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

* The Google Sheet ID can be found in the document URL:
https://docs.google.com/spreadsheets/d/THIS_IS_THE_ID/edit

Apify Configuration

Apify is used to scrape Google Maps:

  1. Sign up at apify.com
  2. Get your API token from Settings β†’ Integrations
  3. Create a Bearer Auth credential in n8n with your token
  4. The workflow uses the compass~crawler-google-places actor

Firecrawl Configuration

Firecrawl is used to scrape business websites:

  1. Sign up at firecrawl.dev
  2. Get your API key
  3. Create a Bearer Auth credential in n8n

Apify Actor Settings

The workflow uses these Apify settings:

  • Actor: compass~crawler-google-places
  • Max places per search: 15
  • Language: English
  • Max images: 0 (disabled for speed)

Features

  • πŸ•’ Scheduled execution - Runs every 30 minutes by default
  • πŸ”„ Polling mechanism - Waits for Apify job to complete
  • πŸ“ Location-based search - Search businesses by query and location
  • 🌐 Website scraping - Extracts contact info from business websites
  • πŸ“Š Multi-sheet storage - Organizes data across multiple sheets

πŸ€– Wikipedia - Agent

An n8n AI Agent workflow that creates an intelligent chatbot assistant named Miranda that can search and retrieve information from Wikipedia. The workflow includes a standalone HTML chat interface for easy deployment.

LangChain OpenAI Gemini Ollama Wikipedia

πŸ“‹ Description

This n8n workflow creates an AI-powered chatbot with:

  1. Chat Trigger - Receives messages via webhook (public endpoint)
  2. AI Agent - LangChain-based agent that processes queries
  3. Language Model - Supports multiple LLM providers:
    • OpenAI (o3-mini)
    • Google Gemini
    • Ollama (local LLM)
  4. Simple Memory - Buffer window memory (10 messages context)
  5. Wikipedia Tool - Searches and retrieves Wikipedia articles

The assistant "Miranda" responds with concise information (2 paragraphs max) and includes article references as links.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Chat Trigger       │───▢│ AI Agent           β”‚
β”‚ (Webhook)          β”‚    β”‚ (LangChain)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β–Ό              β–Ό              β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ OpenAI      β”‚ β”‚ Gemini      β”‚ β”‚ Ollama      β”‚
            β”‚ o3-mini     β”‚ β”‚             β”‚ β”‚ gpt-oss     β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚              β”‚              β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚      Simple Memory         β”‚
                    β”‚   (10 message context)     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                                   β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚     Wikipedia Tool         β”‚
                    β”‚  (Search & Retrieve)       β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

n8n_processes/
β”œβ”€β”€ Wikipedia - Agent.json      # n8n workflow definition
└── n8n - chatbot/
    └── index.html              # Standalone chat UI

🎨 Chat Interface (n8n - chatbot/index.html)

A beautiful, pastel-themed chat interface built with the official n8n Chat widget:

  • Color Scheme: Soft blue pastel theme
  • Responsive: Adjustable chat window (400x600px default)
  • Initial Messages: Greeting from Miranda
  • Custom CSS Variables: Fully customizable styling

Running the Chat Interface

  1. Open the index.html file in a browser
  2. Ensure the n8n workflow is active and running
  3. Update the webhookUrl if your n8n instance is not on localhost:5678

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Chat Webhook ID YOUR_CHAT_WEBHOOK_ID Chat trigger webhook ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential
Google Gemini Credential ID YOUR_GOOGLE_GEMINI_CREDENTIAL_ID Google AI API credential
Ollama Credential ID YOUR_OLLAMA_CREDENTIAL_ID Ollama local API credential
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

LLM Provider Options

The workflow supports three LLM providers (choose one):

Provider Model Credential Type Notes
OpenAI o3-mini OpenAI API Cloud-based, requires API key
Google Gemini Default Google PaLM API Cloud-based, requires API key
Ollama gpt-oss:latest Ollama API Local, requires Ollama server

Chat Interface Configuration

Update the webhook URL in index.html:

createChat({
  webhookUrl: "http://localhost:5678/webhook/YOUR_CHAT_WEBHOOK_ID/chat",
  // ...
});

Agent System Prompt

The AI agent (Miranda) uses this system prompt:

## Objective
You are a kind assistant, your name is Miranda, you help to look up
for information in Wikipedia.

## Rules
- Always return responses in two paragraphs or less.
- Always specify the references of the articles that you search as a link.

## Tools
- You have a tool to connect to wikipedia and get information,
  you can use to confirm information.

Features

  • 🧠 Multi-LLM support - Switch between OpenAI, Gemini, or local Ollama
  • πŸ’¬ Conversational memory - Remembers last 10 messages
  • πŸ“š Wikipedia integration - Real-time article search
  • πŸ”— Reference links - Provides source links for information
  • 🎨 Custom chat UI - Beautiful standalone HTML interface
  • 🌐 Public endpoint - Accessible webhook for integrations

🀡 Personal Assistant

An n8n AI Agent workflow that acts as a personal assistant to manage your Gmail and Google Calendar. It supports multiple LLMs and uses MCP (Model Context Protocol) to access external tools, keeping the agent logic clean and modular.

LangChain Gmail Google Calendar MCP

πŸ“‹ Description

The Personal Assistant "Miranda" is designed to be a helpful productivity partner. Instead of having all tools hardcoded, it connects to MCP Servers to perform actions.

Capabilities:

  1. πŸ“§ Email Management:
    • Read recent emails
    • Draft new emails (HTML format)
    • Send emails (after confirmation)
  2. πŸ“… Calendar Management:
    • List upcoming events
    • Check for conflicts
    • Schedule new meetings
  3. πŸ” Information Retrieval:
    • Pokemon Finder: A dedicated sub-workflow tool to retrieve Pokemon data (demonstrating tool modularity).
  4. 🧠 Intelligent Context:
    • Maintains a short-term memory of the conversation.
    • Knows the current date and time to schedule events accurately.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Chat Trigger       │───▢│ AI Agent           β”‚
β”‚ (Webhook)          β”‚    β”‚ (LangChain)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β–Ό              β–Ό              β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ OpenAI      β”‚ β”‚ Gemini      β”‚ β”‚ Ollama      β”‚
            β”‚ o3-mini     β”‚ β”‚             β”‚ β”‚ gpt-oss     β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                         β–Ό                         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MCP Client      β”‚       β”‚ MCP Client      β”‚       β”‚ Tool Workflow   β”‚
β”‚ (Gmail)         β”‚       β”‚ (Calendar)      β”‚       β”‚ (Pokemon)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                         β”‚
         β–Ό                         β–Ό
  (Connects to)             (Connects to)
  Gmail MCP Server          Calendar MCP Server

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Chat Webhook ID YOUR_CHAT_WEBHOOK_ID Chat trigger webhook ID
Pokemon Tool Workflow ID YOUR_POKEMON_TOOL_WORKFLOW_ID ID of the Pokemon finder tool workflow
MCP Gmail Webhook YOUR_MCP_GMAIL_WEBHOOK_ID URL part for MCP Gmail Server
MCP Calendar Webhook YOUR_MCP_CALENDAR_WEBHOOK_ID URL part for MCP Calendar Server
OpenAI / Gemini / Ollama - Your preferred LLM credential

Note: This workflow acts as the Client. It does not need direct Google credentials because it asks the MCP Servers to handle the authentication and execution.


πŸ”Œ MCP Servers

Workflows that act as Model Context Protocol (MCP) servers. These are "headless" workflows that expose tools to other agents (like the Personal Assistant or Claude Desktop).

1. Gmail MCP Server (Gmail MCP.json)

Exposes Gmail capabilities over MCP.

πŸ“‹ Tools Provided

  • send_email: Sends an email.
  • create_draft: Creates a draft email.
  • get_emails: Retrieves recent emails.

πŸ”„ Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MCP Trigger        │───┬─▢│ Gmail Tool         β”‚
β”‚ (Webhook)          β”‚   β”‚  β”‚ (Send Email)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β”œβ”€β–Άβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                         β”‚  β”‚ Gmail Tool         β”‚
                         β”‚  β”‚ (Create Draft)     β”‚
                         β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β””β”€β–Άβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚ Gmail Tool         β”‚
                            β”‚ (Get Emails)       β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. Calendar MCP Server (MCP Calendar.json)

Exposes Google Calendar capabilities over MCP.

πŸ“‹ Tools Provided

  • get_calendar_events: Lists events within a time range.
  • create_calendar_event: Creates a new event.

πŸ”„ Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MCP Trigger        │───┬─▢│ Google Calendar    β”‚
β”‚ (Webhook)          β”‚   β”‚  β”‚ (Get Events)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
                         β””β”€β–Άβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚ Google Calendar    β”‚
                            β”‚ (Create Event)     β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

βš™οΈ Credential Configuration (Servers)

These workflows DO require direct access to Google APIs.

Parameter Placeholder Description
MCP Gmail Webhook ID YOUR_MCP_GMAIL_WEBHOOK_ID Trigger ID for Gmail MCP
MCP Calendar Webhook ID YOUR_MCP_CALENDAR_WEBHOOK_ID Trigger ID for Calendar MCP
Gmail Credential YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2
Calendar Credential YOUR_GOOGLE_CALENDAR_CREDENTIAL_ID Google Calendar OAuth2
Calendar ID YOUR_CALENDAR_ID Calendar email address

πŸ”§ Client Configuration (Claude Desktop)

You can also use these MCP servers with Claude Desktop! Use the provided claude_desktop_config.json file found in the n8n - agents and MCP/ directory.

{
  "mcpServers": {
    "n8n-google-calendar": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:5678/mcp/YOUR_MCP_CALENDAR_WEBHOOK_ID"
      ]
    },
    "n8n-google-gmail": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:5678/mcp/YOUR_MCP_GMAIL_WEBHOOK_ID"
      ]
    }
  }
}

πŸ›’ Online Store Agent

An n8n AI Agent workflow that acts as a customer service representative for an online store. It connects to a local backend API (mi-tienda) to query order status and update delivery addresses.

LangChain Gmail Google Gemini NodeJS

πŸ“‹ Description

This agent helps customers with their orders using a conversational interface.

Capabilities:

  1. πŸ“¦ Order Status: Look up order details using Name and Order ID.
  2. 🚚 Update Address: Change the delivery address for an order (requires validation).
  3. πŸ“§ Escalate to Support: Send email summaries to support if the issue cannot be resolved.

Backend (mi-tienda)

This workflow requires the local backend to be running.

  • Located in n8n agents with BE/mi-tienda
  • Run with: npm install && npm start
  • It uses json-server to mock a REST API on port 3000, using the provided db.json file as the database.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Chat Trigger       │───▢│ AI Agent           β”‚
β”‚ (Webhook)          β”‚    β”‚ (LangChain)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β–Ό              β–Ό              β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ Google      β”‚ β”‚ Memory      β”‚ β”‚ Tools       β”‚
            β”‚ Gemini      β”‚ β”‚             β”‚ β”‚             β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                   β”‚
                                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                     β–Ό                           β–Ό
                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                           β”‚ HTTP Requests    β”‚        β”‚ Gmail Tool       β”‚
                           β”‚ (Local Backend)  β”‚        β”‚ (Send Email)     β”‚
                           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Chat Webhook ID YOUR_CHAT_WEBHOOK_ID Chat trigger webhook ID
Google Gemini Credential YOUR_GOOGLE_GEMINI_CREDENTIAL_ID Google Gemini API Key
Gmail Credential YOUR_GMAIL_CREDENTIAL_ID Gmail OAuth2
Gmail Webhook ID YOUR_GMAIL_WEBHOOK_ID Webhook ID for Gmail tool (if applicable)

πŸ“š RAG Standard System

An n8n RAG (Retrieval-Augmented Generation) workflow that enables document-based Q&A using an in-memory vector store. Perfect for legal document consultation, knowledge bases, or any scenario where you need to query uploaded documents.

LangChain OpenAI RAG

πŸ“‹ Description

This workflow implements a complete RAG system with two main components:

  1. Document Ingestion:

    • Upload PDF documents via n8n Form
    • Extract text using Default Data Loader
    • Split text into chunks (Recursive Character Text Splitter)
    • Generate embeddings using OpenAI (text-embedding-3-large)
    • Store vectors in in-memory vector store
  2. Document Query:

    • Chat interface for asking questions
    • Semantic search in vector store
    • AI Agent (gpt-4.1-mini) generates answers based on retrieved context
    • Maintains conversation memory (10 messages)

The system is configured as a Legal Assistant that helps lawyers consult internal legal documents with professional, accurate responses.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Form Submission    │───▢│ Default Data       │───▢│ Recursive Text     β”‚
β”‚ (Upload PDF)       β”‚    β”‚ Loader             β”‚    β”‚ Splitter           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Simple Vector      │◀───│ Embeddings         │◀───│                    β”‚
β”‚ Store (Insert)     β”‚    β”‚ OpenAI              β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Chat Trigger       │───▢│ AI Agent            │───▢│ Simple Vector      β”‚
β”‚ (Query)            β”‚    β”‚ (LangChain)          β”‚    β”‚ Store (Retrieve)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β–Ό              β–Ό              β–Ό
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚ OpenAI      β”‚ β”‚ Simple      β”‚ β”‚ Vector      β”‚
            β”‚ Chat Model  β”‚ β”‚ Memory      β”‚ β”‚ Store Tool  β”‚
            β”‚ (gpt-4.1)   β”‚ β”‚ (10 msgs)   β”‚ β”‚             β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Form Webhook ID YOUR_FORM_WEBHOOK_ID Form trigger webhook ID
Chat Webhook ID YOUR_CHAT_WEBHOOK_ID Chat trigger webhook ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

OpenAI Configuration

The workflow uses:

  • Embeddings Model: text-embedding-3-large (for vector generation)
  • Chat Model: gpt-4.1-mini (for answer generation)

Vector Store Configuration

  • Storage: In-memory (Simple Vector Store)
  • Memory Key: vector_store_key
  • Embedding Batch Size: 250
  • Chunk Overlap: 250 characters

System Prompt

The AI agent is configured as a Legal Assistant with this system prompt:

# Rol: Asistente Legal

## DescripciΓ³n
Eres un asistente legal diseΓ±ado para ayudar a un abogado a consultar 
informaciΓ³n contenida en documentos legales internos. Debes recuperar, 
analizar y entregar respuestas precisas, claras y fundamentadas basadas 
ΓΊnicamente en los documentos disponibles.

## Reglas
- Respuestas cortas y puntuales
- Incluir referencia del documento utilizado
- Si no conoces la respuesta, indicar que no dispones de la informaciΓ³n
- Mantener tono profesional y formal

Features

  • πŸ“„ PDF Document Support - Upload and process PDF files
  • πŸ” Semantic Search - Vector-based similarity search
  • πŸ’¬ Conversational Interface - Chat-based Q&A
  • 🧠 Context Memory - Remembers last 10 messages
  • πŸ“š Document References - Includes source document citations
  • ⚑ In-Memory Storage - Fast retrieval (suitable for small to medium document sets)

πŸ—„οΈ RAG Standard System PostgreSQL

An n8n RAG workflow that uses PostgreSQL with PGVector extension for scalable, persistent vector storage. Supports automatic document ingestion from Google Drive and advanced document management features.

LangChain OpenAI PostgreSQL PGVector Google Drive

πŸ“‹ Description

This workflow extends the basic RAG system with enterprise-grade features:

  1. Document Ingestion (Multiple Methods):

    • Form Upload: Upload PDFs via n8n Form
    • Google Drive Integration: Automatic ingestion from Google Drive folder
    • Scheduled Sync: Periodic sync with Google Drive folder
    • Manual Trigger: On-demand document processing
  2. Smart Document Management:

    • Duplicate Detection: Checks MD5 checksum to avoid re-processing
    • Version Control: Tracks file modifications
    • Incremental Updates: Only processes new or changed files
    • Vector Cleanup: Removes old vectors when files are updated
  3. PostgreSQL PGVector Storage:

    • Persistent vector storage
    • Scalable to large document collections
    • Metadata tracking (file_id, name, mime_type, etc.)
    • Ingestion history table (ingested_files)
  4. Query Interface:

    • Chat-based Q&A interface
    • Semantic search using PGVector
    • AI Agent generates contextual answers
    • Conversation memory

πŸ”„ Workflow Flow

Document Ingestion Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Trigger            │───▢│ Search Files/      │───▢│ Is it a file?      β”‚
β”‚ (Manual/Schedule/  β”‚    β”‚ Folders            β”‚    β”‚                    β”‚
β”‚  Google Drive)     β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                      β”‚
                                                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Get Previous      │───▢│ Was it charged     │───▢│ Get Variables      β”‚
β”‚ Upload             β”‚    β”‚ before?            β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                          β”‚                          β”‚
        β”‚ NO                      β”‚ YES                      β”‚
        β”‚                          β”‚                          β”‚
        β–Ό                          β–Ό                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ No Operation      β”‚    β”‚ Delete References  │───▢│ Insert Document    β”‚
β”‚                    β”‚    β”‚ (Old Vectors)      β”‚    β”‚ (Metadata)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Download File      │───▢│ Default Data       │───▢│ Recursive Text     β”‚
β”‚ (Google Drive)     β”‚    β”‚ Loader             β”‚    β”‚ Splitter           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Postgres PGVector  │◀───│ Embeddings         β”‚    β”‚                    β”‚
β”‚ Store (Insert)     β”‚    β”‚ OpenAI              β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Update Vectors     β”‚
β”‚ file_id            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Query Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Chat Trigger       │───▢│ AI Agent           │───▢│ Answer Questions   β”‚
β”‚ (Query)            β”‚    β”‚ (LangChain)        β”‚    β”‚ with Vector Store  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
                    β–Ό              β–Ό              β–Ό           β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
            β”‚ OpenAI      β”‚ β”‚ Simple      β”‚ β”‚             β”‚  β”‚
            β”‚ Chat Model  β”‚ β”‚ Memory      β”‚ β”‚             β”‚  β”‚
            β”‚ (gpt-4.1)   β”‚ β”‚ (10 msgs)   β”‚ β”‚             β”‚  β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                                               β”‚
                                                               β–Ό
                                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                            β”‚ Postgres PGVector  β”‚
                                            β”‚ Store (Retrieve)   β”‚
                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Database Schema

PostgreSQL Tables

n8n_vectors (PGVector Table)

Created automatically by PGVector extension. Stores document chunks as vectors.

Column Type Description
id UUID Primary key
content TEXT Document chunk text
embedding VECTOR(1536) OpenAI embedding vector
metadata JSONB Additional metadata
file_id TEXT Google Drive file ID (nullable)

ingested_files (Tracking Table)

Tracks which files have been processed.

CREATE TABLE ingested_files (
  file_id VARCHAR PRIMARY KEY,
  name VARCHAR,
  mime_type VARCHAR,
  md5_checksum VARCHAR,
  modified_time TIMESTAMP,
  last_ingested TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Form Webhook ID YOUR_FORM_WEBHOOK_ID Form trigger webhook ID
Chat Webhook ID YOUR_CHAT_WEBHOOK_ID Chat trigger webhook ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential
PostgreSQL Credential ID YOUR_POSTGRES_CREDENTIAL_ID PostgreSQL credential ID
PostgreSQL Database Name your-database-name Name for your PostgreSQL connection
Google Drive Credential ID YOUR_GOOGLE_DRIVE_CREDENTIAL_ID Google Drive OAuth2 credential ID
Google Drive Folder ID YOUR_GOOGLE_DRIVE_FOLDER_ID Google Drive folder ID for documents
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

PostgreSQL Setup

  1. Install PGVector Extension:

    CREATE EXTENSION IF NOT EXISTS vector;
  2. Create Tracking Table:

    CREATE TABLE ingested_files (
      file_id VARCHAR PRIMARY KEY,
      name VARCHAR,
      mime_type VARCHAR,
      md5_checksum VARCHAR,
      modified_time TIMESTAMP,
      last_ingested TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  3. Configure Connection:

    • Use a PostgreSQL database with PGVector extension
    • Recommended: Neon, Supabase, or self-hosted PostgreSQL

Google Drive Configuration

  1. Create a folder in Google Drive for your documents
  2. Get the folder ID from the URL: https://drive.google.com/drive/folders/FOLDER_ID
  3. Configure the folder ID in the workflow nodes

Features

  • πŸ—„οΈ Persistent Storage - PostgreSQL with PGVector for scalable storage
  • πŸ”„ Auto-Sync - Automatic document ingestion from Google Drive
  • πŸ” Duplicate Detection - MD5 checksum prevents re-processing
  • πŸ“ Version Control - Tracks file modifications
  • πŸ”„ Incremental Updates - Only processes new/changed files
  • 🧹 Vector Cleanup - Removes old vectors when files are updated
  • πŸ“Š Metadata Tracking - Comprehensive document metadata
  • πŸ’¬ Chat Interface - Conversational Q&A
  • 🧠 Memory - Maintains conversation context

Comparison: In-Memory vs PostgreSQL

Feature RAG Standard System RAG Standard System PostgreSQL
Storage In-memory PostgreSQL PGVector
Scalability Small to medium Large document collections
Persistence No (lost on restart) Yes (persistent)
Google Drive Integration No Yes
Duplicate Detection No Yes (MD5 checksum)
Version Control No Yes
Use Case Quick prototypes Production systems

🎀 Voice Agent

An n8n voice AI agent workflow that enables phone-based customer service using ElevenLabs Conversational AI. The agent can query product information and order details from a local backend API, providing a complete voice assistant solution for e-commerce.

ElevenLabs NodeJS Webhook

πŸ“‹ Description

This workflow creates a voice-powered customer service agent that:

  1. Voice Interface: Uses ElevenLabs Conversational AI widget for phone-based interactions
  2. Product Queries: Retrieves product information from local backend
  3. Order Lookup: Fetches order details by order ID
  4. Error Handling: Validates requests and provides appropriate error responses
  5. Backend Integration: Connects to local mi-tienda backend API

The agent is designed to handle customer inquiries via voice, making it perfect for phone support, IVR systems, or voice-enabled customer service.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ElevenLabs        │───▢│ Webhook - Get      │───▢│ Get products       β”‚
β”‚ Voice Agent        β”‚    β”‚ products           β”‚    β”‚ (HTTP Request)     β”‚
β”‚ (Phone Call)       β”‚    β”‚                    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
                                   β”‚                           β”‚
                                   β”‚                           β–Ό
                                   β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                   β”‚                  β”‚ Response with      β”‚
                                   β”‚                  β”‚ products           β”‚
                                   β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Webhook - Get      │───▢│ OrderId exists     │───▢│ Get order by Id    β”‚
β”‚ order by id        β”‚    β”‚ in body?           β”‚    β”‚ (HTTP Request)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
                    β”‚                              β”‚          β”‚
                    β–Ό                              β–Ό          β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ Response bad       β”‚        β”‚ The order was      β”‚
        β”‚ request (400)      β”‚        β”‚ found?             β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                              β”‚
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚                               β”‚
                              β–Ό                               β–Ό
                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚ Response with      β”‚        β”‚ Response not       β”‚
                  β”‚ the order (200)    β”‚        β”‚ found (404)        β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

voice - agent/
β”œβ”€β”€ Tool - Get products.json    # n8n workflow with product/order endpoints
β”œβ”€β”€ index-agent.html            # ElevenLabs voice agent widget interface
└── mi-tienda/                  # Local backend API
    β”œβ”€β”€ db.json                 # JSON database
    β”œβ”€β”€ package.json            # Node.js dependencies
    └── README.md               # Backend documentation

🎯 API Endpoints

The workflow exposes two webhook endpoints:

1. Get Products

  • Path: my-store/products
  • Method: GET
  • Authentication: Header Auth (ElevenLabs API key)
  • Response: List of all products from backend

2. Get Order by ID

  • Path: my-store/orders
  • Method: POST
  • Authentication: Header Auth (ElevenLabs API key)
  • Request Body:
    {
      "orderId": "123"
    }
  • Response: Order details or error message

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Webhook ID YOUR_WEBHOOK_ID Webhook ID for both endpoints
Header Auth Credential ID YOUR_HEADER_AUTH_CREDENTIAL_ID HTTP Header Auth credential
ElevenLabs Agent ID YOUR_ELEVENLABS_AGENT_ID ElevenLabs Conversational AI agent ID
Backend URL http://localhost:3000 Local backend API URL
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

ElevenLabs Configuration

  1. Create an ElevenLabs Account:

  2. Create a Conversational AI Agent:

    • Create a new agent
    • Configure the agent to use your n8n webhook endpoints
    • Copy the Agent ID
  3. Configure Header Authentication:

    • In n8n, create a Header Auth credential
    • Use your ElevenLabs API key as the header value
    • Header name: xi-api-key (or as required by ElevenLabs)
  4. Update HTML Interface:

    • Open index-agent.html
    • Replace YOUR_ELEVENLABS_AGENT_ID with your actual agent ID

Backend Setup (mi-tienda)

The workflow requires the local backend to be running:

  1. Navigate to voice - agent/mi-tienda/
  2. Install dependencies:
    npm install
  3. Start the server:
    npm start
  4. The backend runs on http://localhost:3000 by default

The backend uses json-server to mock a REST API with the provided db.json file.

Webhook Configuration

Both endpoints use the same webhook ID but different paths:

  • my-store/products β†’ Get all products
  • my-store/orders β†’ Get order by ID

Ensure the webhook is configured with Header Authentication using your ElevenLabs API key.

🎨 Voice Interface (index-agent.html)

The HTML file provides a simple interface for the ElevenLabs voice agent widget:

<elevenlabs-convai agent-id="YOUR_ELEVENLABS_AGENT_ID">
</elevenlabs-convai>

Features

  • πŸ“ž Phone-based interaction - Customers can call and speak with the agent
  • πŸ›οΈ Product queries - Retrieve product information via voice
  • πŸ“¦ Order lookup - Find order details by order ID
  • βœ… Input validation - Validates order ID presence
  • ❌ Error handling - Returns appropriate error messages (400, 404)
  • πŸ” Secure authentication - Header Auth for API security
  • 🌐 Backend integration - Connects to local Node.js backend

Use Cases

  • Phone Support: Handle customer service calls automatically
  • IVR Systems: Interactive Voice Response for order inquiries
  • Voice Commerce: Voice-enabled shopping assistance
  • Order Tracking: Voice-based order status queries

πŸ’¬ Telegram Bot

An n8n AI-powered Telegram bot that provides intelligent conversational assistance with support for text messages, image analysis, and voice messages. The bot uses OpenAI for natural language understanding and can respond with text or voice.

Telegram OpenAI ElevenLabs Giphy

πŸ“‹ Description

This workflow creates a comprehensive Telegram bot that:

  1. Text Messages:

    • Responds to /start command with a welcome sticker from Giphy
    • Processes general knowledge questions using AI Agent
    • Maintains conversation context per chat (10 messages memory)
  2. Image Messages:

    • Downloads and analyzes images using OpenAI Vision (GPT-4o)
    • Extracts information from images
    • Responds with AI-generated insights about the image
  3. Voice Messages:

    • Transcribes voice messages using OpenAI Whisper
    • Processes transcribed text with AI Agent
    • Responds with text or converts response to speech using ElevenLabs

The bot is designed as a general knowledge assistant that helps users with questions and can understand context from images and voice messages.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Telegram Trigger   β”‚
β”‚ (Message Received) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ What kind of       β”‚
β”‚ message is it?     β”‚
β”‚ (Switch)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚    β”‚    β”‚    β”‚
    β”‚    β”‚    β”‚    └───▢ Voice Message
    β”‚    β”‚    β”‚
    β”‚    β”‚    └────────▢ Image Message
    β”‚    β”‚
    β”‚    └─────────────▢ Text Message
    β”‚
    └──────────────────▢ /start Command
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Get Sticker        │───▢│ Download Sticker  │───▢│ Send Sticker      β”‚
β”‚ (Giphy API)       β”‚    β”‚                    β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Text Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Writing            │───▢│ Message Fields     │───▢│ Unify Information β”‚
β”‚ (Chat Action)     β”‚    β”‚                    β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ AI Agent           │───▢│ Is it audio?      │───▢│ Send Text Message β”‚
β”‚ (LangChain)        β”‚    β”‚                    β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                           β”‚
         β”‚                           β”‚ YES
         β”‚                           β–Ό
         β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚              β”‚ Convert Text to    │───▢│ Send Audio File    β”‚
         β”‚              β”‚ Speech (ElevenLabs)β”‚    β”‚                    β”‚
         β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Image Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Select Higher      │───▢│ Download Image     │───▢│ Analyze Image      β”‚
β”‚ Resolution Image   β”‚    β”‚                    β”‚    β”‚ (OpenAI Vision)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Image Data         │───▢│ Unify Information │───▢│ AI Agent           β”‚
β”‚                    β”‚    β”‚                    β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Voice Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Recording Audio    │───▢│ Download Audio      │───▢│ Transcribe Audio   β”‚
β”‚ (Chat Action)      β”‚    β”‚                    β”‚    β”‚ (OpenAI Whisper)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Audio Data         │───▢│ Unify Information │───▢│ AI Agent           β”‚
β”‚                    β”‚    β”‚                    β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

n8n-telegram-bot/
β”œβ”€β”€ Telegram bot.json          # Main n8n workflow
└── docker-n8n/
    β”œβ”€β”€ compose.yaml           # Docker Compose configuration
    └── local-files/           # Local file storage

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
Telegram Credential ID YOUR_TELEGRAM_CREDENTIAL_ID Telegram Bot API token
Telegram Webhook ID YOUR_TELEGRAM_WEBHOOK_ID Telegram trigger webhook ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential
ElevenLabs Credential ID YOUR_ELEVENLABS_CREDENTIAL_ID ElevenLabs API credential
ElevenLabs Voice ID YOUR_ELEVENLABS_VOICE_ID ElevenLabs voice ID for TTS
Giphy API Key YOUR_GIPHY_API_KEY Giphy API key for stickers
Webhook IDs YOUR_WEBHOOK_ID_1 to _6 Various webhook IDs for nodes
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

Telegram Bot Setup

  1. Create a Telegram Bot:

    • Talk to @BotFather on Telegram
    • Use /newbot command to create a new bot
    • Copy the bot token
  2. Configure in n8n:

    • Go to Credentials β†’ New
    • Select Telegram
    • Enter your bot token
    • Save the credential ID
  3. Set Webhook:

    • The Telegram trigger node will automatically set up the webhook
    • Ensure your n8n instance is publicly accessible (or use ngrok for local development)

OpenAI Configuration

The workflow uses OpenAI for:

  • Chat Model: gpt-4.1-mini (for text responses)
  • Vision Model: chatgpt-4o-latest (for image analysis)
  • Whisper: Audio transcription

ElevenLabs Configuration

  1. Get API Key:

  2. Get Voice ID:

    • Navigate to Voice Library
    • Select a voice (e.g., "SofΓ­a - Natural and Conversational")
    • Copy the Voice ID
  3. Configure in n8n:

    • Create ElevenLabs credential with your API key
    • Update the voice ID in the "Convert text to speech" node

Giphy API Setup

  1. Get API Key:

  2. Update Workflow:

    • Replace YOUR_GIPHY_API_KEY in the "Get Sticker" node

Docker Deployment (Optional)

The docker-n8n/compose.yaml file provides a production-ready setup with:

  • Traefik reverse proxy
  • SSL/TLS certificates via Let's Encrypt
  • n8n with persistent storage

To deploy:

  1. Create a .env file:

    SUBDOMAIN=n8n
    DOMAIN_NAME=yourdomain.com
    SSL_EMAIL=your-email@example.com
    GENERIC_TIMEZONE=America/New_York
  2. Start services:

    docker-compose up -d

🎯 Bot Features

Message Types Supported

  1. /start Command:

    • Sends a welcome sticker from Giphy
    • Tag: "hola"
  2. Text Messages:

    • General knowledge questions
    • Conversational responses
    • Context-aware (remembers last 10 messages per chat)
  3. Image Messages:

    • Automatic image analysis
    • Extracts information from images
    • Can use image caption if provided
    • Responds with AI-generated insights
  4. Voice Messages:

    • Automatic transcription
    • Processes as text message
    • Can respond with text or voice (ElevenLabs TTS)

AI Agent System Prompt

The bot is configured as a general knowledge assistant:

## DescripciΓ³n
- Eres un asistente que ayuda a las personas con problemas de cultura general
- Tus respuestas deben de ser muy cortas, 1 o 2 lineas mΓ‘ximo

- A veces recibirΓ‘s textos de imΓ‘genes previamente analizadas por otro AI, 
  la respuesta no ha sido enviada al usuario, tu labor serΓ­a enviarle 
  ese mensaje al usuario.

## Tools
"send_telegram" te permite enviar mensajes de telegram

Features

  • πŸ’¬ Multi-modal Support - Text, image, and voice messages
  • 🧠 AI-Powered - OpenAI GPT-4.1-mini for intelligent responses
  • πŸ‘οΈ Image Analysis - GPT-4o Vision for image understanding
  • 🎀 Voice Transcription - OpenAI Whisper for voice-to-text
  • πŸ”Š Text-to-Speech - ElevenLabs for voice responses
  • 🎭 Sticker Support - Giphy integration for fun interactions
  • πŸ’Ύ Conversation Memory - Maintains context per chat (10 messages)
  • πŸ”„ Chat Actions - Shows "typing" and "recording audio" indicators

Use Cases

  • Customer Support Bot: Answer questions and provide assistance
  • Educational Assistant: Help with general knowledge questions
  • Image Analysis Bot: Describe and analyze images
  • Voice Assistant: Voice-based interactions via Telegram
  • Entertainment Bot: Fun interactions with stickers and AI responses

πŸ“± WhatsApp Bot

An n8n AI-powered WhatsApp bot that provides intelligent conversational assistance with support for text messages, image analysis, document processing, and voice messages. The bot uses OpenAI for natural language understanding and can respond with text or audio.

WhatsApp OpenAI Meta

πŸ“‹ Description

This workflow creates a comprehensive WhatsApp bot that:

  1. Text Messages:

    • Processes general knowledge questions using AI Agent
    • Maintains conversation context per user (10 messages memory)
    • Responds with intelligent text answers
  2. Image Messages:

    • Downloads images from WhatsApp
    • Analyzes images using OpenAI Vision (GPT-4o)
    • Extracts information from images
    • Responds with AI-generated insights about the image
  3. Image Documents:

    • Handles image files sent as documents
    • Analyzes document images using OpenAI Vision
    • Processes captions if provided
  4. Voice Messages:

    • Downloads and transcribes voice messages using OpenAI Whisper
    • Processes transcribed text with AI Agent
    • Can respond with text or convert response to audio using OpenAI TTS

The bot is designed as a general knowledge assistant that helps users with questions and can understand context from images, documents, and voice messages.

πŸ”„ Workflow Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ WhatsApp Trigger   β”‚
β”‚ (Message Received) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ What type of       β”‚
β”‚ message is it?     β”‚
β”‚ (Switch)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚    β”‚    β”‚    β”‚
    β”‚    β”‚    β”‚    └───▢ Audio Message
    β”‚    β”‚    β”‚
    β”‚    β”‚    └────────▢ Image Document
    β”‚    β”‚
    β”‚    └─────────────▢ Image Message
    β”‚
    └──────────────────▢ Text Message

Text Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Get Person Info    │───▢│ Get and Unify      │───▢│ AI Agent           β”‚
β”‚                    β”‚    β”‚ Data               β”‚    β”‚ (LangChain)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
                    β–Ό              β–Ό              β–Ό           β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
            β”‚ OpenAI      β”‚ β”‚ Simple      β”‚ β”‚             β”‚  β”‚
            β”‚ Chat Model  β”‚ β”‚ Memory      β”‚ β”‚             β”‚  β”‚
            β”‚ (gpt-4.1)   β”‚ β”‚ (10 msgs)   β”‚ β”‚             β”‚  β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                                               β”‚
                                                               β–Ό
                                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                            β”‚ Is it an audio?    β”‚
                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                    β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚                               β”‚
                                    β–Ό                               β–Ό
                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚ Generate Audio     β”‚        β”‚ Send Text Message   β”‚
                        β”‚ (OpenAI TTS)      β”‚        β”‚                    β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚
                                β–Ό
                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚ Send Audio Message β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Image Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Download Image     │───▢│ Get File           │───▢│ Analyze Image      β”‚
β”‚ (WhatsApp Media)   β”‚    β”‚ (HTTP Request)     β”‚    β”‚ (OpenAI Vision)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Get Person Info    │───▢│ Get and Unify     │───▢│ AI Agent           β”‚
β”‚ (with AI analysis) β”‚    β”‚ Data              β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Voice Message Flow:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Download Audio      │───▢│ Get Audio          │───▢│ Analyze Audio      β”‚
β”‚ (WhatsApp Media)    β”‚    β”‚ (HTTP Request)     β”‚    β”‚ (OpenAI Whisper)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                              β”‚
                                                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Get Person Audio   │───▢│ Get and Unify      │───▢│ AI Agent           β”‚
β”‚                    β”‚    β”‚ Data               β”‚    β”‚                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

n8n-whatsapp-bot/
β”œβ”€β”€ Whatsapp Bot.json          # Main n8n workflow
└── docker-n8n/
    β”œβ”€β”€ compose.yaml           # Docker Compose configuration
    β”œβ”€β”€ env.example            # Environment variables template
    └── local-files/           # Local file storage

βš™οΈ Credential Configuration

πŸ” Required Credentials

Parameter Placeholder Description
WhatsApp Trigger Credential ID YOUR_WHATSAPP_TRIGGER_CREDENTIAL_ID WhatsApp OAuth credential for trigger
WhatsApp Credential ID YOUR_WHATSAPP_CREDENTIAL_ID WhatsApp API credential
WhatsApp Bearer Token Credential ID YOUR_WHATSAPP_BEARER_TOKEN_CREDENTIAL_ID Bearer token for media downloads
WhatsApp Phone Number ID YOUR_WHATSAPP_PHONE_NUMBER_ID Your WhatsApp Business phone number ID
OpenAI Credential ID YOUR_OPENAI_CREDENTIAL_ID OpenAI API credential
WhatsApp Webhook ID YOUR_WHATSAPP_WEBHOOK_ID WhatsApp trigger webhook ID
WhatsApp Send Webhook ID YOUR_WHATSAPP_SEND_WEBHOOK_ID Webhook ID for sending messages
WhatsApp Media Webhook ID YOUR_WHATSAPP_MEDIA_WEBHOOK_ID Webhook ID for media operations
Instance ID YOUR_INSTANCE_ID Your n8n instance ID

WhatsApp Business API Setup

  1. Create a Meta Business Account:

  2. Set up WhatsApp Business API:

    • Navigate to WhatsApp in Meta Business Suite
    • Create a WhatsApp Business Account
    • Get your Phone Number ID from the dashboard
  3. Get Access Token:

    • Go to System Users β†’ WhatsApp
    • Create a system user with WhatsApp permissions
    • Generate a Permanent Access Token
    • This token is used for the Bearer Auth credential
  4. Configure Webhook:

    • In Meta Business Suite, configure webhook URL
    • Point to your n8n instance webhook endpoint
    • Subscribe to messages events
  5. Configure in n8n:

    • Create WhatsApp Trigger credential with OAuth
    • Create WhatsApp credential with your access token
    • Create HTTP Bearer Auth credential with your access token (for media downloads)
    • Enter your Phone Number ID in the send message nodes

OpenAI Configuration

The workflow uses OpenAI for:

  • Chat Model: gpt-4.1-mini (for text responses)
  • Vision Model: gpt-4o (for image analysis)
  • Whisper: Audio transcription
  • TTS: Text-to-speech (voice: "nova", format: "opus")

Features

  • πŸ’¬ Multi-modal Support - Text, image, document, and voice messages
  • 🧠 AI-Powered - OpenAI GPT-4.1-mini for intelligent responses
  • πŸ‘οΈ Image Analysis - GPT-4o Vision for image understanding
  • πŸ“„ Document Processing - Handles image documents
  • 🎀 Voice Transcription - OpenAI Whisper for voice-to-text
  • πŸ”Š Text-to-Speech - OpenAI TTS for voice responses
  • πŸ’Ύ Conversation Memory - Maintains context per user (10 messages)
  • πŸ“± WhatsApp Integration - Native WhatsApp Business API support

Message Types Supported

  1. Text Messages:

    • General knowledge questions
    • Conversational responses
    • Context-aware (remembers last 10 messages per user)
  2. Image Messages:

    • Automatic image analysis
    • Extracts information from images
    • Can use image caption if provided
    • Responds with AI-generated insights
  3. Image Documents:

    • Handles images sent as documents
    • Analyzes document images
    • Processes captions
  4. Voice Messages:

    • Automatic transcription
    • Processes as text message
    • Can respond with text or audio (OpenAI TTS)

AI Agent System Prompt

The bot is configured as a general knowledge assistant:

You are a helpful assistant that help people with general knowledge questions.

You can receive information from an AI that analyze the image. If there is no 
information in the AI section, then answer the prompt with the information 
that you know.

You can also receive messages or userPrompts that are transcript using AI, 
the userPrompt can come from an audio file.

## Image analyzed by AI:
{{ $json.ai }}

Use Cases

  • Customer Support Bot: Answer questions and provide assistance via WhatsApp
  • Educational Assistant: Help with general knowledge questions
  • Image Analysis Bot: Describe and analyze images sent by users
  • Voice Assistant: Voice-based interactions via WhatsApp
  • Document Processing: Analyze and respond to image documents
  • Business Automation: Automated customer service for WhatsApp Business

πŸ› οΈ General Requirements

  • n8n (self-hosted or cloud)
  • Google account with access to:
    • Google Sheets API
    • Gmail API
    • Google Calendar API (for Time Off workflows)
    • Google Docs API (for Scraping - Course workflow)
    • Google Drive API (for Scraping - Course and RAG workflows)
  • OAuth2 credentials configured in n8n
  • PostgreSQL database (for T-Shirts - PostgreSQL, Time Off, and RAG workflows)
  • PostgreSQL with PGVector extension (for RAG Standard System PostgreSQL)
  • Discord webhook (for Time Off workflows)
  • OpenAI API key (for Scraping - Course, Wikipedia - Agent, Personal Assistant, Online Store Agent, and RAG workflows)
  • Firecrawl API key (for Scraping - Course and Google Maps - Scraping workflows)
  • Apify API token (for Google Maps - Scraping workflow)
  • Google Gemini API key (for Wikipedia - Agent workflow, optional)
  • Ollama local server (for Wikipedia - Agent workflow, optional)

πŸ€” What is n8n?

n8n (pronounced "n-eight-n") is a free and open-source workflow automation tool. It allows you to:

  • πŸ”— Connect 400+ apps and services
  • πŸ€– Automate repetitive tasks
  • πŸ“Š Build complex workflows visually
  • πŸ’» Self-host for complete data control

These workflows demonstrate n8n's capability to integrate multiple services (Google Sheets, external APIs, Gmail, PostgreSQL, Discord, Google Calendar, OpenAI, Firecrawl, Google Docs, Apify, Google Maps, LangChain Agents, Wikipedia, Google Gemini, Ollama, PGVector, Google Drive, RAG, ElevenLabs Voice AI, Telegram, Giphy, WhatsApp Business API) into seamless automation pipelines.


πŸ“„ License

This project is available under the MIT License. Feel free to use, modify, and share it.


πŸ™ Credits

  • PokΓ©mon data provided by PokΓ©API
  • Workflows built with n8n

About

Practice projects using n8n

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages