ViablyViably
๐Ÿ“ทOCR Power

Scan business cards from Slack

Upload a photo of business cards to any OCR-enabled Slack channel, react with ๐Ÿ“ท, and Viably extracts the contacts โ€” posting a formatted table and a downloadable 9-column CSV directly in the thread. No apps, no switching tabs, no manual entry.

How it works

  1. 1

    Upload a photo

    Post an image of business cards to any Slack channel that has the Viably OCR power enabled. Works with photos taken on your phone โ€” one card or a stack.

  2. 2

    React with ๐Ÿ“ท

    Add a :camera: or :camera_with_flash: reaction to the message. Viably detects it, downloads the image, and submits it to the OCR service.

  3. 3

    Extraction happens async

    Viably posts a queued confirmation in the thread immediately. The OCR service processes the image and POSTs the structured result back through your OCR relay endpoint.

  4. 4

    Results appear in the thread

    Viably posts a formatted contact table (name, role, company, phone, email) and uploads a 9-column CSV with the full extracted data โ€” all inside the original thread.

Example Slack output

โœ…  IMG_7261.jpg โ€” 6 contacts  (part 1/1)

#  Name                    Role                     Company        Phone          Email
โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
1  Samuel Chan             Head of Incubator        Supertype      +628778251856  [email protected]
2  Vincentius C. Calvin    AI Infrastructure Lead   Supertype      +628039392210  [email protected]
...

๐Ÿ“Ž  14 contacts extracted. The CSV above has everything.

Setup

Three things to configure before the first scan works:

A. Enable the OCR power in your workspace

Go to Powers โ†’ OCR in your Viably dashboard and add the Slack channels where scans should be accepted. Viably ignores ๐Ÿ“ท reactions in channels not on this list.

B. Create an OCR relay endpoint

Go to Powers โ†’ Webhook Relay and click + New Relay โ†’ OCR Service. Copy the relay URL and Bearer token โ€” you will give these to your OCR service so it can POST results back to Viably.

Unlike other relay types, OCR endpoints do not need a destination channel. Results are posted directly into the Slack thread that triggered the scan.

C. Configure your OCR service

Give your OCR service the relay URL and Bearer token from step B. When processing is complete, the service should POST the structured result back to that URL. See Payload format below for the exact shape.

Payload format

When your OCR service finishes processing, it POSTs a JSON payload to the relay URL with Authorization: Bearer <token>. You do not actually need to implement this yourself as Viably's OCR service handles this for you automatically.
OCR result payload
{
  "job_id":          "EXBm0KUM",          // matches the job Viably created
  "ocr_type":        "business_cards",    // determines parsing & CSV format
  "image_filename":  "IMG_7261.jpg",      // shown in the Slack header
  "contacts_found":  6,                   // shown in the Slack header
  "duration_s":      3.2,                 // shown in footer
  "part":            "1/1",              // supports multi-part results
  "message":         "<pipe-delimited rows, see below>"
}

The message field

For ocr_type: "business_cards", the message field is a string of pipe-delimited rows:

  • โ€ข One contact per line (\n separates rows)
  • โ€ข Fields separated by | (pipe)
  • โ€ข Exactly 9 fields per row, in order (see below)
  • โ€ข A field may contain , for multiple values (e.g. two phone numbers)
Samuel Chan|Head of Incubator|Supertype|+628778251856,...|

Multi-part results

If your OCR service processes a large image in chunks, set part to "1/3", "2/3", "3/3". Viably accumulates each chunk, posts a table per part, and uploads the combined CSV when all parts are received.

The 9 fields

Every business_cards row must have exactly 9 pipe-separated values, in this order. Leave a field empty by writing nothing between the pipes.
#FieldIn Slack tableIn CSVNotes
1nameโœ“ Nameโœ“ name
2titleโœ“ Roleโœ“ titleJob title / designation
3companyโœ“ Companyโœ“ company
4emailโœ“ Emailโœ“ email
5phoneโœ“ Phoneโœ“ phoneUse , for multiple numbers
6whatsappโ€”โœ“ whatsappCSV only
7websiteโ€”โœ“ websiteCSV only
8addressโ€”โœ“ addressCSV only
9notesโ€”โœ“ notesExtra info; use ; as delimiter

The Slack table shows only the first 5 fields (name, role, company, phone, email) to keep it readable. The downloadable CSV always contains all 9 columns.

What you get in Slack

All output is posted as a reply in the original thread โ€” never in the channel itself.

1. Queued confirmation

Immediately after you react with ๐Ÿ“ท, Viably posts a message listing which images were queued for processing.

2. Contact table (per part)

As each result arrives, Viably posts a monospace table showing name, role, company, phone, and email for every contact in that part.

3. CSV download (on completion)

Once all parts are received, Viably uploads a contacts-<job_id>.csv file to the thread. It contains all 9 fields for every extracted contact and is ready to import into any CRM or spreadsheet.