Small BusinessIndependent InvestorTrade BusinessAccountingFinanceLegalMarketingOperationsSalesReal EstateTemplatesPricingDocs
Get started

How to Send Emails from a Google Sheet or CSV

Import a contact list, personalize messages, send from your domain, and write results back to the spreadsheet.

Overview

The most common mail-merge use case: you have a spreadsheet of contacts and want to send each one a personalized email. Formt handles this end-to-end: import the list, loop through contacts, personalize content, send from your domain, and write delivery results back to the spreadsheet.

Import Your Contacts

Two options for getting your contact list into the workflow. Both produce a list of records that For Each can iterate over. Each row becomes a contact with access to all their column data.

  • Google Sheets Read All Rows: a live connection to your spreadsheet. Auto-generates output fields from column headers, so you don't need to define them manually.
  • CSV Import: upload a file directly. Good for one-time sends or when the data isn't in Google Sheets.

Loop Through Contacts

Add a For Each step after the import. Each iteration processes one contact with access to all their row data: name, email, company, and any other columns from the spreadsheet.

Step Guide: For Each

Personalize Each Email

Use AI Generate or field mappings to customize content for each contact. The AI Email Generate action can write purpose-aware emails (cold outreach, follow-up, newsletter) with a subject line and HTML body.

Alternatively, use field mappings to insert contact data directly into a template body. For example, "Hi {{name}}, I saw that {{company}} recently..." without AI generation.

Step Guide: AI Generate

Send from Your Domain

Use Send Email with the Custom Domain action. Map the recipient email from the contact row. Emails go from your verified domain (e.g. hello@yourdomain.com), not a shared Formt address.

Step Guide: Send Email

Write Results Back

After the loop completes, use Collect to aggregate results from each iteration, then write delivery status back to the original spreadsheet or export a delivery report.

  • Google Sheets Write List: writes a list of rows to a new or existing sheet. Use this to add a "status" column with delivery results.
  • Google Sheets Update Row: updates individual rows in place. Use this to write status back to the same row the contact came from.
  • CSV Export: generates a downloadable CSV file with delivery results. Good for archiving or importing into other tools.

Templates

Start from a pre-built template to get a working spreadsheet-to-email pipeline in minutes.

Tips
  • Google Sheets Read All Rows auto-generates output fields from column headers, so you don't need to define them manually.
  • For large lists, start with a small test batch to verify your email content and field mappings before sending to everyone.
  • Maximum list size is 5,000 rows per import.