---
title: "Trip plan email with flights, hotels and activities"
kind: "Kit"
category: "Productivity"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/580b6445-fbf5-4d53-9074-0c20d9a2c56f"
updated: "2026-11-09"
---

# Trip plan email with flights, hotels and activities

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow that answers a web request with a trip plan by email. Claude finds the airport codes and researches things to do, SerpApi searches Google Flights and Google Hotels, and Gmail sends the HTML plan.

Trip plan email with flights, hotels and activities is an n8n workflow in the Productivity category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-09. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow answers a web request with a travel plan by email. Another app posts the two cities, the dates, the number of travelers and the kind of activities wanted. Claude turns the cities into airport codes and researches activities on the web. SerpApi then finds hotels on Google Hotels and flights on Google Flights. Claude writes an HTML email around two flights, three hotels and three activities, Gmail sends it, and the caller gets a confirmation. Fourteen nodes run it.

### Who it suits

Small travel agencies and trip planners who want a first draft for a client, and builders of voice or chat assistants who need a trip tool to call. Its reply is shaped for a voice agent’s end-call tool. Skip it if you want bookings made. It books nothing. The hotels and activities come as links, and the flights as plain lines with a price.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Travel agencies | Agents who answer trip requests | Call it from the request form and read the plan before it goes to the client | An agent gets a Lisbon plan in the inbox and adds the hotel the client asked about. |
| Voice assistants | Builders of phone or web voice agents | Point the agent’s tool at the webhook and let it end the call on the reply | A caller asks for a week in Rome, and the agent says the plan is on its way. |
| Company travel | Office managers | Send each traveler their own plan by putting the request’s email in Send to | A manager plans a team’s trip to a conference, and each person gets the email. |
| Travel writing | Bloggers | Run a few city pairs to collect hotel and activity ideas | A blogger compares three weekend trips from Chicago before writing about them. |

You need a little n8n: importing a file, adding three credentials and sending a POST request. Its author puts setup at about 13 minutes.

### Where to use it

Any n8n that can reach Anthropic, SerpApi and Gmail will run it, and anything that can send JSON can start it.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps
- A voice agent: give its tool the webhook’s production address
- A form or another workflow: post the seven fields from there

### How to set it up

Get it saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| Anthropic | An API key, with web search on for \`Activities\` |
| SerpApi | An account and its API key, for the flight and hotel searches |
| Gmail | An account to send the plans from |
| A caller | Anything that can POST a JSON body: another workflow, a form tool, a voice agent or curl |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add an Anthropic credential and select it in `Anthropic Chat Model`, `Anthropic Chat Model1` and `Activities`.
3. Add a Query Auth credential for SerpApi, with `api_key` as the name and your key as the value. Select it in `Flights` and `Resorts`.
4. Add a Gmail OAuth2 credential in `Send Plan` and replace `YOUR_EMAIL` with the inbox for the plans. To mail each traveler, put `{{ $('Set Fields').item.json.email }}` there.
5. In the system message of `Email Agent`, replace `YOUR_TEAM_NAME` with the name to sign with.
6. Save, send the request below to the test address of `Webhook`, then publish and use the production address.

The webhook takes a POST at the path `travel`. Spell the departure date `depature_date`, as the file does, or that field arrives empty:

```json
{
  "origin": "Chicago",
  "destination": "Lisbon",
  "depature_date": "2026-12-12",
  "return_date": "2026-12-19",
  "travelers": 2,
  "activities": "food tours and day trips",
  "email": "you@example.com"
}
```

### How to use it

Send the request to the webhook. The caller then waits. The answer comes only after the email is out, so Claude and both searches run first. Read the first plans in your own inbox before you point Send to at travelers.

What to change for a different result

| To change | Where |
| --- | --- |
| Sections, tone and length | The system message of \`Email Agent\`, which asks for a line after each section and at most 1,000 words |
| How many results the email names | The text of \`Email Agent\`, which lists flights \`\[0\]\` and \`\[1\]\` and hotels and activities \`\[0\]\` to \`\[2\]\` |
| Hotel order | \`sort\_by\` in \`Resorts\`: \`3\` lowest price, \`8\` highest rating, \`13\` most reviewed |
| Activity research | The prompt of \`Activities\` and its limit of five searches |
| Model | \`claude-sonnet-5-5\` in the two chat models and in \`Activities\` |

### Example

The request above goes in. `Airport Codes & Dates` answers in its parser’s shape, with Claude choosing the airports:

```json
{
  "origin": "ORD",
  "destination": "LIS",
  "departure": "2026-12-12",
  "return": "2026-12-19"
}
```

The email’s subject names the dates and Lisbon. Its body opens with a short welcome, then lists the two flights with airline, time, duration and price. The hotels follow with links and pictures, then the activities with links. The caller receives this, cut short here, with the subject at the end of `description`:

```json
{
  "type": "system",
  "name": "end_call",
  "description": "An email has been sent with the travel plan for: …",
  "response_timeout_secs": 20
}
```

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. A webhook is an address that starts the workflow when something posts to it. Send the test request first. Then open each node in the run to see what it received and what it sent.

**For experts.** Three Claude steps share the work. Only the last writes for a reader.

The three Claude steps

| Node | Kind | What to know |
| --- | --- | --- |
| \`Airport Codes \& Dates\` | A chain with a parser | Gets the current time, so it can move dates that lie in the past |
| \`Activities\` | Anthropic’s own node with web search | Up to five searches and 4,000 tokens. Its JSON answer is never read |
| \`Email Agent\` | An agent with a parser and no tools | Gets a fixed text built from the searches and returns \`subject\` and \`emailBody\` |

The file named `claude-sonnet-4-20250514` in all three. Anthropic’s deprecations page, read on 2 November 2026, lists it as retired on 15 June 2026, so the copy here uses `claude-sonnet-5-5`, the replacement it names.

### Good to know

Three gaps in the prompt text change what the email says.

- Nightly rates: the first two hotels show the third hotel’s rate, because their lines read \`properties\[2\]\`. Change them to \`\[0\]\` and \`\[1\]\`
- Activities: \`Email Agent\` reads them from the raw search results, and their description is an encrypted string, so Claude writes it from the title
- Fewer results fail: a search with fewer than two flights or three hotels stops the run at \`Email Agent\`, and no email goes out
- One leg only: each flight shows its first leg, so a connection’s second leg is missing
- Billing: Anthropic bills three Claude calls and each web search, and SerpApi counts two searches a run
- Open address: once it is published, anyone with the webhook’s address can start a run on your keys, so add Header Auth if others could find it
- Your data: the cities, dates and wishes go to Anthropic and SerpApi, and the plan goes through Gmail
- Credentials: the JSON holds none, and no personal address or brand name from its author

## README

````markdown
# Trip plan email with flights, hotels and activities

An n8n workflow that answers one web request with a travel plan by email. Another app, a form or a voice agent posts the
cities, the dates, the number of travelers and the kind of things to do. Claude turns the cities into airport codes,
searches the web for activities, and SerpApi finds flights on Google Flights and hotels on Google Hotels. Claude then
writes an HTML email with the three lists, Gmail sends it, and the request gets a one-line confirmation back.

## What is inside

- `workflow.json`: the workflow as n8n exports it, fourteen nodes and no sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- `Send Plan` sent every plan to one personal address. It now sends to `YOUR_EMAIL`.
- The email prompt signed off with a travel brand's name. It now says `YOUR_TEAM_NAME`.
- All three Claude steps named `claude-sonnet-4-20250514`. Anthropic's deprecations page, read on 2 November 2026, lists
  that model as retired on 15 June 2026, so requests to it fail. They now use `claude-sonnet-5-5`, the replacement that
  page names.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- An Anthropic API key. `Activities` uses Claude's web search, which is on unless an admin turned it off in the Claude
  Console.
- A SerpApi account and its API key.
- A Gmail account to send from.
- Something that can send a POST request with a JSON body: another workflow, a form tool, a voice agent or `curl`.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add an Anthropic credential and select it in `Anthropic Chat Model`, `Anthropic Chat Model1` and `Activities`.
3. Add a Query Auth credential for SerpApi: the parameter name is `api_key` and the value is your key. Select it in
   `Flights` and `Resorts`.
4. Add a Gmail OAuth2 credential and select it in `Send Plan`. Replace `YOUR_EMAIL` in Send to with the inbox for the
   plans. To mail each traveler instead, put `{{ $('Set Fields').item.json.email }}` there.
5. In the system message of `Email Agent`, replace `YOUR_TEAM_NAME` with the name the email should be signed with.
6. Save. Copy the test address from `Webhook`, send it the request below, then publish the workflow and use its
   production address.

## The request

`Webhook` takes a POST at the path `travel`. `Set Fields` reads these fields from the JSON body. Spell the departure date
`depature_date`, as the file does, or that field arrives empty.

```json
{
  "origin": "Chicago",
  "destination": "Lisbon",
  "depature_date": "2026-12-12",
  "return_date": "2026-12-19",
  "travelers": 2,
  "activities": "food tours and day trips",
  "email": "you@example.com"
}
```

The answer comes back as JSON once the email is out. Its `description` holds the sentence from `Response`, and the rest
of it looks like the settings of a voice agent's end-call tool, so a voice agent can read the result and hang up.

## How a run goes

1. `Set Fields` takes the seven values out of the request body.
2. `Airport Codes & Dates` has Claude turn both cities into airport codes and check that the dates lie in the future,
   against the current time. `Locations & Dates` holds its answer to `origin`, `destination`, `departure` and `return`.
3. `Activities` asks Claude to research things to do of the requested kind at the destination, with up to five web
   searches.
4. `Resorts` searches Google Hotels through SerpApi for the destination, the dates and the number of adults, sorted by
   highest rating.
5. `Flights` searches Google Flights through SerpApi between the two airport codes on those dates.
6. `Email Agent` receives two flights, three hotels and three activities in a fixed text and writes the email as HTML
   in four parts: an introduction, flights, hotels and activities. `Subject & Email` holds its answer to `subject` and
   `emailBody`.
7. `Send Plan` sends it as an HTML email, `Response` writes the confirmation sentence and `Respond to Webhook` returns it.

## Change the look

- Sections, tone and length: the system message of `Email Agent`. It asks for a horizontal line after each section,
  hotel pictures at a fifth of the width and no more than 1,000 words.
- How many results the email names: the text of `Email Agent`, which lists flights `[0]` and `[1]`, and hotels and
  activities `[0]` to `[2]`.
- Hotel order: `sort_by` in `Resorts`. SerpApi's Google Hotels documentation gives `3` for lowest price,
  `8` for highest rating and `13` for most reviewed.
- Activity research: the prompt of `Activities`, and its search limit of 5.
- Model: `claude-sonnet-5-5` in `Anthropic Chat Model`, `Anthropic Chat Model1` and `Activities`.

## Good to know

- Nightly rates: the first and second hotels show the third hotel's rate per night and total, because their lines in
  the `Email Agent` text read `properties[2]`. Change those two to `properties[0]` and `properties[1]`.
- Activities: `Email Agent` reads them from the raw search results in `content[1]` of the `Activities` answer, which
  holds them only when Claude searches before it writes any text. Their description is the search result's
  `encrypted_content`, an encrypted string, so Claude writes the descriptions from the titles. The JSON list the
  `Activities` prompt asks for is never read.
- Fewer results fail: the text expects two flights, three hotels with two nearby places each and three activities. A
  search that returns fewer stops the run at `Email Agent`, and no email goes out.
- One leg only: each flight line reads `flights[0]`, so the second leg of a connection is left out.
- The request's `email` is read but not used until you change Send to (step 4).
- Billing: Anthropic bills three Claude calls and each web search, and SerpApi counts two searches a run.
- Open address: once the workflow is published, anyone with the webhook's address can start a run on your keys. Add
  Header Auth in the `Webhook` node's Authentication if others could find it.
- Your data: the cities, dates and activity wishes go to Anthropic and SerpApi, and the plan goes through Gmail.
- Credentials: the JSON holds none, no personal address and no brand name from its author.
````

## What is in it

2 files, 26 KB, downloaded as a zip.

```text
README.md  6 KB
workflow.json  20 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 10 steps, starting when its webhook is called
- AI: 3 steps call an AI model: Airport Codes & Dates, Activities and Email Agent
- Sign-ins: Signs in to: SerpApi, Gmail and Anthropic
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads 7 of its 8 step types. It does not read: Anthropic

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/580b6445-fbf5-4d53-9074-0c20d9a2c56f)
- [Its page on Mindket](https://mindket.com/p/580b6445-fbf5-4d53-9074-0c20d9a2c56f)
