Amadeus to WhatsApp, hotel rate moves explained
Your comp set moves, your pickup shifts, and suddenly you’re staring at three tabs, two spreadsheets, and a “why did this happen?” message from leadership. The worst part is not the rate change. It’s the scramble to explain it.
This hits Revenue Managers first, but GMs and Sales leads feel it fast too. With Amadeus WhatsApp alerts, you get decision-ready briefs in WhatsApp, plus a way to ask follow-up questions without opening a dashboard.
Below, you’ll see how the workflow watches competitor rates, checks event context, writes an executive summary, and then turns WhatsApp into your “on-demand analyst” for pricing calls.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Amadeus to WhatsApp, hotel rate moves explained
flowchart LR
subgraph sg0["Daily Market Check Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Generate 30 night windows"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Amadeus OAuth"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Amadeus Hotel Offers"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prev Snapshot"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>New Snapshot"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Compute Change"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Significant Competitor Change", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Get Our Hotel Rates", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prefix Our Hotel Fields", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build VCC URLs"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch VCC Month HTML"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Events Extract"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine 30-Day Rates"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Get Prev Rates", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Upsert Latest Rates", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Insert History Rates", pos: "b", h: 48 }
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine New Rates vs Prev Ra.."]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine Competitor Rates vs .."]
n19@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare AI Agent Input"]
n24@{ icon: "mdi:cog", form: "rounded", label: "Upsert Hotel Price Alerts", pos: "b", h: 48 }
n29["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine Rates & Events"]
n30["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Combine Summary & Alert"]
n32@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: Analyze", pos: "b", h: 48 }
n33@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n34@{ icon: "mdi:play-circle", form: "rounded", label: "Daily Market Check", pos: "b", h: 48 }
n35["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Extract Event Details"]
n36["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Clean Amadeus Data"]
n37["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Send WhatsApp Alert"]
n0 --> n2
n5 --> n17
n5 --> n14
n2 --> n1
n4 --> n17
n10 --> n11
n6 --> n7
n12 --> n29
n14 --> n4
n32 --> n37
n32 --> n30
n33 -.-> n32
n36 --> n5
n34 --> n0
n8 --> n9
n3 --> n13
n13 --> n36
n11 --> n35
n35 --> n12
n29 --> n21
n21 --> n32
n21 --> n30
n30 --> n24
n9 --> n18
n19 -.-> n32
n1 --> n13
n1 --> n3
n7 --> n8
n7 --> n18
n17 --> n15
n17 --> n6
n17 --> n16
n18 --> n10
n18 --> n29
end
subgraph sg1["WhatsApp Flow"]
direction LR
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Normalize Whatsapp Input", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Get Hotel_Rates_History", pos: "b", h: 48 }
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>WhatsApp Trigger"]
n25@{ icon: "mdi:cog", form: "rounded", label: "Get Alert Summary", pos: "b", h: 48 }
n26["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/whatsapp.svg' width='40' height='40' /></div><br/>Q&A"]
n27@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: Q&A", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n31@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n38@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Text Messages", pos: "b", h: 48 }
n27 --> n26
n31 -.-> n27
n23 --> n38
n25 --> n27
n28 -.-> n27
n38 --> n20
n22 -.-> n27
n20 --> n25
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n34,n23 trigger
class n19,n32,n27 ai
class n33,n28 aiModel
class n31 ai
class n7,n38 decision
class n2,n3,n11 api
class n1,n4,n5,n6,n10,n12,n21,n36 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n4,n5,n6,n10,n11,n12,n13,n17,n18,n21,n29,n30,n35,n36,n37,n23,n26 customIcon
The Problem: Competitor moves show up late (and without context)
Rate shopping sounds simple until you do it every day. You check Amadeus, compare a handful of hotels, note which dates moved, and then try to figure out if it’s real demand or just noise. Meanwhile, the market doesn’t wait. A concert announcement, a convention calendar update, or one aggressive competitor can reshape your next 30 nights before your morning coffee is done. And if you miss the move, you’re reacting, not pricing.
It adds up fast. Here’s where the friction usually turns into real cost.
- Manual rate checks eat about 1–2 hours a day once you include notes, screenshots, and “sanity checks.”
- You see the price change, but not the reason, so your pricing call becomes guesswork and debate.
- Spreadsheets drift, which means your “latest” snapshot often isn’t actually the latest.
- Leadership wants an executive summary, and you end up rewriting the same explanation over and over.
The Solution: Hourly market checks that brief you in WhatsApp
This workflow runs on a schedule and pulls hotel offers from Amadeus for your hotel and your competitor set across a forward-looking window (commonly 30 days). It turns that raw pricing into a clean “current snapshot,” then compares it against the prior snapshot stored in your database, so you’re not eyeballing changes manually. When it detects a significant competitor move, it doesn’t stop at the number. It also scrapes your local event source (like a convention center calendar), extracts event metadata, and merges that context into the analysis. Finally, an AI Agent reviews the gaps, competitor behavior, and event signals, then writes a clear executive summary and sends it straight to WhatsApp.
There’s a second branch too. When someone replies in WhatsApp with a question, the bot retrieves saved summaries, historical rates, and event schedules, then answers like an analyst who remembers what happened last week.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 1 property plus 6 competitors across the next 30 nights. Manually, even a “quick” check is maybe 10 minutes per hotel once you log changes and write a recap, which is about 70 minutes a day. With this workflow, you spend about 5 minutes setting the comp set once, then you only get pinged when a move crosses your threshold; the WhatsApp brief arrives automatically, and follow-up questions happen in the same chat. Most teams get an hour back on quiet days, and much more when the market is volatile.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Amadeus to fetch hotel offers and rates.
- WhatsApp to deliver briefs and handle Q&A.
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, set parameters, and lightly adjust an event-scraping source.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled market check kicks it off. n8n runs hourly (or a few times per day) and uses Amadeus authentication to pull rates for your hotel and your competitor list across a forward window like 30 days.
Snapshots are generated and compared. The workflow normalizes the Amadeus response, builds a “current snapshot,” retrieves the last saved snapshot from storage, then calculates rate changes and the size of the gap for the exact dates that matter.
Only meaningful moves turn into alerts. An “is this significant?” check filters noise based on your sensitivity settings. When it qualifies, the workflow merges competitor rates with your own rates, then pulls event pages and extracts event metadata so the alert includes plausible demand drivers.
WhatsApp becomes the briefing channel (and the analyst desk). An AI Agent writes a concise executive summary and dispatches it via WhatsApp. Later, if someone replies with a question, the WhatsApp trigger retrieves stored history and summaries, and the assistant responds with context instead of generic advice.
You can easily modify the monitoring window (like 14 vs 30 days) and the significance threshold to match your market and your tolerance for alerts. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow runs scheduled market checks multiple times per day to capture rate changes.
- Add and open Scheduled Market Check.
- Set the schedule cronExpression rules to
0 0 9 * * *,0 0 15 * * *, and0 0 21 * * *. - Confirm that Scheduled Market Check outputs to Setup Parameters.
Step 2: Configure the WhatsApp Trigger
This path lets stakeholders ask questions via WhatsApp and receive analysis summaries.
- Add and open WhatsApp Incoming Trigger.
- Credential Required: Connect your whatsAppTriggerApi credentials.
- Set Updates to include
messages. - Ensure WhatsApp Incoming Trigger flows to Filter Incoming Texts.
[YOUR_ID]. Replace this placeholder with your WhatsApp sender ID.Step 3: Connect Amadeus and Build the 30-Night Windows
This section configures the parameters, authenticates to Amadeus, and generates hotel/date windows used for pricing checks.
- Open Setup Parameters and set: currency to
CAD, adults to2, roomQuantity to1, thresholdPct to0.1, and daysAhead to30. - Set competitors to
[{ "name": "VANCOUVER MARRIOTT PINNACLE", "hotelId": "MCYVRDTM" }]and ourHotel to{ "name": "WESTIN BAYSHORE VANCOUVER", "hotelId": "WIYVRBAY" }. - Open Amadeus Auth Token and provide client_id and client_secret in the form body for the Amadeus API.
- Confirm Amadeus Auth Token outputs to Create 30-Night Windows.
- Verify Create 30-Night Windows uses
$('Setup Parameters').first().jsonand$('Amadeus Auth Token').first().json.access_tokenas in the code.
Step 4: Retrieve and Normalize Hotel Offers
This path retrieves offers from Amadeus, normalizes the results, and builds the current snapshot.
- Open Retrieve Hotel Offers and confirm query values use expressions like
{{$json.checkInDate}},{{$json.checkOutDate}}, and{{$json.currency}}. - Ensure the Authorization header is
Bearer {{$json.access_token}}. - Verify Create 30-Night Windows outputs to both Merge 30-Day Rates and Retrieve Hotel Offers in parallel.
- Confirm Merge 30-Day Rates flows into Normalize Amadeus Data, then into Generate Current Snapshot.
Step 5: Manage Rate Snapshots and Significant Changes
These nodes compare current and prior rates, calculate changes, and decide when to alert.
- Check that Generate Current Snapshot outputs to both Merge New vs Prior Rates and Fetch Prior Rates in parallel.
- Confirm Fetch Prior Rates filters by
{{$json.rateKey}}and feeds Previous Snapshot Map. - Verify Merge New vs Prior Rates outputs to Update Latest Rates, Calculate Rate Change, and Insert Rate History in parallel.
- Open Check Significant Competitor and confirm conditions use expressions for
{{$json.hotelRole}},{{$json.isSignificant}},{{$json.prevExists}}, and{{$json.outcome}}.
Step 6: Merge Competitor, Our Rates, and Event Context
This step merges competitor changes with your hotel’s rates and enriches the alert with VCC event context.
- Confirm Check Significant Competitor outputs to both Fetch Our Hotel Rates and Merge Competitor & Our Rates in parallel.
- In Fetch Our Hotel Rates, verify the rateKey filter uses
{{$node["Setup Parameters"].json.ourHotel.hotelId}}|{{$json.checkInDate}}. - Ensure Label Our Hotel Fields maps fields like
{{$json.bestTotal}}to ourHotelBestTotal. - Verify Merge Competitor & Our Rates outputs to both Assemble VCC URLs and Merge Rates with Events in parallel.
- Open Get VCC Month HTML and ensure the URL uses
{{$json.vccUrl}}, then flow into Extract Event Metadata and Parse Event Items.
Step 7: Set Up AI Analysis and Q&A
AI nodes generate structured analysis and allow follow-up questions over WhatsApp.
- Open AI Analyst Agent and keep the input expression
{{ "Analyze this JSON bundle and return ONLY valid JSON in the required schema.\n\nINPUT:\n" + JSON.stringify($json) }}. - Credential Required: Connect your openAiApi credentials in OpenAI Chat Model A (language model for AI Analyst Agent).
- Ensure Structured Output Decoder is attached as the output parser for AI Analyst Agent; add credentials to OpenAI Chat Model A, not the parser.
- Open AI Assistant Q&A and keep the input
{{ $('Normalize WhatsApp Text').item.json.chatInput }}. - Credential Required: Connect your openAiApi credentials in OpenAI Chat Model B (language model for AI Assistant Q&A).
- Confirm Conversation Memory and Retrieve Rate History are connected to AI Assistant Q&A; add credentials on the parent model node, not these tools.
Step 8: Configure Output and Alerts
This step sends alerts and stores the executive summary for future Q&A.
- Ensure AI Analyst Agent outputs to both Dispatch WhatsApp Alert and Merge Summary and Alert in parallel.
- Credential Required: Connect your whatsAppApi credentials in Dispatch WhatsApp Alert and Send Q&A Response.
- In Dispatch WhatsApp Alert, set textBody to
{{ $json.output.executiveSummary }}, and replace[YOUR_ID]/[YOUR_PHONE]. - In Send Q&A Response, set textBody to
{{ $json.output }}and replace[YOUR_ID]/[YOUR_PHONE]. - Check Upsert Price Alerts maps
{{ $json.output.executiveSummary }}and{{ $json.vccEventsSummary }}into the Hotel_Price_Alert table.
Step 9: Test and Activate Your Workflow
Validate both the scheduled pricing run and the WhatsApp Q&A path before enabling automation.
- Manually execute Scheduled Market Check to trigger the full pricing intelligence chain.
- Confirm successful execution produces rows in Update Latest Rates and Insert Rate History, and that Dispatch WhatsApp Alert sends a message.
- Send a test WhatsApp message to the connected number and verify Send Q&A Response returns a reply from AI Assistant Q&A.
- When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- Amadeus credentials can expire or need specific permissions. If things break, check your Amadeus app/client credentials and token response first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- WhatsApp message templates and sender permissions can block delivery. If alerts stop arriving, check your WhatsApp Business approval status and recent message logs inside n8n.
Frequently Asked Questions
About 60–90 minutes if you already have credentials and a WhatsApp sender set up.
No. You’ll mostly connect accounts and edit a few config values. The only “techy” part is adjusting the event source scraper, and you can copy the existing pattern.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API usage (often a few cents per day for brief summaries) and any WhatsApp messaging fees.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and that’s one of the best tweaks to make early. Update the Config node to change the daysAhead window (like 14 instead of 30), then adjust the Significant Competitor Change logic so alerts only fire when moves are meaningful for your market. You can also swap the event scraping nodes (the VCC fetch and parse parts) to point at your local events site, a tourism board calendar, or even an internal Google Sheet of events.
Most of the time it’s an expired or mis-scoped token from the Amadeus Auth Token request. Regenerate your Amadeus credentials, confirm the token call succeeds in n8n, then re-run the Retrieve Hotel Offers request. If it still fails, check rate limits and confirm your hotel IDs match what Amadeus expects. Finally, make sure your server clock is correct, because OAuth-style token validation can be picky about time drift.
A lot, as long as your Amadeus limits and your hosting can keep up.
Often, yes, frankly. This workflow does more than pass data from A to B: it builds snapshots, compares history, merges multiple sources (rates plus events), and then runs two AI agents (one for proactive summaries, one for Q&A). n8n is a better fit for that kind of branching logic and “store + retrieve + reason” pattern, especially if you self-host and run hourly checks without worrying about per-task costs. Zapier or Make can still work if you only need a basic alert on a single condition and you don’t care about history. If you’re unsure, Talk to an automation expert and describe your comp set size and alert cadence.
You get the move, the context, and a recommendation in the same place your team already communicates. Set it up once, then let the market explain itself.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.