# Email

> How to give an app an email address, so that inbound messages become tickets, replies go back to the sender, and Conclude adds summaries and translations.

Canonical HTML page: https://conclude.io/doc/apps/integrations/email/
Last updated: 2026-10-30

---

This page is for app builders who want an app to receive email and answer it from the ticket channel. The YAML keys are listed under [Email connector](https://conclude.io/doc/reference/connectors/#email-connector).

## Enable email for an app

1. In the Dashboard, select **Apps** in the sidebar. Click the pencil (edit) icon of the app to open it in the editor.
2. Go to the **Integrations** tab and keep **Email** selected in the **Integration** picker.
3. Tick **Allow email access via …** and click **Save**.

![The Integrations tab of a Support app with Allow email access ticked and the app's email address shown](https://conclude.io/images/doc/email-integration/dev-app-settings-email.webp)

If your Slack workspace has a short name, the checkbox label shows `<channel>.<short name>@conclude.email` at once. Otherwise `<connector id>@conclude.email` appears after the first save.

## How a message becomes a ticket

Each new email creates one ticket with its own channel. Conclude posts the message there with a **Reply** button. It uploads the attachments to the channel, and it stores the detected language in the `email.language` attribute. The ticket is also listed under **Tickets** in the Dashboard.

![An incoming email in a Slack thread that created a Support ticket](https://conclude.io/images/doc/email-integration/dev-email-incoming.webp)

Later messages in the same thread land in the same ticket. If that ticket is concluded, Conclude reopens it and unarchives its channel.

Conclude drops definite spam. It keeps likely spam and adds a `[SPAM]` prefix to the subject. When no app matches the address, the sender gets an automatic "recipient could not be found" reply. Conclude skips that reply when the message is itself an auto-reply.

## Replies

Click **Reply** in the ticket channel, write the response and click **Send**. The reply goes out from the app's address. If the connector YAML sets `from` and `replyTo`, Conclude uses those addresses instead. Either way, it records the reply in the ticket.

![Replying to the email from the Slack thread](https://conclude.io/images/doc/email-integration/dev-email-reply.webp)

## Attribute mapping

By default the email subject fills the `title` attribute, and an empty subject becomes `-`. The trimmed body fills `body`.

An `attributeMap` under `emailConnector` chooses which email fields fill which attributes. Each entry has `external` for the email field and `internal` for the attribute name. It can also have a `defaultValue`.

```yaml
emailConnector:
  attributeMap:
    - external: subject
      internal: title
    - external: from.address
      internal: contactEmail
```

The available fields are `subject`, `body`, `from`, `from.address`, `from.name`, `to`, `to.address`, `to.name`, `cc` and `reply_to`. The reference example writes `from.email`, but the product stores the sender address as `from.address`. Mail relayed through an anonymous-sender service contributes only the subject.

## Custom domain via SendGrid

An app can also receive mail on your own subdomain. The public endpoint [`POST /v1/email/<connector id>`](https://conclude.io/doc/reference/endpoints/#email) accepts SendGrid Inbound Parse posts, which carry the full MIME message in the `email` field.

1. Run `/c app email-connector` in the app's channel to print the connector ID. Conclude creates the ID on demand.
2. In SendGrid, authenticate your domain. Then point an MX record for a subdomain such as `support.example.com` to `mx.sendgrid.net`. Your regular mail keeps working.
3. Create an Inbound Parse webhook for that host. Set the destination to `https://api.conclude.io/v1/email/<connector id>`, turn spam checking on and tick the raw MIME option.

Mail to any address at the subdomain now reaches the app. Set `from` and `replyTo` in the YAML so replies carry your domain.

## AI summaries and translation

**Email summarization.** Tick **Enable summarization of emails**. Then choose a **Summary length** and a **Summarization language**. Brief is 20 words, Medium is 40 words and Detailed is 60 words. When a ticket is created, an AI model summarizes the email into the `body` attribute, or into the attribute named by `summarize.output` in YAML. Conclude leaves text that is too short to summarize as it is. If the summarization language differs from the detected language, it translates that text instead.

![The Email summarization and Email translation settings with a 40-word English summary and Spanish, French and German as supported languages](https://conclude.io/images/doc/email-integration/dev-email-languages.webp)

**Email translation.** Choose a **Primary language**, which is English by default, and one or more **Supported languages**. With a supported language set, the email block shows a **Select translation** menu that switches between the original and each supported language. The reply form shows a **Translate reply** menu that translates your draft before you send it. Translation uses Google Cloud Translation.

![An incoming Spanish email in Slack with the Select translation menu open](https://conclude.io/images/doc/email-integration/dev-email-incoming-tr.webp)

![The same email shown in English, with a reply drafted below it and the Translate reply menu](https://conclude.io/images/doc/email-integration/dev-email-reply-tr.webp)

The `preprocess` key exists in YAML only. It runs a prompt over each inbound body before Conclude posts it. See [Email connector](https://conclude.io/doc/reference/connectors/#email-connector).

## Related pages

- [Integrations tab](https://conclude.io/doc/apps/editor/integrations/)
- [Web forms](https://conclude.io/doc/apps/integrations/web-form/)

