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 →
{
"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.
googleCalendarOAuth2ApinotionApiopenAiApislackOAuth2Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
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
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
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
Overview