> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.lido.app/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Send extracted data to email or Slack

Once you've extracted data from a document, you usually want to do something with it — notify a team in Slack, email it to a manager, attach the original file, or push it to multiple places at once. This article covers the common notification patterns.

---

## Which method should I use?

| If you want to… | Use… |
| --- | --- |
| Send a one-off email from a spreadsheet cell | `SENDGMAIL` or `SENDOUTLOOK` formula |
| Notify Slack from a spreadsheet cell | `SENDSLACK` formula |
| Send notifications automatically as part of a workflow | **Send Gmail / Send Outlook / Send Slack** node |
| Forward an Outlook email after extraction | **Forward Outlook** action (`FORWARDOUTLOOK`) |
| Send extracted rows as an Excel file | **Export to Excel** node, then attach in a Send node |
| Send a templated PDF report | **PDF Form Filler** or **Template Filler** → **Send Gmail** with attachment |

The workflow nodes and the spreadsheet formulas have the same parameters. Pick based on whether the work is happening in a workflow (use the node) or anchored in a sheet (use the formula).

---

## Before you start

You need:

- A connected **Gmail, Outlook, or Slack** credential. Set these up in workspace settings.
- For Slack, the **channel ID or name** you want to post in. The Slack credential's bot user must be a member of private channels.
- For Twilio SMS: a **Twilio credential** and a verified sender number.

---

## Pattern 1: notify Slack after extraction

Add a **Send Slack** node after your **Data Extractor** node.

**Channel:** `#ap-inbox` (or any channel name your bot has access to)

**Message:**

```
New invoice extracted
Vendor: {{$item.data.Vendor Name}}
Invoice #: {{$item.data.Invoice Number}}
Total: ${{$item.data.Total Amount}}
Due: {{$item.data.Due Date}}
```

Each item flowing through the workflow becomes its own Slack message.

---

## Pattern 2: email a summary to one person

Add a **Send Gmail** node after **Data Extractor**.

**To:** `ap@yourco.com`

**Subject:** `Invoice {{$item.data.Invoice Number}} from {{$item.data.Vendor Name}}`

**Body (HTML):**

```html
<p>A new invoice was extracted from your invoice inbox.</p>
<ul>
  <li><strong>Vendor:</strong> {{$item.data.Vendor Name}}</li>
  <li><strong>Invoice #:</strong> {{$item.data.Invoice Number}}</li>
  <li><strong>Total:</strong> ${{$item.data.Total Amount}}</li>
  <li><strong>Due:</strong> {{$item.data.Due Date}}</li>
</ul>
```

For Outlook accounts, use **Send Outlook** instead — same parameters except no `sender` override.

---

## Pattern 3: attach the original document

The trigger gave you a file URL. Pass it to the Send node as an attachment.

In **Send Gmail**:

- **file_url** parameter: `{{$item.data.file.url}}` (or whatever field holds the original URL).

The recipient gets the original PDF along with the extracted summary.

---

## Pattern 4: route different items to different channels

Use the **Switch** node before your Send nodes:

```
[Data Extractor] → [Switch on Vendor Name]
                          │
                          ├─ "Vendor A" ─→ [Send Slack: #vendor-a]
                          ├─ "Vendor B" ─→ [Send Slack: #vendor-b]
                          └─ default    ─→ [Send Slack: #ap-inbox]
```

Useful when different teams own different vendor relationships.

---

## Pattern 5: aggregate before sending

You don't always want one message per item. To send a single end-of-day digest:

```
[Scheduled Trigger: daily 5pm]
        │
        ▼
[Get Table: today's invoices]
        │
        ▼
[Aggregate: count by vendor]
        │
        ▼
[Send Gmail: digest with table]
```

Use **Aggregate** to collapse many items into one summary, then a single Send node.

---

## Spreadsheet-anchored alternatives

If the work lives in a sheet (no workflow), use formulas:

```
=SENDGMAIL("gmail-cred-id",
           Invoices[@Email],
           "Invoice " & Invoices[@Invoice Number],
           "Total: $" & Invoices[@Total Amount],
           Invoices[@Send Status])
```

Add this as a column. Right-click → Run on a single row to send for one row, or Create Automation to send for every row on a schedule.

For Slack:

```
=SENDSLACK("slack-cred-id",
           "#ap-inbox",
           "Invoice " & Invoices[@Invoice Number] & " for $" & Invoices[@Total Amount],
           Invoices[@Send Status])
```

---

## Tips

- **Use the `status_ref` parameter** wherever it exists. It writes the success/failure status into a cell or column so you can see what went through.
- **HTML is supported in Send Gmail / Send Outlook bodies.** Use it for tables, links, and basic formatting.
- **Keep Slack messages short and structured.** Long Slack walls of text get ignored. Use bullets or a code block.
- **Don't email the same address from multiple workflows simultaneously** without throttling. You'll trigger spam filters.
- **Test with your own email/channel first.** Then switch to the production destination.
- **Don't include sensitive document contents in chat or email** unless your team has agreed it's safe. Many extraction documents contain personal data.

---

## Common mistakes

- **Sending one notification per workflow item when you wanted one per batch.** Use Aggregate first if you want a digest.
- **Slack bot not in the channel.** Send Slack will fail silently or with a confusing error if the bot user hasn't been added to the channel. Add the bot first.
- **Not handling the Send node's error output.** A failed email is much worse than an obvious error message — always wire up the error output to a logging or alerting node.
- **Hardcoding recipient addresses.** Use a column or workspace setting so you can change recipients without editing the workflow.
- **Including raw `{{$item.data...}}` in the message** because the parameter is in literal mode instead of expression mode. Toggle the mode switch in the parameter input.
- **Trying to send 10,000 emails in one workflow run** without throttling. Most providers will rate-limit or quarantine you. Use the Limit node and node-level concurrency settings.

---

## Related articles

- Extract data from PDFs and documents
- Automate extraction with workflows
- Build your first workflow
- Connect Gmail
- Connect Outlook
- Lido Mailbox
- Triggers: how workflows start (Scheduled Trigger)