# Bulk send

Send one form to a whole list at once on Pro and Business: type, paste, upload a CSV or pick HubSpot contacts, and each person gets their own request.

## Add a second person

![The New request sheet with five people in a table with Company name and case\_id columns, one address outlined red, an add row with Upload CSV under it, and Email or Link beside Create 4 links in the footer](https://docs.formstep.io/images/requests/bulk-send-table.png)

A send to several people: everyone in one table, the row that needs a fix outlined red, and Send counting only the rows that can go.

Open your published form and click **New request**. **Who is it for?** starts as one row: an address and a name. Under it, click **Add another person**, **Paste a list**, **Upload CSV** or **Find in HubSpot**. As soon as there are two people, the row becomes the first row of a table and its headers appear. Nothing else in the sheet moves: what they see, the options and the delivery stay as you set them.

## Add people

Every source adds to the same list. Use whichever fits the list you have, and mix them freely:

| Source | How |
| - | - |
| Type | In the row under the table, type a name and an email address, then press Enter. A bare address works too. |
| Paste | Paste a list into that row, or into Paste a list, one person per line: Ada Lovelace , Ada Lovelace, ada\@example.com, tab-separated columns copied from a spreadsheet, or just the address. |
| Upload CSV | Pick a CSV whose first row names the columns: email (required), name, and any of the form's field keys. CSV template, beside the other sources and under the table, downloads exactly those headers. |
| HubSpot | With a HubSpot integration on the form, search contacts by name or email, tick the ones you want and click Add. Contacts already in the table show as Added. |

A CSV column named after a field key fills that field for each person: a visible question’s key prefills it, a hidden field’s key fills its context. A choice question takes the option’s key or its label, a switch takes `true` or `false`, and a column the form has no field for is ignored and named under the table, so nothing disappears silently. Comma, semicolon and tab separated files all work, and so do quoted values.

A HubSpot contact is read through the form’s existing [mapping](https://docs.formstep.io/integrations/hubspot/#requests): every field mapped to prefill fills that contact’s row, and the answers update the same contact when they come back. A contact without an email address is still added; its row asks you for one.

## Columns and what everyone shares

Each of the form’s fields is either a **column**, with a value per person, or the same for everyone, with one value for the whole list. A field becomes a column on its own when a CSV or HubSpot brings values for it. **Columns**, at the right of Who is it for?, adds a field as a column, moves one back to the same for everyone, and locks it.

**What they see** works as it does for one person, for the fields that are not columns: fill a value, and **Lock** it if nobody should change it. Hidden fields are in the same list, tagged Hidden. A lock applies to every request of the send, column or not, so a locked column needs a value in every row.

## Rows that need a fix

The table checks every row as you go and outlines a bad cell in red, with the reason when you hover it. A row with a red cell is held back, and the line under the table says how many: **Send** counts only the rows that can go, and **Show them** lists just the rows to fix. Every cell is editable in place.

| Red cell | Why |
| - | - |
| Email | No address, an address that is not one, or a second row for an address already in the list. |
| A number column | A value that is not a number. |
| A choice column | A value that is neither an option's key nor its label. |
| A locked column | An empty cell: the person could never fill it in. |
| Name | A HubSpot contact that no longer exists, or could not be read. |

## Send

1. **Pick the delivery**

   Beside Send, Email emails every person their own link and reminds them while the request is open. Link emails nobody and hands the links to you.

2. **Click Send**

   The button names the count, such as Send 20 invitations or Create 20 links, and shows its progress while the requests are created. From 20 invitations, the footer asks once before they go: how many, to how many domains, and when the requests close.

3. **Read the receipt**

   The receipt says how many went out. Download links saves every link as a CSV with the email, name and link of each person, and Open in Requests shows the send.

The people a send reached leave the table. Anyone it could not reach stays, with the reason: on their row when it was about them, or in the receipt when it stopped the send, such as the monthly allowance running out. When one person is left, the table turns back into the one-person row, with the reason under it. Columns, shared values, locks, delivery and options stay too, so the next list goes out the same way.

**Try it yourself**, in the footer, makes a test request from the first person who can be sent, with the shared values, so you see what they will get before anyone does.

## In Requests

The requests of one send are ordinary requests: each has its own page, reminders and callback, and you can remind, cancel or delete one without touching the others. In the [Requests list](https://docs.formstep.io/requests/managing-requests/) they sit under a heading that says how many people the send reached and for which form, when and by whom it went out, how many came from HubSpot, when it expires and where they stand. Click the heading, or pick the send under **Sent together** in **Filter**, to see only that send.

## Limits

| Limit | What happens |
| - | - |
| 500 people per send | The table stops adding people at 500 and says so. |
| Monthly allowance | Each request spends one unit, like any request. When the allowance runs out partway, the send stops there and the rest stay in the table. |
| Invitations per hour | Formstep emails at most 200 invitations an hour per account, 30 in its first 7 days. A larger send emails as far as it can; the rest stay in the table to send later, or as links. |
| Plan | Bulk send is on Pro and Business. With a free account the sheet sends to one person at a time, and its free invitations go only to your own address. |

> **From an automation**
>
> The API and the MCP server create one request per call. To send to a list from a workflow, call `requests.create` once per person, with an [idempotency key](https://docs.formstep.io/requests/creating-requests/#idempotency) per person so a retried run sends nobody twice. **From an automation**, in the footer’s **⋯** menu, shows that call for the first person in the list.

[Creating a request](https://docs.formstep.io/requests/creating-requests/) — Prefill, locked fields and context, one person at a time.

[The Requests page](https://docs.formstep.io/requests/managing-requests/) — Follow every request, filter by send, remind and cancel.
