# Integrations

Connect Google Sheets, Slack, Discord, Microsoft Teams, Telegram, Zapier, Make, n8n or your own server, and get each response there as it comes in.

Open your form, go to **Integrations**, and pick an app. Each new response is sent there the moment it comes in.

## Connect an app

1. Click **Connect** on the app.
2. Give it a **Name**. It is only for you, to tell your connections apart (for example "Orders channel"). It is not sent anywhere.
3. Paste what the app asks for. The box says where to find it:
   - **Slack:** an Incoming Webhook address for the channel you want.
   - **Discord:** a webhook address, made in the channel's settings under Integrations.
   - **Microsoft Teams:** the address of a workflow that starts when a webhook request is received.
   - **Telegram:** the token of a bot you made with @BotFather.
   - **Zapier:** the address of a Catch Hook. In Zapier, make a Zap that starts with **Webhooks by Zapier**, choose **Catch Hook**, and copy the address. It starts with `https://hooks.zapier.com/hooks/catch/`.
   - **Make:** the address of a custom webhook. In Make, start a scenario with **Webhooks**, choose **Custom webhook**, and copy the address. It starts with `https://hook.`.
   - **n8n:** the **Production URL** of a Webhook node (method **POST**). Publish the workflow so that address works. The test address (it has `/webhook-test/` in it) is refused. n8n has to be reachable from the internet.
   - **Google Sheets:** nothing to paste. You sign in to Google and allow it.
   - **Webhook:** nothing now. You give the address when you turn it on for a form.

A connection belongs to your workspace, so you connect once and use it in any of your forms. You can connect the same app more than once, for example to two channels.

## Turn it on for a form

In the app's box, switch on the connection you want. Telegram asks which chat, and a webhook asks for its address. To change that later, click **Change**.

## Google Sheets

Click **Continue to Google Sheets**, sign in to Google and allow it. You come back to the same place, connected.

When you switch it on for a form, a new sheet named after the form is made in your Google Drive. The first row has **Submitted at** and **Submission ID**. Each question gets its own column the first time it is answered, and each response is one row. A question you add later gets a new column at the end.

- Click **Open sheet** next to the connection to see it.
- It can only open the sheets it made, never your other files.
- If you rename the form, the sheet keeps its name. Rename the sheet in Google if you like.
- If the sheet is deleted, the log says so. Click **Start over** to make a new one. The old sheet stays in your Drive and the log of this form starts empty.
- If you take the access back in your Google account, the connection says **Connect again**.
- Google takes about 60 rows a minute. If more come at once, the rest are sent a little later.

## Zapier, Make and n8n

They all get the same thing, a JSON body, and start a run with it:

```json
{
  "event": "submission.created",
  "ref": "<the response's id>",
  "occurredAt": "2026-10-27T10:30:00.000Z",
  "form": "Contact us",
  "title": "New response: Contact us",
  "url": "<the response in InvoyForm>",
  "answers": { "Your name": "Asha", "Email": "asha@example.com" }
}
```

- `answers` has each answer under the label of its question, so you can pick it by name in the tool. If two questions have the same label, the second one is "Label (2)".
- Before you map fields in the tool, click **Send a test** next to the connection (it shows once the connection is on for the form). We send one example response, the same for every form: **Your name**, **Email** and **Message**. It is not in the log and is not a real response. Your own questions arrive with your first real response, so send one from your form to map them.
- The address is the secret. We keep it sealed, and nobody can see it again after you paste it. If it leaks, make a new one in the tool and connect again.
- Uploaded files are not sent.

## See what was sent

Open the **Logs** tab of the app's box. Each line is one response, with the connection it went to and how it went:

| Shown | What it means |
|---|---|
| Sent | The app took it. |
| Waiting | It is on its way. |
| Will try again | The app did not take it, and we try again shortly. |
| Not sent | We stopped trying. The line says why in plain words. |

## Good to know

- Every app is free on every plan. The number of apps one form can send to depends on the plan: 3 on Free, 8 on Pro and 15 on Business. If you move to a lower plan, the first apps you added keep sending and the others wait, with nothing deleted, until you upgrade.
- Only an owner or an admin can connect an app or turn it on. Editors and viewers can look.
- If an app does not take a response, we try five times in total, over a little more than an hour, and then mark it as not sent.
- Very long answers are shortened in a chat message so that the app does not refuse it. A webhook gets the whole answer.
- Uploaded files are not sent.
- The log keeps the last 30 days.
- Disconnecting an app stops it for every form that used it.
- For a form you have saved, the open box is in the address (for example `/builder/<your form>/integrations/slack?tab=logs`), so you can reload it, use the back button to close it, or share the link with your team.
