---
title: "Email providers and BYOK"
description: "Notification emails, the autoresponder and bringing your own email provider keys."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.getquickforms.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Email providers and BYOK

Every submission can send a notification email to you and an autoresponder to the person who submitted. Forms with [double opt-in](https://docs.getquickforms.com/double-opt-in/) also send a confirmation email first, through the same provider.

These emails need your own [mail provider](#bring-your-own-keys). Without one, the team owner gets an hourly summary saying how many new messages arrived, and double opt-in is skipped. Set `settings.notify.frequency` to `every` (**On every response** in the editor) to email the owner about each response instead. These emails link to the dashboard and never include the answers.

## Notification email

- Sent to `settings.notify.emails` (up to 10 addresses), or to the team owner when the list is empty. Turn it off with `settings.notify.enabled: false`.
- [Routing rules](https://docs.getquickforms.com/routing-rules/) can add to or replace these recipients based on the answers.
- The email lists every field in schema order. File fields get a signed download link.
- Sandbox submissions get `[Sandbox] ` in front of the subject.

```json title="settings.notify"
{
  "enabled": true,
  "emails": ["team@example.com"],
  "subject": "[{{_form_name}}] {{topic}} enquiry from {{name}}",
  "reply_to_field": "work_email"
}
```

### Subject

`settings.notify.subject` sets the subject line, up to 200 characters. The default is `New submission: {{_form_name}}`, which is also used when the subject is blank. It can use any of the [placeholders](#placeholders).

### Reply-to

`settings.notify.reply_to_field` picks where replies to the notification go, so you can answer the submitter straight from your inbox.

| Value | Reply-to |
| --- | --- |
| `null` (the default) | The autoresponder's address when the autoresponder is on, otherwise the first email field with an answer. |
| An email field's name | That field's answer. |
| `"none"` | No reply-to. |

Reply-to is only set when the answer is a valid email address. Any value other than `null`, `"none"` or one of the form's email fields gets a `422` on `settings.notify.reply_to_field` with "Reply-to must be one of the form's email fields, or "none"."

## Placeholders

The notification subject and the autoresponder subject and body can use `{{name}}` placeholders, filled from the submission. Spaces inside the braces are allowed, so `{{ name }}` works too.

| Placeholder | Value |
| --- | --- |
| `{{field_name}}` | The answer to any field. Several answers are joined with `, `, yes/no answers become `Yes` or `No`, and file fields become their signed download link. |
| `{{_form_name}}` | The form's name. |
| `{{_form_id}}` | The form's ID. |
| `{{_submission_id}}` | The submission's ID. |
| `{{_submitted_at}}` | When it was submitted, as an ISO 8601 date and time. |
| `{{_summary}}` | Every field as `Label: answer`, one per line, in schema order. |
| `{{_link_label}}` | The label of the [personal link](https://docs.getquickforms.com/personal-links/) it came through, if any. |

Unknown fields and empty answers become blank.

## Autoresponder

Turn on `settings.autoresponder.enabled` to reply to the submitter. It goes to the field named in `email_field`, or the first email field in the schema. `subject` and `body` support the same [placeholders](#placeholders) as the notification subject. Replies to the autoresponder go to the first address in `settings.notify.emails`, if there is one.

```json title="settings.autoresponder"
{
  "enabled": true,
  "email_field": "email",
  "subject": "Thanks {{name}}, we got your message",
  "body": "Hi {{name}},\n\nThanks for getting in touch about {{plan}}. We will get back to you soon."
}
```

## Bring your own keys

Add mail providers to your team in the dashboard or through the [API](https://docs.getquickforms.com/api/#mail-providers). A form uses its own provider if it has one, otherwise the team default. The from address and name come from the provider.

### Limits

These stop forms being used to send mail to people who didn't ask for it. An email over a limit isn't sent and shows in the delivery log as failed with the reason.

| Limit | Default | Set with |
| --- | --- | --- |
| Autoresponders and confirmations to one address, per hour | 10 | `QUICKFORMS_EMAIL_PER_RECIPIENT_PER_HOUR` |
| Notification recipients for one submission | 20 | `QUICKFORMS_EMAIL_MAX_NOTIFY_RECIPIENTS` |

| `driver` value | Provider | Credentials |
| --- | --- | --- |
| `resend` | Resend | `api_key` |
| `postmark` | Postmark | `api_key` |
| `mailgun` | Mailgun | `api_key`, `domain`, optional `region` (us or eu) |
| `ses` | Amazon SES | `access_key_id`, `secret_access_key`, `region` |
| `smtp` | SMTP | `host` (must be a public address), `port` (25, 465, 587 or 2525), optional `username`, `password`, `encryption` (tls, ssl or none) |
| `mailchimp` | Mailchimp Transactional (Mandrill) | `api_key` |

> **Tip**
>
> Credentials are encrypted at rest and write-only. API responses only ever include masked values, with the last four characters of each secret visible.

Failed emails are retried after 30 seconds, 5 minutes and 30 minutes, and every attempt is logged like a webhook attempt.

How quickforms builds the mailer for your keys is covered in [mail transports](https://docs.getquickforms.com/email/mail-transports/).

Source: https://docs.getquickforms.com/email/index.mdx
