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

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

ColumnPurposeExample
EmailRecipient addresssarah@example.com
FirstNameGreetingSarah
CompanyContextNorthside Dental
FactsWhat AI may use, written brieflyBought 2 chairs Mar 2026; asked about service plan; renewal 1 Dec
DraftAI-written paragraph(filled by AI)
StatusWorkflow controlDraft / Approved / Sent / Skip
SentAtLog(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 Sub

Run 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

MethodGood forLimits
Word Mail MergeSimple, identical messages with merge fieldsNo per-row logic, no attachments without add-ins
Outlook VBA (this guide)Operational emails, attachments, per-row textWindows desktop Outlook; mailbox sending limits
Power AutomateCloud-based, scheduled, Microsoft 365Setup effort; licences for premium connectors
Email marketing platformNewsletters and campaigns, consent, trackingMonthly cost; not for one-to-one operational mail
CRM sequencesMulti-step sales follow-up with reply trackingCost 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

The classic method is Word Mail Merge with Outlook: connect Word to the Excel list, insert merge fields, and send. For more control, a VBA macro can create one Outlook email per row with custom text and attachments. AI adds a step before sending: drafting a personalised paragraph per row from notes or history, which a person reviews.

Yes. Give the model a fixed template, the facts for each row (name, product, last order, open issue) and strict rules: length, tone, what it must never promise. It writes one paragraph per row into a new column. Review the drafts before anything is sent.

Sending hundreds of emails at once from a normal mailbox can trigger sending limits and spam filters. Send in small batches with a delay, keep recipients on lists they have opted into, and use a proper email platform for marketing campaigns. Outlook automation suits operational emails such as reminders, statements and follow-ups.

Start with drafts. The macro creates each email in the Drafts folder, someone spot-checks a sample, then sends. Once the template and data are proven, switch to sending in batches. Never let AI-written text go out unreviewed to customers.

For a few hundred contacts and operational messages, yes. If you need tracking of opens and replies, multiple sequences, or many users working the same list, a CRM is a better fit. A lightweight Excel or Access CRM is a common middle step.