Expert guide
Send Personalized Emails from Excel with AI and Outlook
AI drafts a message for every row, you approve it in the sheet, VBA creates the emails
Call us at +1 (385) 386-3860
Short answer: keep contacts and facts in an Excel Table, have AI write one personalised paragraph per row into a Draft column using a strict prompt, mark each row Approved after review, then run a VBA macro that creates an Outlook email for every approved row, as drafts first, then in small timed batches. Use this for operational emails such as follow-ups, renewals and reminders. We build the full version, with logging and opt-outs, in AI workflow automation projects.
Mail merge has existed for decades, and it still produces emails that read like mail merge: "Dear Sarah, we value your business." What makes a follow-up work is one sentence that proves someone looked at this customer: their last order, the issue they raised, the renewal date they care about. Writing that sentence 300 times is why follow-ups do not get sent. AI can write it from the facts in your sheet; a person checks it; Outlook sends it.
Step 1: Structure the Sheet
| Column | Purpose | Example |
|---|---|---|
| Recipient address | sarah@example.com | |
| FirstName | Greeting | Sarah |
| Company | Context | Northside Dental |
| Facts | What AI may use, written briefly | Bought 2 chairs Mar 2026; asked about service plan; renewal 1 Dec |
| Draft | AI-written paragraph | (filled by AI) |
| Status | Workflow control | Draft / Approved / Sent / Skip |
| SentAt | Log | (filled by the macro) |
The Facts column is the key design choice. AI only knows what you put there, so it cannot invent a discount or a meeting that did not happen. If facts come from a CRM, an order system or email, pull them in rather than typing them; see our guide to Gmail to Excel automation for one way to do that.
Step 2: The Drafting Prompt
You write one paragraph for a business follow-up email. Sender: Alex from BrightCare Equipment. Purpose: remind the customer their service plan renews soon and offer a call. Rules: - 2–3 sentences, under 60 words, friendly and plain. - Use ONLY the facts given. Do not invent prices, discounts or dates. - Mention one specific fact to show this is personal. - No greeting and no sign-off (the template adds them). - If the facts are insufficient, return exactly: NEEDS REVIEW Customer: Sarah, Northside Dental Facts: Bought 2 chairs Mar 2026; asked about service plan; renewal 1 Dec
Run it row by row with Copilot for small lists, or with the VBA API function from calling the OpenAI API from Excel VBA for hundreds of rows. Write the result into the Draft column and leave Status as Draft.
Step 3: Review in the Sheet
Filter Draft for NEEDS REVIEW and fix the facts or write those by hand.
Read every draft for a list under 50 rows; read a random 20% for larger lists, plus all high-value customers.
Check for anything that sounds like a promise: prices, deadlines, guarantees.
Set Status to Approved only for rows you are happy to send.
Step 4: Create the Outlook Emails With VBA
Option Explicit
Sub CreateFollowUpEmails()
Const SEND_NOW As Boolean = False ' False = save as drafts
Const BATCH_PAUSE_SECONDS As Long = 20
Const BATCH_SIZE As Long = 25
Dim ol As Object, mail As Object
Dim lo As ListObject, r As ListRow
Dim body As String, n As Long
Set lo = ThisWorkbook.Worksheets("Contacts").ListObjects("tblContacts")
Set ol = CreateObject("Outlook.Application")
For Each r In lo.ListRows
If r.Range(1, lo.ListColumns("Status").Index).Value = "Approved" Then
body = "Hi " & r.Range(1, lo.ListColumns("FirstName").Index).Value & "," & _
vbCrLf & vbCrLf & _
r.Range(1, lo.ListColumns("Draft").Index).Value & _
vbCrLf & vbCrLf & _
"Best regards," & vbCrLf & "Alex" & vbCrLf & "BrightCare Equipment"
Set mail = ol.CreateItem(0)
With mail
.To = r.Range(1, lo.ListColumns("Email").Index).Value
.Subject = "Your service plan renewal"
.Body = body
If SEND_NOW Then .Send Else .Save
End With
r.Range(1, lo.ListColumns("Status").Index).Value = IIf(SEND_NOW, "Sent", "Drafted")
r.Range(1, lo.ListColumns("SentAt").Index).Value = Now
n = n + 1
If SEND_NOW And n Mod BATCH_SIZE = 0 Then
Application.Wait Now + TimeSerial(0, 0, BATCH_PAUSE_SECONDS)
End If
End If
Next r
MsgBox n & " emails " & IIf(SEND_NOW, "sent.", "saved to Drafts."), vbInformation
End SubRun it once with SEND_NOW = False and check the Drafts folder in Outlook. When you are confident, set it to True. The macro updates Status and SentAt for every row so you never send the same email twice.
Adding attachments
Add a column with a file path and, inside the With block, .Attachments.Add r.Range(1, lo.ListColumns("Attachment").Index).Value. This is how statements, quotes or certificates go out one per customer. Generating those PDFs from Excel first is covered in our guide to bulk-creating PDF invoices from Excel.
Choosing the Right Sending Method
| Method | Good for | Limits |
|---|---|---|
| Word Mail Merge | Simple, identical messages with merge fields | No per-row logic, no attachments without add-ins |
| Outlook VBA (this guide) | Operational emails, attachments, per-row text | Windows desktop Outlook; mailbox sending limits |
| Power Automate | Cloud-based, scheduled, Microsoft 365 | Setup effort; licences for premium connectors |
| Email marketing platform | Newsletters and campaigns, consent, tracking | Monthly cost; not for one-to-one operational mail |
| CRM sequences | Multi-step sales follow-up with reply tracking | Cost and adoption effort |
Rules That Keep You Out of Trouble
Only email people who have a business relationship with you or have opted in, and honour opt-outs.
Keep a Skip status and never remove rows; it is your record of who asked not to be contacted.
Keep AI facts factual. If a fact is old or uncertain, leave it out.
Do not send personal or health information in email bodies.
Respect your mailbox provider's sending limits; batch and pause.
Industry Uses We See Most
Clinics and dental practices
Recall reminders that mention the last visit type; see our dental patient recall tracker guide.
Insurance agencies
Renewal reminders that reference the policy type and renewal date.
Accounting firms
Document request emails listing exactly what is still missing per client.
B2B suppliers
Re-order prompts based on the last order date and usual order interval.
Practical guides: the dental patient recall tracker, insurance renewal tracker and tax season client document tracker. When the list outgrows a spreadsheet, a lightweight Excel CRM is the next step.
FAQ
Personalized email from Excel FAQ
AI drafting, Outlook automation and safe sending