Hey n8n Community,
My CEO mentioned he’s got a few conferences coming up in the next weeks and he’s actually looking forward to them. There’s just one problem: every time he comes back from an event, he has a stack of business cards in his pocket and zero time to manually add them all to his phone. By the time he gets around to it, half the context is already gone – who was that founder we wanted to follow up with? Which one was the panel guy?
So I went looking for a tool I could just hand him. Plenty of business card scanners exist. But every single one of them has the same baffling design choice: you have to photograph each card individually. One at a time. For 30 cards.
That’s not really a scanner. That’s a slightly faster version of typing them in by hand.
So I built him something better in n8n.
The setup
The flow is now this: he lays all the business cards out on a hotel desk, takes ONE photo, and sends it to a Telegram bot. That’s the whole input.
What he gets back: every contact appended as a row in a Google Sheet, plus a separate vCard file for each new contact, sent right there in the Telegram chat. He taps a vCard on his iPhone → “Add Contact” → done. The whole thing takes about 15 seconds for 30 cards.
The hard part: making batch extraction actually work
The reason every other scanner does one card at a time is that multi-card extraction is genuinely hard. Most OCR tools turn a photo of 30 cards into one giant blob of text and then you’re writing regex to figure out which phone number belongs to which person.
I used the easybits Extractor for this because it returns structured JSON with each card as a separate object – so the workflow can just iterate. The prompt explicitly tells the model to treat each rectangular card as a distinct contact and to return null for any field it can’t read confidently (instead of hallucinating a plausible-looking phone number, which is the classic OCR failure mode).
Then I added duplicate handling
The Google Sheet is the real unlock here. Before contacts go to his phone, the workflow checks the sheet for duplicates – matched by email, or name+company if no email is on the card. If he scanned someone last month at a different event, they don’t get re-added.
So his phone stays clean and the sheet becomes a proper running database of every person he’s met. No more 5 versions of the same contact because he forgot he already had them.
What you need to set this up
- An n8n instance (Cloud or self-hosted)
- A Telegram bot (free, takes 2 minutes via BotFather)
- A Google Sheet with the right column headers
- An easybits account at easybits.tech for the extractor – the free Sandbox tier covers what you need
The easybits Extractor is a verified n8n community node, so on n8n Cloud you just search easybits Extractor in the node panel and it’s there. On self-hosted, install via Settings → Community Nodes with '@easybits/n8n-nodes-extractor'.
Workflow & setup guide
The sticky notes inside the workflow walk through every node – what it does, how it’s configured, and why.
Anyone else built something similar for handling event leads? Curious whether people are pushing contacts straight to a CRM (HubSpot, Pipedrive) or keeping it in a sheet. The Sheet to vCard pattern is nice because it works for everyone, but I imagine the CRM version would be even better for sales-heavy teams.
Best,
Felix
