AutomationFlowsAI & RAG › Extract Business Card Data From Slack to Google Sheets with Gpt-4o OCR

Extract Business Card Data From Slack to Google Sheets with Gpt-4o OCR

ByToshiki Hirao @hirao on n8n.io

You can turn messy business card photos into organized contact data automatically. With this workflow, you can upload a business card photo to Slack and instantly capture the contact details into Google Sheets using OCR. No more manual typing—each new card is scanned,…

Event trigger★★★★☆ complexityAI-powered10 nodesSlack TriggerGoogle SheetsSlackOutput Parser StructuredOpenAI ChatHTTP RequestAgent
AI & RAG Trigger: Event Nodes: 10 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #8367 — 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "21c87864-6365-4d62-95e6-01576fb3f01d",
      "name": "Slack Trigger",
      "type": "n8n-nodes-base.slackTrigger",
      "position": [
        -496,
        0
      ],
      "parameters": {
        "options": {},
        "trigger": [
          "message"
        ],
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09DW6Q03T8",
          "cachedResultName": "card"
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "bd53e180-a97f-4ffc-af2e-e95408c52fbf",
      "name": "Append row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        528,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $json.output['full names'] }}",
            "Email": "={{ $json.output.email }}",
            "Phone": "={{ $json.output['phone numbers'] }}",
            "Company": "={{ $json.output['company names'] }}",
            "Job Title": "={{ $json.output['job titles'] }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NEmgb1BU706kR4k-H2e3L6T8AnUPxFsNzkQZNhVAP90/edit#gid=0",
          "cachedResultName": "\u7dcf\u5408\u30ea\u30b9\u30c8"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1NEmgb1BU706kR4k-H2e3L6T8AnUPxFsNzkQZNhVAP90",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NEmgb1BU706kR4k-H2e3L6T8AnUPxFsNzkQZNhVAP90/edit?usp=drivesdk",
          "cachedResultName": "\u540d\u523a\u30ea\u30b9\u30c8"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c0881266-4f48-47e4-9da9-5a9c15c019f4",
      "name": "Transforming data",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        304,
        0
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "output"
      },
      "typeVersion": 1
    },
    {
      "id": "8183cd9c-512f-4f5c-aaa6-6897a89e1fb7",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        752,
        0
      ],
      "parameters": {
        "text": "=---\nName: {{ $json.Name }}\nTitle: {{ $json['Job Title']}}\nCompany: {{ $json.Company }}\nPhone: {{ $json.Phone }}\nEmail: {{ $json.Email }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09DW6Q03T8",
          "cachedResultName": "card"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "59ea6f4b-f9c4-4873-856e-356599ae22ea",
      "name": "Structure Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        96,
        224
      ],
      "parameters": {
        "jsonSchemaExample": "[{\n\t\"full names\": \"Toshiki Hirao\",\n\t\"job titles\": \"CEO\",\n  \"company names\": \"dTosh\",\n  \"phone numbers\": \"012-3456-938\",\n  \"email\": \"user@example.com\"\n}]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8ca7e36b-2066-4a45-b09b-de49648111c5",
      "name": "AI model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -48,
        224
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "gpt-4o"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7153c21f-d2d7-455d-9d88-a3cb4b1a20c2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -48
      ],
      "parameters": {
        "width": 448,
        "height": 880,
        "content": "## How it works\n1. Slack Trigger \u2013 The workflow starts when a business card photo is uploaded to Slack.\n2. HTTP Request \u2013 The uploaded image is fetched from Slack.\n3. AI/OCR Parsing \u2013 The card image is analyzed by an AI model and structured into contact fields (name, company, email, phone, etc.).\n4. Transform Data \u2013 The extracted data is cleaned and mapped into the correct format.\n5. Google Sheets \u2013 A new row is appended to your designated Google Sheet, creating an organized contact database.\n6. Slack Notification \u2013 Finally, a confirmation message is sent back to Slack to let you know the contact has been successfully saved.\n\n## How to use\n1. Copy the template into your n8n instance.\n2. Connect your Slack account to capture uploaded images.\n3. Set up your Google Sheets connection and choose the spreadsheet where contacts should be stored.\n4. Adjust the Contact Information extraction node if you want to capture custom fields (e.g., job title, address).\n5. Deploy and test: upload a business card image in Slack and confirm it\u2019s added to Google Sheets automatically.\n\n## Requirements\n1. n8n running (cloud).\n2. A Slack account with access to the channel where photos will be uploaded.\n3. A Google Sheets account with a target sheet prepared for storing contacts.\n4. AI/OCR capability enabled in your n8n (e.g., OpenAI, Google Vision, or another OCR/LLM provider).\n5. Basic access rights in both Slack and Google Sheets to read and write data."
      },
      "typeVersion": 1
    },
    {
      "id": "2b3d9219-4616-4a95-b255-dbb1eab2ffd3",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -272
      ],
      "parameters": {
        "width": 608,
        "height": 192,
        "content": "## Scan Business Cards in Slack to Google Sheets\n\nYou can turn messy business card photos into organized contact data automatically.\nWith this workflow, you can upload a business card photo to Slack and instantly capture the contact details into Google Sheets using OCR. No more manual typing\u2014each new card is scanned, structured, saved, and confirmed back in Slack, making contact management fast and effortless."
      },
      "typeVersion": 1
    },
    {
      "id": "2e313bd5-2046-4ed0-a521-d28dc962b0b9",
      "name": "Fetch images",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -272,
        0
      ],
      "parameters": {
        "url": "={{ $json.files[0].url_private_download }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        },
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "slackApi"
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3d8e76d9-9bcb-4e52-ac45-b560d9086e47",
      "name": "Scan Contact Information",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -48,
        0
      ],
      "parameters": {
        "text": "Please identify and extract all professional contact information from the image containing several business cards. You have to include details that are full names, job titles, company names, phone numbers, and email addresses.",
        "options": {
          "systemMessage": "You assist sales/BD teams by parsing images with several business cards. Identify every card and pull the essentials\u2014full names, job titles, companies, phone numbers, and emails."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    }
  ],
  "connections": {
    "AI model": {
      "ai_languageModel": [
        [
          {
            "node": "Scan Contact Information",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch images": {
      "main": [
        [
          {
            "node": "Scan Contact Information",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack Trigger": {
      "main": [
        [
          {
            "node": "Fetch images",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        []
      ]
    },
    "Structure Output": {
      "ai_outputParser": [
        [
          {
            "node": "Scan Contact Information",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Transforming data": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append row in sheet": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scan Contact Information": {
      "main": [
        [
          {
            "node": "Transforming data",
            "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

You can turn messy business card photos into organized contact data automatically. With this workflow, you can upload a business card photo to Slack and instantly capture the contact details into Google Sheets using OCR. No more manual typing—each new card is scanned,…

Source: https://n8n.io/workflows/8367/ — 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 streamlines academic assessment through a multi-agent AI system that interprets rubrics, grades submissions, checks for plagiarism, performs quality moderation, generates feedback, and e

HTTP Request, Agent, OpenAI Chat +3
AI & RAG

This workflow automates invoice processing directly from your email inbox.

Gmail Trigger, HTTP Request, Agent +5
AI & RAG

This workflow automates athlete performance monitoring through two parallel pipelines: real-time session analysis triggered by training form submissions, and scheduled weekly performance summaries. De

Form Trigger, Google Sheets, Agent +4
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Form Trigger, HTTP Request, Agent +6
AI & RAG

Streamline your HR recruitment process with this intelligent automation that reads candidate emails and resumes, analyzes them using GPT-4, and automatically shortlists or rejects applicants based on

Gmail, Gmail Trigger, HTTP Request +7