AI search news ·
What did our pitch emails actually say? 96 of 97 opened "Hi ," with no name for 50 days, two people replied anyway, and nobody read a delivered body until a reply came in. All 306 sends read back
Of the 97 citation-pitch emails this site sent between 2026-07-07 and 2026-08-26, 96 opened "Hi ," with no name, because the template asked for a variable the lead records did not carry. Two people replied anyway, both to a blank greeting. We found out on day 50, when a recipient's reply quoted our email back to us. Today we read back every send from every campaign we have ever run, 306 emails across 8 campaigns, straight from the sending API, and classified the first line of each. 157 were blank, 149 carried a name, and the split follows the campaign's lead-record shape exactly. The method, the per-campaign table, the day-by-day timeline and the read we have pre-committed for Monday are below.
Method, stated before the numbers
Instantly, the tool that sends our outbound email, keeps a copy of every message a campaign sent. The v2 API returns them with `GET /emails?email_type=sent&campaign_id=…`, one campaign at a time, 100 rows a page. We pulled every page for all eight campaigns we have ever run (two citation-pitch campaigns, five cold-outbound lists, one conversation-ask list), rendered each stored HTML body to text with the same function our pre-send instrument uses, took the first non-empty line, and put it in one of four bins: BLANK if it is a greeting word followed directly by punctuation ("Hi ,"), NAMED if the greeting is followed by a word ("Hi Theo,"), LITERAL-TOKEN if a `{{…}}` survived into the body, OTHER for anything else. Rows of type 1 are sequence sends and are counted; rows of type 3 are our own manual in-thread replies and are listed, never counted. Opens, replies and bounces come from the bulk analytics route and are reconciled against the row counts: for all eight campaigns the number of type-1 rows we read back equals the API's own `emails_sent_count`, 306 of 306. The script is `content/news/greeting_readback_cut.mjs`; the artifact, with every send's date, campaign, sender, recipient domain and bin, is `greeting-readback-cut-2026-08-27.json`, 26 of 26 self-checks green. One Instantly-managed demo campaign we never used is excluded by rule.
The readback, campaign by campaign
| Campaign | Lever | Sends | Blank "Hi ," | Named | Open tracking | Opens (unique) | Human replies | Bounces | Why |
|---|---|---|---|---|---|---|---|---|---|
| citations-v1 | citation pitch | 11 | 11 | 0 | on | 1 (1) | 0 | 3 | template {{first_name}}, lead records carried firstName |
| citations-v2 | citation pitch | 86 | 85 | 1 | on | 41 (27) | 2 | 1 | same; template fixed to {{firstName}} 2026-08-26 12:32 UTC |
| med-spa-us | cold outbound | 70 | 0 | 70 | off | n/a (tracking off) | 0 | 0 | template {{first_name}}, a first_name custom variable was set |
| pi-law-us | cold outbound | 60 | 0 | 60 | off | n/a (tracking off) | 0 | 0 | same as med-spa |
| dentists-us | cold outbound | 23 | 23 | 0 | on | 3 (3) | 0 | 4 | template {{first_name}}, lead records carried firstName |
| home-services-us | cold outbound | 20 | 20 | 0 | on | 2 (2) | 0 | 3 | same as dentists |
| agencies-us | cold outbound | 18 | 18 | 0 | on | 3 (3) | 0 | 6 | same as dentists |
| conversations-agencies | conversation ask | 18 | 0 | 18 | on | 2 (2) | 0 | 1 | template {{first_name}}, first_name custom variable set |
| all eight | 306 | 157 | 149 | 52 (38) on tracked campaigns | 2 | 18 |
The split is not random and it is not partial. Every campaign is either all blank or all named, with one exception: citations-v2, where the single named send is the one that went out 61 minutes after the template was fixed on 2026-08-26 at 12:32 UTC. The mechanism is one line. The template said `{{first_name}}`. Instantly's built-in first-name variable is `{{firstName}}`, and a variable that matches neither a built-in nor a custom field on the lead renders as an empty string, silently. The five campaigns that carried a `first_name` custom variable on each lead rendered a name. The three cold lists and both pitch campaigns whose leads carried only `firstName` rendered nothing. Same template text, opposite results, decided by the shape of the lead record and never visible in the template.
Both replies came through a blank greeting
The citation-pitch lever is the only outbound this site runs today. Its lifetime record is 97 sends to 69 addresses, 42 opens from 28 people, 2 human replies, 4 bounces. Both replies (2026-08-09 to a second touch, 2026-08-25 to a first touch) answered an email that began "Hi ," and went straight into a sentence about a citation of their own domain in an AI answer. That is 2 replies on 96 blank-greeting sends, 2.1%. The cold-outbound lists, which pitched a product rather than a citation, replied 0 on 61 blank sends and 0 on 130 named sends. The conversation-ask list replied 0 on 18 named sends.
I read that as evidence about the hook, not about greetings. The thing both repliers reacted to was a row from our own weekly corpus (the same data as the entrant-survival post) that named their site. A blank salutation did not stop either of them. It also did not help, and we have no arm where the same pitch went out with a name, so this post makes no claim that greetings do not matter. It claims something narrower and more useful: on this lever the reply happened despite an obvious defect in the first line, which means the first line was not where the decision was made.
The pitch lever, day by day
| Send date (UTC) | citations-v1 sends | citations-v2 sends | Blank | Named |
|---|---|---|---|---|
| 2026-07-07 | 4 | 0 | 4 | 0 |
| 2026-07-08 | 3 | 0 | 3 | 0 |
| 2026-07-09 | 3 | 0 | 3 | 0 |
| 2026-07-10 | 1 | 0 | 1 | 0 |
| 2026-07-13 | 0 | 2 | 2 | 0 |
| 2026-07-22 | 0 | 2 | 2 | 0 |
| 2026-07-23 | 0 | 4 | 4 | 0 |
| 2026-07-25 | 0 | 3 | 3 | 0 |
| 2026-07-26 | 0 | 4 | 4 | 0 |
| 2026-07-27 | 0 | 4 | 4 | 0 |
| 2026-07-28 | 0 | 3 | 3 | 0 |
| 2026-07-30 | 0 | 1 | 1 | 0 |
| 2026-08-02 | 0 | 1 | 1 | 0 |
| 2026-08-03 | 0 | 4 | 4 | 0 |
| 2026-08-04 | 0 | 5 | 5 | 0 |
| 2026-08-05 | 0 | 4 | 4 | 0 |
| 2026-08-06 | 0 | 4 | 4 | 0 |
| 2026-08-07 | 0 | 4 | 4 | 0 |
| 2026-08-08 | 0 | 4 | 4 | 0 |
| 2026-08-09 | 0 | 4 | 4 | 0 |
| 2026-08-10 | 0 | 4 | 4 | 0 |
| 2026-08-11 | 0 | 1 | 1 | 0 |
| 2026-08-17 | 0 | 6 | 6 | 0 |
| 2026-08-18 | 0 | 4 | 4 | 0 |
| 2026-08-19 | 0 | 1 | 1 | 0 |
| 2026-08-22 | 0 | 4 | 4 | 0 |
| 2026-08-23 | 0 | 4 | 4 | 0 |
| 2026-08-24 | 0 | 4 | 4 | 0 |
| 2026-08-25 | 0 | 4 | 4 | 0 |
| 2026-08-26 | 0 | 1 | 0 | 1 |
First blank send 2026-07-07 13:55 UTC, template fixed 2026-08-26 12:32 UTC: 49.9 days, 96 sends, 26 distinct send days, and the fix landed 61 minutes before the day's only send, which is why the last row reads 0 blank, 1 named.
How it survived 50 days
Three things were read every day and none of them was the email. The send, open, reply and bounce counters were read every morning. A lint ran on every batch manifest before loading (named person, source page re-checked, MX, envelope, word cap). The template was diffed when it changed. All three passed every day, because all three describe the input or the counters, and the defect lived in the output. The first person to read a delivered body was the recipient who replied on 2026-08-25 and quoted it; the first instrument to read one was written the next morning. It now runs on every health check, in both directions: before a send it renders every `{{variable}}` in a live template against every lead still pending and refuses to stay green if any would render empty; after a send it reads the delivered body back from the API and flags an empty greeting or a surviving token. Today the same class of check was added to the repo for the other email path we run, the report-delivery and follow-up emails sent through a different provider whose copy we cannot read, by recording the rendered subject and body at send time so there is an artifact to judge.
The general lesson is small and dull, which is probably why it took 50 days. A template diff tells you what you asked the renderer to do. Only the rendered artifact tells you what it did, and the renderer's failure mode here was silence: an empty string, no error, counters incrementing normally.
Limits
One site, one sending tool, 306 emails. Open counts are Instantly's pixel and undercount anyone whose mail client blocks images; two campaigns had open tracking off and read 0 on 130 sends, which is the instrument, not the readers, and the table says so. The classifier reads the first non-empty line only; a greeting further down would be missed, though the templates all begin with one. "Two replies on 96" is too small to carry a rate and we quote it as a count. The readback is of Instantly's stored copy, not of what arrived in an inbox; the two are the same document unless a mail server rewrote it, which we have no way to see.
What we will read on Monday
- Five follow-up emails to the six sites pitched on 2026-08-24 are due from 2026-08-29 to 2026-08-31 through the fixed template. On 2026-09-01 we read all five back the same way. Fewer than 5 of 5 NAMED falsifies "the defect is closed" and we will say so.
- The blank count across all eight campaigns is 157 today. Any new BLANK send on any campaign through 2026-09-07, as read by the health-check instrument, falsifies the same claim.
- We will publish the reply count on named-greeting pitch sends whatever it is, and we will not read a rate off five emails.
If you send outbound through a template tool and have never opened a delivered copy, the check takes ten minutes and the API is usually already there. If you would rather see what the AI engines say about your own site first, run the free check.
Why did the same template render a name on some campaigns and nothing on others?
Instantly resolves `{{first_name}}` from a custom variable of that exact name on the lead; its built-in variable is `{{firstName}}`. Leads loaded with a `first_name` custom field rendered a name; leads loaded with only the built-in `firstName` field rendered an empty string, with no error. Five campaigns had the custom field, three cold lists and both pitch campaigns did not.
Did the blank greeting hurt reply rates?
We cannot say. Both human replies the pitch lever ever received came through a blank greeting (2 on 96 sends), and the cold lists replied 0 on both blank and named sends, but there is no arm where the same pitch went out with a name. The post claims only that the replies happened despite the defect.
How do you check this on your own sends?
Pull the sent rows from your tool's API (for Instantly, `GET /emails?email_type=sent&campaign_id=…`), strip the HTML, read the first non-empty line of each, and count how many are a greeting word followed by punctuation. Then compare the count of rows to the tool's own sent counter so you know you read them all. Our script is in the repo path named above.
See your number
See which businesses AI names when your client's buyers ask.
Running this for clients? The $249 agency 5-pack audits five businesses, white-labeled.
Who runs this
- Built and operated by Sensara LLC, Atlanta, Georgia — about us and how the audit works.
- See what the report looks like before you run anything — score per engine, the competitors AI names instead of you, and a fix plan.
- We run the same audit on ourselves every week and publish the result: in the latest run AI named AskedAbout in 1 of 144 answers. We report our own numbers the way we report yours.