The test for a segment
A filter tells you a row is different. A segment tells you the rep is different. The only question I let myself ask about a candidate cut: does the first sentence of the email change, does the proof point change, does the recipient change. If two of the three stay the same, it is a filter, and it goes.
The axis
Every firmographic cut (tier, cert density, headcount band, region, multi-homing) left the conversation unchanged. What changes it is what stands between the firm and putting Claude in front of a client. Three answers, mutually exclusive.
- S1 Cortex Native, 29. They build on Snowflake Cortex, where Claude is already a hosted model. Adopting it is a model string in a SQL function they already call. First touch: a one-page benchmark offer.
- S2 Committed Elsewhere, 32. They name OpenAI, Azure OpenAI, Bedrock, Vertex, Gemini or Databricks and show no Cortex. A displacement argument with a practice lead who has an opinion. First touch: a teardown of one of their published case studies.
- S3 Practice on Paper, 23. They market an AI service line, name no model vendor, and in 17 of 23 cases have no dated shipped work in twelve months. The ask is "build the practice and we fund the first one", a founder's decision. First touch: a funded pilot scoped to one named client of theirs.
- Unassigned, 3. Already name Claude and nothing else. Routed to the partner team, not to a sequence.
The routing column
// Clay formula column: segment. Reads one upstream Claygent column, model_vendors.
model_vendors contains "Cortex" -> S1 Cortex Native
else contains OpenAI | Azure OpenAI | Bedrock |
Vertex | Gemini | Databricks -> S2 Committed Elsewhere
else contains "none found" -> S3 Practice on Paper
else (names Anthropic Claude only) -> UNASSIGNED, route to partner team
Three destination tables, each fed by its own Send table data action whose run condition is this column. Cortex wins ties on purpose: a partner already on Cortex is the shortest distance to revenue, so the competing vendor becomes the objection the rep handles rather than the bucket the account sits in.
The honest part
S3 produces six accounts that clear every disqualifier, not ten. No vendor evidence and no shipped work turn out to be the same thinness measured from two directions. I reported 26 accounts to work now and four to track, four short of thirty.
The send caps, in code
// Apps Script endpoint. Runs on the server, not in Clay's run condition. A mis-set filter cannot get past it.
MAX_TOUCHES: 2, COOLDOWN_DAYS: 7, DAILY_SEND_CAP: 10, TOTAL_SEND_CAP: 25, MODE: 'DRY_RUN'
const idem = email.toLowerCase() + '#' + touch; // Clay columns re-run. This stops a duplicate send.
if (prior && prior.result === 'SENT') return json_({ ok: true, result: 'ALREADY_SENT' });
function blocked_(p, touch, log, email) {
if (touch > CONFIG.MAX_TOUCHES) return 'touch out of range';
if (truthy_(p.stop)) return 'stop flag set';
if (truthy_(p.replied) && touch > 1) return 'already replied, exits sequence';
if (!String(p.send_guard).startsWith('CLEAR')) return 'copy gate: ' + p.send_guard;
if (days < CONFIG.COOLDOWN_DAYS) return 'cooldown, ' + left + ' days left';
if (sentToday >= CONFIG.DAILY_SEND_CAP) return 'daily cap reached';
if (sentTotal >= CONFIG.TOTAL_SEND_CAP) return 'total cap reached';
return null;
}
Clay's HTTP API column POSTs each row here. The script takes a lock, checks a shared secret, runs these checks, drafts or sends through Gmail, and returns the result so Clay writes status back into the row. A 15-minute trigger walks replies and POSTs stop, bounce or pending back to a Clay webhook. The log sheet is append-only.
Where the human sits
cortex_evidence_check, Claygent: CONFIRMED, LIKELY, NOT_FOUND or UNCERTAIN with a verbatim quote and URL. The prompt says a false CONFIRMED is much worse than a NOT_FOUND, because a human is going to state this back to the company.
cortex_verified_by_human, a checkbox, ticked only after I clicked the URL myself. Nothing downstream runs without it.
email_draft, a drafting model with no web access, run condition on the checkbox. Eight columns are inserted into the prompt. final_grade, the ARR estimate and the exclusivity flag are excluded by name.
banned_phrase_check, a formula, not AI: deterministic and free. Blocks partner-program language, pricing, "on behalf of Anthropic", "book a demo", and any em or en dash.
send_approved, a second checkbox per row. The endpoint refuses anything that arrives without CLEAR.
What broke
- Clay's JSON Schema output mode failed silently at 0 percent on one column. Every AI column was rebuilt with Fields output.
- The Cortex-first tie break is the load-bearing assumption and it is untested. If a partner running both Cortex and OpenAI behaves like an OpenAI shop, S1 drops from 29 to about 20 and S2 grows to about 41.