# A Field Guide to Go-To-Market, for People Who Read Code

*Published 2026-06-10* | Author: brad-webb

<blockquote><p><strong class="lede-label">tl;dr</strong> <span class="lede-lead">Go-to-market isn't software, but it often fails like software.</span> The funnel behaves like a request lifecycle. The org chart behaves like a service topology. Once you read it that way, the acronyms get less mystical, behavior becomes a better input than self-reported intent, and "the stack is broken" usually resolves into a small set of failure modes you already know how to debug. "GTM Engineer" is the labor market catching up to work that's been getting more technical for years.</p></blockquote>

<hr>

<h2>Why the funnel embarrasses us</h2>

<p>I used to think the marketing funnel was embarrassing because it was too simple.</p>

<p>You know the diagram. A triangle. Awareness at the top. Decision at the bottom. A few soft nouns in between: consideration, evaluation, intent. If you've spent most of your career around code, it's hard not to wince a little. Surely the commercial system of a software company can't be reduced to a triangle with a gradient fill.</p>

<svg class="funnel-cliche" viewBox="0 0 460 380" role="img" aria-labelledby="fc-title fc-desc" xmlns="http://www.w3.org/2000/svg">
<title id="fc-title">The funnel, as usually drawn</title>
<desc id="fc-desc">The cliché marketing funnel: an inverted triangle of five stacked bands narrowing from top to bottom, filled with a purple gradient that deepens as it descends. From top to bottom the bands read Awareness, Consideration, Evaluation, Intent and Decision.</desc>
<defs>
<linearGradient id="fc-grad" x1="0" y1="0" x2="0" y2="1">
<stop class="fc-stop-top" offset="0"/>
<stop class="fc-stop-bottom" offset="1"/>
</linearGradient>
</defs>
<text class="fc-eyebrow" x="230" y="22" font-size="11" letter-spacing="1.5" font-weight="600" text-anchor="middle">THE FUNNEL, AS USUALLY DRAWN</text>

<g class="fc-bands" fill="url(#fc-grad)">
<polygon points="20,44 440,44 396,104 64,104"/>
<polygon points="68,108 392,108 354,168 106,168"/>
<polygon points="110,172 350,172 312,232 148,232"/>
<polygon points="152,236 308,236 270,296 190,296"/>
<polygon points="194,300 266,300 240,360 220,360"/>
</g>

<g class="fc-labels" text-anchor="middle" font-weight="600">
<text x="230" y="79" font-size="17">Awareness</text>
<text x="230" y="143" font-size="15">Consideration</text>
<text x="230" y="207" font-size="14">Evaluation</text>
<text x="230" y="271" font-size="13">Intent</text>
<text x="230" y="335" font-size="11">Decision</text>
</g>
</svg>

<!-- FunnelCliche: the deliberately off-brand, cheesy marketing funnel the essay pokes fun at — a gradient-filled
     inverted triangle with soft nouns. The cliché *form* is intentional and editorial; only color (brand tokens
     via the #fc-grad stops in globals.css) and accessibility (role/title/desc) stay disciplined. Parallel namespace
     to .funnel-lifecycle below (funnel-cliche / fc-*). On mobile the SVG scales down rather than truncates.
     Markdown alternate (section G): when draft flips to false, regenerate public/md with an ASCII version of this
     funnel too (alongside the lifecycle funnel). See report follow-ups. -->

<p>It can't. But the problem isn't that the diagram is wrong. The problem is that it hides the machinery.</p>

<p>What looks like a funnel is really a request lifecycle. Cold cache. Route hit. Drop-off at every hop. A hundred thousand impressions become a few customers through ordinary attrition, not one dramatic failure. The numbers vary by company, motion, price point, category and execution. The topology is stubbornly familiar.</p>

<p>Go-to-market teams already use the right clues. They talk about pipeline, leakage, routing, handoffs, latency and attribution. Engineers hear those words and assume they're analogies. I don't think they are. I think the two vocabularies evolved apart and then kept describing the same underlying system from different rooms.</p>

<p>That's where a lot of the friction starts.</p>

<p>For the engineer crossing into growth work, or for the GTM Engineer who's been doing the work without ever seeing it named cleanly, the functions look organizational. They're mostly services. The metrics look financial. Many are operational. The acronyms look proprietary. They aren't. They name events.</p>

<p>This is the field guide I wish someone had handed me earlier. It will not make you a marketer. It will make the system legible enough that you can stop translating every sentence in your head.</p>

<h2>A word about "signal"</h2>

<p>Start with the word most likely to cause a wrong turn.</p>

<p>In engineering, a signal is a measurement. Telemetry. An event in a stream. A metric, a trace, a log line. Sometimes a UNIX interrupt. The word usually points to something observed before interpretation.</p>

<p>In go-to-market, a signal is already an inference. A pricing-page visit. A job change. A funding announcement. A trial activation. The shorthand means, "somebody did something that might indicate buying intent."</p>

<p>I've seen this exact mismatch waste whole conversations. A growth lead says, "we got a signal from Acme last week." The engineer asks which event, metric or source table. The growth lead means, "Acme behaved like a company we should talk to now." Both are reasonable. They're just naming different layers.</p>

<figure class="inline-code-card" id="signal-card">
<div class="inline-code-card__head"><span class="inline-code-card__eyebrow">Signal</span><span class="inline-code-card__title">Same word, different layer</span></div>
<pre tabindex="0" data-language="typescript"><code>// same word, different layer

const engineeringSignal = observe(eventStream, {
  as: ["metric", "trace", "log_line"]
});

const gtmSignal = inferIntent({
  from: ["pricing_page", "job_change", "trial_activation"],
  meaning: "they_might_buy"
});</code></pre>
<figcaption>In engineering, signal is observed. In go-to-market, signal is inferred.</figcaption>
</figure>

<p>The distinction matters because most modern go-to-market tooling uses signal in the second sense, while the architecture underneath looks like the first: event stream, classifier, router, destination. The buyer-side meaning rides on top of the engineering shape. Once you can hold both meanings at once, the rest of the vocabulary gets easier.</p>

<h2>The pipeline, conceptually</h2>

<p>A go-to-market motion is the system a company uses to turn strangers into customers, and then to turn those customers into retained or expanded revenue. Every acronym, function and dashboard lives somewhere inside that system.</p>

<p>At its simplest, the pipeline has four conceptual stages. Most of the vocabulary you'll meet names an event, a state or a transition between them.</p>

<ul>
<li><strong>Awareness.</strong> The buyer didn't know the company existed. Now they do. <code>UNKNOWN → ANONYMOUS_VISITOR</code>.</li>
<li><strong>Interest.</strong> They're evaluating. <code>ANONYMOUS_VISITOR → IDENTIFIED_LEAD → QUALIFIED</code>.</li>
<li><strong>Decision.</strong> Money changes hands. <code>QUALIFIED → CUSTOMER</code>.</li>
<li><strong>Expansion.</strong> They keep paying and pay more, or they leave. <code>CUSTOMER → EXPANDED | CHURNED</code>.</li>
</ul>

<p>If you've built a state machine, this should look familiar, with two complications. First, the transitions are noisy and partially observable. Second, the object moving through the system isn't just a message. It's a person, a company or both in changing ratio over time.</p>

<p>That identity carries history. A buyer's state at time T+1 depends on their state at time T and on every touch between those two points: the ad they ignored, the doc they read, the teammate who invited them, the sales email they didn't answer, the renewal call that happened six months later. People go backward. They switch jobs. They return after a quarter of silence. The median motion may take weeks. The long tail takes quarters or years.</p>

<p>The word "funnel" makes this sound cleaner than it is. The system is stateful, partially observable and full of tail latency. That's the useful mental model.</p>

<h2>The funnel as request lifecycle</h2>

<p>Put the familiar funnel into a vocabulary engineers already use.</p>

<p>Don't treat these rates as benchmarks. They're illustrative, and deliberately round. The point is to make the shape visible.</p>

<svg class="funnel-lifecycle" viewBox="0 0 560 700" role="img" aria-labelledby="fl-title fl-desc" xmlns="http://www.w3.org/2000/svg">
<title id="fl-title">The funnel as a request lifecycle</title>
<desc id="fl-desc">A vertical stack of six stages, from 100,000 ad impressions at the top down to about 3 retained customers at 12 months. Each marketing stage is paired with its engineering equivalent: ad impressions are a cold cache, visits are a route hit, leads are an identified entity, qualified leads have passed validation, customers are a commit, and retained customers at 12 months are steady state. The take-rate is labeled on the arrow between stages. Rates are illustrative. Pointing at a stage reframes it in engineering terms.</desc>
<defs>
<marker id="fl-arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path class="fl-arrow-head" d="M0,0 L10,5 L0,10 z"/></marker>
<radialGradient id="fl-sheen" cx="32%" cy="22%" r="85%">
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.32"/>
<stop offset="55%" stop-color="#FFFFFF" stop-opacity="0.05"/>
<stop offset="100%" stop-color="#FFFFFF" stop-opacity="0"/>
</radialGradient>
</defs>
<text class="fl-eyebrow" x="20" y="22" font-size="11" letter-spacing="1.5" font-weight="600">FUNNEL AS REQUEST LIFECYCLE</text>

<g class="fl-stage">
<rect class="fl-box" x="20" y="40" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="40" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="40" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="75" text-anchor="end" font-size="19" font-weight="700">100,000</text><text class="fl-label" x="210" y="75" font-size="15" font-weight="500">Ad impressions</text>
<text class="fl-eng" x="210" y="75" font-size="15" font-weight="600">Cold cache</text>
<text class="fl-anno" x="400" y="73" font-size="12">Cold cache</text>
</g>

<g class="fl-stage">
<line class="fl-arrow-line" x1="200" y1="102" x2="200" y2="152" stroke-width="1.5" marker-end="url(#fl-arrow)"/>
<text class="fl-rate" x="216" y="131" font-size="11">~1 to 3% click-through</text>
<rect class="fl-box" x="20" y="158" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="158" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="158" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="193" text-anchor="end" font-size="19" font-weight="700">2,000</text><text class="fl-label" x="210" y="193" font-size="15" font-weight="500">Visits</text>
<text class="fl-eng" x="210" y="193" font-size="15" font-weight="600">Route hit</text>
<text class="fl-anno" x="400" y="191" font-size="12">Route hit</text>
</g>

<g class="fl-stage">
<line class="fl-arrow-line" x1="200" y1="220" x2="200" y2="270" stroke-width="1.5" marker-end="url(#fl-arrow)"/>
<text class="fl-rate" x="216" y="249" font-size="11">~2 to 5% form-fill</text>
<rect class="fl-box" x="20" y="276" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="276" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="276" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="311" text-anchor="end" font-size="19" font-weight="700">60</text><text class="fl-label" x="210" y="311" font-size="15" font-weight="500">Leads</text>
<text class="fl-eng" x="210" y="311" font-size="15" font-weight="600">Identified entity</text>
<text class="fl-anno" x="400" y="309" font-size="12">Identified entity</text>
</g>

<g class="fl-stage">
<line class="fl-arrow-line" x1="200" y1="338" x2="200" y2="388" stroke-width="1.5" marker-end="url(#fl-arrow)"/>
<text class="fl-rate" x="216" y="367" font-size="11">~20 to 40% qualify</text>
<rect class="fl-box" x="20" y="394" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="394" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="394" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="429" text-anchor="end" font-size="19" font-weight="700">18</text><text class="fl-label" x="210" y="429" font-size="15" font-weight="500">Qualified</text>
<text class="fl-eng" x="210" y="429" font-size="15" font-weight="600">Passed validation</text>
<text class="fl-anno" x="400" y="427" font-size="12">Passed validation</text>
</g>

<g class="fl-stage">
<line class="fl-arrow-line" x1="200" y1="456" x2="200" y2="506" stroke-width="1.5" marker-end="url(#fl-arrow)"/>
<text class="fl-rate" x="216" y="485" font-size="11">~15 to 30% close</text>
<rect class="fl-box" x="20" y="512" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="512" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="512" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="547" text-anchor="end" font-size="19" font-weight="700">4</text><text class="fl-label" x="210" y="547" font-size="15" font-weight="500">Customers</text>
<text class="fl-eng" x="210" y="547" font-size="15" font-weight="600">Commit</text>
<text class="fl-anno" x="400" y="545" font-size="12">Commit</text>
</g>

<g class="fl-stage">
<line class="fl-arrow-line" x1="200" y1="574" x2="200" y2="624" stroke-width="1.5" marker-end="url(#fl-arrow)"/>
<text class="fl-rate" x="216" y="603" font-size="11">net of churn</text>
<rect class="fl-box" x="20" y="630" width="360" height="56" rx="10"/>
<rect class="fl-drench" x="20" y="630" width="360" height="56" rx="10"/>
<rect class="fl-drench-sheen" x="20" y="630" width="360" height="56" rx="10" fill="url(#fl-sheen)"/>
<text class="fl-num" x="190" y="665" text-anchor="end" font-size="19" font-weight="700">~3</text><text class="fl-label" x="210" y="665" font-size="15" font-weight="500">Retained at 12mo</text>
<text class="fl-eng" x="210" y="665" font-size="15" font-weight="600">Steady state</text>
<text class="fl-anno" x="400" y="663" font-size="12">Steady state</text>
</g>
</svg>

<!-- FunnelLifecycle is rendered here as a live, accessible, tokenized inline SVG (rebuilt from
     assets/funnel-lifecycle.svg). Stage numbers use var(--brand); all other ink uses --text / --text-muted.
     Each stage is wrapped in <g class="fl-stage"> so the whole stage (feeding arrow + box + labels)
     responds as one CSS-only hover unit: the box "drenches" (brand fill + white radial sheen), the
     marketing label crossfades to its engineering equivalent (.fl-label -> .fl-eng) inside the box, and
     sibling stages dim so the multiplicative drop-off is felt. Pure CSS, no JS — the body is rendered via
     dangerouslySetInnerHTML, so any client enhancement would be clobbered on re-render.
     Accessibility: the resting state carries full meaning (marketing label in the box + faint engineering
     side annotation .fl-anno); the <desc> names every marketing/engineering pair, so nothing is hover-only.
     prefers-reduced-motion users get the same state changes with no transition. Side annotations (.fl-anno)
     drop on mobile via globals.css rather than truncate. Rates are illustrative.
     Markdown alternate (section G): when draft flips to false, regenerate public/md with the ASCII funnel.
     See report follow-ups. -->

<p>Drop-off isn't an exception here. Drop-off is the default. The whole system is a multiplicative loss function, which means the right place to optimize is wherever the marginal improvement survives furthest downstream.</p>

<p>That sounds obvious until you sit in the planning meeting.</p>

<p>Teams will argue about whether the top of funnel is weak, whether sales is underperforming, whether the website needs work, whether pricing is wrong. Sometimes the loudest argument is correct. More often, the arithmetic is more useful than the volume.</p>

<p>If you're running ten qualified leads through a fifteen-percent close rate, doubling close rate gains roughly 1.5 customers per period. Improving a small form-fill rate by twenty percent may barely show up. In a different motion, with much more top-of-funnel volume and a healthy close rate, the reverse can be true. There's no permanent answer. The math changes as the system changes.</p>

<p>Good teams stop asking which stage is "the problem" in the abstract. They ask which stage's next unit of improvement compounds the most this quarter.</p>

<h2>Two motions, one pipeline</h2>

<p>Modern B2B SaaS usually runs two motions through the same pipeline. They differ in who initiates the transitions.</p>

<p>In a sales-led motion, humans move the process forward. Marketing generates the lead. A sales development rep works it. An account executive demos, negotiates and closes. A contract gets signed. The cycle is longer, the contract value is higher, and the process has more human judgment at every hop.</p>

<p>In a <a href="https://openviewpartners.com/product-led-growth/" target="_blank">product-led growth</a> motion, the product moves more of the process forward. The user signs up without talking to sales. They reach value inside the product. They invite a teammate. They hit a limit, a trigger or a reason to upgrade. The cycle is usually shorter, the initial contract value is usually lower, and the system depends on the product doing work that a seller used to do.</p>

<p>Most scaled software companies end up hybrid. Self-serve handles the bottom of the market. Sales handles the top. The interesting work happens in the seam: a self-serve user inside a five-hundred-person company who looks ordinary until their behavior suggests they could become a six-figure account.</p>

<p>That seam is where the math gets non-linear. It's also where the tooling stack is often least coherent.</p>

<h2>The org chart as service topology</h2>

<p>Viewed from the right distance, a go-to-market organization is less a hierarchy than a service topology. Each function owns a stage of the pipeline and exposes a contract to the function downstream of it. The contracts are often informal, which means they drift. A lot of what gets called sales and marketing alignment is really contract drift between services.</p>

<p><strong>Marketing.</strong> Owns the top of the funnel: awareness, interest, demand generation, content, brand, lifecycle, product marketing. The function as a whole is the ingest layer. It creates events for downstream teams to consume. If it over-fires, sales gets a queue full of poor-fit work. If it under-fires, sales starves. If it changes the definition of a qualified lead without telling anyone, the downstream service starts failing in ways that look like culture problems.</p>

<p><strong>Sales.</strong> Owns the middle and bottom of the funnel: qualifying, demoing, negotiating, closing. The sales development rep is a worker queue. The account executive is the request handler that actually commits the transaction. The account manager handles expansion and renewal on existing customers. The sales engineer is the field engineer, the technical co-pilot for demos, proofs and security questions. Compensation across these roles is usually some form of quota, which is just a revenue target with a paycheck attached.</p>

<p><strong>Customer success</strong> (CS). Owns what happens after the contract is signed: onboarding, adoption, renewal, expansion and support. Good CS looks a lot like good on-call. They watch the customer's real usage after deploy. They notice when an account goes quiet. They page the right human before the renewal is already dead. Broken CS looks like everyone screaming in <code>#incidents</code>, except the incident is a renewal you didn't know was at risk.</p>

<p><strong>RevOps</strong> (Revenue Operations). Owns the infrastructure all of the above run on: the CRM, data model, lead-routing rules, forecasting, territory logic and compensation mechanics. This is the platform team. They don't sell and they don't market. They keep the commercial system operable. They care, more than anyone else, whether product events are clean, typed and usable. In practice, they own a schema that many teams can break.</p>

<!-- brand-voice exempt (Brad, 2026-06-07): "platform team" above is the platform-engineering sense
     (the team that owns the shared rails), not the kill-on-sight buzzword. Intentional, do not lint-fix. -->

<p><strong>Growth.</strong> Owns the product-led loop: sign-up, activation, retention, virality and monetization. In a product-led company, growth sits halfway between engineering and marketing. Growth teams run experiments, instrument funnels, build dashboards and ship code. They're usually the GTM function closest to the product itself.</p>

<!-- OPTIONAL org-interface-card omitted: density call. After the hero, the funnel SVG, and the three
     required code cards, the page already carries five visual objects across ~3,000 words, and the org
     section sits close to the funnel. Adding a fourth code card here would crowd the page and violate the
     "prose separates the two visual objects" guidance. See handoff, section H. -->

<p>The buyer has a topology too. A champion wants you to win. An economic buyer can sign the check. Legal, security, finance, IT and the team lead can all become veto points. The exact cast changes by market, but the shape is consistent enough to matter.</p>

<p>A B2B sale is a quorum protocol, not a single-leader write. The deal doesn't close until enough of the system agrees.</p>

<p>That's not only a clever line. <a href="https://www.forrester.com/press-newsroom/forrester-2026-the-state-of-business-buying/" target="_blank">Forrester's 2026 buyer research</a> put the typical buying decision at 13 internal stakeholders and nine external influencers. <a href="https://www.gartner.com/en/newsroom/press-releases/2025-05-07-gartner-sales-survey-finds-74-percent-of-b2b-buyer-teams-demonstrate-unhealthy-conflict-during-the-decision-process" target="_blank">Gartner's 2025 buyer-team research</a> described buying groups ranging from five to 16 people across as many as four functions, and found that consensus is materially tied to deal quality. The exact numbers will change. The point will not: there's rarely one buyer.</p>

<p>Once you read these roles as services and counterparties in a distributed system, the acronyms stop looking like soup. They start looking like interface descriptions.</p>

<h2>Behavior as qualification</h2>

<p>The older model of qualification ran through forms. A lead filled out a contact form, checked a few boxes about company size and budget, and entered a queue. Marketing-qualified lead became sales-qualified lead after a salesperson decided it was worth working.</p>

<p>That model still exists. It's also weaker than it used to be.</p>

<p>In a product-led world, the best qualification data is often not what a user claims on a form. It's what they do. A user signs up, completes onboarding, invites two teammates, hits a free-tier limit and visits the pricing page twice in a week. At that point, they're qualifying themselves in the event stream. The form was a proxy for behavior. Now the behavior is visible directly.</p>

<figure class="inline-code-card" id="pql-routing-card">
<div class="inline-code-card__head"><span class="inline-code-card__eyebrow">Qualification</span><span class="inline-code-card__title">Behavior beats declared intent</span></div>
<pre tabindex="0" data-language="typescript"><code>// behavior as qualification

const pql = qualify(user.events, {
  activated: true,
  invitedTeammates: 2,
  hitUsageLimit: true,
  viewedPricing: "twice_this_week"
});

if (pql.score >= threshold) {
  route.to("sales", { reason: pql.explain() });
}</code></pre>
<figcaption>A product-qualified lead is a routing decision over behavior, not a better form field.</figcaption>
</figure>

<p>That's the useful idea inside the term <a href="https://productled.com/blog/product-qualified-leads" target="_blank">product-qualified lead</a> (PQL). The acronym isn't beautiful. The concept is. Behavior is usually a better intent signal than declared interest, and the go-to-market system should be built to notice it.</p>

<p>Most systems still don't.</p>

<p>The design problem is straightforward to state and difficult to do well: read the stream, classify what it shows, route the resulting signal to the right person or system, and keep enough audit trail that someone can answer, "why did we email this customer last Thursday?" three months later.</p>

<p>That last requirement is easy to underrate. A system that turns behavior into outreach but can't explain what it saw will become unsupportable as soon as it scales beyond the team that built it. Audit isn't compliance overhead. Audit is the work record.</p>

<h2>Three failure modes, repeating</h2>

<p>Talk to enough people running go-to-market systems at real scale and the same failures come up again and again. They're usually described in commercial language. The shape is engineering language.</p>

<!-- Failure-modes card: authored as a CI test-runner readout rather than a flat <pre> dump,
     so each block carries a named failure tag (mapping 1:1 to the three prose paragraphs below)
     and the expected/received pairs read as a real diff (- danger / + success). Built as plain
     markup (not a data-language <pre>, which the lib/content.ts codebox processor would line-wrap
     and escape) and styled under .cb-runner in globals.css to stay native to the --cb-* terminal
     palette. Pure markup + CSS; no row->paragraph anchors (rejected: fiddly + scroll/JS risk). -->
<figure class="inline-code-card" id="failure-tests-card">
<div class="inline-code-card__head"><span class="inline-code-card__eyebrow">Failure modes</span><span class="inline-code-card__title">The stack usually fails one of three tests</span></div>
<div class="cb-bar"><span class="cb-lang">test runner</span></div>
<div class="cb-runner">
<div class="cb-runner__head"><span class="cb-x">FAIL</span> gtm-stack.integration</div>
<div class="cb-test">
<div class="cb-test__line"><span class="cb-tag">data mismatch</span></div>
<div class="cb-test__line cb-test__name"><span class="cb-x">x</span> reconciles CRM and warehouse revenue</div>
<div class="cb-test__line cb-diff cb-diff--del">- expected: 428000 ARR</div>
<div class="cb-test__line cb-diff cb-diff--add">+ received: 391000 ARR</div>
</div>
<div class="cb-test">
<div class="cb-test__line"><span class="cb-tag">dropped handoff</span></div>
<div class="cb-test__line cb-test__name"><span class="cb-x">x</span> retries dropped lead handoff</div>
<div class="cb-test__line cb-diff cb-diff--del">- lead.created fired</div>
<div class="cb-test__line cb-diff cb-diff--add">+ sales.queue received: 0</div>
</div>
<div class="cb-test">
<div class="cb-test__line"><span class="cb-tag">schema drift</span></div>
<div class="cb-test__line cb-test__name"><span class="cb-x">x</span> validates webhook schema version</div>
<div class="cb-test__line cb-diff cb-diff--del">- sender: account.updated@v2.1</div>
<div class="cb-test__line cb-diff cb-diff--add">+ receiver: account.updated@v2.0</div>
</div>
<div class="cb-runner__summary">Tests: <span class="cb-fail-count">3 failed</span>, 0 passed</div>
</div>
<figcaption>Data mismatch, dropped handoff, and schema drift are GTM failures with engineering-shaped names.</figcaption>
</figure>

<p><strong>Failure one: the data doesn't reconcile.</strong> Salesforce says one thing. The warehouse says another. The dashboard the CFO uses to forecast says a third. The requested fix is usually "a single source of truth," which sounds technical until the numbers move. Then it becomes political. Every team has built reporting around the version of reality that makes its own performance legible, sometimes flattering. Reconciliation means somebody loses a chart they liked.</p>

<p><strong>Failure two: the handoff drops events.</strong> Marketing fires a lead and sales never sees it, or sees it three days late. Sales closes a deal and customer success never gets the kickoff context. Product records usage that would change the account plan, but nobody in the revenue team knows where to look. In engineering terms, this is an event-driven system without retries, idempotency or a dead-letter queue. In go-to-market terms, it's Tuesday.</p>

<p><strong>Failure three: the integrations rot.</strong> A webhook payload changes. A field gets renamed. A sync silently stops mapping the value everyone depends on. For two weeks, the wrong deals route to the wrong queue and the dashboard keeps looking normal. This is API contract drift without integration tests. It's worse when nobody owns the schema because the schema crosses organizational boundaries, and boundaries are where ownership tends to blur.</p>

<p>When a growth leader says "the stack is broken," they usually mean one of these three. The practical question isn't whether the stack is broken. It's which contract failed, who owns it, and what would make the failure visible sooner next time.</p>

<h2>The vocabulary lookup, lightly</h2>

<p>This guide is trying to install intuition more than terminology. Once the intuition is there, the terms have somewhere to go. Still, a few acronyms show up often enough that knowing them early is useful.</p>

<p><strong>ICP</strong> is <a href="https://offers.hubspot.com/ideal-customer-profile-icp" target="_blank">ideal customer profile</a>. It's the company-level shape of the customer a product is built to serve: size, industry, use case, budget, maturity, trigger, constraints. If you retain one acronym, retain this one. A weak ICP makes every downstream system noisier.</p>

<p><strong>NRR</strong>, or net revenue retention, is the retention metric people care about most in SaaS. It measures revenue this period from the customers you had last period, including expansion and churn. Above 100% means the existing customer base grows even before new logos are added. <a href="https://www.bvp.com/atlas/state-of-the-cloud-2023" target="_blank">Bessemer's 2023 State of the Cloud benchmarks</a> call 100% good, 110% better and 120% or higher best for growth-stage SaaS.</p>

<p><strong>CAC</strong> is customer acquisition cost. <strong>LTV</strong> is lifetime value. The ratio is a shorthand for unit economics. <a href="https://www.forentrepreneurs.com/saas-metrics-2-definitions-2/" target="_blank">David Skok's SaaS metrics guide</a> puts a healthy LTV:CAC ratio above 3, and treats CAC recovery under 12 months as a guideline that runs longer for land-and-expand motions.</p>

<p><strong>MEDDIC</strong> and <strong>BANT</strong> are sales qualification frameworks. They're mnemonics for whether sales asked the right questions. <a href="https://meddicc.com/meddpicc-sales-methodology-and-process" target="_blank">MEDDIC</a> originated inside PTC in 1996 and has since grown variants with extra letters. BANT is older and shorter: budget, authority, need, timeline. The mnemonics matter less than the discipline they impose.</p>

<p>The rest you can learn in the wild. A demand gen lead running a lifecycle program is, in one reading, a person on the ingest team writing pub-sub jobs against a templating engine. The more time you spend around the work, the less strange the job descriptions sound.</p>

<h2>What changes when you take it seriously</h2>

<p>The thesis here isn't that every GTM person should talk like an SRE. Please don't do that.</p>

<p>The thesis is that go-to-market has become an engineering surface. The functions have been getting more technical for years. The vocabulary has lagged the work. The job title "GTM Engineer" feels new because the labor market is finally naming a job that already existed in pieces.</p>

<p>Once you read the system this way, arguments get more specific.</p>

<p>A marketing campaign isn't only a creative artifact. It's an event generator with a payload. A sales process isn't only theater. It's a request lifecycle with informal SLA contracts between handlers. Customer success isn't only relationship management. It's observability and on-call for retained revenue. The CRM isn't only a database of accounts. It's the system of record tying the rest of the mesh together.</p>

<p>None of this removes the human craft from the work. Sales is still a craft. Marketing is still a craft. Customer success is still a craft. The best people in those functions are excellent in ways that resist instrumentation, and the systems view should never be used to flatter the measurable parts at the expense of the real ones.</p>

<p>What the systems view does is make the work modelable. It gives the engineer and the go-to-market lead a shared way to talk about where information enters, where it mutates, where it drops and where it should be routed next.</p>

<p>If you're crossing into this work, welcome. The system is more legible than its vocabulary suggests. If you're already in the work and the title GTM Engineer is somewhere in your present or future, this guide is for you in a different way. The shift is real. The names are catching up.</p>

Source: https://www.civic.com/field-notes/field-guide-go-to-market
