This workflow corresponds to n8n.io template #9754 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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 →
{
"id": "wYda99sf09SAlzu4",
"name": "Extract Business Card Data using AI Vision from Telegram to Google Sheets using AI Vision",
"tags": [],
"nodes": [
{
"id": "beaba1cd-076a-4223-b481-4d0dd7474590",
"name": "Add to Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
-64
],
"parameters": {
"columns": {
"value": {
"date": "={{ $today }}",
"email": "={{ $json.output['Email Address'] }}",
"address": "={{ $json.output.Address }}",
"full_name": "={{ $('AI Vision Agent').item.json.output['Full Name'] }}",
"job_title": "={{ $('AI Vision Agent').item.json.output['Job Title'] }}",
"department": "={{ $('AI Vision Agent').item.json.output.Department }}",
"fax_number": "={{ $json.output['Fax Number'] }}",
"postal_code": "={{ $json.output['Postal Code'] }}",
"website_url": "={{ $json.output['Website URL'] }}",
"company_name": "={{ $('AI Vision Agent').item.json.output['Company Name'] }}",
"phone_number": "={{ $json.output['Phone Number'] }}",
"mobile_phone_number": "={{ $json.output['Mobile Phone Number'] }}"
},
"schema": [
{
"id": "date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company_name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "company_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "department",
"type": "string",
"display": true,
"required": false,
"displayName": "department",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "job_title",
"type": "string",
"display": true,
"required": false,
"displayName": "job_title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "full_name",
"type": "string",
"display": true,
"required": false,
"displayName": "full_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postal_code",
"type": "string",
"display": true,
"required": false,
"displayName": "postal_code",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "address",
"type": "string",
"display": true,
"required": false,
"displayName": "address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "mobile_phone_number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "mobile_phone_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phone_number",
"type": "string",
"display": true,
"required": false,
"displayName": "phone_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fax_number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "fax_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "website_url",
"type": "string",
"display": true,
"required": false,
"displayName": "website_url",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"company_name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rYf2kqfmMRUtpFAb5YdhOcsvGg8Gr1CTbO-lvrd48m4/edit#gid=0",
"cachedResultName": "\u30b7\u30fc\u30c81"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1rYf2kqfmMRUtpFAb5YdhOcsvGg8Gr1CTbO-lvrd48m4",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1rYf2kqfmMRUtpFAb5YdhOcsvGg8Gr1CTbO-lvrd48m4/edit?usp=drivesdk",
"cachedResultName": "Demo"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "e804b404-71ad-4a9b-a554-48e2515e7bc8",
"name": "Check Input Type",
"type": "n8n-nodes-base.if",
"position": [
-80,
-48
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition_001",
"operator": {
"type": "string",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{ $json.message.text }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "7758173c-f34e-45d9-9230-499aacefd109",
"name": "AI Vision Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
128,
-64
],
"parameters": {
"text": "=Analyze the provided business card image or text and accurately identify all of the following information.List them clearly.\n\nImage URL: {{ $('Telegram Trigger').item.json.message.photo[0].file_id }}",
"options": {
"systemMessage": "=System Prompt (for AI Vision Agent)\nYou are a business card data extraction expert. Analyze the provided business card image or text and accurately identify all of the following information. Return the results as a structured list.\n\nImportant Rules:\nAlways prioritize Japanese text when it is available.\nOnly use romanized or English text if no Japanese text exists for that field.\nIf both Japanese and romanized text are present, return only the Japanese version.\n\nFields to extract:\n-Company Name\n-Department\n-Job Title\n-Full Name\n-Postal Code\n-Address\n-Phone Number\n-Fax Number\n-Email Address\n-Website URL\n-Mobile Phone Number\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2
},
{
"id": "d274cf40-53c1-4c2a-a3cd-b51737c79a11",
"name": "OpenAI Vision Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
112,
112
],
"parameters": {
"options": {
"temperature": 0.3
}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "ea82ce74-d4fe-406a-a60f-c870818fcec4",
"name": "Ingredient Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
288,
112
],
"parameters": {
"autoFix": "={{ false }}",
"schemaType": "manual",
"inputSchema": "{\n \"company_name\": \"Example Company Ltd.\",\n \"department\": \"Sales\",\n \"job_title\": \"Sales Manager\",\n \"full_name\": \"Taro Yamada\",\n \"postal_code\": \"100-0001\",\n \"address\": \"1-1-1 Marunouchi, Chiyoda-ku, Tokyo\",\n \"phone_number\": \"+1234567890\",\n \"mobile_phone_number\": \"+1234567890\",\n \"fax_number\": \"+1234567890\",\n \"email\": \"user@example.com\",\n \"website_url\": \"https://example.com\"\n}\n"
},
"typeVersion": 1.2
},
{
"id": "84e37cd2-6ffa-4b35-a8d4-fae8cb1f4d65",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-336,
-48
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {
"download": true
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "b5c11a80-b969-4af8-9473-e2da7850bb84",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
-272
],
"parameters": {
"color": 2,
"height": 384,
"content": "## \u2460Send business card image\nSend a business card image to your Telegram bot"
},
"typeVersion": 1
},
{
"id": "c48693cf-60b6-4617-8ea6-0a56fd2fe6b6",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-144,
-272
],
"parameters": {
"color": 4,
"height": 384,
"content": "## \u2461Business Card Image Input Filter\nChecks if the incoming Telegram message contains an image or text"
},
"typeVersion": 1
},
{
"id": "b96a98b1-2fb9-4290-8aa1-f526f9d9f809",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-272
],
"parameters": {
"color": 3,
"width": 256,
"height": 384,
"content": "## \u2462Analyze business card image\nThe structured output is cleaned and standardized by the parser"
},
"typeVersion": 1
},
{
"id": "a4aad8f8-fa84-4c5c-8e16-52d3cfc2d010",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-272
],
"parameters": {
"color": 5,
"height": 384,
"content": "## \u2463Log the parsed business card details into Google Sheets\nGoogle Sheets node appends or updates the contact data automatically"
},
"typeVersion": 1
},
{
"id": "b02297b2-0cd1-4eee-86e0-e1a0d4c3de52",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
-432
],
"parameters": {
"width": 480,
"height": 544,
"content": "## Business Card OCR Auto-Logging (Telegram \u2192 AI \u2192 Google Sheets) \n\n**Description:**\nThis workflow automatically extracts structured contact information from business card images sent via Telegram and logs the results into Google Sheets.\nAn AI Vision Agent analyzes the image, identifies key fields such as company name, person\u2019s name, department, job title, and contact details, and formats the data into a structured JSON format for direct entry.\n\n**Key Features:**\n\n\ud83d\udce4 Send a business card image via Telegram\n\n\ud83e\udd16 AI Vision Agent (powered by OpenRouter) detects company, \nname, department, job title, address, phone, email, and more\n\n\ud83e\udde9 The \u201cOutput Parser\u201d ensures consistent JSON formatting for clean Google Sheets integration\n\n\ud83d\udcca Automatically saves or updates each contact in Google \nSheets (appendOrUpdate mode)\n\n\ud83e\udde0 Optimized for Japanese business cards with high OCR precision"
},
"typeVersion": 1
},
{
"id": "29c0d3aa-06b4-429a-bd5a-8d1b96c04356",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
112
],
"parameters": {
"width": 480,
"height": 272,
"content": "**Use Cases:**\n\n**\ud83d\udcbcSales & CRM**:Automatically build and update your client database from received business cards\n\n**\ud83c\udfe2Back Office & Admin**: Digitize incoming cards for unified company records\n\n**\ud83d\udce7Marketing Teams**: Collect and manage leads efficiently\n\n**\ud83d\udcda AI / OCR Research**: Build structured datasets for training AI models or internal automation"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "8672707b-9789-482b-a6ee-b5a88928dc8d",
"connections": {
"AI Vision Agent": {
"main": [
[
{
"node": "Add to Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Check Input Type": {
"main": [
[
{
"node": "AI Vision Agent",
"type": "main",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Check Input Type",
"type": "main",
"index": 0
}
]
]
},
"Ingredient Parser": {
"ai_outputParser": [
[
{
"node": "AI Vision Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"OpenAI Vision Model": {
"ai_languageModel": [
[
{
"node": "AI Vision Agent",
"type": "ai_languageModel",
"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.
googleSheetsOAuth2ApiopenRouterApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Extract business card data from Telegram to Google Sheets
Source: https://n8n.io/workflows/9754/ — 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.
zettel-ocr sdg26. Uses telegramTrigger, telegram, googleGemini, agent. Event-driven trigger; 16 nodes.
This workflow transforms your Telegram bot into an intelligent creative assistant. It can chat conversationally, fetch trending image prompts from PromptHero for inspiration, or perform a deep "remix"
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
This workflow acts as an AI-powered "Viral Architect" for YouTube creators. Simply send a video topic (e.g., "Kling 2.6") to your Telegram bot, and it will scrape top-performing competitor thumbnails,
This workflow automates the process of recording financial transactions from photos of receipts or shopping receipts. Users simply send an image of the receipt via Telegram. The image is processed usi