AutomationFlowsAI & RAG › Personalize Client Meeting Prep with Gpt-4, Google Calendar, Notion & Places…

Personalize Client Meeting Prep with Gpt-4, Google Calendar, Notion & Places…

Original n8n title: Personalize Client Meeting Prep with Gpt-4, Google Calendar, Notion & Places API to Slack

By長谷 真宏 @masa0258 on n8n.io

Who is this for This template is perfect for sales professionals, account managers, and business development teams who want to make memorable impressions on their clients. It automates the tedious task of researching gift shops and preparation spots before important meetings.…

Event trigger★★★★☆ complexityAI-powered16 nodesSlackOpenAIHTTP RequestNotionGoogle Calendar Trigger
AI & RAG Trigger: Event Nodes: 16 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11430 — we link there as the canonical source.

This workflow follows the HTTP Request → Notion 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 →

Download .json
{
  "nodes": [
    {
      "id": "bd5619da-5899-474b-9b89-7f439fa44190",
      "name": "Sticky Note - Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -48
      ],
      "parameters": {
        "width": 896,
        "height": 1008,
        "content": "##  Automate Personalized Gift & Cafe Recommendations with GPT-4, Google Calendar & Notion\n\n**What this template does:**\nAutomatically suggests personalized gift shops and nearby cafes before your client visits, based on customer preferences stored in Notion.\n\n**Who is this for:**\n- Sales teams who want to make a great impression\n- Account managers preparing for important client meetings\n- Anyone who wants AI-powered meeting preparation\n\n**How it works:**\n1. Triggers when a calendar event containing \"visit\", \"meeting\", \"client\", or \"dinner\" is created/updated\n2. Extracts the company name from the event title\n3. Fetches customer preferences from Notion database\n4. Searches nearby gift shops and cafes using Google Places API\n5. Uses GPT-4 to recommend the best options based on customer preferences\n6. Sends personalized recommendations to Slack\n\n**Example Slack Output:**\n```\n Recommended Gift Shop\nPatisserie Sadaharu AOKI (\u26054.6)\n3-5-2 Marunouchi, Chiyoda-ku\n\ud83d\udca1 Reason: The customer loves French desserts, so this patisserie's macarons would be perfect!\n\n\u2615 Pre-Meeting Cafe\nStarbucks Reserve Roastery (\u26054.5)\n5 min walk from meeting location\n```\n\n**Requirements:**\n- Google Calendar account\n- Notion database with customer preferences\n- Google Places API key\n- OpenAI API key\n- Slack workspace\n\n**Setup steps:**\n1. Connect your Google Calendar credentials\n2. Set up your Notion database with \"Company Name\" (title) and \"Preferences\" (text) fields\n3. Add your Google Places API key in the Configuration node\n4. Connect your OpenAI and Slack accounts\n5. Update the Slack channel ID"
      },
      "typeVersion": 1
    },
    {
      "id": "0fac8e19-8373-4a7a-a107-b45ac9245876",
      "name": "Sticky Note - Config",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \u2699\ufe0f Step 1: Configuration\nSet your API keys and search parameters here.\n\n**Important:** Replace the Google Places API key with your own.\n\n- `googlePlacesApiKey`: Your API key\n- `searchRadius`: Search radius in meters (default: 1000)\n- `minRating`: Minimum rating filter (default: 4.5)"
      },
      "typeVersion": 1
    },
    {
      "id": "d00a1296-eafe-4cff-9634-bdba5beed212",
      "name": "Sticky Note - Filter",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        544,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \ud83d\udd0d Step 2: Event Filtering\nFilters calendar events to only process client visits and meetings.\n\n**Keywords detected:**\n- visit, meeting, client, dinner, greeting\n\nCustomize these keywords to match your calendar naming conventions."
      },
      "typeVersion": 1
    },
    {
      "id": "0fdf50f7-21d9-41df-b30d-76bdbd92a8c2",
      "name": "Sticky Note - Enrich",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \ud83d\udccb Step 3: Data Enrichment\nExtracts company name from event title and fetches customer preferences from Notion.\n\n**Notion Database Setup:**\nCreate a database with these fields:\n- `Company Name` (Title)\n- `Preferences` (Text)"
      },
      "typeVersion": 1
    },
    {
      "id": "68e71890-a150-40e5-bce4-94c02f97ef42",
      "name": "Sticky Note - Search",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \ud83d\uddfa\ufe0f Step 4: Location Search\nSearches for gift shops and cafes near the meeting location using Google Places API.\n\n**Gift Shops:** Bakeries, confectioneries\n**Cafes:** Quiet work-friendly cafes"
      },
      "typeVersion": 1
    },
    {
      "id": "c4d458d0-6631-4842-8f22-f9e05b22d18a",
      "name": "Sticky Note - AI",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \ud83e\udd16 Step 5: AI Recommendation\nGPT-4 analyzes customer preferences and recommends:\n- The best gift shop (with reasoning)\n- The best cafe for pre-meeting preparation\n\nThe AI provides personalized explanations based on customer tastes."
      },
      "typeVersion": 1
    },
    {
      "id": "551a15ee-5181-4453-92a1-f8d49973ca27",
      "name": "Sticky Note - Notify",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1984,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 304,
        "content": "### \ud83d\udce4 Step 6: Notification\nSends the personalized recommendation to your Slack channel.\n\n**Setup:** Update the channel ID to your preferred channel."
      },
      "typeVersion": 1
    },
    {
      "id": "fa5fba17-c4d9-4134-98ec-52ac4271f9dd",
      "name": "Send Slack Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        2064,
        720
      ],
      "parameters": {
        "text": "={{ $json.output[0].content[0].text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "YOUR_CHANNEL_ID"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "87bc2cdd-f2cf-4e4e-b342-0c287b494cf3",
      "name": "AI Gift Recommendation",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1680,
        720
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "GPT-4.1-MINI"
        },
        "options": {},
        "responses": {
          "values": [
            {
              "content": "=You are a thoughtful and attentive sales assistant.\nThe user is about to attend an important client meeting. Based on the following information, create a Slack message recommending the best gift shop and cafe.\n\n## Visit Information\n- Client Company: {{ $('Extract Company Name').first().json.extractedCompany }}\n- Customer Preferences: {{ $('Get Customer Preferences from Notion').item.json.properties['Preferences'].rich_text[0].plain_text }}\n\n## Gift Shop Candidates (Google Maps Results)\n{{ JSON.stringify($('Search Gift Shops').json) }}\n\n## Cafe Candidates (Google Maps Results)\n{{ JSON.stringify($('Search Nearby Cafes').json) }}\n\n## Instructions\n1. Analyze the customer preferences and select ONE gift shop that would delight them most.\n2. Select ONE quiet cafe suitable for pre-meeting preparation.\n3. Explain WHY you chose each place based on customer preferences.\n\n## Output Format\nNo JSON needed. Output a friendly, readable message that can be posted directly to Slack.\n\nExample format:\n\ud83c\udf81 **Recommended Gift Shop**\n[Shop Name] (\u2605Rating)\n[Address]\n\ud83d\udca1 Reason: Based on the customer's love for chocolate, this shop's award-winning truffles would be perfect!\n\n\u2615 **Pre-Meeting Cafe**\n[Cafe Name] (\u2605Rating)\nX minutes walk from meeting location"
            }
          ]
        },
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d3cbb2fd-8038-4588-a746-6f7c055349c7",
      "name": "Search Nearby Cafes",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1456,
        816
      ],
      "parameters": {
        "url": "=https://maps.googleapis.com/maps/api/place/nearbysearch/json",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "location",
              "value": "={{ $json.location || '35.6812,139.7671' }}"
            },
            {
              "name": "radius",
              "value": "={{ $('Workflow Configuration').first().json.searchRadius }}"
            },
            {
              "name": "type",
              "value": "cafe"
            },
            {
              "name": "keyword",
              "value": "quiet work cafe"
            },
            {
              "name": "key",
              "value": "={{ $('Workflow Configuration').first().json.googlePlacesApiKey }}"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "0571efe3-ab34-4148-90c4-f7b94bacc2f6",
      "name": "Search Gift Shops",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1456,
        624
      ],
      "parameters": {
        "url": "=https://maps.googleapis.com/maps/api/place/nearbysearch/json",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "location",
              "value": "={{ $json.location || '35.6812,139.7671' }}"
            },
            {
              "name": "radius",
              "value": "={{ $('Workflow Configuration').first().json.searchRadius }}"
            },
            {
              "name": "type",
              "value": "bakery"
            },
            {
              "name": "keyword",
              "value": "pastry sweets gift"
            },
            {
              "name": "key",
              "value": "={{ $('Workflow Configuration').first().json.googlePlacesApiKey }}"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "c6647e36-f97d-4701-8f8e-f8a2b32e935c",
      "name": "Get Customer Preferences from Notion",
      "type": "n8n-nodes-base.notion",
      "position": [
        1232,
        720
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "conditions": [
            {
              "key": "Company Name|title",
              "type": "title",
              "condition": "contains",
              "titleValue": "={{ $json.extractedCompany }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_NOTION_DATABASE_ID",
          "cachedResultName": "Customer List"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "60e90a35-7457-4313-80b6-41be6a79bf47",
      "name": "Extract Company Name",
      "type": "n8n-nodes-base.code",
      "position": [
        1008,
        720
      ],
      "parameters": {
        "jsCode": "// Extract company name from calendar event summary\nconst summary = $input.first().json.summary || '';\n\n// Match common company name patterns (English and Japanese formats)\nconst companyMatch = summary.match(/([^\\s]+(?:Inc|Corp|LLC|Ltd|Company|Co\\.))/);\nconst companyName = companyMatch ? companyMatch[0] : summary.split(' ')[0];\n\nreturn [{ json: { ...($input.first().json), extractedCompany: companyName } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "a8c165e4-22cf-4f9e-92d8-dd28c155c369",
      "name": "Filter Client Visit Events",
      "type": "n8n-nodes-base.if",
      "position": [
        784,
        720
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "id-1",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $('Google Calendar Trigger').item.json.summary }}",
              "rightValue": "visit"
            },
            {
              "id": "id-2",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $('Google Calendar Trigger').item.json.summary }}",
              "rightValue": "meeting"
            },
            {
              "id": "id-3",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $('Google Calendar Trigger').item.json.summary }}",
              "rightValue": "greeting"
            },
            {
              "id": "id-4",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $('Google Calendar Trigger').item.json.summary }}",
              "rightValue": "dinner"
            },
            {
              "id": "id-5",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $('Google Calendar Trigger').item.json.summary }}",
              "rightValue": "client"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "926798ac-5ff7-4e4a-bd3d-d47c3bc99fc0",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        560,
        720
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "googlePlacesApiKey",
              "type": "string",
              "value": "YOUR_GOOGLE_PLACES_API_KEY"
            },
            {
              "id": "id-2",
              "name": "searchRadius",
              "type": "number",
              "value": 1000
            },
            {
              "id": "id-3",
              "name": "minRating",
              "type": "number",
              "value": 4.5
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "3163191b-6950-41f5-bbeb-0dd0c98c07ee",
      "name": "Google Calendar Trigger",
      "type": "n8n-nodes-base.googleCalendarTrigger",
      "position": [
        336,
        720
      ],
      "parameters": {
        "options": {
          "matchTerm": ""
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "eventUpdated",
        "calendarId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_CALENDAR_ID",
          "cachedResultName": "Primary Calendar"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Search Gift Shops": {
      "main": [
        [
          {
            "node": "AI Gift Recommendation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Nearby Cafes": {
      "main": [
        [
          {
            "node": "AI Gift Recommendation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Company Name": {
      "main": [
        [
          {
            "node": "Get Customer Preferences from Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Gift Recommendation": {
      "main": [
        [
          {
            "node": "Send Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Filter Client Visit Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar Trigger": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Client Visit Events": {
      "main": [
        [
          {
            "node": "Extract Company Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Customer Preferences from Notion": {
      "main": [
        [
          {
            "node": "Search Nearby Cafes",
            "type": "main",
            "index": 0
          },
          {
            "node": "Search Gift Shops",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Who is this for This template is perfect for sales professionals, account managers, and business development teams who want to make memorable impressions on their clients. It automates the tedious task of researching gift shops and preparation spots before important meetings.…

Source: https://n8n.io/workflows/11430/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow is an AI-powered lighting and look development pipeline designed for VFX production. It transforms a single lighting brief into multiple high-quality cinematic lighting references using

Form Trigger, HTTP Request, Google Drive +4
AI & RAG

This template is ideal for photographers, graphic designers, and creative professionals who manage large volumes of visual assets. It is also perfect for Digital Asset Managers looking for a customiza

Google Drive Trigger, Google Drive, OpenAI +3
AI & RAG

What it is An automated LinkedIn content system that takes a simple form (idea + optional file), generates LinkedIn posts with OpenAI, stores them in Notion, builds Google Slides carousels, and auto-p

Form Trigger, OpenAI, Notion +6
AI & RAG

This workflow automatically turns any audio file uploaded to Google Drive into a complete podcast episode. It handles transcription, content generation, blog drafting, social copy creation, thumbnail

Google Drive Trigger, Google Drive, OpenAI +3
AI & RAG

Overview

Gmail Trigger, Google Drive, OpenAI +4