GTM Systems Design
Enrichment, scoring, routing and reliability
The data model & sources of truth
After this you can design the object model a GTM system sits on
Every enrichment formula, scoring rule and routing decision sits on top of one thing: a data model that knows what a person and a company are. Get the objects wrong and every downstream system inherits the mess.
At Cursor the model is unusually leaky, because the strongest buying signal isn't a form fill. It's a developer who signed up, opened the editor and ran the agent forty times this week. A GTM Engineer who treats product usage as a second-class input next to marketing leads has already lost the plot for a developer-led, PLG-to-enterprise motion.
Start the interview answer by naming the objects and how they relate, not by jumping to a tool.
- Lead
- An unqualified person, often a form fill or a list import, that hasn't been matched to a known account yet. A holding pen, not a permanent home.
- Contact
- A person resolved to a known account. The identity you actually act on - email, role, seniority, the signals you scored.
- Account
- The company. The grain most GTM logic runs at: domain, firmographics, technographics, aggregate product usage across all its users.
- Opportunity
- An active deal tied to an account. Where revenue lives and the won/lost outcome you feed back into scoring.
The hard part is identity resolution: stitching a lead that arrived as a personal Gmail to the account it actually belongs to and recognizing that the same human shows up as a product sign-up, a webinar registrant and a partner referral.
Source of truth: CRM, warehouse or bothname the boundary
A common interview trap is declaring "the CRM is the source of truth" and stopping. The honest answer splits responsibility by what each system is good at.
- System
- Warehouse (Snowflake/BigQuery)
- Source of truth for
- Product usage, computed scores, modeled accounts
- Why
- Joins billions of events; cheap to recompute; where modeling and SQL live
- System
- CRM (Salesforce/HubSpot)
- Source of truth for
- Deals, owner, activity, pipeline stage
- Why
- Where reps work; system of action and record for revenue
- System
- Orchestration (Clay)
- Source of truth for
- In-flight enrichment, transient working state
- Why
- Stages a record mid-pipeline; not a system of record
| System | Source of truth for | Why |
|---|---|---|
| Warehouse (Snowflake/BigQuery) | Product usage, computed scores, modeled accounts | Joins billions of events; cheap to recompute; where modeling and SQL live |
| CRM (Salesforce/HubSpot) | Deals, owner, activity, pipeline stage | Where reps work; system of action and record for revenue |
| Orchestration (Clay) | In-flight enrichment, transient working state | Stages a record mid-pipeline; not a system of record |
Pick one writer per field. Two systems both claiming to own a contact's title is how you get silent overwrites.
The durable rule isn't "one source of truth for everything," it's one writer per field. The warehouse owns the ICP score, the CRM owns the deal stage and a sync that respects those boundaries keeps both honest. When you say this in a panel, you sound like someone who has cleaned up a bidirectional-sync disaster, because the rule exists precisely to prevent one.
Dedup and merge
Dedup is where good schemas get tested. You need matching keys, a fuzzy fallback and a deterministic conflict-resolution rule so two runs never disagree.
- 1Exact keys first. Normalize and match on email and company domain. Lowercase, strip plus-addressing, map
gmail.com/googlemail.com. Most matches resolve here, cheaply and unambiguously. - 2Fuzzy fallback. When exact fails, match on normalized company name plus enriched domain or person name plus account. Set a similarity threshold and route anything below it to manual review instead of guessing.
- 3Deterministic conflict resolution. When two records disagree on a field, pick the winner by an explicit rule: most recent verified value or highest-trust source. Never "last write wins" by accident.
- 4Merge, don't delete. Collapse duplicates into a survivor record but keep the merge history, so a wrong merge is reversible and an audit can see what happened.
A schema that survives new segments
The role explicitly asks for systems that extend as new geos, segments and program types are added. A schema hard-codes that future or fights it.
- Model program membership as a row in a join table (
account_program), not a boolean column per program - so adding a partnerships program is data, not a migration. - Keep firmographics, technographics and usage as separate field groups with their own freshness timestamps, since they decay at different rates.
- Store the reason a field has its value (which provider, which run) so you can debug coverage later.
- Give every object a stable internal id that survives CRM record churn, so usage events captured before a lead is created can attach retroactively.
When the craft screen asks you to "design the data model for our startup program," resist drawing tables first. Open with the grain - "most logic runs at the account level, but the buying signal is per-user product usage, so I need both and a clean way to roll usage up." Then name source-of-truth boundaries. That framing tells them you've operated a real GTM stack, not just configured one.
Takeaway. Model lead/contact/account/opportunity at the right grain, assign one writer per field across warehouse and CRM and treat product usage as a first-class input - not a marketing afterthought.
Self-check
QYou're told "Salesforce is our single source of truth for everything." Why is that a problem for a PLG company like Cursor and what's the better framing?
Waterfall enrichment
After this you can explain and design multi-provider enrichment that maximizes coverage
No single data provider knows everything. Waterfall enrichment is the answer: try providers in sequence until a field is filled and you routinely double or triple the match rate of any one vendor.
This is the single most likely thing the practical round asks you to build. A Clay-style table where a domain comes in and a rich, scored profile comes out is the canonical GTM Engineer exercise and the waterfall is its engine.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Most records stop early; the cache and the confidence check are where cost is won or lost.
What a waterfall actually does
For each field you want, you call providers in a chosen order and stop the moment the field is populated. The next record might fill the same field on the first try and skip the rest entirely.
- 1Try provider 1. Cheapest or highest-hit-rate vendor for this field. If it returns a confident value, mark the field filled and stop.
- 2Fall through on miss. Empty or low-confidence result, move to provider 2. Repeat down the chain.
- 3Stop early. The instant a field is filled, skip every remaining provider for that field - that's where the cost savings come from.
- 4Record provenance. Store which provider filled each field and when, so freshness and conflict resolution have something to reason about.
The right ordering isn't cheapest-first or best-first alone. Rank providers by expected cost to fill the field, which blends price with hit-rate: a $0.10 provider that fills 70% of records beats a $0.02 one that fills 10% once you count the fall-through calls the cheap-but-weak vendor forces downstream. Saying this out loud is the difference between "I've used Clay" and "I've tuned a waterfall against a real bill."
Cost vs. coverage
Every provider call costs money and latency. The whole design is a dial between filling more fields and spending less.
- Lever
- Chain depth
- Push toward coverage
- More providers per field
- Push toward cost
- Stop after 2-3; accept some blanks
- Lever
- Confidence bar
- Push toward coverage
- Accept lower-confidence values
- Push toward cost
- Only accept verified values
- Lever
- Field set
- Push toward coverage
- Enrich 30+ data points
- Push toward cost
- Enrich the handful scoring actually uses
- Lever
- Trigger
- Push toward coverage
- Enrich every record
- Push toward cost
- Enrich only records that pass a cheap pre-filter
| Lever | Push toward coverage | Push toward cost |
|---|---|---|
| Chain depth | More providers per field | Stop after 2-3; accept some blanks |
| Confidence bar | Accept lower-confidence values | Only accept verified values |
| Field set | Enrich 30+ data points | Enrich the handful scoring actually uses |
| Trigger | Enrich every record | Enrich only records that pass a cheap pre-filter |
Interviewers love "enrich only what scoring needs." Spending to fill a field no decision reads is pure waste.
Caching and freshness
Re-enriching a record you already have is the most common way GTM bills balloon. Cache aggressively, but give cached values a shelf life.
- Key the cache by normalized domain or email plus field name, so a hit skips the entire chain for that field.
- Attach a TTL per field group: a company's headcount can be weeks stale, a person's current employer should expire sooner.
- On a stale read, re-enrich in the background and serve the old value now - don't block the pipeline waiting for freshness.
- Track a per-provider hit-rate over time; a vendor whose coverage quietly drops should fall in the order.
Failure handling
Providers rate-limit, time out and return partial matches. A waterfall has to degrade rather than break, because a stalled pipeline is worse than a half-filled record.
Treat as a miss for now and fall through to the next provider.
Queue a retry with backoff; don't fail the whole record.
Keep the fields that came back, mark the rest still-open.
A later provider or run can fill the gaps.
Prefer the higher-trust provider or the more recent verified value.
Keep both with provenance so you can audit the choice.
Mark the field unenrichable and move on.
Don't retry forever - log it and let scoring proceed on what you have.
Don't describe the waterfall as a strict ladder that always runs top to bottom. The point of stopping early and caching is that most records never touch the bottom of the chain. If your design re-runs every provider on every record, you've built an expensive single-provider pipeline with extra steps.
Takeaway. Chain providers by cost ÷ hit-rate, stop the instant a field fills, cache with per-field TTLs and degrade on failure - partial enrichment beats a stalled pipeline.
Self-check
ICP & lead scoring
After this you can build a scoring model that drives real routing decisions
A score that nobody acts on is a vanity number. Scoring earns its place only when a threshold sends a lead somewhere different - to a rep, to nurture or to the bin.
For Cursor the ICP can't be the usual firmographic checklist, because the best lead might be a two-person startup whose engineers are running the agent every day. Define the ideal customer profile across three input families, then weight them for a developer-led motion.
- Signal family
- Firmographic
- Examples
- Headcount, funding stage, industry, geo
- Why it matters here
- Sizes the account and fits it to a program (startup vs. enterprise)
- Signal family
- Technographic
- Examples
- Stack, repo hosts, languages, dev-tool spend
- Why it matters here
- A modern eng org is a far better fit than headcount alone implies
- Signal family
- Product usage
- Examples
- Active developers, agent runs, seats near a plan limit
- Why it matters here
- The truest intent signal for a PLG product - behavior over claims
| Signal family | Examples | Why it matters here |
|---|---|---|
| Firmographic | Headcount, funding stage, industry, geo | Sizes the account and fits it to a program (startup vs. enterprise) |
| Technographic | Stack, repo hosts, languages, dev-tool spend | A modern eng org is a far better fit than headcount alone implies |
| Product usage | Active developers, agent runs, seats near a plan limit | The truest intent signal for a PLG product - behavior over claims |
Weight usage heavily. A free workspace with 30 daily-active engineers outranks a 5,000-person firm with one dormant seat.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
For a developer-led PLG product, behavior outranks size - the ordering itself is the interview answer.
Point-based vs. model-based
Both have a place and the interview reward goes to the one whose tradeoff you can articulate rather than the one you happen to prefer.
+20 for Series A-C, +15 for 10+ active devs, -30 for student email.
Transparent: a rep can see exactly why a lead scored 80.
Start here. Stakeholders trust what they can read.
Fit a model on historical won/lost to weight features for you.
Higher ceiling once you have enough labeled outcomes.
Earn it later; an opaque score erodes trust if it's wrong early.
On a small, flat team, a rep who doesn't trust the score will ignore it and work their own list - and now you've built a system nobody uses. A point-based model where every contributing signal is visible buys adoption. You can graduate to a learned model once outcomes are labeled and people already believe the scores.
Thresholds that trigger action
The score is continuous; the decisions are discrete. Bands turn a number into a routing rule.
- 75+
- Route to a rep now, with an SLA. High firmographic fit and live usage.
- 40-74
- Nurture sequence; re-score on new usage. A spike in agent runs can promote them.
- Below 40
- Self-serve and product-led only. No human touch until behavior changes.
- Disqualified
- Routed nowhere regardless of score - see negative signals below.
Negative signals and disqualification
Disqualification isn't a low score - it's a hard gate that overrides the number. Conflating the two is a common design bug.
- Competitor domains: don't route a rival's eng team to a rep and don't waste enrichment budget on them.
- Students and
.edufree-only intent: real users, wrong motion - keep them in product-led, out of sales. - Personal-email tire-kickers with zero usage and no resolvable account.
- Explicit opt-outs and suppression lists, which must win against any positive score.
Closing the loop
A scoring model that never sees what happened next slowly drifts from reality. Feed outcomes back so the thresholds stay honest.
- 1Capture outcomes. Join won/lost, meeting-booked and post-sale expansion back to the score each lead had at routing time.
- 2Measure the bands. If the 40-74 nurture band converts as well as the 75+ band, your threshold is mis-set, not your reps.
- 3Re-weight. Adjust point values (or retrain) on what actually predicted revenue and version the change so you can compare before and after.
- 4Watch for drift. A signal that predicted fit last quarter can decay; re-check periodically rather than setting it and forgetting it.
If asked to "design a lead score," don't list features and stop. Name the three signal families, weight product usage heavily for a PLG product, separate disqualification from low scores and finish with the feedback loop that keeps thresholds calibrated. The loop is what separates a scoring system from a one-time scoring spreadsheet.
Takeaway. Score on firmographic + technographic + product usage, keep it transparent so reps trust it, gate disqualification separately from low scores and feed won/lost back to recalibrate the bands.
Self-check
QA 4,000-person enterprise scores 80 on firmographics but has one dormant seat. A 6-person startup scores 45 on firmographics but has 25 developers running the agent daily. For Cursor's PLG motion, how should your model treat them?
Routing, ownership & SLAs
After this you can design lead routing that's fair, fast and auditable
Routing is where a scored lead becomes someone's job. Done well it's invisible. Done badly it drops leads, double-assigns or quietly sends every good account to the same rep.
This is core plumbing the role calls out by name - lead capture and routing logic, permissions, reliability. Treat it as a small distributed-systems problem, not a CRM workflow toggle.
Routing strategies
There's no single right strategy; you compose them. Most real systems layer ownership rules first and use round-robin only to break ties.
- Strategy
- Round-robin
- Assigns by
- Next rep in rotation
- Watch for
- Ignores fit and load; a rep on PTO still gets leads
- Strategy
- Territory / segment
- Assigns by
- Geo, segment or named-account ownership
- Watch for
- Stale ownership maps; unowned segments fall through
- Strategy
- Capacity-aware
- Assigns by
- Rep's current open load and SLAs
- Watch for
- Needs live load data; degrades if that feed breaks
- Strategy
- Account-based
- Assigns by
- Existing owner of the account
- Watch for
- A new lead at a known account should go to that account's rep, not a fresh rotation
| Strategy | Assigns by | Watch for |
|---|---|---|
| Round-robin | Next rep in rotation | Ignores fit and load; a rep on PTO still gets leads |
| Territory / segment | Geo, segment or named-account ownership | Stale ownership maps; unowned segments fall through |
| Capacity-aware | Rep's current open load and SLAs | Needs live load data; degrades if that feed breaks |
| Account-based | Existing owner of the account | A new lead at a known account should go to that account's rep, not a fresh rotation |
Layered: check account ownership, then territory, then round-robin within the eligible pool, then capacity to break ties.
SLAs and escalation
Assignment without a clock is a wish. An SLA defines what "actioned" means and what happens when it isn't met.
- 1Define the SLA. A 75+ lead gets a first touch within, say, 15 minutes during business hours. The number is the team's; the mechanism is yours.
- 2Track the clock. Stamp assigned-at and first-touch-at, so the SLA is measurable and not a feeling.
- 3Escalate on breach. No touch in time, reassign to a backup or notify a manager. The lead never just sits.
- 4Surface it. A breach should page or post to a channel before a stakeholder notices the lead went cold.
Permissions and data access
Across startup, ecosystem and partnership programs, not everyone should see or act on every lead. Permissions are part of the routing design, not an afterthought bolted on later.
- Scope visibility by program and segment, so a partnerships lead isn't visible to the whole sales floor.
- Separate who can see a record from who can act on it; read access is cheaper to grant than write.
- Keep partner-sourced data walled appropriately when a data-sharing agreement requires it.
- Make permission grants data-driven (role + program membership), not hand-edited per user, so they scale with the team.
Fallbacks and dead-letter handling
Some leads won't route cleanly: no matching territory, ambiguous segment, a tie no rule breaks. Borrow the dead-letter queue from messaging systems - an unroutable lead goes somewhere visible, never nowhere.
No territory matches the account.
Route to a default queue a human triages and flag the gap in the ownership map.
Lead could belong to two accounts.
Hold for review rather than guess; a wrong owner is worse than a short delay.
Auditability
When a rep asks "why did I get this lead?" you need an answer in seconds. Log every decision the router makes.
{
"lead_id": "ld_8f2a",
"account_id": "ac_311",
"score": 82,
"band": "route_now",
"strategy": "account_owner -> territory -> round_robin",
"matched_rule": "account_owner",
"assigned_to": "rep_kim",
"sla_minutes": 15,
"decided_at": "2026-06-15T14:03:22Z",
"trace_id": "rt_5d9c"
}"It's in the CRM somewhere" is not auditability. If you can't reconstruct exactly which rule fired and why a specific lead landed where it did, reps stop trusting routing and route themselves - and the system you built becomes shelfware. A structured decision log per lead is the cheap insurance.
Takeaway. Layer routing (account owner, then territory, then round-robin, then capacity), enforce SLAs with escalation, gate access by program and log every decision so routing is debuggable and trusted.
Self-check
QA new high-scoring lead arrives at a company that's already an open opportunity owned by Rep A. Pure round-robin would assign it to Rep B, next in rotation. What's the right design and why?
Reliability & operating in production
After this you can treat GTM plumbing like real software
The thing that separates a GTM Engineer from a marketing-ops admin is that you operate your pipelines like production software. Idempotency, retries, monitoring - the boring discipline that means a re-run doesn't email a prospect twice.
Cursor bars AI assistance in the craft screen specifically to see whether you reason about this yourself. Expect to defend why your design won't double-create records when a webhook fires twice, without hand-waving "the tool handles it."
Idempotency and retries
Networks retry, webhooks duplicate and a job that crashed mid-run will run again. The only safe assumption is at-least-once delivery, so every action has to be safe to repeat.
- 1Derive an idempotency key. Hash the stable inputs (lead id + action type + day), so the same logical action produces the same key.
- 2Check before you act. Has this key already succeeded? If yes, return the prior result instead of acting again.
- 3Upsert, don't insert. Write keyed on the natural identity so a re-run updates rather than duplicates.
- 4Make external sends idempotent too. Pass an idempotency token to the email/Slack API so a retry after a timeout doesn't double-message a prospect.
The scenario interviewers reach for: your enrichment job times out after the provider charged you and after the outreach fired, then the orchestrator retries. Without an idempotency key the prospect gets two emails and you get billed twice. Naming this failure unprompted, then showing the key that prevents it, is a strong signal you've run production GTM rather than configured a demo.
Rate limits, backoff and queueing
Third-party APIs throttle you and a burst of leads will hit those limits. Smooth the load instead of hammering through it.
- Queue work and drain it at each provider's allowed rate rather than firing the whole batch at once.
- On a 429, back off exponentially with jitter so a thundering herd of retries doesn't sync up and re-spike.
- Respect
Retry-Afterheaders when a provider tells you exactly when to come back. - Set a sane max-retry ceiling, then dead-letter - infinite retries on a permanently failing call just burn budget.
Monitoring, alerting, runbooks
A silent GTM pipeline is a broken one nobody noticed yet. You want to catch a stall before a rep complains that the leads dried up.
- Watch
- Throughput
- Healthy
- Leads/hour in a normal band
- Alert when
- Volume drops to ~0 unexpectedly
- Watch
- Match rate
- Healthy
- Enrichment hit-rate steady
- Alert when
- Coverage falls sharply (provider down?)
- Watch
- SLA breaches
- Healthy
- Near zero
- Alert when
- Breaches spike - routing or capacity broke
- Watch
- Error / DLQ rate
- Healthy
- Low and flat
- Alert when
- Dead-letter queue grows quickly
| Watch | Healthy | Alert when |
|---|---|---|
| Throughput | Leads/hour in a normal band | Volume drops to ~0 unexpectedly |
| Match rate | Enrichment hit-rate steady | Coverage falls sharply (provider down?) |
| SLA breaches | Near zero | Breaches spike - routing or capacity broke |
| Error / DLQ rate | Low and flat | Dead-letter queue grows quickly |
Pair each alert with a runbook: what it means, first thing to check, how to safely re-run.
Graceful degradation
When a provider is down, the pipeline should keep moving on what it has rather than freeze. Partial enrichment that scores and routes beats a stalled queue that delivers nothing.
If the technographic provider is down, score on firmographics and usage now, mark the missing fields open and backfill when the provider recovers. A lead routed in 15 minutes on 80% of its profile is worth more than a perfect profile that arrives after the buyer went cold.
Versioning and safe rollout
Changing live scoring or routing logic is changing a system reps depend on right now. Ship it like a code deploy, because it is one.
Tag each scoring/routing change with a version on every decision log, so you can compare cohorts before and after.
Run the new logic alongside the old without acting on it; compare what would have changed before you flip it.
Keep the previous version one toggle away. A bad routing change should revert in minutes, not a rebuild.
"I treat the pipeline like a service: every action is idempotent so retries are safe, every external call is queued and backed off against rate limits and every scoring change ships shadowed with a version stamp so I can compare cohorts and roll back in minutes if routing regresses."
Takeaway. Assume at-least-once delivery: make every action idempotent, queue and back off against rate limits, monitor throughput and DLQ with runbooks, degrade gracefully and ship logic changes shadowed and versioned.
Self-check
QYour orchestrator delivers events at-least-once, so a webhook can fire twice. What's the single most important pattern to keep a duplicate from double-creating a record or double-sending an email and how does it work?
Worked example: pricing-page intent flow
After this you can assemble the pieces into one end-to-end system you can whiteboard
Now wire the parts together. A target company hits the pricing page; minutes later the right rep has a scored, enriched, personalized reason to reach out. This is the system you should be able to draw end-to-end on a whiteboard.
Treat this as the spine of a practical-round answer. Every concept from the earlier sections shows up exactly once, in order and you can name the tool at each step without making the tools the story.
The flow, step by step
- 1Trigger + capture. A pricing-page visit fires an event (reverse-IP or a known cookie). Resolve the visitor's domain to an account or create one. This is identity resolution from Section 1, at the front door.
- 2Enrich the domain. Run the waterfall against the account: firmographics, technographics and pull aggregate product usage from the warehouse. Cache hits skip the chain; misses fall through.
- 3Find the right contacts. Identify people at the account by role - eng leadership, platform owners - and resolve them to contacts. A pricing-page hit from a 40-person eng org matters more than the visitor's individual title.
- 4Score against ICP. Combine firmographic fit, technographic fit and live usage into a score and apply disqualification gates (competitor, student, suppressed).
- 5Route the top contact. Send the highest-scoring eligible contact through the layered router (account owner first), attach the SLA and log the decision.
- 6Trigger a personalized action. Generate outreach grounded in real context - what they use, why now - and send it idempotently so a retry never double-messages.
- 7Instrument every step. Emit a structured event at trigger, enrich, score, route and send, all tied by one
trace_id.
The personalization step is where AI earns its keep: an LLM drafts a relevant first line from the enriched profile and usage and an agent can take the action through an MCPModel Context Protocol. A standard that lets an AI agent pull in context from outside the repo, like Jira tickets or internal docs. server or API rather than queueing a human task. The discipline is to keep the decision (score, route) auditable and rules-driven and use AI for the generation and action - impact where it helps, determinism where you need to trust the system.
The architecture as components
- Capture
- Web event + reverse-IP / identity resolution to an account
- Orchestration
- Clay-style table or a queue runs the waterfall and the steps in order
- Enrichment
- Multi-provider waterfall with cache + per-field TTLs
- Warehouse
- Product usage + the computed ICP score (source of truth for both)
- CRM
- Owner, routing outcome, activity (system of action for reps)
- Action
- LLM personalization + agent/MCPModel Context Protocol. A standard that lets an AI agent pull in context from outside the repo, like Jira tickets or internal docs. send, idempotent and rate-limited
- Observability
- Structured events per step, joined on trace_id, with alerts + runbooks
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Each layer rests on the one below; the warehouse and CRM own different fields and never fight over them.
Two inflection points turn an internal tool from a localhost script into a cross-functional asset. The first is hosting: a usage dashboard or a Salesforce-embedded usage calculator stays a personal hack until an AE counterpart asks "can you send me a link?" - the fix is putting it on something like Vercel so anyone reaches it from a web page, with version control over how it's accessed. The second is live data: trade imported CSV snapshots for a proxy access layer or webhooks into the warehouse, so the tool shows account-360 visibility in real time. These connectivity and hosting needs sit outside Cursor-the-IDE - they're the systems-design step, and they're often the bridge from a no-code Airtable prototype to real code.
"the biggest inflection point was hosting these solutions on something like a versel... and then the kind of data connectivity as well. Make sure that's done by web hooks or proxy query connections to backend live data."
The success metric
A system you can't measure is a system you can't defend in the data round. Pick one primary metric the flow is accountable for and name the guardrails that stop you from gaming it.
- Metric
- Qualified-meeting rate
- What it tells you
- Did routed leads turn into real conversations?
- Type
- Primary - the outcome the flow exists for
- Metric
- Time-to-first-touch
- What it tells you
- Is the SLA actually being met?
- Type
- Operational - speed of the plumbing
- Metric
- Enrichment match rate
- What it tells you
- Is the waterfall covering enough fields?
- Type
- Health - input quality
- Metric
- False-positive routes
- What it tells you
- Are reps getting junk?
- Type
- Guardrail - protects rep trust
| Metric | What it tells you | Type |
|---|---|---|
| Qualified-meeting rate | Did routed leads turn into real conversations? | Primary - the outcome the flow exists for |
| Time-to-first-touch | Is the SLA actually being met? | Operational - speed of the plumbing |
| Enrichment match rate | Is the waterfall covering enough fields? | Health - input quality |
| False-positive routes | Are reps getting junk? | Guardrail - protects rep trust |
Lead with qualified-meeting rate; the rest exist so you can explain a move in the primary number.
Generalize it into a primitive
The role wants durable infrastructure, not a one-off. The pricing-page flow is really a generic primitive - trigger → resolve → enrich → score → route → act → measure - and swapping the trigger and the action reuses everything in between.
Trigger: applies / hits a usage milestone.
Action: program invite + onboarding.
Same enrich → score → route spine.
Trigger: extension install or repo signal.
Action: community / docs nudge.
Reuse the scoring and routing core.
Trigger: partner-sourced lead.
Action: co-sell routing with walled data.
Same primitive, permissions tuned.
Close a whiteboard answer by collapsing your specific flow into the generic primitive and showing two other programs it serves by swapping only the trigger and action. That single move answers the unspoken question behind the whole loop - can this person build infrastructure that outlives one campaign - which is exactly what "GTM Engineer, not marketing ops" means.
Takeaway. The pricing-page flow is one reusable primitive - trigger → resolve → enrich → score → route → act → measure - with auditable decisions, AI for generation/action, qualified-meeting rate as the metric and only the trigger and action swapped per program.