Compare Flight Prices Across Multiple Booking Platforms with Email Reports

This workflow automates flight price comparison across multiple booking platforms (Kayak, Skyscanner, Expedia, Google Flights). It accepts natural language queries, extracts flight details using NLP, scrapes prices in parallel, identifies the best deals, and sends professional email reports with comprehensive price breakdowns and booking links.

šŸ“¦ What You'll Get

A fully functional, production-ready n8n workflow that:

āœ… Compares flight prices across 4 major platforms (Kayak, Skyscanner, Expedia, Google Flights)
āœ… Accepts natural language requests ("Flight from NYC to London on March 25")
āœ… Sends beautiful email reports with best deals
āœ… Returns real-time JSON responses for web apps
āœ… Handles errors gracefully with helpful messages
āœ… Includes detailed documentation with sticky notes

šŸš€ Quick Setup (3 Steps)

Step 1: Import Workflow to n8n

Copy the JSON from the first artifact (workflow file) Open n8n → Go to Workflows Click "Import from File" → Paste JSON → Click Import āœ… Workflow imported successfully!

Step 2: Setup Python Scraper

On your server (where n8n SSH nodes will connect):

Navigate to your scripts directory cd /home/oneclick-server2/

Create the scraper file nano flight_scraper.py

Copy the entire Python script from the second artifact Save with Ctrl+X, then Y, then Enter

Make it executable chmod +x flight_scraper.py

Install required packages pip3 install selenium

Install Chrome and ChromeDriver sudo apt update sudo apt install -y chromium-browser chromium-chromedriver

Test the scraper python3 flight_scraper.py JFK LHR 2025-03-25 2025-03-30 round-trip 1 economy kayak

Expected Output: Delta|$450|7h 30m|0|10:00 AM|6:30 PM|https://kayak.com/... British Airways|$485|7h 45m|0|11:30 AM|8:15 PM|https://kayak.com/... ...

Step 3: Configure n8n Credentials

A. Setup SMTP (for sending emails):

In n8n: Credentials → Add Credential → SMTP Fill in details: Host: smtp.gmail.com Port: 587 User: your-email@gmail.com Password: [Your App Password]

For Gmail Users: Enable 2FA: https://myaccount.google.com/security Create App Password: https://myaccount.google.com/apppasswords Use the 16-character password in n8n

B. Setup SSH (already configured if you used existing credentials):

In workflow, SSH nodes use: ilPh8oO4GfSlc0Qy Verify credential exists and points to correct server Update path if needed: /home/oneclick-server2/

C. Activate Workflow:

Click the workflow toggle → Active āœ… Webhook is now live!

šŸŽÆ How to Use

Method 1: Direct Webhook Call

curl -X POST https://your-n8n-domain.com/webhook/flight-price-compare
-H "Content-Type: application/json"
-d '{ "message": "Flight from Mumbai to Dubai on 15th March, round-trip returning 20th March", "email": "user@example.com", "name": "John Doe" }'

Response: { "success": true, "message": "Flight comparison sent to user@example.com", "route": "BOM → DXB", "bestPrice": 450, "airline": "Emirates", "totalResults": 18 }

Method 2: Natural Language Queries

The workflow understands various formats:

āœ… All these work: "Flight from New York to London on 25th March, one-way" "NYC to LHR March 25 round-trip return March 30" "I need a flight from Mumbai to Dubai departing 15th March" "JFK LHR 2025-03-25 2025-03-30 round-trip"

Supported cities (auto-converts to airport codes): New York → JFK London → LHR Mumbai → BOM Dubai → DXB Singapore → SIN And 20+ more cities

Method 3: Structured JSON

{ "from": "JFK", "to": "LHR", "departure_date": "2025-03-25", "return_date": "2025-03-30", "trip_type": "round-trip", "passengers": 1, "class": "economy", "email": "user@example.com", "name": "John" }

šŸ“§ Email Report Example

Users receive an email like this:

FLIGHT PRICE COMPARISON

Route: JFK → LHR Departure: 25 Mar 2025 Return: 30 Mar 2025 Trip Type: round-trip Passengers: 1

šŸ† BEST DEAL British Airways Price: $450 Duration: 7h 30m Stops: Non-stop Platform: Kayak

šŸ’° Save $85 vs highest price!

šŸ“Š ALL RESULTS (Top 10) British Airways - $450 (Non-stop) - Kayak Delta - $475 (Non-stop) - Google Flights American Airlines - $485 (Non-stop) - Expedia Virgin Atlantic - $495 (Non-stop) - Skyscanner United - $520 (1 stop) - Kayak ...

Average Price: $495 Total Results: 23

Prices subject to availability. Happy travels! āœˆļø

šŸ”§ Customization Options

Change Scraping Platforms

Add more platforms:

Duplicate an SSH scraping node Change platform parameter: kayak → new-platform Add scraping logic in flight_scraper.py Connect to "Aggregate & Analyze Prices" node

Remove platforms:

Delete unwanted SSH node Workflow continues with remaining platforms

Modify Email Format

Edit the "Format Email Report" node:

// Change to HTML format const html = <!DOCTYPE html> <html> <body> Flight Deals Best price: ${bestDeal.currency}${bestDeal.price} </body> </html>;

return [{ json: { subject: "...", html: html, // Instead of text ...data } }];

Then update "Send Email Report" node: Change emailFormat to html Use {{$json.html}} instead of {{$json.text}}

Add More Cities/Airports

Edit "Parse & Validate Flight Request" node:

const airportCodes = { ...existing codes..., 'berlin': 'BER', 'rome': 'FCO', 'barcelona': 'BCN', // Add your cities here };

Change Timeout Settings

In each SSH node, add:

"timeout": 30000 // 30 seconds

šŸ› Troubleshooting

Issue: "No flights found"

Possible causes: Scraper script not working Website structure changed Dates in past Invalid airport codes

Solutions: Test scraper manually cd /home/oneclick-server2/ python3 flight_scraper.py JFK LHR 2025-03-25 "" one-way 1 economy kayak

Check if output shows flights If no output, check Chrome/ChromeDriver installation

Issue: "Connection refused" (SSH)

Solutions: Verify SSH credentials in n8n Check server is accessible: ssh user@your-server Verify path exists: /home/oneclick-server2/ Check Python installed: which python3

Issue: "Email not sending"

Solutions: Verify SMTP credentials Check email in spam folder For Gmail: Confirm App Password is used (not regular password) Test SMTP connection: telnet smtp.gmail.com 587 Issue: "Webhook not responding"

Solutions: Ensure workflow is Active (toggle on) Check webhook path: /webhook/flight-price-compare Test with curl command (see "How to Use" section) Check n8n logs: Settings → Log Streaming

Issue: "Scraper timing out"

Solutions: In flight_scraper.py, increase wait times time.sleep(10) # Instead of time.sleep(5)

Or increase WebDriverWait timeout WebDriverWait(driver, 30) # Instead of 20

šŸ“Š Understanding the Workflow

Node-by-Node Explanation

  1. Webhook - Receive Flight Request Entry point for all requests Accepts POST requests Path: /webhook/flight-price-compare

  2. Parse & Validate Flight Request Extracts flight details from natural language Converts city names to airport codes Validates required fields Returns helpful errors if data missing

  3. Check If Request Valid Routes to scraping if valid Routes to error response if invalid

4-7. Scrape [Platform] (4 nodes) Run in parallel for speed Each calls Python script with platform parameter Continue on failure (don't break workflow) Return pipe-delimited flight data

  1. Aggregate & Analyze Prices Collects all scraper results Parses flight data Finds best overall deal Finds best non-stop flight Calculates statistics Sorts by price

  2. Format Email Report Creates readable text report Includes route details Highlights best deal Lists top 10 results Shows statistics

  3. Send Email Report Sends formatted email to user Uses SMTP credentials

  4. Webhook Response (Success) Returns JSON response immediately Includes best price summary Confirms email sent

  5. Webhook Response (Error) Returns helpful error message Guides user on what's missing

šŸŽØ Workflow Features

āœ… Included Features

Natural Language Processing**: Understands flexible input formats Multi-Platform Comparison**: 4 major booking sites Parallel Scraping**: All platforms scraped simultaneously Error Handling**: Graceful failures, helpful messages Email Reports**: Professional format with all details Real-Time Responses**: Instant webhook feedback Sticky Notes**: Detailed documentation in workflow Airport Code Mapping**: Auto-converts 20+ cities

🚧 Not Included (Easy to Add)

Price Alerts**: Monitor price drops (add Google Sheets) Analytics Dashboard**: Track searches (add Google Sheets) SMS Notifications**: Send via Twilio Slack Integration**: Post to channels Database Logging**: Store searches in PostgreSQL Multi-Currency**: Show prices in the user's currency

šŸ’” Pro Tips

Tip 1: Speed Up Scraping

Use faster scraping service (like ScraperAPI):

// Replace SSH nodes with HTTP Request nodes { "url": "http://api.scraperapi.com", "qs": { "api_key": "YOUR_KEY", "url": "https://kayak.com/flights/..." } }

Tip 2: Cache Results

Add caching to avoid duplicate scraping:

// In Parse node, check cache first const cacheKey = ${origin}-${dest}-${departureDate}; const cached = await $cache.get(cacheKey);

if (cached && Date.now() - cached.time < 3600000) { return cached.data; // Use 1-hour cache }

Tip 3: Add More Platforms

Easy to add Momondo, CheapOair, etc.:

Add function in flight_scraper.py Add SSH node in workflow Connect to aggregator

Tip 4: Improve Date Parsing

Handle more formats:

// Add to Parse node const formats = [ 'DD/MM/YYYY', 'MM-DD-YYYY', 'YYYY.MM.DD', // Add your formats ];

0
Downloads
1
Views
7.82
Quality Score
beginner
Complexity
Author:Oneclick AI Squad(View Original →)
Created:10/26/2025
Updated:11/20/2025

šŸ”’ Please log in to import templates to n8n and favorite templates

Workflow Visualization

Loading...

Preparing workflow renderer

Comments (0)

Login to post comments