Slack to Google Sheets, business cards logged fast
Business cards are still everywhere. The problem is what happens after: photos scattered in Slack, names typed in later (maybe), and a “where did that lead go?” moment a week from now.
This Slack Sheets automation hits sales reps first, but event marketers and ops people cleaning up CRMs feel it too. You post a card photo, and the contact shows up in Google Sheets with the key fields already filled in.
Below you’ll see how the workflow runs, what it eliminates, and what you can tweak so it matches the way your team captures leads.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Slack to Google Sheets, business cards logged fast
flowchart LR
subgraph sg0["Slack Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Trigger"]
n1@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Transforming data", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Send a message"]
n4@{ icon: "mdi:robot", form: "rounded", label: "Structure Output", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "AI model", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch images"]
n7@{ icon: "mdi:robot", form: "rounded", label: "Scan Contact Information", pos: "b", h: 48 }
n5 -.-> n7
n6 --> n7
n0 --> n6
n4 -.-> n7
n2 --> n1
n1 --> n3
n7 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n4,n7 ai
class n5 aiModel
class n1 database
class n6 api
classDef customIcon fill:none,stroke:none
class n0,n3,n6 customIcon
The Challenge: Business Cards Turn Into Data Entry
Capturing leads from business cards sounds simple until you’re doing it at speed. You take a photo, drop it into Slack, and tell yourself you’ll “log it later.” Later becomes next week. Then it’s a scramble: zooming into blurry text, guessing at email spellings, mixing up titles, or saving “John” with no company because you couldn’t read the logo. It’s not just time. It’s lost context, missed follow-ups, and a list that never becomes searchable.
It adds up fast. Here’s where the friction compounds:
- Someone has to retype every field, and it’s usually the busiest person on the team.
- Small mistakes (a wrong digit, a missing domain) quietly break follow-up.
- Photos sit in Slack threads, which means you can’t sort, dedupe, or search contacts later.
- Even if you do capture the lead, you still need a “did it save?” check, or you end up doing the work twice.
The Fix: Capture Slack Business Cards Straight Into Sheets
This workflow turns one small habit (posting the photo) into a clean contact record you can actually use. It starts when a business card photo is uploaded in Slack. n8n fetches the image from Slack, then sends it to an AI-powered extraction step that reads the card and returns structured fields like name, company, email, and phone. After that, the data is cleaned and mapped into the columns you’ve chosen in Google Sheets. Finally, the workflow appends a new row to your sheet and posts a confirmation back to Slack so you know it worked. No spreadsheet hunting, no copying details off a tiny rectangle of paper.
The workflow begins with a Slack trigger and pulls down the image with an HTTP request. Then the AI agent extracts and structures contact details so your sheet gets consistent rows. Once the row is saved, Slack gets a quick confirmation message.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say your team collects 30 business cards after a conference day. Manually, a careful entry is maybe 5 minutes per card once you include checking spelling and formatting, so that’s about 2.5 hours of admin. With this workflow, each person just posts the photo in Slack (a few seconds), and the automation handles extraction plus Sheets logging in the background. You still spot-check a few rows, but the heavy lifting is gone.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Slack to receive the uploaded card photos.
- Google Sheets to store contacts in a shared table.
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Beginner. You’ll connect accounts, pick your sheet, and adjust which fields you want captured.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A Slack photo lands in your channel. The trigger listens for a new message with an uploaded business card image, so you don’t need a separate form or app.
The image is fetched from Slack. n8n uses an HTTP request to retrieve the file so it can be processed reliably (not just “seen” in the chat).
AI extracts the contact fields. The workflow passes the image to an AI agent powered by an OpenAI chat model, then uses a structured output step so you get predictable fields like name, company, email, and phone.
A new row is created in Google Sheets, then Slack gets confirmation. The workflow appends the data into your chosen sheet and posts back a message so the person who uploaded it knows the lead is saved.
You can easily modify the fields captured (like job title or address) to match your sheet columns. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Slack Message Trigger
Set up the workflow to start when a new Slack message is posted in a specific channel.
- Add the Slack Message Trigger node to your workflow.
- Credential Required: Connect your slackApi credentials.
- Set Trigger to
message. - Set Channel to the target Slack channel (value:
[YOUR_ID]).
Step 2: Connect Slack and Download the Image
Use the Slack file URL from the trigger to download the business card image file.
- Add the Retrieve Image File node and connect it to Slack Message Trigger.
- Credential Required: Connect your slackApi credentials.
- Set URL to
={{ $json.files[0].url_private_download }}. - Set Authentication to
predefinedCredentialTypeand Credential Type toslackApi. - Under Options → Response, set Response Format to
file.
Step 3: Set Up the AI Extraction
Configure the AI to extract structured contact data from the image, then split the results into individual records.
- Add the OpenAI Chat Model node and select the model
gpt-4o. - Credential Required: Connect your openAiApi credentials.
- Add the Define Structured Output node and set JSON Schema Example to
[{ "full names": "Toshiki Hirao", "job titles": "CEO", "company names": "dTosh", "phone numbers": "012-3456-938", "email": "[YOUR_EMAIL]" }]. - Add the Extract Contact Details node and set Text to
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.. - In Extract Contact Details, keep Prompt Type as
defineand enable Has Output Parser. - Connect OpenAI Chat Model to Extract Contact Details as the language model.
- Connect Define Structured Output to Extract Contact Details as the output parser. For this AI sub-node, credentials are added to OpenAI Chat Model, not Define Structured Output.
- Add the Split Output Records node after Extract Contact Details and set Field to Split Out to
outputwith Include asallOtherFields.
Step 4: Configure Google Sheets and Slack Outputs
Append each extracted contact into Google Sheets and then post a confirmation to Slack.
- Add the Append Sheet Row node and connect it to Split Output Records.
- Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Set Operation to
append. - Select your Document (value:
[YOUR_ID]) and Sheet (value:gid=0). - Map columns: Name to
={{ $json.output['full names'] }}, Email to={{ $json.output.email }}, Phone to={{ $json.output['phone numbers'] }}, Company to={{ $json.output['company names'] }}, and Job Title to={{ $json.output['job titles'] }}. - Add the Post Slack Confirmation node and connect it to Append Sheet Row.
- Credential Required: Connect your slackApi credentials.
- Set Text to
=--- Name: {{ $json.Name }} Title: {{ $json['Job Title']}} Company: {{ $json.Company }} Phone: {{ $json.Phone }} Email: {{ $json.Email }}and select your target Channel (value:[YOUR_ID]).
Step 5: Test and Activate Your Workflow
Validate the end-to-end flow from Slack message to Google Sheets and confirmation post.
- Click Execute Workflow in n8n and post a message with a business card image in the configured Slack channel.
- Verify that Retrieve Image File downloads the file and Extract Contact Details outputs structured data.
- Confirm new rows are appended in the Google Sheet by Append Sheet Row.
- Check Slack for the formatted confirmation from Post Slack Confirmation.
- When everything looks correct, toggle the workflow Active to enable continuous processing.
Watch Out For
- Slack credentials can expire or need specific permissions. If things break, check the Slack app permissions and your n8n credential connection first.
- If you’re posting low-light photos, the AI extraction can come back incomplete. Ask your team to snap the card on a flat surface with decent lighting, or you’ll be fixing missing emails later.
- Default AI prompts are generic. Add your column names and “what counts as a valid email/phone” rules early, or you will spend time cleaning Sheets afterward.
Common Questions
Usually about 30 minutes if Slack, Sheets, and your API key are ready.
Yes. No coding is required, but you will need to connect Slack and Google Sheets credentials. The only “fiddly” part is matching your sheet columns to the fields you want extracted.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often a few cents per card, depending on your model and usage).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can change what gets captured by adjusting the extraction prompt in the “Extract Contact Details” agent and the “Define Structured Output” step that enforces the fields. Common tweaks include adding job title, splitting first and last name, capturing a full address, or saving the original Slack file URL into your sheet for reference.
Usually it’s an expired Slack token or missing permissions to read files in that channel. Reconnect the Slack credential in n8n and confirm the app can access file uploads. If the HTTP request can’t fetch the image, double-check the file URL handling and make sure the message trigger is firing on the right event type.
On n8n Cloud, capacity depends on your plan’s monthly executions, and each uploaded card typically counts as one run. If you self-host, there’s no execution cap; it mainly depends on your server and the time your AI extraction takes. In practice, most small teams can process dozens of cards in a day without thinking about limits. If you’re logging hundreds daily, you’ll want to watch API rate limits and queueing.
Often, yes, because OCR + structured extraction usually needs more control than a simple two-step Zap. n8n makes it easier to enforce a consistent schema (so Sheets columns don’t drift), and you can self-host if you want unlimited runs. Zapier and Make can still work if your needs are basic, but the moment you want better validation, retries, or custom prompts, they get awkward. Honestly, the best choice depends on volume and how picky you are about data quality. Talk to an automation expert if you’re not sure which fits.
Once this is running, business cards stop being “something to deal with later.” They turn into searchable leads the same day, and your team keeps moving.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.