Booking.com + Telegram: instant hotel shortlists
Hotel research gets messy fast. You open Booking.com, tweak filters, copy prices into notes, lose the “good” tab, then start over when someone changes the city.
Telegram hotel shortlist automation hits event planners hardest, because decisions depend on clear options. But travel agents and busy operators booking team trips feel the same drag. You send one city message and get a clean, shareable shortlist back.
This workflow pulls listings from Booking.com, cleans the data, and formats it into a human-friendly report. You’ll see what it fixes, what you need, and how the flow works end to end.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Booking.com + Telegram: instant hotel shortlists
flowchart LR
subgraph sg0["When chat message received Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "parameters", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Chat Model2", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "check Snapshot Again", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "check if result ready", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Initiate batch extraction fr..", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Check the status of a batch ..", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "hotels", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Download the snapshot content", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "clean data", pos: "b", h: 48 }
n10@{ icon: "mdi:play-circle", form: "rounded", label: "When chat message received", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Human Friendly Results", pos: "b", h: 48 }
n13@{ icon: "mdi:wrench", form: "rounded", label: "Calculator", pos: "b", h: 48 }
n3 --> n2
n7 --> n6
n11 --> n12
n13 -.-> n12
n9 --> n11
n0 --> n5
n2 --> n7
n4 --> n8
n4 --> n3
n1 -.-> n12
n10 --> n0
n8 --> n9
n8 --> n3
n5 --> n7
n6 --> n4
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 n10 trigger
class n12 ai
class n1 aiModel
class n13 ai
class n4 decision
The Problem: Hotel Research Turns Into Tab Chaos
Finding “a few good hotels” sounds simple until it’s not. You search a city, scroll forever, open 10 listings, then try to explain the options to someone else without sounding vague. Prices are in different currencies, some listings hide fees until late, and the details you care about (location, cancellation, breakfast, star rating) get scattered across tabs and screenshots. And when the destination changes or dates shift, you repeat the whole routine. Honestly, it’s not hard work. It’s exhausting work.
It adds up fast. Here’s where it breaks down in real teams.
- You spend about 30–45 minutes per city just collecting options you can confidently share.
- Copy-paste research creates small errors, like mismatched prices or the wrong link, which then causes back-and-forth.
- Stakeholders don’t want raw search results, so you end up rewriting the same summary over and over.
- When you need “one more shortlist for another city,” you’re starting from zero instead of reusing a repeatable process.
The Solution: Telegram Message In, Curated Hotel List Out
This workflow turns hotel research into a quick chat interaction. You send a city name into an n8n chat trigger (which can be connected to Telegram), and the automation kicks off a Booking.com data pull using Bright Data’s web scraper. While the scrape runs, the workflow waits and checks status in a loop until the snapshot is ready. Once results come back, n8n downloads the data, normalizes the fields (so “price,” “rating,” and “link” don’t show up as inconsistent columns), and aggregates listings into a single batch. Then an AI agent powered by OpenRouter formats everything into a concise, human-friendly shortlist, including clean links and readable pricing.
The flow starts with a simple city input. Bright Data handles the extraction, and the workflow keeps monitoring until the snapshot is available. Finally, the AI agent summarizes and formats the shortlist so it’s ready to paste, forward, or share with a client.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you’re sourcing hotels for a two-day offsite and you need shortlists for 3 cities. Manually, it’s usually about 40 minutes per city to find, open, compare, and rewrite options, so roughly 2 hours total. With this workflow, you send 3 quick Telegram messages (maybe 1 minute each), then wait for the scrape and summary to come back. You still review the shortlist, but your “research time” drops from hours to a few minutes of oversight.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram to send the city and receive results
- Bright Data for Booking.com web scraping snapshots
- OpenRouter API key (get it from your OpenRouter dashboard)
Skill level: Intermediate. You’ll connect credentials, adjust one or two nodes, and test the chat trigger end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A city message triggers everything. A chat message is received, and the workflow maps that input into a clean “city” value it can use downstream.
The workflow starts the Booking.com extraction. Bright Data launches a batch extraction from a URL built from your city input, then the workflow splits checks into batches so it can monitor status without hammering the API.
Status checks and waiting prevent empty results. If the snapshot isn’t ready, the workflow waits, loops, and checks again. When it is ready, it retrieves the snapshot data and moves on.
AI turns raw listings into a shortlist you can send. Results are normalized, aggregated, and passed into an AI agent (via OpenRouter). A calculator tool supports price conversions or quick math, then the final text is returned in a readable format for chat.
You can easily modify search parameters to include dates or group size based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Chat Trigger
This workflow starts from a chat input, so configure the trigger to accept a city name and return the final summary.
- Add and open Chat Intake Trigger.
- Set Response Mode to
lastNodeso the chat returns the AI summary. - Connect Chat Intake Trigger to Map City Input.
Step 2: Connect Bright Data and Start Extraction
These nodes trigger the Booking.com scrape based on the city input and start the extraction workflow.
- Open Map City Input and add the assignment city with value
={{ $json.chatInput }}. - Open Start URL Extraction and set Resource to
webScrapperand Operation totriggerCollectionByUrl. - Set URLs to
=[{"url":"https://www.booking.com","location":"{{ $json.city }}","check_in":"2025-11-01T00:00:00.000Z","check_out":"2025-11-08T00:00:00.000Z","adults":2,"children":1,"rooms":1,"property_type":"Hostels","currency":"","country":""}]. - Credential Required: Connect your brightdataApi credentials in Start URL Extraction.
⚠️ Common Pitfall: The date range in Start URL Extraction is hardcoded. Update check_in and check_out before production use to avoid stale results.
Step 3: Configure Status Monitoring and Recheck Loop
These nodes loop until the snapshot is ready, then download the data.
- Open Monitor Extraction Status and set Operation to
monitorProgressSnapshotwith snapshot_id set to={{ $('Start URL Extraction').item.json.snapshot_id }}. - Credential Required: Connect your brightdataApi credentials in Monitor Extraction Status.
- Configure Result Ready Check to evaluate Left Value
={{ $json.status }}equalsready. - Ensure the "false" output of Result Ready Check goes to Delay Execution, then to Recheck Snapshot Loop and Hotel Batch Splitter as shown in the connections.
- Open Retrieve Snapshot Data and set Operation to
downloadSnapshotwith snapshot_id={{ $('Monitor Extraction Status').item.json.snapshot_id }}. - Credential Required: Connect your brightdataApi credentials in Retrieve Snapshot Data.
Step 4: Normalize and Aggregate Listings
This step standardizes the extracted data and aggregates it into a single list.
- Open Normalize Listing Fields and map fields using expressions: title
={{ $json.title }}, address={{ $json.address }}, original_price={{ $json.original_price }}, and final_price={{ $json.final_price }}. - Open Combine Listings and set Aggregate to
aggregateAllItemData. - Confirm the flow is Normalize Listing Fields → Combine Listings → Readable Hotel Summary.
Step 5: Set Up the AI Summary
These nodes generate a readable hotel summary and calculate prices in euros.
- Open Readable Hotel Summary and set Text to
={{ $json }}. - Set the system prompt in Readable Hotel Summary to
=Convert this list of hotels into a well-presented list for human display. Use the CALC tool to show prices in euros. Start the response with 'Here is the list of hotels available on Booking in the city of' followed by the name of the city. - Connect OpenRouter Chat Engine to Readable Hotel Summary as the language model.
- Credential Required: Connect your openRouterApi credentials in OpenRouter Chat Engine.
- Connect Pricing Calculator Tool as an AI tool to Readable Hotel Summary to enable the calculator in the prompt.
- Note: The Pricing Calculator Tool is a sub-node tool; add credentials only to the parent LLM node (OpenRouter Chat Engine), not the tool itself.
Step 6: Test and Activate Your Workflow
Run a full test to confirm data extraction, looping, aggregation, and AI output.
- Click Execute Workflow and enter a sample city in the chat input (for example,
Lisbon). - Verify that Start URL Extraction returns a snapshot ID and Monitor Extraction Status cycles until Result Ready Check is
ready. - Confirm Retrieve Snapshot Data outputs hotel rows and Combine Listings aggregates them into a single list.
- Check that Readable Hotel Summary returns a human-friendly list in the chat response.
- When satisfied, switch the workflow to Active to enable production use.
Common Gotchas
- Bright Data credentials can expire or need specific permissions. If things break, check your Bright Data API key and dataset access in the Bright Data dashboard 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.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes once your Bright Data and OpenRouter accounts are ready.
No. You’ll mainly connect credentials and adjust a couple of fields for your search preferences.
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 Bright Data and OpenRouter usage costs.
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 it’s the kind of change that pays off quickly. Update the “Start URL Extraction” (Initiate batch extraction from URL) node to include your check-in/check-out dates, adults, children, or property type. If you want a different style of response, edit the agent prompt used for the final “Readable Hotel Summary” so it outputs JSON, CSV, or a stricter template. Many teams also tweak the calculator prompt to standardize currency in the final shortlist.
Usually it’s an invalid or expired API key, so regenerate it in Bright Data and update the credential in n8n. It can also be a dataset permission issue (wrong scraper/dataset selected) or the extraction endpoint returning a temporary error while the job is still starting. If failures happen only on larger pulls, rate limiting is a likely culprit, so slow the polling loop and increase the Wait time.
A typical run can handle dozens of listings per city, and the practical limit depends on your Bright Data dataset settings and your n8n execution limits.
Often, yes, because this flow relies on scraping, looping until data is ready, and then doing structured formatting with an AI agent. n8n handles branching and “wait then retry” patterns cleanly, and you can self-host for more control. Zapier or Make can work, but multi-step loops and heavy data shaping tend to get awkward or expensive. If you already live in Zapier for simple tasks, it might still be fine for a lightweight version that doesn’t scrape. Talk to an automation expert if you want the fastest path to a reliable setup.
Once this is in place, hotel research stops being a mini project. You ask for a city, get a shortlist back, and move on with your day.
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.