# Review personalized email drafts before using Gmail

Artifact: AX068 v3, 2026-10-09. Audience: Gmail users preparing a small set of expected messages from a Sheet list. Browser job: https://bulldo.gs/jobs/mail-merge-review/?via=llms

## Run without installing Node

Download https://bulldo.gs/jobs/mail-merge-review-offline.html (AC015 v1), then
open the saved HTML file in your browser. The file contains its complete local
CSV parser and review builder, with no external scripts, telemetry or storage.
Load the fictional example to learn the format; start empty before adding your
own CSV and templates. Review the generated packet and copy it or download TXT
for manual use in Gmail. It does not create drafts, send or check delivery.
The downloaded original contains no inputs from the website. Inputs and output
remain visible in the open local page and any saved result; clear them before
sharing your screen, and protect any TXT file you create. Browser extensions,
device handling and the surrounding environment are outside this file's scope.
Offline use cannot be inferred from a website download event. Count useful
completion only from a separate independent report, not operator fixtures.

## Run the existing job locally

Agent source: https://bulldo.gs/downloads/mail-merge-review.mjs (AX069 v1).
Runnable fixture and complete contract:
https://bulldo.gs/downloads/mail-merge-review-README.md

Save the module beside an `example.mjs` file. Import
`buildMailMergeDrafts` from `./mail-merge-review.mjs`, pass the TSV string,
subject template and body template, and use the returned plain-text packet.
Run `node example.mjs` in an existing Node.js environment; the README contains
an executable fictional fixture and exact expected output. The module uses
the same browser core and returns the same packet/errors. It has no runtime
dependencies, Gmail access, telemetry or sending. Caller logging and data
handling remain the caller's responsibility. Availability and parity QA do not
prove independent agent execution or customer use.

## Input and existing alternatives

Paste a rectangular tab-separated range or import a local UTF-8 CSV file, including unique headers and an exact, case-sensitive email header. Use 1–25 data rows and one plain address per row. Duplicate addresses ignoring case, malformed addresses, blank rows and uneven widths stop the entire job. Resolve them instead of silently skipping people. Subjects and bodies may use case-sensitive {{field}} placeholders matching headers; static text also works. No recursive substitution, HTML rendering or code evaluation occurs. Multiline bodies are supported in the template, but pasted Sheet cells must be single-line. Quoted TSV/embedded-tab cells are unsupported. CSV supports quoted commas and doubled quotes; CSV cells with tabs, newlines or controls reject wholly. CSV is capped at100,000bytes and10,000cells including the header, in addition to25data rows/500columns. Every pasted recipient cell also rejects controls. Invalid imports clear old recipient rows and results.

Every input box and the complete packet are capped at 100,000 characters. Every rendered subject must be nonempty, one line without control characters and at most 200 characters. Every rendered body must be nonempty. Addresses are checked for the existing parser's supported syntax, not mailbox ownership, deliverability or consent. No OAuth, Google access, email send or Gmail draft creation occurs.

Native Gmail templates or manually composing each email remain alternatives. This joins existing recipient validation and literal template rendering into one review packet; no time advantage, delivery, independent completion or paid demand has been measured.

## Fictional acceptance example

```text
email	name	appointment
alex@example.com	Alex	Tuesday at 10:00
sam@example.com	Sam	Wednesday at 14:00
```

Subject: Appointment details for {{name}}

Body:

```text
Hello {{name}},
Your appointment is {{appointment}}.
Please check these details and reply if a change is needed.
```

The packet must contain two labeled drafts with exact matching To/Subject/Body values and an explicit no-send/no-Gmail-draft warning. Alex gets Tuesday, Sam gets Wednesday; field values containing literal {{braces}} are not expanded again. A duplicate address or missing placeholder rejects the entire packet. The example is operator QA, not independent customer use.

## Complete the user's job

1. Start empty before entering real work. Fictional-example edits remain sample use.
2. Paste only the small list needed; use recipients who expect the message. Enter subject/body templates.
3. Create the packet, resolve all errors, and review every address, subject and body against your Sheet. Changes invalidate the previous packet.
4. Copy the packet or use the selected-text fallback. This is plain text, not a Gmail import file.
5. Manually create the intended messages in your normal Gmail workflow. Review each before sending; this page cannot observe delivery.

Pasted addresses, values and output stay in the browser and are masked from session capture. Explicit events carry only fixed ID/version/placement, sample versus own-input and success/failure labels. A browser completion or copy is intent/proxy evidence. Independently useful completion, actual sending/delivery, normal-cadence reuse, paid delivery and recipient-to-independent-sender acquisition need separate receipts. No credentials or customer text belong in operator reports.

## Audience, measurement and decision

Current owned routes: existing personalized-Gmail guide, homepage job card and llms.txt task index. Those routes improve access but establish no external eligible audience. Existing natural help lanes may use this job only under their current authority/caps; root does not publish or force the social executor. No new account, recipient or outreach allocation is created.

Measure eligible job arrivals → own-input successful packets → independently reported useful completion. Count sample/QA separately and never sum overlapping browser IDs across rows. Review a material independent receipt, 20 qualified opportunities, October 14 or October 21; absent exposure remains inconclusive. Advance a real eligible audience route in at least one of the next two slots. Retain current no-spend boundaries and October 21 expiry.
