Lev Gamaley · VP of Revenue Operations, Xtrm · Loomis, California
Let's build something that can drive your revenue to the next level.
I build revenue systems. At Xtrm, a global payments platform, that is an outbound system that does the work of an SDR team (Xtrm has none), a 37-demo interactive demo library, and the partner audiences, routing and telemetry in Clay that the next four sections walk through. Before that I owned Xtrm's payments API as its product manager and shipped enterprise integrations as a solutions engineer.
Hood
The audience build
A partner-recruitment audience for Anthropic's Claude Partner Network, built in Clay from two public partner directories. 908 qualified accounts. Zero enrichment credits spent.
- What went in
- Snowflake Services Partners (Americas) and Databricks C&SI Partners, 1,081 rows after dedupe.
- What decided
- Three free gates (non-US, Big Four and platform vendors, data quality), then
fit_score_0_7. - What came out
anthropic-icp-FINAL, 908 rows, 23 columns, 173 disqualified rows logged with a reason each.- What it does now
- Waits on domain resolution, then HQ verification, then the 15 to 150 headcount gate. Credits are spent on the survivors.
Thesis
Anthropic sells through Snowflake and Databricks as much as it sells direct, and the consulting and systems-integration firms that deploy on those platforms are the recruitable layer. Not the Big Four. The 15 to 150 person shops that already have a Snowflake or Databricks bench and no model vendor they are married to. The thesis predicted a partner incentive-infrastructure gap. Five days after I wrote it, Anthropic posted a partnerships req whose core deliverable is commercial mechanics: deal registration, marketplace structure, incentives.
The disqualification funnel
Bands inside the 908: 43 A-priority, 315 B-qualified, 550 C-long-tail. 42 accounts appear in both directories.
Scoring
Every point in fit_score_0_7 traces to a thesis claim: Snowflake tier (Elite or Premier 2, Select 1), multi-homing across both directories (2), Americas region confirmed (1), source name unaltered by the cleaner (1), and a Databricks AI specialization badge (1). Top row: Aimpoint Digital, 7 of 7.
The finding that changed the model
The Databricks AI specialization badge is a large-SI credential. Filtered to C&SI Partner plus AI, 19 of 1,419 companies qualify, and 17 of the 19 are Accenture, Avanade, Capgemini, Cognizant, DXC, EPAM, EY, Infosys and firms of that size.
So the badge cannot be a gate. Used as a gate it selects almost exactly the firms the ICP excludes. It works as a tie-breaking bonus point, and only two firms in the whole set hold it while plausibly sitting in the 15 to 150 band: Aimpoint Digital and Koantek. Same pattern as PRM-platform detection on Xtrm's own partner-program audience: a bonus signal, never the Keep or Flag gate.
What broke
- The first Databricks pull was unfiltered: 501 rows including ISVs and cloud vendors. Their filter checkboxes do nothing until you click Apply Selected Filters. The second pass applied C&SI at the source: 357 wrong-type companies excluded before they entered the table.
- Databricks renders company names as logo images. 117 of 501 rows came back as image filenames. Normalization recovered most;
raw_source_valueis kept on every row for audit. - My noise-word stripper removed the word "digital". Aimpoint Digital, LP became "Aimpoint , LP", on the highest-scoring row. Caught late, fixed.
- Neither directory has a country filter. US-only was approximated by excluding unambiguous non-US legal suffixes and geography words. Remaining rows are marked
PASS (presumed US, verify HQ).
Wheel and brakes
Routing, and the caps that hold
One formula column routes 87 accounts into three live tables. An Apps Script endpoint enforces the send caps on the server, and a human ticks two boxes before anything goes out.
- What went in
- 429 US and LatAm Snowflake services partners, gated to 367 US, then 87 in the 15 to 150 band.
- What decided
- A Claygent research pass returning named model vendors, then the
segmentformula. On the outbound side,blocked_()in the endpoint. - What came out
- S1 29 · S2 32 · S3 23 · 3 unassigned, each in its own destination table. Seven recipients in the S1 sequence.
- What it does now
- Rows that change segment move tables on their own. Mode is
DRY_RUNuntil the first ten drafts are read.
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.
Door
Inside Xtrm
The systems that run at my day job, and the seats I sat in before this one.
The outbound system
Xtrm has no SDR team. The outbound system I built on Alta does that work. Six live campaigns, one per ICP, each ICP defined by the partner-incentive payout motion it runs (channel rebates, reseller incentives, rev-share payouts) rather than by industry code. Each campaign carries its own multi-step, multi-channel sequence, its own reply handling, and writes back to the CRM.
The demo library
Thirty-seven interactive demos in Storylane, November 2025 to August 2026, built and kept current by me. They cover company and personal account signup, wallet creation and funding by bank transfer and bank debit, individual and mass payments, first-time recipient flows in USD and GBP, transfers out to bank, prepaid virtual debit and digital gift cards, connected-manager onboarding, identity-level upgrades, reporting, and the SPIF and MDF partner incentive payment flows. Each demo is a share link that support, sales and the help center point to instead of a live walkthrough.
Before this seat
Two years as the product manager who owned Xtrm's payments API, including the financial-institution vendor partnerships underneath it. Before that, senior solutions engineer: enterprise API integrations, Postman documentation, Salesforce custom objects, a PRM migration. When something is missing, I build it.
Dash
Telemetry from Clay
Row counts read from the Clay tables behind sections 01 and 02, queried through Clay's public API. The readout is rendered from that response.
loading snapshot
Disqualification funnel, Anthropic partner audience
Rows remaining after each gate. Source: anthropic-icp-FINAL plus the logged disqualified rows.
Table view
| Gate | Rows |
|---|
Segment sizes, Snowflake partners in band
Where the segment formula routed the 87 accounts. Source: the three destination tables.
Table view
| Segment | Accounts |
|---|
The request
POST https://api.clay.com/public/v0/tables/query
clay-api-key: <server side, never in this page>
{ "query": { "tables": [ { "id": "t_0tkgaa2wuHGApf5CBas" } ], "field_mode": "names" },
"limit": 100 } // paginate with the returned cursor; count rows; keep the field list
Five tables, one request per page. The key stays on the machine that runs scripts/clay_pull.py. The page ships the response, dated, and says whether the numbers came from the build logs or from api.clay.com.
Corrections
raw_source_value retained on every row.Keyboard: W A S D or arrows, space for the handbrake, Esc to get out. On a phone, the buttons on the right. Sound is on by default; M mutes.