# Formstep Docs — Integrations

# Integrations overview

Every tool Formstep works with and the page that sets each one up: where answers go, where requests come from, what runs inside the form, analytics, and your own site.

## Where the answers go

- [HubSpot](https://formstep.io/docs/integrations/hubspot/) — Update or create the HubSpot contact behind each submission, matched by email.

- [Google Sheets](https://formstep.io/docs/integrations/google-sheets/) — Add every submission to a Google spreadsheet, with the columns you choose.

- [Airtable](https://formstep.io/docs/integrations/airtable/) — Push submissions into an Airtable base with typed field mapping.

- [Notion: submissions](https://formstep.io/docs/integrations/notion/) — Add submissions to a Notion database, with each field mapped to a property.

- [Slack](https://formstep.io/docs/integrations/slack/) — Post new submissions to a Slack channel with custom message templates.

- [Discord](https://formstep.io/docs/integrations/discord/) — Post each form submission to a Discord channel with mentions.

- [Linear](https://formstep.io/docs/integrations/linear/) — Open a Linear issue from each submission, in the team you pick.

- [GitHub](https://formstep.io/docs/integrations/github/) — Open a GitHub issue from each submission, in the repository you pick.

- [Webhooks](https://formstep.io/docs/integrations/webhooks/) — Send each submission to a URL of your own, such as your backend, a serverless function or an automation tool that takes webhooks.

- [n8n: submissions](https://formstep.io/docs/guides/n8n/public-link-submissions/) — Run an n8n workflow when someone submits, edits or abandons a form through its share link, and pass the answers to the next node.

- [Zapier: submissions](https://formstep.io/docs/guides/zapier/public-link-submissions/) — Start a Zap when someone submits, edits or abandons a form through its share link, and send the answers to email, Sheets, Slack or a CRM.

- [Make: submissions](https://formstep.io/docs/guides/make/public-link-submissions/) — Run a Make scenario when someone submits, edits or abandons a form through its share link, and map each answer by its question.

## Where requests come from

- [n8n: requests](https://formstep.io/docs/guides/n8n/send-a-request/) — Create a Formstep request from an n8n workflow, prefill and lock what you already know, then wait for the answer in the same workflow or start another one when a request ends.

- [Zapier: requests](https://formstep.io/docs/guides/zapier/send-a-request/) — Create a Formstep request from any Zapier trigger, prefill and lock the answers you already know, send the link, then find, remind or cancel the request from a later Zap.

- [Make: requests](https://formstep.io/docs/guides/make/requests/) — Create a Formstep request from a Make scenario, prefill it per field, and run a scenario when the recipient completes it, it expires or is canceled.

- [MCP](https://formstep.io/docs/guides/ai-agents/send-a-request/) — Ask a connected agent to send a Formstep request to one person, prefill and lock what you already know, and read the answers back when they are done.

- [Claude, ChatGPT](https://formstep.io/docs/guides/ai-agents/connect/) — Add Formstep to Claude, ChatGPT, Cursor or any tool that supports remote MCP servers, sign in, and pick the workspace the agent may use.

- [REST API](https://formstep.io/docs/developers/quickstart-send-a-request/) — Create an API token, read a form's field keys, and create a prefilled request with curl, from any tool that can make an HTTP call.

## Inside the form

- [Cal.com](https://formstep.io/docs/integrations/cal-com/) — Let respondents choose and book a Cal.com appointment without leaving your form.

- [Stripe](https://formstep.io/docs/building-forms/payment-collection/) — Accept one-time payments from respondents via Stripe.

## Analytics

- [Google Analytics, Axiom](https://formstep.io/docs/integrations/analytics-streaming/) — Send form views, starts and submissions to Google Analytics 4 or Axiom, and, with Axiom, the answers of each submission too.

## On your own site

- [Inline embed, Popup](https://formstep.io/docs/sharing-publishing/embedding-popups/) — Embed your form on a website or show it as a popup over the page.

- [Webflow](https://formstep.io/docs/sharing-publishing/embed-in-webflow/) — Put a Formstep form inside a Webflow page with a Code Embed element, or open it as a popup from a button.

- [WordPress](https://formstep.io/docs/sharing-publishing/embed-in-wordpress/) — Put a Formstep form inside a WordPress page or post with a Custom HTML block.

- [Framer](https://formstep.io/docs/sharing-publishing/embed-in-framer/) — Put a Formstep form inside a Framer page with the Embed component, from the share link or from the embed code.

- [Notion: embed](https://formstep.io/docs/sharing-publishing/embed-in-notion/) — Put a Formstep form inside a Notion page with an Embed block.

## A form’s integrations

Open a form and click **Integrations** (plug icon) in its top bar. The dialog lists every integration, says how each one on this form is doing, and opens the one you pick to set it up, test it or change it. An amber dot on the button means an integration stopped delivering: see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

![The Integrations dialog: every integration on the left, Google Sheets and Slack with their status, and the Slack integration open on the right: its status with Send test, Recent deliveries, and its setup read back with Edit.](https://formstep.io/docs/images/integrations/integrations-dialog.png)

A form's Integrations dialog

Every integration works on every plan. Sending unfinished drafts to an integration needs Pro or Business.

> **Send only what you need**
>
> An integration sends respondents’ answers to another service. Connect only destinations you trust, map only the fields you need, and make sure your privacy notice covers it.

# HubSpot

Update or create the HubSpot contact behind each submission, matched by email. Map fields to contact properties, and pick contacts as recipients of a request.

## What you get

- One HubSpot contact per email address, updated or created
- Each field mapped to a contact property of a matching type
- Edits update the same contact again
- A legal basis for new contacts, for accounts that need one
- A test send that changes only a test contact

For an overview, see [Formstep for HubSpot](https://formstep.io/integrations/hubspot/).

## Connect HubSpot

1. **Open Integrations**

   Click **Integrations** (plug icon) in the form's top bar, then pick HubSpot under CRM.

2. **HubSpot account**

   Pick a connected HubSpot account, or click **Connect HubSpot account**. Formstep then loads the account's contact properties.

3. **Contact properties**

   Match each form field to a contact property. Only compatible properties are listed. Map one form field to Email: Formstep finds the contact by it. If the account needs a legal basis, pick one here too.

4. **Turn it on**

   Click **Turn on HubSpot**, then **Send test** to write sample values to the test contact formstep-test\@example.com.

## How a submission finds its contact

The answer mapped to **Email** picks the contact. On each completed submission, Formstep:

1. Updates the HubSpot contact with that email, writing only the properties you mapped.
2. Creates the contact when no contact has that email. A new contact gets the mapped answers, the email, and the legal basis.

When a respondent edits their submission, Formstep updates the same contact again. An empty answer never clears a value in HubSpot. Formstep never changes properties you did not map.

> **Make the email question required**
>
> Without an email answer, the delivery fails and is not retried. Make the question you mapped to Email required.

## Legal basis for new contacts

With data privacy settings on, HubSpot creates no contact without a legal basis. EU accounts have this setting by default. Then the Configure step shows **Legal basis for new contacts** with your account’s options. Pick one to continue.

Formstep writes the legal basis only on a new contact. An existing contact keeps its legal basis, because it records the consent your team collected. You cannot map a form field to the legal basis.

## Property types

| Form field | Compatible HubSpot properties |
| - | - |
| Any field | Single-line text, Multi-line text |
| Number, Rating, Scale | Number, plus text |
| Date | Date picker, Date and time picker, plus text |
| Phone | Phone number, plus text |
| Radio, Dropdown, Checkboxes, Picture choice | Dropdown select, Radio select, Multiple checkboxes, plus text |
| Toggle switch | Single checkbox, plus text |
| Repeating group (whole group) | Text only |

- A choice answer goes to the HubSpot option whose internal value or label matches the Formstep option’s key or label, ignoring case. An answer with no matching option is left out, and the rest of the write goes through.

- Several selected options go to a Multiple checkboxes property together.

- Metadata can be mapped as well, for example **Submitted at** to a date property or **PDF Link** to a text property.

Read-only, calculated, hidden, and archived properties are not listed. The property list refreshes each time you open the integration.

## Test event

**Send test** writes placeholder values to the contact `formstep-test@example.com`, and creates it if needed. It never changes any other contact. Delete the test contact in HubSpot when you are done.

## Find HubSpot contacts for a request

The New request sheet can also add people from HubSpot. Click **Import**, then **Find in HubSpot**, and search by name or email. A contact fills in the person’s email and name. Fill in the rest of the [request](https://formstep.io/docs/requests/overview/) as usual. On Pro and Business, tick several contacts to send one request each: see [Bulk send](https://formstep.io/docs/requests/bulk-send/).

- The form needs no HubSpot integration for this. A contact you pick never fills in form fields.

- The workspace owner connects HubSpot once, under Integrations or from **Import** › **Connect HubSpot**. Then everyone in the workspace can search it. When the connection expires, the owner sees **Reconnect HubSpot** there.

- Answers reach HubSpot only through the form’s HubSpot integration, like every other submission.

- **Try it yourself** never updates HubSpot: a test request does not reach integrations.

> **Only in the dashboard**
>
> An automation cannot search HubSpot through Formstep. It looks the contact up itself, for example with the HubSpot step in n8n or Zapier, and prefills the request with what it found. Prefill and lock the field mapped to Email with the contact’s email, and the answers update that contact. See [Prefill, locked fields and hidden fields](https://formstep.io/docs/requests/creating-requests/#three-buckets).

## What it doesn’t do

- Unfinished drafts are not sent to HubSpot. Only finished submissions and edits update contacts.
- Existing submissions are not exported when you connect. Contacts are updated from the next submission on.
- It writes contacts only, not companies, deals, or tickets.

## Property changes in HubSpot

- Delete a mapped property: Formstep leaves it out, and the rest of the contact still updates.
- Change a property’s type or options: answers are converted to the new definition.
- Change a property to a type that no longer fits the form field: the mapping shows a warning. Map that field again.

## When something goes wrong

- If the integration shows **Connection expired**, for example because the app was uninstalled in HubSpot, click **Reconnect**.

- HubSpot can refuse a value, for example one that breaks a validation rule on the property. The failed event under **Recent events** shows HubSpot’s message. Fix the form field or the property, then send it again with [Retry all](https://formstep.io/docs/integrations/health-monitoring/#failed-deliveries).

- If the contact properties do not load, click **Try again**. If it keeps failing, reconnect the account.

## FAQ

**What access does Formstep need?**

Access to read and write contacts and to read their property definitions. You sign in with HubSpot, so there are no keys to manage. It does not ask for access to companies, deals or other objects.

**Can other workspace members see my HubSpot connection?**

Yes. HubSpot accounts are connected to the workspace. Any member can use any connected account in an integration.

**Can I connect multiple HubSpot accounts?**

Yes. The workspace owner connects more accounts, from Integrations or during setup. Each form picks one account.

**Does an edit create a second contact?**

No. The edit updates the contact with the email in the submission. If the respondent changes the email answer, Formstep updates or creates the contact with the new email.

**How do I remove the integration?**

Open Integrations, pick HubSpot under **On this form**, and choose **Delete integration** in the ⋯ menu. To also revoke Formstep’s access, uninstall the Formstep app in HubSpot under Settings › Integrations › Connected apps.

## Next steps

[Send a request](https://formstep.io/docs/requests/creating-requests/) — Prefill and lock fields for one recipient

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries, pausing and reconnecting

[Client intake template](https://formstep.io/templates/client-onboarding/) — A form to prefill from a contact, whose answers update it

[Email capture to a CRM-prefilled form](https://formstep.io/workflows/zapier-hubspot-prefill-form/) — A Zap that looks the person up in HubSpot and sends them a prefilled form

# Google Sheets

Add every submission to a Google spreadsheet, with the columns you choose. Formstep creates the spreadsheet, and past submissions can be copied in too.

## What you get

- One row per submission, as it arrives
- The columns you choose, with your own headers
- A spreadsheet Formstep creates for you
- Past submissions copied in when you connect

## Connect Google Sheets

1. **Open Integrations**

   Click Integrations in the form's top bar, then pick Google Sheets.

2. **Google account and spreadsheet**

   Pick a connected Google account, or click **Connect Google account**. You can name the spreadsheet; it defaults to the form name.

3. **Columns**

   All fields are included by default. Turn off **Export all form fields** to remove any, add metadata, and rename column headers.

4. **Turn it on**

   Under **More options**, turn on **Export existing submissions** to copy past responses. Click **Turn on Google Sheets**, then **Send test** to add a test row.

## Column mapping

Toggle **Export all form fields** to include every question, or turn it off to pick specific fields and set custom column headers.

Formstep writes values by column position. Renaming a header in Google Sheets is fine; moving or deleting a column puts values in the wrong place. When your mapping changes, Formstep rewrites the header row.

### Repeating groups

Map a [repeating group](https://formstep.io/docs/building-forms/repeating-groups/) in either or both ways:

- The whole group maps to one column. Every item shows as numbered, labeled rows, like “1. Full name: Jane Appleseed, Age: 34, 2. Full name: Marcus Lee, Age: 29”.

- Each member field maps to its own column. The values from every item join with `· `, so the Full name column reads “Jane Appleseed · Marcus Lee”.

### Metadata columns

| Column | What it contains |
| - | - |
| Submitted at | The date and time the response was submitted. |
| Submitter | The respondent's email address when one was captured, otherwise "Anonymous". |
| Submission ID | A unique identifier for the submission. |
| Form name | The internal name of your form. |
| Submission status | "Completed", "Partial" for an unfinished draft, or "Updated" when the respondent edited it. |
| PDF Link | A link to the generated submission PDF. |
| Submission language | The language the response was submitted in, as a code such as de. |
| Channel | "Public link" when the response came through a share link, "Request" when it answered a request. |
| Request ID | The id of the request the response answered. Empty for a share-link response. |

By default, Submitted at and Submitter are included. Add or remove any metadata column during setup, and rename any of them like a normal column header.

## Auto-created spreadsheets

Formstep creates the spreadsheet in your Google Drive when the first submission arrives. If you delete it, Formstep creates a new one on the next submission.

## Test event

**Send test** adds a row of placeholder values, so you can check the columns.

## Backfill existing submissions

Past submissions are copied in the background, oldest first. The integration shows the progress.

## Unfinished drafts

On Pro and Business, Google Sheets can also add [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts), set under **More options** › **Unfinished drafts**. Their rows say “Partial” in the Submission status column.

## When something goes wrong

| Problem | What happens |
| - | - |
| Google access ends | You'll be asked to reconnect your Google account. |
| Spreadsheet deleted | Formstep creates a new spreadsheet with the header row and adds the submission, so nothing is lost. |
| Permission denied | The Google account lost access to the spreadsheet. Reconnect the account. |
| Sheet tab renamed | New rows stop with an error. Rename the tab back, or set up the integration again. |
| Google is busy or down | The delivery is retried automatically. |

For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**Can other workspace members see my Google connection?**

Yes. Google accounts are connected at the workspace level. Any member can use any connected account when setting up an integration, without re-authorizing it.

**What access does Formstep need?**

Permission to create spreadsheets in Google Drive and edit only the ones it creates (per-file access), and read your email and profile name. Formstep cannot read your other Drive files or access anything outside the spreadsheets it creates.

**Can I connect multiple Google accounts?**

A workspace can connect several Google accounts, and each form picks one. The workspace owner adds accounts during setup.

**Can I edit the column mapping later?**

Yes. Open the integration and re-map fields. The next delivery rewrites the header row to match; existing rows keep the values they were written with.

**Can I point the integration at a different spreadsheet?**

No. The spreadsheet is fixed once the integration is created. Delete it and create a new one.

**How do I remove the integration?**

Open Integrations, pick Google Sheets under **On this form**, and choose **Delete integration** in the ⋯ menu. To also revoke Formstep’s access to your Google account, visit your [Google account permissions](https://myaccount.google.com/permissions) page.

## Next steps

[Airtable](https://formstep.io/docs/integrations/airtable/) — Add each submission to an Airtable base

[Notion](https://formstep.io/docs/integrations/notion/) — Add each submission to a Notion database

[Repeating groups](https://formstep.io/docs/building-forms/repeating-groups/) — Let respondents add as many items as they need

[Exporting submissions](https://formstep.io/docs/submissions-analytics/exports/) — Download CSV, Excel or PDF

# Airtable

Push submissions into an Airtable base with typed field mapping. Each submission becomes a new record, and past submissions can be copied in when you connect.

## What you get

- One record per submission
- Each field mapped to a column of a matching type
- Metadata columns, including a link to the submission PDF
- An optional rich-text body built from the answers
- Past submissions copied in when you connect
- Mappings that keep working when you rename a column

## Connect Airtable

1. **Open Integrations**

   Click **Integrations** (plug icon) in the form's top bar, then pick Airtable.

2. **Account and table**

   Pick a connected Airtable account, or click **Connect Airtable account** and choose the bases Formstep may use. Then pick the base and table.

3. **Fields**

   Match each form field to a column. Only columns of a compatible type are listed. You can also write a rich-text body.

4. **Turn it on**

   Under **More options**, turn on **Export existing submissions** to copy past responses. Click **Turn on Airtable**, then **Send test** to write a placeholder record.

## Column types

| Form field | Compatible Airtable columns |
| - | - |
| Short / long text | Single line text, Long text, Rich text |
| Email | Email, Single line text, Long text, Rich text |
| Phone | Phone, Single line text, Long text, Rich text |
| URL | URL, Single line text, Long text, Rich text |
| Number | Number, Currency, Percent, Rating, Duration, Single line text, Long text, Rich text |
| Rating / Scale | Rating, Number, Single line text, Long text, Rich text |
| Date | Date, Date & time, Single line text, Long text, Rich text |
| Time | Single line text, Long text, Rich text |
| Toggle switch | Checkbox, Single line text, Long text, Rich text |
| Radio / Dropdown (single) | Single select, Multi-select, Single line text, Long text, Rich text |
| Checkboxes (multi) | Multi-select, Single line text, Long text, Rich text |
| File upload | Attachments, URL, Single line text, Long text, Rich text |
| Signature | URL, Single line text, Long text, Rich text |
| Picture choice | Multi-select, Single select, Single line text, Long text, Rich text |
| Payment | Currency, Number, Single line text, Long text, Rich text |
| Matrix / Ranking | Single line text, Long text, Rich text |

When an answer matches no select option, Formstep creates the option.

You cannot map read-only columns: formula, rollup, count, lookup, linked record, collaborator, created/modified time, created/modified by, auto-number, button, and synced-source columns.

## Repeating groups

Map a [repeating group](https://formstep.io/docs/building-forms/repeating-groups/) in either or both ways:

- The whole group maps to one field. Every item shows as numbered, labeled rows, like “1. Full name: Jane Appleseed, Age: 34, 2. Full name: Marcus Lee, Age: 29”.

- Each member field maps to its own field. The values from every item join with `· `, so the Full name field reads “Jane Appleseed · Marcus Lee”.

## Rich-text body

You can write the content of a Rich text, Long text, or Single line text column in the template editor. Type **@** to insert an answer or metadata, such as PDF Link. Rich text columns keep the formatting. Other columns get plain Markdown.

You can use headings (H1-H4), **bold**, _italic_, ~~strikethrough~~, `inline code`, links, and lists. Images and embeds are not supported.

## Test event

**Send test** writes a record of placeholder values. Select columns get the question’s first option, so no new options are created. Delete the test record when you are done.

## Backfill existing submissions

Past submissions are copied in the background. The integration shows the progress.

## Unfinished drafts

On Pro and Business, Airtable can also add [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts), set under **More options** › **Unfinished drafts**. To tell them apart, map Submission status to a single-select or text column: it reads “Partial”, “Completed” or “Updated”.

## Column changes in Airtable

- Rename a column: the mapping updates on the next submission.
- Delete a column: Formstep drops it from the mapping and syncs the other fields.
- Change a column to an incompatible type: that value fails to sync. Open the integration and map the field again.

## When something goes wrong

- If a column is missing from the list, check that you gave Formstep access to the base and that the column type can be written (see [Column types](#column-types)).

- If the integration shows **Connection expired**, for example because you revoked access in Airtable, click **Reconnect**.

- When Airtable is busy, Formstep slows down and retries on its own. For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**What access does Formstep need?**

It reads and writes records, reads the structure of your bases, and reads your email to know which account is connected. You sign in with Airtable, so there are no keys to manage.

**Can other workspace members see my Airtable connection?**

Yes. Airtable accounts are connected to the workspace. Any member can use any connected account in an integration.

**Can I connect multiple Airtable accounts?**

Yes. The workspace owner connects more accounts, from Integrations or during setup. Each form picks one account.

**What happens if I delete the Airtable table?**

The next submission fails with a “not found” error and the integration stops. You cannot change the base or table later. Delete the integration and create a new one for the new table.

**How do I remove the integration?**

Open Integrations, pick Airtable under **On this form**, and choose **Delete integration** in the ⋯ menu. To also revoke Formstep’s access, remove Formstep in your Airtable account settings.

## Next steps

[Notion](https://formstep.io/docs/integrations/notion/) — Add each submission to a Notion database

[Google Sheets](https://formstep.io/docs/integrations/google-sheets/) — Add each submission to a spreadsheet as a row

[Repeating groups](https://formstep.io/docs/building-forms/repeating-groups/) — Let respondents add as many items as they need

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries, pausing and reconnecting

# Notion

Add submissions to a Notion database, with each field mapped to a property. Each submission becomes a new page with an optional body, and past submissions can be copied in.

## What you get

- One Notion page per submission
- Each field mapped to a database property
- An optional page body built from the answers
- Past submissions copied in when you connect
- Mappings that keep working when you rename a property

## Connect Notion

1. **Open Integrations**

   Click **Integrations** (plug icon) in the form's top bar, then pick Notion.

2. **Workspace and database**

   Pick a connected Notion account, or click **Connect Notion workspace**. Share the database with Formstep there: Formstep sees only the databases you share. Then pick the database.

3. **Properties**

   Match each form field to a Notion property. Only properties of a compatible type are listed. You can also write a page body.

4. **Turn it on**

   Under **More options**, turn on **Export existing submissions** to copy past responses. Click **Turn on Notion**, then **Send test** to create a placeholder page.

## Property types

| Form field | Compatible Notion properties |
| - | - |
| Short / long text | Title, Rich text |
| Email | Email, Title, Rich text |
| Phone | Phone, Title, Rich text |
| URL | URL, Title, Rich text |
| Number / Rating / Scale | Number, Title, Rich text |
| Date | Date, Title, Rich text |
| Time | Title, Rich text |
| Radio / Dropdown (single) | Select, Status, Title, Rich text |
| Checkboxes (multi) | Multi-select, Title, Rich text |
| Toggle switch | Checkbox, Title, Rich text |
| File upload | Files, URL, Title, Rich text |
| Signature | URL, Title, Rich text |
| Picture choice | Multi-select, Title, Rich text |
| Matrix / Ranking / Payment | Title, Rich text |

### Metadata properties

| Metadata | Compatible Notion properties |
| - | - |
| Submitted at | Date, Title, Rich text |
| Respondent email | Email, Title, Rich text |
| Submission ID | Title, Rich text |
| Form name | Title, Rich text |
| Submission status | Status, Select, Title, Rich text |
| PDF Link | URL, Files, Title, Rich text |
| Submission language | Title, Rich text |
| Channel | Select, Title, Rich text |
| Request ID | Title, Rich text |

Channel reads “Public link” or “Request”. Request ID holds the id of the request the response answered. Use them to separate the two kinds of response.

## Repeating groups

Map a [repeating group](https://formstep.io/docs/building-forms/repeating-groups/) in either or both ways:

- The whole group maps to one Rich text or Title property. Every item shows as numbered, labeled rows, like “1. Full name: Jane Appleseed, Age: 34, 2. Full name: Marcus Lee, Age: 29”.

- Each member field maps to its own property. The values from every item join with `· `, so the Full name property reads “Jane Appleseed · Marcus Lee”.

## Rich page body

You can write the page body in the template editor. Type **@** to insert an answer or metadata, such as PDF Link.

You can use paragraphs, **bold**, _italic_, _underline_, and links. Headings, lists, and images show as plain paragraphs.

## Test event

**Send test** creates a real page of placeholder values in your database. Delete the test page when you are done.

## Backfill existing submissions

Past submissions are copied in the background. The integration shows the progress.

## Unfinished drafts

On Pro and Business, Notion can also add [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts), set under **More options** › **Unfinished drafts**. To tell them apart, map Submission status to a Status or Select property: it reads “Partial”, “Completed” or “Updated”.

## Property changes in Notion

- Rename a property: the mapping updates on the next submission.

- Delete a property: Formstep drops it from the mapping and syncs the other fields.

- Change a property to an incompatible type, for example number to select: that value can fail to sync. Open the integration and map the field again.

## When something goes wrong

- If a database is missing from the list, connect again and share the database with Formstep on Notion’s consent screen.

- If a value does not sync, its property has a type that does not fit. Open the integration to see which field to fix.

- If you remove Formstep in Notion, under Settings › Connections, the integration stops and the person who set it up gets an email. Connect again to restore it.

- When Notion is busy, Formstep retries on its own. For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**Does Formstep create the database for me?**

No. Create the database in Notion first, then share it with Formstep during authorization.

**What happens if I delete the Notion database?**

The next submission fails with a “not found” error and the integration stops. You cannot change the database later. Delete the integration and create a new one for the new database.

**Can other workspace members see my Notion connection?**

Yes. Notion accounts are connected to the workspace. Any member can use any connected account in an integration.

**Can I connect multiple Notion accounts?**

Yes. The workspace owner connects more Notion workspaces, from Integrations or during setup. Each form picks one account.

**How do I remove the integration?**

Open Integrations, pick Notion under **On this form**, and choose **Delete integration** in the ⋯ menu. To also revoke Formstep’s access, remove Formstep in Notion, under Settings › Connections.

## Next steps

[Airtable](https://formstep.io/docs/integrations/airtable/) — Add each submission to an Airtable base

[Google Sheets](https://formstep.io/docs/integrations/google-sheets/) — Add each submission to a spreadsheet as a row

[Repeating groups](https://formstep.io/docs/building-forms/repeating-groups/) — Let respondents add as many items as they need

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries, pausing and reconnecting

# Slack

Post new submissions to a Slack channel with custom message templates. Insert answers with @, mention users and groups, and post to several channels per form.

## What you get

- One message per submission, in the channel you pick
- Your own message template. Type **@** to insert a field value.
- Mentions of users, user groups, and `@here`, `@channel`, or `@everyone`
- A separate message for unfinished drafts, on Pro and Business
- Several Slack integrations per form, each with its own channel and template

## Connect Slack

1. **Open Integrations**

   Click Integrations in the form's top bar, then pick Slack.

2. **Workspace and channel**

   Pick a connected Slack workspace, or install the Formstep bot in a new one in Slack. Then pick a channel. Public channels show automatically. For a private channel, run /invite @formstep in it in Slack, then refresh the channel list.

3. **Message**

   Type @ to insert field values or to mention users, user groups, @here, @channel, or @everyone. Use bold, italic, or links.

4. **Unfinished drafts (optional)**

   Under **More options**, on Pro and Business, pick an idle window and write a message for unfinished drafts. Leave it Off to skip.

5. **Turn it on**

   Click **Turn on Slack**, then **Send test** to post a preview. Placeholders show as \[Question title], and no real answers are sent.

## Message template

Type **@** in the template to insert an answer, submission details such as the PDF Link, a Slack user or user group to ping, or `@here`, `@channel` and `@everyone`.

Bold, italic, strikethrough, inline code and links work in Slack; underline does not. A message can be up to 3,000 characters, and Formstep shortens a longer one.

## Unfinished drafts

On Pro and Business, Slack can also post a separate message for [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts) from the share link, set under **More options** › **Unfinished drafts**.

## When something goes wrong

If the Formstep app is removed from Slack, reconnect it. If the channel is archived or deleted, delete the integration and set up a new one for another channel. For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**Can I connect multiple Slack workspaces?**

Yes. Each Slack workspace is a separate connection. The workspace owner adds one during a new integration setup.

**Can other workspace members see my Slack connection?**

Yes. Slack connections belong to the workspace. Any member can use any connected Slack workspace in an integration.

**Can Slack post past submissions?**

No. Slack posts only new submissions. For past data, use [Google Sheets](https://formstep.io/docs/integrations/google-sheets/) or [Notion](https://formstep.io/docs/integrations/notion/).

**What permissions does the Formstep bot need?**

Post messages, post to public channels without joining them, read channel lists, read user and group lists (for mentions), and read team info. It does not ask for admin permissions, message history, or file access.

**How do I remove the integration?**

Open Integrations, pick Slack under **On this form**, and choose **Delete integration** in the ⋯ menu. To remove the Formstep bot from Slack too, uninstall it on Slack’s app management page.

## Next steps

[Discord](https://formstep.io/docs/integrations/discord/) — Post each submission to a Discord channel

[Custom webhooks](https://formstep.io/docs/integrations/webhooks/) — Send each submission to your own URL

# Discord

Post each form submission to a Discord channel with mentions. Connect the Formstep bot, write your own message with answers in it, and send a test first.

## What you get

Formstep posts each submission to the channel as it arrives. It connects as a bot, so you do not copy webhook URLs or IDs. Discord posts only new submissions. For past data, use [Google Sheets](https://formstep.io/docs/integrations/google-sheets/) or [Notion](https://formstep.io/docs/integrations/notion/).

## Connect Discord

1. **Open the integration**

   Click Integrations in the form's top bar, pick Discord, then click **Connect Discord account**.

2. **Server and channel**

   In the Discord window, authorize the Formstep bot, then pick the server. If the bot is not in it yet, click **Invite bot** and refresh. The channel list shows the text and announcement channels the bot can post in, grouped by category.

3. **Message**

   Type @ to insert field values, submission metadata such as PDF Link, Discord users, or roles. Use bold, italic, or links.

4. **Unfinished drafts (optional)**

   Under **More options**, on Pro and Business, pick an idle window and write a message for unfinished drafts. Leave it Off to skip.

5. **Turn it on**

   Click **Turn on Discord**, then **Send test** to post a preview. Placeholders show as \[Question title], and no real answers are sent.

## Unfinished drafts

On Pro and Business, Discord can also post a separate message for [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts) from the share link, set under **More options** › **Unfinished drafts**.

## Limits

- A message can be up to 2,000 characters. Formstep shortens a longer one.

- You can mention users and roles. `@everyone` and `@here` do not work, so mention a role instead.

- Formstep posts to text and announcement channels only.

- Bold, italic, strikethrough, inline code and links work; underline does not.

## When something goes wrong

**The bot isn't in my server**

Click **Invite bot** during setup. Pick the server and confirm the permissions. Then go back to Formstep and refresh the server list.

**The integration stopped posting**

Usually the bot was removed from the server, lost its permissions for the channel, or the channel was deleted. Open the integration in the form’s Integrations dialog: **Recent events** shows the error. Invite the bot again or reconnect, or delete the integration and set it up again. See [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**How do I change which channel messages go to?**

You cannot change the server or channel after setup. Delete the integration and create a new one for the new channel.

**Can I connect multiple Discord servers?**

Yes. Each integration posts to one server and one channel. Add one Discord integration per server to the same form.

**Can other workspace members see my Discord connection?**

Yes. Discord connections belong to the workspace. Any member can use any connected Discord account in an integration.

**What permissions does the Formstep bot need?**

View Channels, Send Messages, Send Messages in Threads, Create Public Threads and Embed Links. It does not ask for Mention Everyone, Read Message History, Administrator, or Manage Messages or Channels. To limit the bot to one channel, set channel permission overrides for the Formstep bot role in Discord.

**How do I remove the integration?**

Open Integrations, pick Discord under **On this form**, and choose **Delete integration** in the ⋯ menu. To remove the bot from your server too, open Server Settings, then Integrations, in Discord and remove Formstep.

## Next steps

[Slack](https://formstep.io/docs/integrations/slack/) — Post each submission to a Slack channel

[Custom webhooks](https://formstep.io/docs/integrations/webhooks/) — Send each submission to your own URL

# Linear

Open a Linear issue from each submission, in the team you pick. Write the title and description yourself, insert answers with @, and copy past submissions in.

## What you get

- One Linear issue per submission, created in your name
- Title and description templates. Type **@** to insert a field value.
- Markdown in the description: bold, lists, headings, code blocks, quotes, and links
- An optional project for every issue
- Past submissions copied in when you connect

## Connect Linear

1. **Open Integrations**

   Click Integrations in the form's top bar, then pick Linear. Click **Connect Linear workspace**, or pick an account the workspace already connected.

2. **Workspace and team**

   Issues go to this team. Each integration uses one team. Add another integration for a second team.

3. **Issue**

   Pick a project for every issue, if you like; it resets when you change the team. Then write the title and description: type @ to insert field values or submission metadata such as PDF Link. The title is plain text, up to 255 characters. The description is markdown.

4. **Unfinished drafts (optional)**

   Under **More options**, on Pro and Business, pick an idle window and write a title and description for unfinished drafts. Leave it Off to skip.

5. **Turn it on**

   Click **Turn on Linear**, then **Send test** to create a real issue with a \[Test] prefix in the team. Archive or delete it afterwards.

## Backfill existing submissions

When you connect, you can copy past submissions in as Linear issues. Formstep creates them in the background, about one per second.

## Unfinished drafts

On Pro and Business, Linear can also create a separate issue for [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts) from the share link, set under **More options** › **Unfinished drafts**. These issues get a `partial-submission` label.

## Limits and behavior

- One new issue per submission. Formstep does not comment on existing issues.

- Formstep cuts a title longer than 255 characters and adds an ellipsis.

- An empty title becomes `New submission to <form name>`.

- A file upload answer shows the file name and its download link.

- A [repeating group](https://formstep.io/docs/building-forms/repeating-groups/) inserted with @ shows every item, joined by “ · “.

## When something goes wrong

If you revoke Formstep’s access in Linear, the integration shows **Connection expired**: click **Reconnect**. For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**What access does Formstep need?**

Access to read your teams, projects and labels, and to create and update issues. Issues are created in your name.

**Can I change the team or project after setup?**

Yes. Open Integrations, pick Linear under **On this form**, change either field, and click Save. Changing the team resets the project, because projects belong to a team.

**Can I connect multiple Linear workspaces?**

Yes. The workspace owner connects each Linear account. Each integration picks one.

**Can other workspace members see my Linear connection?**

Yes. Linear connections belong to the workspace. Any member can use any connected Linear account in an integration.

**How do I remove the integration?**

Open Integrations, pick Linear under **On this form**, and choose **Delete integration** in the ⋯ menu. New submissions stop creating issues at once. To also revoke Formstep’s access, do it in your Linear user settings.

## Next steps

[GitHub Issues](https://formstep.io/docs/integrations/github/) — Turn each submission into a GitHub issue

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries, pausing and reconnecting

# GitHub Issues

Open a GitHub issue from each submission, in the repository you pick. Write your own title and body templates, and insert answers with @ mentions.

## What you get

- One GitHub issue per submission, created in your name
- Title and body templates. Type **@** to insert a field value.
- GitHub-flavored markdown in the body: bold, lists, headings, code blocks, and links
- An optional milestone for every issue

## Connect GitHub

1. **Open Integrations**

   Click Integrations in the form's top bar, then pick GitHub Issues. Click **Connect GitHub account**, or pick an account the workspace already connected.

2. **Account and repository**

   The list shows repositories you can push to. Archived and disabled repositories do not show.

3. **Issue**

   Pick a milestone for every issue, if you like; it resets when you change the repository. Then write the title and body: type @ to insert field values or submission metadata such as PDF Link. The title is plain text, up to 256 characters. The body is GitHub-flavored markdown.

4. **Unfinished drafts (optional)**

   Under **More options**, on Pro and Business, pick an idle window and write a title and body for unfinished drafts. Leave it Off to skip.

5. **Turn it on**

   Click **Turn on GitHub Issues**, then **Send test** to create a real issue with a \[Test] prefix in the repository. Close or delete it afterwards.

## Unfinished drafts

On Pro and Business, GitHub Issues can also open a separate issue for [unfinished drafts](https://formstep.io/docs/submissions-analytics/partial-submissions/#unfinished-drafts) from the share link, set under **More options** › **Unfinished drafts**. These issues get a `partial-submission` label.

## Limits and behavior

- One new issue per submission. Formstep does not comment on existing issues.

- Only new submissions create issues. Past submissions are not copied in.

- Formstep cuts a title longer than 256 characters and adds an ellipsis.

- An empty title becomes `New submission to <form name>`.

- A file upload answer shows the file name and its download link.

- Answers go into the body as typed. An answer with `@username` notifies that GitHub user, and `#123` links to issue 123.

## When something goes wrong

If you revoke Formstep’s access in GitHub, the integration shows **Connection expired**: click **Reconnect**. If the repository is archived or deleted, edit the integration and pick another repository. For retries and pausing, see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## FAQ

**What access does Formstep need?**

Access to create issues in your repositories, to see your account, and to list your organizations’ repositories. You sign in with GitHub; there is no GitHub App to install.

**Can other workspace members see my GitHub connection?**

Yes. GitHub connections belong to the workspace. Any member can use any connected GitHub account in an integration.

**Can I change the repository or milestone after setup?**

Yes. Open Integrations, pick GitHub Issues under **On this form**, change either field, and click Save. Changing the repository resets the milestone, because milestones belong to a repository.

**How do I remove the integration?**

Open Integrations, pick GitHub Issues under **On this form**, and choose **Delete integration** in the ⋯ menu. New submissions stop creating issues at once. This does not revoke Formstep’s access in GitHub: do that on your account’s authorized OAuth Apps page.

## Next steps

[Linear](https://formstep.io/docs/integrations/linear/) — Turn each submission into a Linear issue

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries, pausing and reconnecting

# Custom webhooks

Send each submission to a URL of your own, such as your backend, a serverless function or an automation tool that takes webhooks.

## How it works

Each time someone submits the form, or edits a submission, Formstep sends the answers to your URL. A form can have several webhooks, and each one gets every submission. Unfinished drafts are not sent to a webhook.

## Add a webhook

1. **Open Integrations**

   Click **Integrations** in the form's top bar, then pick Webhook.

2. **URL**

   Type the https\:// address that should receive the answers.

3. **Answers to send**

   Leave the mapping empty to send every field. Add rows to send only some fields, each under a name you choose. Open **See an example request** to watch what is sent change as you edit.

4. **Signing secret and headers**

   Formstep creates a signing secret for this webhook. Copy it now and give it to whoever runs the receiving end. Add up to 5 headers of your own if the receiver needs them, such as an authorization token.

5. **Turn it on**

   Click **Turn on Webhook**, then **Send a test event** to send an example submission.

> **Testing on your own computer**
>
> A webhook also accepts `http://localhost`, so you can try it against a receiver running on your machine. A request’s callback URL does not: it must use HTTPS.

Formstep refuses addresses inside a private network. If a delivery fails, Formstep retries it and pauses the webhook after repeated failures: see [Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/).

## What your URL receives

Each delivery carries the form, the submission, and every answer twice: once as the stored value, under the question’s [field key](https://formstep.io/docs/requests/field-keys/), and once as text a person reads. To see the exact body for your form, open the webhook and expand **Example payload**. It uses your current mapping with sample answers.

Each delivery is signed with the webhook’s secret, so the receiver can check it came from Formstep. Developers: see [Signing](https://formstep.io/docs/developers/webhooks-reference/#signing) in the webhooks reference, which also has the full format.

## FAQ

**Can I change the signing secret?**

No. Formstep creates it once, with the webhook. For a new secret, delete the webhook and add a new one. Only the workspace owner can see the secret later.

**How do I get unfinished drafts at my URL?**

A custom webhook sends only finished submissions and edits. A developer can subscribe to unfinished drafts through the [webhooks reference](https://formstep.io/docs/developers/webhooks-reference/#abandoned-submissions). Google Sheets, Airtable, Notion, Slack, Discord, Linear and GitHub Issues can send them too, on Pro and Business.

**How do I remove the webhook?**

Open Integrations, pick the webhook under **On this form**, and choose **Delete integration** in the ⋯ menu. Formstep stops sending at once and deletes the webhook’s event history.

## Next steps

[Webhook API reference](https://formstep.io/docs/developers/webhooks-reference/) — Format, signing and retries, for developers

[Airtable](https://formstep.io/docs/integrations/airtable/) — Add each submission to an Airtable base

# Cal.com scheduling

Let respondents choose and book a Cal.com appointment without leaving your form. Add a Schedule appointment question and get the booking with each submission.

This works on every plan, including Free. [Compare plans](https://formstep.io/pricing/)

## What you get

Schedule appointment is a question built into the form, so it uses your form’s theme and language. Cal.com supplies the event types, availability, calendar invitations, and meeting links.

- Show or hide scheduling based on earlier answers.
- Fill in the attendee name and email from earlier questions.
- Show free times in the respondent’s time zone.
- Get the booking details with the submission.

## Connect Cal.com

1. **Insert Schedule appointment**

   Type / in the editor, search for "Schedule appointment", and insert the question where the booking should appear.

2. **Connect Cal.com**

   Click **Connect Cal.com** in the question. Allow access in the Cal.com window, then return to the editor.

3. **Choose account and event type**

   Pick a connected Cal.com account, then select the event type respondents should book.

4. **Map attendee fields**

   Optionally set **Name from** and **Email from**. They list Text and Email questions above the scheduler, plus hidden fields. Leave them on "Do not autofill" to have respondents type both.

5. **Preview and publish**

   Test the booking in Preview. You cannot publish while the setup is incomplete.

Cal.com accounts belong to the workspace. The workspace owner can also connect them under **Workspace › Integrations**, in **Payments & scheduling**. Every member can then pick one on any form.

## Configure the question

| Setting | What it controls |
| - | - |
| Account | Which connected Cal.com account owns the event type. |
| Event type | The Cal.com event type, duration, location, and availability respondents book. |
| Name from | Optional earlier Text question or hidden field used to fill in the attendee name. |
| Email from | Optional earlier Email question or hidden field used to fill in the attendee email. |

Without these, respondents type their name and email in the question.

## Respondent experience

1. The respondent picks a date, then a free time. Times show in the browser’s time zone. The respondent can pick another in the **Time zone** list, and the booking uses it.

2. They confirm the attendee name and email, then click **Book**.

3. Cal.com creates the booking and sends its normal confirmation and calendar invitation.

4. Formstep shows the booking as **What**, **When**, **Who**, and **Where**, with the meeting link.

5. Before they submit, they can click **Cancel booking** and choose another time.

> **Booking happens before form submission**
>
> Cal.com confirms the appointment when the respondent clicks **Book**. It joins the submission when they submit the form. Until then, the appointment stays on the host’s calendar, even if the respondent leaves. Formstep cancels it in these cases:
>
> - On a public link, the form is still not submitted 24 hours after booking.
> - On a request, the request is canceled or expires.
> - You delete the submission or the form.

If someone else takes the time first, the respondent sees the times that are still free. If a booking fails halfway, Formstep cancels the calendar entry it created. A second device cannot book the same question twice.

## Use scheduling with logic

Logic can show or hide Schedule appointment like any other question. For example, show booking only to leads with budget and authority.

- A visible Schedule appointment question needs a confirmed booking before submission. A hidden one does not block submission.

- After a booking, the answers that decide whether the question shows are locked. To change one, the respondent cancels the booking first.

- If the question is hidden at submission anyway, for example because a branching rule skipped its page, Formstep cancels the booking on Cal.com.

## Publish checks

You cannot publish while a Schedule appointment question is missing its account or event type. The error points to the question, and in the editor the question shows a **Not connected**, **Event missing** or **Configured** badge.

A form can book only event types that need just a name, an email and a time. Event types that need confirmation, recur, have seats, cost money or have required booking questions show as **Not bookable from a form**, and you cannot select them.

## After submission

The booking shows under the question in the submission, and in notification emails, PDFs, exports and integrations. Automations such as Zapier, Make and n8n get it as data too. Developers: see [Bookings and payments](https://formstep.io/docs/developers/webhooks-reference/#bookings-and-payments).

The booking stays up to date after submission. When the respondent or host reschedules or cancels in Cal.com, or the host rejects it or marks a no-show, its text starts with **Rescheduled**, **Cancelled**, **Rejected** or **No-show**. Integrations are not sent again. Deleting a submission or the form cancels its appointments on Cal.com.

Respondents cannot [edit their answers after submitting](https://formstep.io/docs/submissions-analytics/edit-after-submit/) a form with a Schedule appointment question, so the booking always matches the answers.

## Connection health

Formstep keeps its Cal.com access fresh on its own and retries through short Cal.com outages, so neither needs anything from you.

If access is revoked, the connection expires:

- The question shows a **Disconnected** badge, and respondents cannot book.

- The person who connected the account gets an email that lists each published form that books through it.

- Reconnect Cal.com under **Workspace › Integrations**. Then select the account again and confirm the event type on each of those questions.

When you disconnect a Cal.com account under **Workspace › Integrations**, Formstep lists the published forms that book through it. Those forms stop taking bookings, and their owner gets an email. Reconnect the same Cal.com account to restore them. You do not need to select anything again.

## Next steps

[Conditional logic](https://formstep.io/docs/building-forms/conditional-logic/) — Reveal booking only for qualifying answers

[Question types](https://formstep.io/docs/building-forms/field-types/) — See every question available in Formstep

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Reconnect an account that expired

[Submission inbox](https://formstep.io/docs/submissions-analytics/submission-inbox/) — View booking details with submissions

# Analytics (GA4 and Axiom)

Send form views, starts and submissions to Google Analytics 4 or Axiom, and, with Axiom, the answers of each submission too. Connect once for the workspace, then choose per form.

This works on every plan, including Free. [Compare plans](https://formstep.io/pricing/)

## What is sent

Formstep sends three events: when someone opens a form, when they first answer a question, and when they submit.

Each event says which form it is, whether it came through a share link or a request, and, when Formstep knows them, the country, device, browser, UTM tags and referring site. A submit event also has how long the person took. Events carry a random visitor ID and never include answers, emails or question text.

| Event | Sent when | Also carries |
| - | - | - |
| form\_view | Someone opens the form | form\_id, form\_name, source (link or request) |
| form\_engaged | They first answer a question | The same |
| form\_submit | They submit | The same, plus duration\_seconds |

When known, every event also has country, device, browser, traffic\_source, traffic\_source\_name, traffic\_medium, traffic\_campaign and referrer\_host. Look for these names when you build a report in Google Analytics or query Axiom.

Axiom can also receive the full answers of each submission. That stays off until you turn it on for a form. Google Analytics never gets answers.

Events are sent once. If the destination does not respond, the event is dropped, and the person filling in the form never notices. Answers sent to Axiom are retried like any other integration.

## Choose per form

Once a destination is connected, every form in the workspace sends events. To change that for one form, open it and click **Integrations** (plug icon) in its top bar. Under **Analytics streaming**, pick Google Analytics or Axiom:

- Turn off **Forward analytics events** to stop events from this form.

- Turn on **Send respondent answers** to send each submission’s answers to Axiom.

- Click **Send test event** to check the connection without live traffic.

## Google Analytics (GA4)

You need a GA4 property with a Web data stream. Only the workspace owner can connect it.

1. **Copy the Measurement ID**

   In Google Analytics, go to **Admin › Data streams**, open your Web stream and copy its ID, which looks like G-XXXXXXXXXX.

2. **Create an API secret**

   On the same stream, open **Measurement Protocol API secrets**, create a secret and copy its value.

3. **Connect in Formstep**

   Open **Integrations** in the workspace sidebar. Under **Analytics**, click **Connect** on Google Analytics, enter both values and click **Connect**.

4. **Send a test event**

   Open any form, click **Integrations**, pick Google Analytics and click **Send test event**.

In GA4:

- The test shows under **Reports › Realtime**. The events are named `form_view`, `form_engaged` and `form_submit`.

- To report on a detail such as the form or the device, register it as a custom dimension.

- Mark `form_submit` as a key event if a submission is a conversion for you.

If the test is rejected, check that the Measurement ID and the API secret belong to the same Web stream. If nothing arrives, check your GA filters and internal-traffic rules.

## Axiom

Only the workspace owner can connect Axiom.

1. **Create a dataset and a token**

   In Axiom, create or pick a dataset for Formstep, then create an API token that can ingest into it.

2. **Connect in Formstep**

   Open **Integrations** in the workspace sidebar. Under **Analytics**, click **Connect** on Axiom. Enter the dataset and the token, pick the region of your Axiom organization (US East 1 or EU Central 1), and click **Connect**.

3. **Send a test event**

   Open any form, click **Integrations**, pick Axiom and click **Send test event**.

Each detail of an event arrives as its own field, so you can filter and group by form, source or device in your queries and dashboards.

With **Send respondent answers** on, Axiom gets one record when someone submits and another when they edit their submission. Each record has the answers under each question’s [field key](https://formstep.io/docs/requests/field-keys/). Unfinished drafts are never sent.

If the answers keep failing, Formstep stops sending them. Fix access to the dataset and save a new API token to start again. If the test is rejected, check the dataset name, that the token can ingest, and that the region matches your organization.

Developers: the record format is the one in the [webhooks reference](https://formstep.io/docs/developers/webhooks-reference/#payload).

## Privacy and consent

Analytics events have no answers, but their visitor ID and traffic details still count as personal data in many places. Tell respondents you use third-party analytics, ask for consent where the law requires it, and set how long GA4 or Axiom keeps the data.

> **Answers in Axiom**
>
> Answer records can hold names, emails, free text, files and signatures. Before you turn them on, use a dataset only your team can read, give the token the least access it needs, set retention in Axiom, and make sure your privacy notice covers the transfer.

## Next steps

[Analytics & insights](https://formstep.io/docs/submissions-analytics/analytics-insights/) — Views, starts and submissions inside Formstep

[Health and monitoring](https://formstep.io/docs/integrations/health-monitoring/) — Retries and pausing for answer delivery

# Health and monitoring

What happens when an integration cannot deliver: how Formstep retries, when it pauses an integration, and how you turn it back on, retry failed deliveries or reconnect an account.

## Where you see a problem

- The Integrations button in the form’s top bar shows an amber dot.

- In the form’s Integrations dialog, the integration’s status line under **On this form** names the problem.

- Open the integration and a banner says what happened and what to do.

- The person who set up the integration gets an email, at most one per integration a day.

## What each status means

| What you see | What it means | What to do |
| - | - | - |
| On | Submissions are sent as they come in. | Nothing. |
| Paused | You turned it off, or Formstep paused it after repeated failures. | Fix the cause, then turn its switch back on. |
| Connection expired | The account behind it no longer lets Formstep in. | Click **Reconnect** in the banner. |
| Lost access to the destination | The connected account can no longer write to the spreadsheet, database or channel. | Share it with that account again, or reconnect with an account that has access. Then click **Reactivate**. |
| Destination not found | The spreadsheet, database or channel no longer exists. | Delete the integration and set up a new one. A Linear team or GitHub repository can be changed in place instead. |
| Delivery failed | Recent deliveries failed for another reason. | Read the error under **Recent events**, fix it, and click **Reactivate**. |

## Retries and failed deliveries

When a delivery fails, Formstep tries it again on its own for about two hours. Most short outages at the destination clear up within that time without you noticing.

If every try fails, the integration shows a banner such as “3 submissions failed to deliver”. Fix the cause, then click **Retry all** to send them again. Retry all also turns the integration back on if it was paused. Formstep keeps every submission whatever happens to an integration, so you can retry the failed ones later.

## When Formstep pauses an integration

After 5 failed deliveries in a row, Formstep pauses the integration and emails the person who set it up, or the workspace owner. It pauses at once when retrying cannot help, for example when access was revoked or the destination was deleted.

To turn it back on, fix the cause, open the integration and turn its switch back on. If it shows an error banner, click **Reactivate** instead. New submissions are sent again from then on. Use **Retry all** for the ones that failed in the meantime.

## Reconnecting an account

Formstep keeps each connected account signed in on its own. When that stops working, for example because someone revoked Formstep’s access in the other tool, the integration shows **Connection expired**. Click **Reconnect** and sign in again. Every integration that uses that account starts working again.

If the original account is not available, reconnect with another account that has access to the same destination.

## Recent events

Each integration lists its last 20 events under **Recent events**: deliveries, tests and copies of past submissions. A failed event shows the destination’s own error message, which usually says what to fix. A failed copy of past submissions has a **Retry** button.

> **Google Analytics and Axiom work differently**
>
> Analytics events are sent once and never retried. See [Analytics](https://formstep.io/docs/integrations/analytics-streaming/).

## FAQ

**Will I lose submissions if an integration goes down?**

No. Formstep saves every submission whatever the integration’s status. Send the failed ones again with **Retry all** once you fix the cause.

**What if I reconnect with a different account?**

The integration uses the new account. Make sure it can reach the same spreadsheet, database or channel, or change the integration’s setup.

## Next steps

[Integrations overview](https://formstep.io/docs/integrations/overview/) — Every tool Formstep works with

[Custom webhooks](https://formstep.io/docs/integrations/webhooks/) — Send each submission to your own URL
