Send a contract to everyone in your spreadsheet
You have a spreadsheet of clients and one contract that only changes in a few places: the name, the address, the fee. Bulk send turns each row into its own envelope, with that row's details printed in the contract, and tracks every signature for you.
Updated November 5, 2026 · 3 min read
On this page
What you need before you start
- A template with a signer role for the person each row goes to, plus any others who sign every copy, such as you.
- A labeled text box in the template for each detail that changes per row: Monthly fee, VAT number, Start date. The label is the name your spreadsheet column will use.
- A paid plan. Bulk send is on Solo, Crew and Company, up to 250, 500 and 1000 rows in one send.
Text boxes are the key. A value you type into a text box prints on the contract itself, read-only, so a hotel sees its own commission rate in the body of the agreement rather than in a field it could change.
Get the spreadsheet ready
- 1
Start from the blank file
On the template's page, choose Bulk send, then Download a blank CSV. It has a column for each signer's name and email and one for every labeled text box, already named the way SignMaster expects.
- 2
Fill one row per contract
Paste your client list into it, or rename the columns in your own sheet to match. Leave a cell empty only if that text box can be blank on the contract.
- 3
Save it as CSV UTF-8
SignMaster reads CSV files, not .xlsx workbooks. In Excel, use Save As or Save a Copy and pick the CSV UTF-8 format, which keeps accents and symbols like € intact. Files saved with semicolons, as European Excel does, work too.
Short on time?
You can skip the file: select the rows in Excel or Google Sheets, copy them with the header row, and paste them straight into the bulk send screen.
Send the batch
- 1
Add people
Upload the CSV or paste the rows. The template's panel lists what each row needs, so you can spot a missing column early.
- 2
Match columns
Columns whose header matches a role or a text box label are matched for you. Check the rest by hand, or set a column to be ignored.
- 3
Check rows
Every row is checked before anything goes out: a missing name, a bad email or a value that doesn't fit its field is listed with the reason. Rows with a problem are skipped and stay on the batch, so you can fix and send them later.
- 4
Send
Pick reminders, link expiry and the signing order, and add each person's name to their envelope's title if you like. Then send.
SignMaster sends at a steady pace and shows each row as waiting, sending, sent, failed or skipped. A failed row never stops the rest: fix it and retry it. When you're done, download the results as a CSV with every row's envelope and status.
After they sign
Each envelope works like any other: reminders go out on schedule, and each signer gets the sealed PDF with its certificate of completion when they finish. To see what everyone filled in, open the template's Responses tab for every answer in one table, ready to export as CSV or JSON. On Crew and Company, webhooks can also push each signed contract to your CRM or a spreadsheet as it lands.
Working from a Google Sheet instead? It goes the same way: choose File › Download › Comma Separated Values (.csv), or copy and paste the rows. See send contracts from Google Sheets.
Questions? Answers.
Can I upload the Excel file itself?
No. Upload a CSV, or paste the rows. If you pick an .xlsx file, SignMaster says so and tells you to export a CSV first.
Does everyone see the whole list?
No. Each row becomes a separate envelope with its own private link, and each person sees only their own copy and their own values.
How many contracts can I send at once?
Up to 250 rows on Solo, 500 on Crew and 1000 on Company, each row its own envelope. Paid plans have no envelope limit, so a big batch costs nothing extra. Larger lists can go out in a few sends.
What if a value is too long for its box?
That row is held back with the reason, either on the Check rows step or when it sends, and the other rows go out as normal. Shorten the value and send that row again.
