This workflow corresponds to n8n.io template #5218 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "YhwckWo4y8FNZ4v4",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Cheapest_Flight_Finder_via_Bright_Data",
"tags": [],
"nodes": [
{
"id": "6da8e17f-3448-4195-b812-43564470d376",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-480,
2340
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6e92c67b-3e06-4de8-ac8f-f09d33bc6115",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2460,
500
],
"parameters": {
"color": 4,
"width": 1300,
"height": 320,
"content": "=======================================\n WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n - YouTube: https://www.youtube.com/@YaronBeen/videos\n - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
},
"typeVersion": 1
},
{
"id": "ffb0ba94-e697-409d-9190-1e6f8656c775",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2460,
840
],
"parameters": {
"color": 4,
"width": 1289,
"height": 2458,
"content": "# \ud83e\uddf3 \u2708\ufe0f **Flight Price Scraper from Skiplagged using Bright Data**\n\nThis automation helps you extract **cheap flight prices** from [Skiplagged.com](https://skiplagged.com) using **Bright Data** and automatically logs those prices into a **Google Sheet** for review and tracking.\n\n---\n\n## \ud83d\udd39 **SECTION 1: Getting the Flight Prices**\n\n*Combining: Manual Trigger + HTTP Request (Bright Data)*\n\n### \ud83c\udf29\ufe0f 1. **Manual Trigger**\n\n* **\ud83e\udde0 What it does**: Starts the workflow when you click **Execute Workflow** in n8n.\n* **\ud83d\udc68\u200d\ud83c\udfeb For beginners**: Think of it like a **start button**. No schedule, just run it manually whenever you want to check for deals.\n\n---\n\n### \ud83c\udf10 2. **Fetch Flight Details from Skiplagged via Bright Data**\n\n* **\ud83d\udd27 Node Type**: `HTTP Request` (POST)\n\n* **\ud83c\udf0d What's happening**:\n\n * Uses Bright Data Web Unlocker to **bypass bot protection** and fetch HTML content from Skiplagged.\n * You\u2019re sending a POST request to `https://api.brightdata.com/request`, asking Bright Data to open:\n `https://skiplagged.com/flights/DUB/LON/2024-06-30` (or a dynamic route).\n * Headers & proxy make it **look like a real browser**.\n\n* **\ud83d\udca1 Why it\u2019s useful**:\n\n * **Skiplagged is tricky to scrape** directly, but Bright Data makes it easy.\n * You get the **entire HTML** of the search results page, ready to extract price info.\n\n* \u2705 **Returns**: HTML of the page (not yet structured \u2014 we handle that next)\n\n---\n\n## \ud83d\udd39 **SECTION 2: Extracting & Storing Flight Prices**\n\n*Combining: HTML Node + Google Sheets*\n\n### \ud83d\udda5\ufe0f 3. **HTML Extract (extractHtmlContent)**\n\n* **\ud83d\udd27 Node Type**: `HTML Extract`\n\n* **\ud83c\udfaf Goal**: Pull out **all flight prices** from the raw HTML.\n\n* **How it works**:\n\n * Uses a selector like `.flights-landing__flight-price` to find every element that matches.\n * **Returns multiple values** if \"Return All Matches\" is enabled.\n\n* \ud83e\udde0 **Beginner Note**: Imagine your browser looking for all `<div class=\"flights-landing__flight-price\">`. This is like **copying all price tags off the screen**.\n\n* \u2705 **Returns**:\n\n ```json\n [\n \"$104\", \"$117\", \"$99\", \"$88\"\n ]\n ```\n\n---\n\n### \ud83d\udcca 4. **Google Sheets (append: sheet)**\n\n* **\ud83d\udd27 Node Type**: `Google Sheets Append`\n\n* **\ud83d\udccb What it does**: Appends each flight price as a new row in your spreadsheet.\n\n* **\ud83d\udee0\ufe0f Tip**: Make sure your sheet has one column titled something like `Price` and authentication is set up.\n\n* \u274c **Error Warning**: If this node is red, likely issues are:\n\n * Missing Google credentials\n * Sheet name doesn\u2019t match\n * Field mapping mismatch\n\n* \u2705 **Returns**: New rows in your sheet like:\n\n| Price |\n| ----- |\n| \\$88 |\n| \\$99 |\n| \\$104 |\n\n---\n\n## \ud83c\udf1f Final Thoughts: Why This Is Powerful\n\n\u2705 **Perfect for spontaneous travelers** who want to grab last-minute deals.\n\u2705 **Low-cost** thanks to free tools (n8n + Google Sheets) and flexible Bright Data usage.\n\u2705 **Easy to expand**: Add logic to filter cheapest flight, add Telegram/email alert, or schedule it daily.\n\n---\n\n## \ud83e\udded Next Steps You Could Add\n\n* \ud83d\udcc5 Add a **Cron node** to automate daily checks.\n* \ud83d\udcec Add **Telegram or Email node** to notify when price < \\$100.\n* \ud83d\udd27 Use **Set node** to make route and date dynamic.\n\n---\n\n\n"
},
"typeVersion": 1
},
{
"id": "3e3a26e0-eeed-4a0f-85bb-ac49e438eb43",
"name": "HTML",
"type": "n8n-nodes-base.html",
"position": [
20,
2340
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "Title",
"cssSelector": "<span class=\"flights-landing__flight-logo-txt\" data-translate=\"false\">United</span>"
},
{
"key": "Price",
"cssSelector": "<div class=\"flights-landing__flight-price\">$114</div>"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "4213760f-1d00-4d4c-b918-5b46728c78e8",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
240,
2340
],
"parameters": {
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "c1bda948-e9f0-4539-ba18-fa37ac431d91",
"name": "Fetch flight details from skiplegged via bright data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-260,
2340
],
"parameters": {
"url": "https://api.brightdata.com/request",
"method": "POST",
"options": {},
"jsonBody": "{\n \"zone\": \"n8n_unblocker\",\n \"url\": \"https://skiplagged.com/flights/NYC/LAX/2024-07-01\",\n \"country\": \"ie\",\n \"format\": \"raw\",\n \"headers\": {\n \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/0.0.0.0 Safari/537.36\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\"\n }\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "6f4009d4-bd47-4bda-a4b1-cd6bdfa59821",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-500,
1340
],
"parameters": {
"color": 3,
"width": 400,
"height": 1200,
"content": "## \ud83d\udd39 **SECTION 1: Getting the Flight Prices**\n\n*Combining: Manual Trigger + HTTP Request (Bright Data)*\n\n### \ud83c\udf29\ufe0f 1. **Manual Trigger**\n\n* **\ud83e\udde0 What it does**: Starts the workflow when you click **Execute Workflow** in n8n.\n* **\ud83d\udc68\u200d\ud83c\udfeb For beginners**: Think of it like a **start button**. No schedule, just run it manually whenever you want to check for deals.\n\n---\n\n### \ud83c\udf10 2. **Fetch Flight Details from Skiplagged via Bright Data**\n\n* **\ud83d\udd27 Node Type**: `HTTP Request` (POST)\n\n* **\ud83c\udf0d What's happening**:\n\n * Uses Bright Data Web Unlocker to **bypass bot protection** and fetch HTML content from Skiplagged.\n * You\u2019re sending a POST request to `https://api.brightdata.com/request`, asking Bright Data to open:\n `https://skiplagged.com/flights/DUB/LON/2024-06-30` (or a dynamic route).\n * Headers & proxy make it **look like a real browser**.\n\n* **\ud83d\udca1 Why it\u2019s useful**:\n\n * **Skiplagged is tricky to scrape** directly, but Bright Data makes it easy.\n * You get the **entire HTML** of the search results page, ready to extract price info.\n\n* \u2705 **Returns**: HTML of the page (not yet structured \u2014 we handle that next)\n\n---\n\n"
},
"typeVersion": 1
},
{
"id": "15115b20-c08a-4953-be0b-8e7a7f2a4030",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-20,
1080
],
"parameters": {
"color": 5,
"width": 400,
"height": 1460,
"content": "## \ud83d\udd39 **SECTION 2: Extracting & Storing Flight Prices**\n\n*Combining: HTML Node + Google Sheets*\n\n### \ud83d\udda5\ufe0f 3. **HTML Extract (extractHtmlContent)**\n\n* **\ud83d\udd27 Node Type**: `HTML Extract`\n\n* **\ud83c\udfaf Goal**: Pull out **all flight prices** from the raw HTML.\n\n* **How it works**:\n\n * Uses a selector like `.flights-landing__flight-price` to find every element that matches.\n * **Returns multiple values** if \"Return All Matches\" is enabled.\n\n* \ud83e\udde0 **Beginner Note**: Imagine your browser looking for all `<div class=\"flights-landing__flight-price\">`. This is like **copying all price tags off the screen**.\n\n* \u2705 **Returns**:\n\n ```json\n [\n \"$104\", \"$117\", \"$99\", \"$88\"\n ]\n ```\n\n---\n\n### \ud83d\udcca 4. **Google Sheets (append: sheet)**\n\n* **\ud83d\udd27 Node Type**: `Google Sheets Append`\n\n* **\ud83d\udccb What it does**: Appends each flight price as a new row in your spreadsheet.\n\n* **\ud83d\udee0\ufe0f Tip**: Make sure your sheet has one column titled something like `Price` and authentication is set up.\n\n* \u274c **Error Warning**: If this node is red, likely issues are:\n\n * Missing Google credentials\n * Sheet name doesn\u2019t match\n * Field mapping mismatch\n\n* \u2705 **Returns**: New rows in your sheet like:\n\n| Price |\n| ----- |\n| \\$88 |\n| \\$99 |\n| \\$104 |\n\n---\n"
},
"typeVersion": 1
},
{
"id": "b151fc17-d628-4e38-a5e7-91b2555b8e1f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
460,
1080
],
"parameters": {
"color": 7,
"width": 380,
"height": 240,
"content": "## I\u2019ll receive a tiny commission if you join Bright Data through this link\u2014thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "d966578d-4e22-4067-b7b6-1b310276ba5a",
"connections": {
"HTML": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger": {
"main": [
[
{
"node": "Fetch flight details from skiplegged via bright data",
"type": "main",
"index": 0
}
]
]
},
"Fetch flight details from skiplegged via bright data": {
"main": [
[
{
"node": "HTML",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically searches multiple flight booking websites to find the cheapest flights for your desired routes. It leverages web scraping to compare prices across platforms, helping you save money on air travel.
Source: https://n8n.io/workflows/5218/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This guide will walk you through setting up your n8n workflow. By the end, you'll have a fully automated system for managing your recruitment pipeline.
Batch_Call. Uses googleDrive, httpRequest, stopAndError, googleSheets. Event-driven trigger; 28 nodes.
This n8n workflow automatically generates TikTok/Reels-ready talking head videos from scratch. You provide a topic and intention, and the workflow handles everything: scriptwriting, avatar generation,
This template is only compatible with a self-hosted n8n instance using a community node.
Intelligent Source Routing - Uses a Switch node to route URLs to specialized extractors based on source identifier, enabling custom CSS selectors per publisher for maximum accuracy Universal Fallback