This workflow follows the Gmail → 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 →
{
"nodes": [
{
"id": "4fe13927-84cb-4227-9daa-d6cef72d10b9",
"name": "CarrierNameLookup",
"type": "n8n-nodes-base.code",
"position": [
740,
320
],
"parameters": {
"jsCode": "var carrierCodes={}\nJSON.parse($('Get Carrier Codes').first().json.data).data.forEach(datum=>{\n carrierCodes[datum.iataCode] = {icao:datum.icaoCode, name:datum.commonName}\n})\nreturn carrierCodes"
},
"typeVersion": 2
},
{
"id": "cb0ab93c-5fc5-402d-8ac9-672960b14112",
"name": "Gmail",
"type": "n8n-nodes-base.gmail",
"position": [
2080,
400
],
"parameters": {
"message": "=Hi! We just found a bargain flight:\nDeparture Time: {{ $json.time }}\n[{{ $json.legs[0].carrier }}] {{ $json.duration }} flight from {{ $('FromTo').first().json.from }} to {{ $('FromTo').first().json.to }}\n",
"options": {},
"subject": "=Bargain Flight Found! {{ $('FromTo').first().json.from }} -> {{ $('FromTo').first().json.to }} @ {{ $json.price }} on {{ $json.time }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "2f98b3e2-8a25-496e-89f3-b1ebe7e33192",
"name": "Get Dates",
"type": "n8n-nodes-base.code",
"position": [
940,
300
],
"parameters": {
"jsCode": "const getNextSevenDays = () => {\n const dates = [];\n const today = new Date();\n\n for (const i of [7, 14]) {\n const nextDate = new Date(today);\n nextDate.setDate(today.getDate() + i);\n \n // Format the date as YYYY-MM-DD\n const formattedDate = nextDate.toISOString().split('T')[0];\n dates.push({date:formattedDate});\n }\n\n return dates;\n};\n\nreturn getNextSevenDays()"
},
"typeVersion": 2
},
{
"id": "3d8cf3fa-6ce7-422a-978f-afe2884c1e1a",
"name": "Merge & Extract",
"type": "n8n-nodes-base.code",
"position": [
1660,
400
],
"parameters": {
"jsCode": "//Merge\nresult = []\nfor (const item of $input.all()) {\n result = result.concat(JSON.parse(item.json.data).data)\n}\n\n//Extract data fields\nfinal_result = []\nfor (x of result){\n let legs = x.itineraries[0].segments.map(y=>{\n let a = $('CarrierNameLookup').item.json[y.carrierCode];\n let carrier = a.name? a.name: a.icao;\n return {carrier:carrier, duration:y.duration}})\n\n\n console.log(x.itineraries[0].segments[0].departure.at)\n let duration = x.itineraries[0].duration\n let price = x.price.total+' '+x.price.currency\n\n final_result.push({legs:legs, time:x.itineraries[0].segments[0].departure.at, duration:duration, price:price})\n}\n\nreturn final_result"
},
"typeVersion": 2
},
{
"id": "89df1c9b-c863-4cf5-88a2-18793d542f02",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1200,
240
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "5595e34d-3736-42f6-ad64-e7f3c72c7f0a",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
1060,
440
],
"parameters": {
"amount": 3
},
"typeVersion": 1.1
},
{
"id": "550005ad-ea97-4d83-90ac-67c7c583f2dc",
"name": "Under Price",
"type": "n8n-nodes-base.filter",
"position": [
1880,
400
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "bc2a9b61-41eb-45b1-9ee3-00fe211dadc3",
"operator": {
"type": "number",
"operation": "lt"
},
"leftValue": "={{ parseFloat($json.price) }}",
"rightValue": 600
}
]
}
},
"typeVersion": 2.1
},
{
"id": "ce1beef1-4189-4cd7-b8c6-dd5bef2d9963",
"name": "FromTo",
"type": "n8n-nodes-base.set",
"position": [
560,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1944c696-6cfd-4d4d-8f3d-31cb89b37d3d",
"name": "from",
"type": "string",
"value": "LHR"
},
{
"id": "9c4d5ac9-fa75-4fa7-a369-2b0493150203",
"name": "to",
"type": "string",
"value": "JFK"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a4956257-28ce-4014-b549-ad413264c012",
"name": "Amadeus Flight Search",
"type": "n8n-nodes-base.httpRequest",
"position": [
1340,
440
],
"parameters": {
"url": "https://test.api.amadeus.com/v2/shopping/flight-offers",
"options": {},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "oAuth2Api",
"queryParameters": {
"parameters": [
{
"name": "originLocationCode",
"value": "={{ $('FromTo').item.json.from }}"
},
{
"name": "destinationLocationCode",
"value": "={{ $('FromTo').item.json.to }}"
},
{
"name": "adults",
"value": "1"
},
{
"name": "departureDate",
"value": "={{ $json.date }}"
}
]
}
},
"credentials": {
"oAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "b7a41d45-799d-4f65-a904-f8fa82e59620",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
260,
-320
],
"parameters": {
"width": 490.02125360646824,
"height": 538.1571460797832,
"content": "# Amadeus Flight Bargains\nEvery day checks for bargain flights for an itinerary and price target of your choosing, and emails you if it finds a match.\n\n## Setup\n1. Create an api account on https://developers.amadeus.com/\n2. In **Amadeus Flight Search**, connect to Oauth2 API:\n -- Grant Type - Client Credentials\n -- Access Token URL - https://test.api.amadeus.com/v1/security/oauth2/token\n -- Client ID/Secret - from your account\n3. Set your details in **Gmail**\n4. Set your desired Origin/Destination airports in FromTo\n5. Set the dates ahead you wish to search in **Get Dates** (default is 7 days and 14 days)\n6. Set the price target in **Under Price**\n\n## Test\nHit 'Test workflow'!"
},
"typeVersion": 1
},
{
"id": "88126395-c96a-4905-87db-57ad19cead23",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
360,
320
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "0fa74451-6053-470c-b5c5-9b25fd2e5b55",
"name": "Get Carrier Codes",
"type": "n8n-nodes-base.httpRequest",
"position": [
360,
600
],
"parameters": {
"url": "https://test.api.amadeus.com/v1/reference-data/airlines",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "oAuth2Api"
},
"credentials": {
"oAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
}
],
"connections": {
"Wait": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"FromTo": {
"main": [
[
{
"node": "CarrierNameLookup",
"type": "main",
"index": 0
}
]
]
},
"Get Dates": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Under Price": {
"main": [
[
{
"node": "Gmail",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Merge & Extract",
"type": "main",
"index": 0
}
],
[
{
"node": "Amadeus Flight Search",
"type": "main",
"index": 0
}
]
]
},
"Merge & Extract": {
"main": [
[
{
"node": "Under Price",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "FromTo",
"type": "main",
"index": 0
}
]
]
},
"CarrierNameLookup": {
"main": [
[
{
"node": "Get Dates",
"type": "main",
"index": 0
}
]
]
},
"Amadeus Flight Search": {
"main": [
[
{
"node": "Wait",
"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.
gmailOAuth2oAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow automates the monitoring of carrier email notifications for parcel deliveries, extracting key details like sender, dates, and pricing to evaluate offers without constant manual checking. It's ideal for logistics managers or e-commerce operators handling high shipment volumes who need to quickly identify cost-effective carriers. The core step involves looping through incoming Gmail messages, applying filters to select those under a specified price threshold, and pausing execution until new batches arrive via scheduled triggers, integrating seamlessly with HTTP requests for any external data pulls.
Use this workflow when you receive regular carrier updates via Gmail and want to automate price comparisons to streamline procurement decisions, especially in repetitive supply chain tasks. Avoid it for one-off shipments or non-email-based notifications, as the cron scheduling suits ongoing monitoring rather than ad-hoc needs. Common variations include adjusting the price filter for different thresholds or adding HTTP requests to fetch real-time carrier rates for more dynamic evaluations.
About this workflow
Wait Code. Uses gmail, splitInBatches, httpRequest, stickyNote. Scheduled trigger; 12 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
14310 Send Overdue Invoice Payment Reminders With Ifirma Gmail Postgrid And Slack. Uses httpRequest, stopAndError, slack, gmail. Scheduled trigger; 53 nodes.
Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.
Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.
Instead of providing a routine check, it focuses on significant movements by: Sending a Slack alert only if a query crosses a defined movement threshold. Emailing a structured report with the Top 25 i