Contents: 1. Sign in with Microsoft · 2. Upload the contact list · 3. Generate the template · 4. Preview before anything goes out · 5. Build & send the mail merge · 6. Check the audit log for errors · Pre-flight — before the big button · Appendix
You will do steps 2–5 inside the app's five tabs, in this order:
Template Manager → Mail Merger → Email Tester → Mail Merger → Audit Logger.
Build your source file before you open the app — in Excel (see Appendix H). Running example: every screen follows the same three members from contact_list.xlsx — Walker Steppens, Tanner Brown, John Doe — and the *WizMerge Sample Template*. The raw files live in sample-data/. One requirement: an internet connection — the app loads two libraries from a CDN, and a yellow "libraries failed to load" banner means check your connection and reload.
Top-right of every screen. Click Sign in with Microsoft.
A Microsoft popup opens. Choose your FDA account and approve Mail.ReadWrite and Mail.Send (first time only). The header then reads "Signed in as …". If sign-in fails, allow popups for the WizMerge site and retry — the reason is written to the Audit Logger (§6).
Everything runs in this browser: your sign-in goes directly to Microsoft, and templates and settings stay in this browser's local storage.
The FDA registration is pre-configured. You only need this if you see the yellow banner:
Click Open setup → the Instructions tab → fill Client ID, Tenant ID, Redirect URI → Save configuration → Test sign-in. These live in this browser's local storage only — use Export templates.json (§3.2) to move templates to another machine.
Click Sign out in the header when you're done on a shared machine.
Open the Mail Merger tab. Drop contact_list.xlsx onto the dropzone, or browse for it.
Check the filename, the row count (3 rows × 7 columns), and whether an attachment column was found — step 3 appears only when one is found. Confirm the preview shows the right sheet.
⚠ Loading a new contact list clears any attachment files you already selected in step 3 — always load the final contact list before selecting attachment files.
Choose data file… → one clickable chip per column. Click into a template field first, then click the chip to insert its tag at the cursor.
⚠ Click into a template field first — To, CC, BCC, subject, body, or signature — then click the chip. Otherwise the app just toasts a reminder and nothing is inserted.
The Saved templates dropdown loads a template for editing. Export templates.json backs them up; Import restores them. Attachments are never included in the export.
Fill in the fields top to bottom: name (*WizMerge Sample Template*), To = {{Email}}, subject, body with tags, signature. Drop template-wide attachments in the dropzone.
To: {{Email}}
Subject: Subscription Update - Switch to Monthly Billing Cycle
Member #: {{MbrID}}
Greetings {{FirstName}} {{LastName}},
I hope this email finds you well. Please note that the quarterly billing cycle structure will be suspended effective Q1 2027. Moving forward you will be billed for goods and services monthly, in the amount of $ {{InvoiceTotal}}. Please find a detailed invoice for your 2027 subscription attached.
Your current Donation Club status is: {{DC_Status}}
Respectfully,
Elijah Gaines
Membership Coordinator
Florida Dental Association
⚠ Attachment files live in memory only until you reload the page, go on every email in the merge, and are not saved with the template.
Create New clears the form. Save / Update requires a name. Delete asks for confirmation and can't be undone.
Pick the template. One field appears per {{tag}} — type Walker's values and watch the merged email render live. This tests the template's wording, not your spreadsheet.
With template and contact list loaded, click Preview emails: the first 3 merged emails exactly as they'll go out — with our 3 members, the entire run.
Read the summary line: subject, tags used ({{Email}}, {{MbrID}}, {{FirstName}}, {{LastName}}, {{InvoiceTotal}}, {{DC_Status}}), and any waiting session attachments.
This panel appears only when an attachment column was detected. Select the invoice files:
| Recipient | Names in the Attachment column | You select in step 3 |
|---|---|---|
| Walker Steppens | invoice_steppens_2027_DEMO.txt | All three invoice files — matching ignores case |
| Tanner Brown | invoice_brown_2027_DEMO.txt | |
| John Doe | invoice_doe_2027_DEMO.txt |
Generic Attachment (all recipients).txt is not named in the sheet — it goes in the Template Manager attachments dropzone instead (§3.3).
⚠ First run with a new template? Use the "Trial run" field to process just Walker's row first — enter 1, inspect the result, then run all three rows.
Click Check data. Green ("all rows look good") means go. Missing columns lists tags with no column — those print blank. Row warnings name bad addresses, duplicates, and missing files.
A confirmation dialog appears for sends, or whenever issues exist — Confirm & send proceeds, Cancel aborts.
Watch the progress bar and per-row results (Row 1: draft created for bigsteppen@snuffy.net). Finished rows are auto-skipped on rerun — fix failures and press the button again; Reset saved progress clears that memory.
After the run, open your Outlook Drafts folder — one personalized draft per row, attachments included — review each, and send when ready.
Set the type filter to Error after a run. Search by address or filename. Export CSV/JSON for records; Clear log wipes it (with confirmation).
The console streams every entry as it happens — watch each Graph call land during a merge.
A clean drafts run: "Mail merge started: 3 rows…" → one "Draft created for …" per row → "finished: 3 drafts created, 0 failed." A send run says "Email sent to …" instead. The full error table is in the appendix (§D).
{{MbrID}}, {{FirstName}}, …). Clicking a chip with no field focused just toasts a reminder.{{Email}}) and plain addresses mix freely, comma-separated.contact_list.xlsx · 3 rows × 7 columns · attachment column: "Attachment". The preview table shows the first 5 rows, all columns. Loading a new file resets step-3 attachment selections.2 / 3 processed · 2 drafts created · 1 failed), and a per-row results list (capped at 300 entries). ~0.3 s pause between rows. Finished row indexes are remembered per run — rerunning skips them automatically; Reset saved progress clears that memory.{{tag}} detected across To, CC, BCC, subject, body, and signature.[time][category] lines as they happen (last 200, follows new entries automatically). Green = success, red = error.| Log says | It means | What to do |
|---|---|---|
| Your sign-in expired. Click "Sign in with Microsoft" again, then retry. | Microsoft token lapsed (HTTP 401) | Sign in again, rerun — finished rows are skipped |
| Microsoft refused the request… missing a permission or admin consent (HTTP 403) | Entra permissions problem | Check API permissions in Entra; contact IT |
| Microsoft could not find what was asked for (HTTP 404) | Mailbox or Drafts folder unreachable | Check the mailbox; retry |
| Microsoft is throttling requests… (HTTP 429) | Too many requests, too fast | Wait a minute, rerun — finished rows are skipped |
| Microsoft had a temporary problem (HTTP 5xx) | Their side hiccuped | Wait a bit, retry |
| Attachment file(s) not selected: invoice_doe_2027_DEMO.txt. Add them in Mail Merger step 3. | John's row named a file you never selected | Select the files in step 3 and rerun |
| Row N skipped: row produced no To recipients / invalid address(es) | Bad or missing email in that row | Fix the spreadsheet cell, rerun |
| Network problem — check your connection | Connectivity dropped | Check connection, rerun |
common), Redirect URI (auto-detected from the page address; must match the Entra registration exactly). Save configuration stores it in this browser; Test sign-in verifies it. The FDA values are pre-configured in the app files.{{…}}; inner whitespace is trimmed, matching is case-insensitive. Symbols inside tags are fine ({{Cost ($)}}).{{Email}} addresses each row to itself), subject, body, and signature. Numbers and dates from cells are converted to text.file:// disables Microsoft sign-in; use the hosted URL.WizMerge reads the first worksheet only. Row 1 is the headers; every row below is one recipient. Empty rows are skipped; blank cells come out blank. Accepted: .xlsx, .xls, .csv.
| MbrID | FirstName | LastName | DC_Status | InvoiceTotal | Attachment | |
|---|---|---|---|---|---|---|
| 123456789 | Walker | Steppens | bigsteppen@snuffy.net | Gold | 400 | invoice_steppens_2027_DEMO.txt |
| 654987321 | Tanner | Brown | tbrown01@snuffy.net | Silver | 345 | invoice_brown_2027_DEMO.txt |
| 789654123 | John | Doe | johndoe@snuffy.net | Bronze | 335 | invoice_doe_2027_DEMO.txt |
Walker Steppens (Member #123456789, Gold, $400) gets invoice_steppens_2027_DEMO.txt; Tanner Brown gets his own file; John Doe gets his. A blank cell would simply come out blank in the email — no error.
{{ColumnName}} is replaced with that row's value in that column. Tags work in To, CC, BCC, subject, body, and signature. Matching ignores case and extra spaces inside the braces — but not typos.
| You write | Walker receives | Tanner receives | John receives |
|---|---|---|---|
Dear {{FirstName}} {{LastName}}, | Dear Walker Steppens, | Dear Tanner Brown, | Dear John Doe, |
Member #: {{MbrID}} · $ {{InvoiceTotal}} | 123456789 · $ 400 | 654987321 · $ 345 | 789654123 · $ 335 |
{{email}} (lowercase) in the To field | bigsteppen@snuffy.net — case doesn't matter, typos do | ||
{{InvoiceTotals}} (typo — no such column) | blank for everyone — and no error is raised | ||
⚠ A mistyped tag resolves to blank silently. Run Check data (§5.4) before every real send.
Name the column Attachment, Attachments, File, or Files (any case). Each cell lists that row's file(s), separated by commas.
⚠ If a row names a file you never selected in step 3, that row fails — every other row still processes. Files over ~20 MB get flagged; Outlook may reject messages near 25 MB.
WizMerge SOP. Grounded in WizMerge v2.0.0. The raw sample files live in sample-data/.