LG Lev Gamaley
A white 1994 E36 sedan built for rally, parked on a wet gravel forest road in the Olympic Peninsula. Render of the finished build.

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.

Pop the hood Four stops, then you drive it.
Engine bay of the E36, hood up, in a forest service park.
01

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

1,081Raw union of both directories, deduped
954After removing 127 identifiable non-US entities
916After removing 38 Big Four, global SIs and platform vendors
908After the data-quality gate. Final qualified.

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_value is 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).
Front wheel and brake package of the E36: gravel tire, drilled rotor, red caliper.
02

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 segment formula. 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_RUN until 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

  1. 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.
  2. cortex_verified_by_human, a checkbox, ticked only after I clicked the URL myself. Nothing downstream runs without it.
  3. 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.
  4. 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.
  5. 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.
Through the open driver door: suede wheel, two bucket seats, red harnesses, white cage.
03

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.

Rally tripmeter with an amber LCD readout, toggle switches, red harness in the foreground.
04

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
GateRows

Segment sizes, Snowflake partners in band

Where the segment formula routed the 87 accounts. Source: the three destination tables.

Table view
SegmentAccounts

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

2026-08-20
SnowPro certification count treated as delivery depth. It was a headcount proxy.
Dropped as a gate. Kept as a descriptive column.
2026-08-27
Noise-word stripper removed "digital" from company names. Aimpoint Digital, LP became "Aimpoint , LP".
Fixed. raw_source_value retained on every row.
2026-08-28
ARR potential gate at $500K. The attach variable took two values, so the estimate was headcount times a constant, and the gate had quietly turned the 15 to 150 band into 34 to 150.
Removed.
2026-08-28
Dormancy check fails any firm whose case study has no publication date. Small consultancies do not date theirs, so it partly measures publishing habits, which correlates with size again.
Not fixed. Flagged on the column. The test that caught all three: can the signal vary independently of the gates above it.
2026-09-01
Published "7 of 8 roles above the line name zero tools." Recount: 5 of 8, then 6 of 9.
Corrected in the published artifact, with the correction noted.
2026-09-01
Cited a comp report claiming $385K to $785K for forward-deployed engineers. The highest posted figure was $376K.
Retracted.

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.