{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#owner-of-record-routing","id":"owner-of-record-routing","termCode":"PAT-01","name":"Owner-of-Record Routing","alsoKnownAs":["Ownership-first routing","Account-owner inheritance"],"context":"A new lead, form fill or identified visit arrives from a company that may already have an owner in the CRM: an account owner, an open-opportunity owner or a territory rep.","problem":"Rotation that ignores existing ownership hands a known account to a stranger, and owner-only routing makes the lead wait on one person's calendar. Either way the first touch is slower or less informed than it needs to be.","forces":["Context on the first call is worth more as deal size grows.","Speed is worth more than context when leads are interchangeable.","Owners take holidays, sit in long meetings and cherry-pick.","Duplicate and unmatched account records hide the real owner."],"solution":"On lead creation, match the lead to an account by domain and look up the owner of record before any rotation runs. If an owner exists and is available, assign to them and send the alert with the account context attached. If no owner exists or the owner is unavailable, fall through to an availability-gated rotation that skips managers and offline reps, and log which path each lead took.","antiPattern":"Pure round-robin for every lead, or owner-only assignment with no fallback. The first sends an expansion lead from your biggest account to a rep who has never heard of it; the second leaves the best lead of the week waiting until someone gets back from holiday.","exampleStack":["HubSpot workflow branches on company owner before the rotate-record-to-owner action","Salesforce lead assignment rules ordered so the account-match rule sits above the round-robin rule","Domain-based lead-to-account matching runs before assignment so a duplicate record cannot hide the owner","Slack alert to the assigned owner carries the account history and any open opportunity"],"closesLeak":["slow-lead-response","leaky-mql-to-sql-handoff"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation","https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back","https://artemisgtm.ai/resources/gtm-systems-patterns/#enrichment-waterfall-with-fallback"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#lead-routing","https://artemisgtm.ai/resources/glossary/#speed-to-lead","https://artemisgtm.ai/resources/glossary/#crm"],"sourcePages":["https://artemisgtm.ai/resources/round-robin-vs-ownership-routing/","https://artemisgtm.ai/resources/speed-to-lead/","https://artemisgtm.ai/resources/slack-sms-lead-alerts/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation","id":"sla-timer-with-escalation","termCode":"PAT-02","name":"SLA Timer with Escalation","alsoKnownAs":["Time-boxed reassignment","Response clock"],"context":"A lead has been assigned and alerted, and the team has committed to a response target, such as under 5 minutes for a demo request.","problem":"An assignment with no clock is a preference, not an SLA. Leads sit with an owner who is busy, and nobody finds out until the weekly report.","forces":["Reassigning too fast takes leads off reps who were about to call.","Reassigning too slowly lets the response window close.","Managers need to see misses without becoming the first responder.","A timer that resets on reassignment makes the SLA report lie."],"solution":"Start a timer the moment the lead is assigned and check, when it expires, whether a first activity has been logged. Unclaimed at the first deadline, reassign to the next available rep and repost the alert with the original timestamp; unclaimed at the second, page a manager. Tier the clock by intent so a demo or enterprise request runs on a shorter timer than a content download, and stop it only on a logged touch, never on a click or a view.","antiPattern":"A blanket rule such as \"sales follows up within one business day\" with nothing enforcing it, or an escalation that restarts the clock. The first is a polite agreement that fails quietly; the second makes every reassigned lead look fast in the report while the buyer waited.","exampleStack":["HubSpot workflow enrolls on first activity date is unknown, with a delay step and a reassign branch","Salesforce scheduled Flow reassigns and notifies when no task or call has been logged","Slack thread update on the original alert, so the repost keeps its first timestamp","SMS page to the manager only at the second deadline"],"closesLeak":["slow-lead-response","leaky-mql-to-sql-handoff"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#owner-of-record-routing","https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back","https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window","https://artemisgtm.ai/resources/gtm-systems-patterns/#shared-handoff-definition"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#speed-to-lead","https://artemisgtm.ai/resources/glossary/#lead-routing","https://artemisgtm.ai/resources/glossary/#sdr"],"sourcePages":["https://artemisgtm.ai/resources/slack-sms-lead-alerts/","https://artemisgtm.ai/resources/round-robin-vs-ownership-routing/","https://artemisgtm.ai/resources/mql-to-sql-handoff/","https://artemisgtm.ai/resources/after-hours-lead-response/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#enrichment-waterfall-with-fallback","id":"enrichment-waterfall-with-fallback","termCode":"PAT-03","name":"Enrichment Waterfall with Fallback","alsoKnownAs":["Waterfall enrichment","Cascading enrichment"],"context":"Routing, scoring and suppression depend on fields such as company domain, size, industry, title and email validity, and no single data provider fills them for every record.","problem":"Single-provider enrichment leaves gaps, and empty fields fail silently downstream: the lead routes to the wrong queue, scores as a poor fit or slips past a suppression check.","forces":["Every extra provider adds cost and latency to the write.","Providers disagree, so something has to decide which value wins.","Routing needs a few fields now; reporting can wait for the rest.","Overwriting a value a rep entered with vendor data destroys trust in the record."],"solution":"Rank the fields that routing and scoring depend on, then chain providers in a fixed order per field: when the first cannot fill a field, the request falls through to the next. Stamp the source and date on every filled value, never overwrite a value a human entered, and stop the cascade as soon as the field is filled. When every provider misses, write an explicit unknown and route on a safe default rather than holding the lead.","antiPattern":"Buying one more data vendor and running it against every field on every record. Coverage rises a little, cost rises a lot, conflicting values overwrite each other, and nobody can say which provider set the field a rep is looking at.","exampleStack":["Clay table runs providers in priority order per field and stops on the first valid value","CRM properties carry an enrichment source and an enriched date next to each enriched field","Email validity check runs ahead of any sequence enrollment","An unknown company size routes to a default queue instead of blocking assignment"],"closesLeak":["weak-icp-targeting","leaky-mql-to-sql-handoff"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#owner-of-record-routing","https://artemisgtm.ai/resources/gtm-systems-patterns/#suppression-ring","https://artemisgtm.ai/resources/gtm-systems-patterns/#signal-stacking"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#crm","https://artemisgtm.ai/resources/glossary/#icp","https://artemisgtm.ai/resources/glossary/#revops"],"sourcePages":["https://artemisgtm.ai/resources/crm-data-quality/","https://artemisgtm.ai/resources/mql-to-sql-handoff/","https://artemisgtm.ai/resources/pain-first-icp-scoring/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#suppression-ring","id":"suppression-ring","termCode":"PAT-04","name":"Suppression Ring","alsoKnownAs":["Suppression list","Exclusion sync"],"context":"An automated trigger, such as an identified visit, a score change or a signal match, is about to enroll someone in outreach or alert a rep.","problem":"Without suppression, automation emails your own customers, interrupts open deals, alerts reps about competitors and re-enrolls people who asked to be left alone.","forces":["A suppression list goes stale the day it is exported.","Some exclusions belong at the account, others at the person.","Closed-lost accounts need a cooling window, not a permanent block.","Every tool in the chain keeps its own exclusion list."],"solution":"Draw rings around the trigger and check every one before anything fires: customers and open opportunities at the account domain; competitors, partners, investors and your own staff; closed-lost accounts inside a cooling window; unsubscribes and do-not-contact flags at the person; and anyone already in an active sequence. Sync the rings from the CRM lifecycle stage on a schedule rather than from a spreadsheet, and propagate do-not-contact in both directions. A suppressed trigger becomes a logged hold, never a silent drop.","antiPattern":"A CSV of customer domains uploaded once to the sequencing tool. It is out of date within weeks, it misses everyone who unsubscribed in the CRM, and the first customer who gets a cold email finds the gap for you.","exampleStack":["CRM lifecycle stage drives the sequencing tool exclusion list on a scheduled sync","HubSpot workflow suppression segment unenrolls a contact the moment they join it","A do-not-contact flag change removes the contact from every active sequence","Visitor alert segments exclude customer and open-opportunity accounts before Slack fires"],"closesLeak":["anonymous-website-traffic","low-outbound-reply-rates"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#consent-gated-identification","https://artemisgtm.ai/resources/gtm-systems-patterns/#signal-stacking","https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#visitor-deanonymization","https://artemisgtm.ai/resources/glossary/#signal-based-selling","https://artemisgtm.ai/resources/glossary/#crm"],"sourcePages":["https://artemisgtm.ai/resources/deanonymized-visitor-outreach-automation/","https://artemisgtm.ai/resources/slack-sms-lead-alerts/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#score-decay","id":"score-decay","termCode":"PAT-05","name":"Score Decay","alsoKnownAs":["Intent decay","Lead score aging"],"context":"A lead score adds intent points for activity: page views, downloads, replies and hand-raises.","problem":"A score that only goes up leaves stale leads in the Hot band months after the buyer moved on, and reps learn to ignore the band.","forces":["Old intent is worth less than new intent, but not nothing.","Firmographic fit does not expire.","A lead in an open deal or an active sequence should not lose rank mid-conversation.","Long-cycle buyers go quiet for legitimate reasons."],"solution":"Decay intent points on a schedule, multiplying by a factor below one for each period of inactivity, and zero them after a long dormancy. Never decay fit. Pause decay when the lead converts to an opportunity or enters an active sequence, and slow it for long-cycle segments instead of switching it off. Treat re-engagement as a fresh high-intent event and branch on the size of the jump, not only the new total.","antiPattern":"Subtracting a fixed number of points per week from the whole score, fit included. It drags good-fit accounts below the fit floor, keeps stale intent alive too long, and drops live deals out of the band because the buyer stopped reading the blog.","exampleStack":["HubSpot scheduled workflow re-checks last activity date and reapplies the decay factor","Salesforce scheduled Flow with a decay-pause branch for leads attached to an open opportunity","Separate fit and intent score properties, so decay only ever touches intent","A last high-intent action field set on re-engagement, so routing can promote the lead"],"closesLeak":["leaky-mql-to-sql-handoff","thin-nurture"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#capacity-bound-threshold-bands","https://artemisgtm.ai/resources/gtm-systems-patterns/#signal-stacking","https://artemisgtm.ai/resources/gtm-systems-patterns/#shared-handoff-definition"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#mql","https://artemisgtm.ai/resources/glossary/#lead-nurturing","https://artemisgtm.ai/resources/glossary/#conversion-rate"],"sourcePages":["https://artemisgtm.ai/resources/lead-score-decay-explained/","https://artemisgtm.ai/resources/lead-score-thresholds/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#capacity-bound-threshold-bands","id":"capacity-bound-threshold-bands","termCode":"PAT-06","name":"Capacity-Bound Threshold Bands","alsoKnownAs":["Score bands with exit points","Hysteresis bands"],"context":"A lead score has to become an action: who owns the lead, what happens next and how fast.","problem":"Template cutoffs ignore both conversion and capacity. A Hot band larger than reps can work inside the response target turns a minutes SLA into a same-week one, and leads near a cutoff flip owners every time the score moves.","forces":["Raising a cutoff cuts false positives and adds false negatives.","Rep hours for inbound are fixed in the short run; lead volume is not.","Engaged non-buyers can rack up intent points.","Sales will not work a band it does not trust."],"solution":"Place each cutoff where the meeting rate steps up in your own history, using the score each lead had at routing time. Multiply the expected Hot volume by the time a first touch takes and compare it with the rep hours available; if it does not fit, raise the cutoff or move the overflow to a slower band. Add a fit floor every Hot lead must clear with a hand-raise override above it, give every band an exit point below its entry point, and store the band as its own field so workflows fire only on a band change.","antiPattern":"Copying cutoffs from a template and routing on the raw score. Nobody checks whether leads above the line convert better than leads below it, the Hot queue overflows, and a single unsubscribe bounces a lead between owners.","exampleStack":["CRM fields for total score, band and score at routing time","Band workflow uses separate entry and exit cutoffs and triggers on a band change only","Quarterly export buckets past leads by score at routing time against meeting and opportunity outcomes","A threshold changelog with the date, old and new cutoffs and the reason, agreed with sales"],"closesLeak":["leaky-mql-to-sql-handoff","slow-lead-response"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#score-decay","https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation","https://artemisgtm.ai/resources/gtm-systems-patterns/#shared-handoff-definition"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#mql","https://artemisgtm.ai/resources/glossary/#sql","https://artemisgtm.ai/resources/glossary/#conversion-rate","https://artemisgtm.ai/resources/glossary/#sdr"],"sourcePages":["https://artemisgtm.ai/resources/lead-score-thresholds/","https://artemisgtm.ai/resources/bdr-queue-routing-from-lead-scores/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#signal-stacking","id":"signal-stacking","termCode":"PAT-07","name":"Signal Stacking","alsoKnownAs":["Composite signal trigger","Multi-signal trigger"],"context":"Outbound and alerting run on signals: a website visit, a job change, a funding round, a hiring post, a public statement of pain.","problem":"A single signal is a weak and noisy reason to reach out, so single-signal triggers fire constantly, reps stop trusting them and the messages they produce are generic.","forces":["Waiting for more signals delays the touch.","Signals from different sources arrive at different times and go stale at different rates.","Some signals describe the account and others the person.","The message has to name the reason for the touch without being creepy."],"solution":"Collect signals onto one record per account and weight each one by how directly it matches the pain you solve and how recent it is. Trigger outreach only when enough independent signals stack inside a recency window, and keep each signal's source and date on the record so the message can reference the strongest one by topic. Let a fresh hand-raise override the stack, and let stale signals expire out of it.","antiPattern":"One sequence per signal source, each firing on its own. The same buyer gets three unrelated first touches in a week, none of them specific, and the reply rate ends up measuring noise.","exampleStack":["A signal table keyed by account domain with signal type, source URL and observed date","Weights for pain relevance and recency taken from the Pain-First ICP scoring tiers","The trigger fires when the composite crosses a threshold, never on a single row","Sequence copy references the top-weighted signal by its topic, never by the fact of a visit"],"closesLeak":["low-outbound-reply-rates","weak-icp-targeting","undifferentiated-conversion-content"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#suppression-ring","https://artemisgtm.ai/resources/gtm-systems-patterns/#enrichment-waterfall-with-fallback","https://artemisgtm.ai/resources/gtm-systems-patterns/#score-decay","https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#signal-based-selling","https://artemisgtm.ai/resources/glossary/#icp","https://artemisgtm.ai/resources/glossary/#sdr"],"sourcePages":["https://artemisgtm.ai/resources/pain-first-icp-scoring/","https://artemisgtm.ai/resources/blog/signal-based-selling-intent-driven-pipeline/","https://artemisgtm.ai/resources/deanonymized-visitor-outreach-automation/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#consent-gated-identification","id":"consent-gated-identification","termCode":"PAT-08","name":"Consent-Gated Identification","alsoKnownAs":["Region-gated identification","Consent-first deanonymization"],"context":"A site runs visitor identification that can resolve a visit to a company and, in some regions, to a named person, and that signal feeds alerts and outreach.","problem":"Identification and outreach that ignore region and consent create person-level data where it should not exist and send emails nobody can defend.","forces":["A person-level match is the most actionable signal and the most privacy-sensitive.","The rules differ by region, and the visitor location is sometimes unknown.","A gate placed after enrollment is too late, because the email has already gone.","Opt-outs and browser privacy signals have to reach every tool in the chain."],"solution":"Gate twice: on the site, where the consent layer decides which identification scripts load, and again before enrollment, where region and identification level decide which actions are allowed. Artemis GTM runs this model on its own site: in the United States identification runs on visit with a notice and an opt-out at any time, everywhere else it waits for consent, and in the EEA, the UK and Switzerland it is company-level only, so no person-level signal is created there at all. An unknown location or a Global Privacy Control signal gets the consent-first rules. This is a system design, not legal advice; confirm the posture with counsel for each region you sell into.","antiPattern":"Running person-level identification everywhere and filtering by region at the email step. The personal data already exists, the gate depends on every downstream tool honoring it, and one misconfigured sequence sends an email the policy said could not happen.","exampleStack":["The consent layer estimates region from the IP address and decides which identification scripts load","Browser-based person-level identification scripts never load in the EEA, the UK or Switzerland, or when region is unknown","The enrollment rule reads region and identification level and can only downgrade the action","An opt-out or a Global Privacy Control signal clears identification identifiers from the browser"],"closesLeak":["anonymous-website-traffic"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#suppression-ring","https://artemisgtm.ai/resources/gtm-systems-patterns/#signal-stacking","https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#visitor-deanonymization"],"sourcePages":["https://artemisgtm.ai/resources/person-vs-company-level-identification/","https://artemisgtm.ai/resources/deanonymized-visitor-outreach-automation/","https://artemisgtm.ai/resources/how-visitor-identification-works/","https://artemisgtm.ai/privacy/","https://artemisgtm.ai/cookies/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#idempotent-event-ingestion","id":"idempotent-event-ingestion","termCode":"PAT-09","name":"Idempotent Event Ingestion","alsoKnownAs":["Dedup on ingest","Exactly-once effects"],"context":"Form fills, webhooks, visitor events and sequence replies arrive from several tools, and most of those tools retry on a timeout or fire more than once for the same real-world event.","problem":"Without an idempotency key, one form fill becomes two leads, two alerts and two sequence enrollments, and the duplicates corrupt routing, reporting and the buyer's inbox.","forces":["Webhook senders retry, and some deliver out of order.","The same person arrives from several sources with slightly different identifiers.","Dropping a genuine second event is as bad as processing a duplicate.","The receiver has to answer fast or the sender retries again."],"solution":"Give every inbound event a stable key, the sender's event id where one exists or a hash of source, identifier and event time where it does not, and record the key before any side effect runs. A repeat key returns success without doing the work again. Acknowledge the sender quickly, do the slow work after, and make every downstream write an upsert keyed on a normalized identity so a replay converges on the same record.","antiPattern":"Deduplicating with a nightly merge job. By the time it runs, the duplicate lead has been routed to a second rep, alerted twice and enrolled twice, and the merge quietly rewrites the response-time history.","exampleStack":["The webhook receiver writes the event key to a table with a unique constraint before acting","CRM writes upsert on normalized email or company domain instead of creating a new record","The Slack interactivity handler acknowledges inside the platform deadline, then processes","Replayed events are logged as duplicates for monitoring instead of failing silently"],"closesLeak":["cross-cutting","slow-lead-response"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window","https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back","https://artemisgtm.ai/resources/gtm-systems-patterns/#verify-loop"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#crm","https://artemisgtm.ai/resources/glossary/#revops"],"sourcePages":["https://artemisgtm.ai/resources/slack-sms-lead-alerts/","https://artemisgtm.ai/resources/crm-data-quality/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#alert-dedup-window","id":"alert-dedup-window","termCode":"PAT-10","name":"Alert Dedup Window","alsoKnownAs":["Alert throttling","One alert per window"],"context":"Real-time alerts fire from identified visits, form fills and replies, and the same buyer can trigger several of them in a day.","problem":"Repeat alerts for the same person or account train reps to ignore the channel, and two reps can act on the same lead from two different alerts.","forces":["A repeat visit is real information, not only noise.","Some visitor tools notify per session rather than per unique visitor.","A claimed lead should stop alerting, but its owner still wants to know it came back.","Suppressing too hard hides the moment a dormant buyer returns."],"solution":"Key each alert on the contact, or on the account when the person is unknown, and allow one alert per key inside a window such as a session or a day. Thread repeats under the original alert instead of posting new ones, suppress keys that are already claimed or attached to an open opportunity, and let a repeat high-intent visit inside the window escalate to the owner rather than re-alert the pool. Route the low tiers to a daily digest so the real-time channel carries only alerts someone should act on.","antiPattern":"Muting the channel, or raising the score floor until the noise stops. Both cut volume by hiding real hand-raises, and the rep who muted the channel misses the one alert that mattered.","exampleStack":["The alert service stores the last alert time per contact and per account","Slack posts repeats as thread replies on the original message","Visitor alert segments exclude claimed and open-opportunity accounts","Low-tier signals roll into a daily digest instead of the real-time channel"],"closesLeak":["slow-lead-response","anonymous-website-traffic"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#idempotent-event-ingestion","https://artemisgtm.ai/resources/gtm-systems-patterns/#suppression-ring","https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#speed-to-lead","https://artemisgtm.ai/resources/glossary/#visitor-deanonymization"],"sourcePages":["https://artemisgtm.ai/resources/slack-sms-lead-alerts/","https://artemisgtm.ai/resources/deanonymized-visitor-outreach-automation/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#read-only-audit-pass","id":"read-only-audit-pass","termCode":"PAT-11","name":"Read-Only Audit Pass","alsoKnownAs":["Diagnose before build","Read-only diagnosis"],"context":"Someone is about to change a GTM system: new routing, new scoring, a new tool or a CRM cleanup.","problem":"Building before measuring fixes the easiest problem instead of the costliest one, and write access during discovery risks changing live data before anyone has agreed what is wrong.","forces":["Leaders want something shipped quickly.","Teams are too close to their own funnel to see what has come to feel normal.","The numbers that matter are spread across the CRM, the sequencing tool and analytics.","Write access granted for diagnosis tends to get used."],"solution":"Start with a pass that only reads: pull response times, stage conversion, routing paths and field completeness from the CRM and tools under read-only access. Price each leak in dollars from those numbers, with the arithmetic shown, and rank the fixes by cost and complexity. Agree the map before anything is built, then grant write access per build item, scoped to what the agreed map needs.","antiPattern":"Starting with the tool purchase or the rebuild. A team buys visitor identification with no routing behind it, or rebuilds scoring while the real leak is an unowned queue, and any later audit has to measure around the changes.","exampleStack":["A CRM integration user scoped to read permissions for the diagnosis","Exports of lead created, first activity and owner fields for the response-time math","A leak map priced in dollars with the arithmetic shown, agreed before the build","Write scopes granted per build item after sign-off"],"closesLeak":["cross-cutting"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#verify-loop","https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#revenue-leak","https://artemisgtm.ai/resources/glossary/#revenue-leak-framework","https://artemisgtm.ai/resources/glossary/#gtm-health-score","https://artemisgtm.ai/resources/glossary/#revops"],"sourcePages":["https://artemisgtm.ai/resources/what-is-a-gtm-audit/","https://artemisgtm.ai/resources/how-artemis-builds/","https://artemisgtm.ai/engineer/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#verify-loop","id":"verify-loop","termCode":"PAT-12","name":"Verify Loop","alsoKnownAs":["Acceptance-tested build","Verify before done"],"context":"A GTM build, such as a routing rule, an alert, a sequence trigger or a scoring workflow, has been configured and looks complete.","problem":"A system that looks complete can fail quietly on the first real lead, and nobody finds out until the pipeline report comes up short.","forces":["Test data behaves better than live data.","Each tool in the chain can pass on its own while the chain fails at a join.","Verification takes time the team would rather spend shipping.","A system that works today drifts when a field, a user or a plan changes."],"solution":"Write acceptance criteria before the build, in terms a live test can check, such as a test lead that is created, routed, alerted and touched inside the target window. Run that test end to end across every tool in the chain, record pass or fail against each criterion in a results ledger, and mark the build done only on a pass. Schedule the same test to rerun, so drift shows up as a failed check instead of a lost deal.","antiPattern":"Calling a build done because each tool's settings page looks right. The form, the CRM workflow and the alert each work in isolation, and the lead still dies at the join between two of them.","exampleStack":["A controlled test lead submitted through the live form with a known identity","Checks read the CRM record for owner, timestamps and enrollment against each criterion","A scheduled rerun of the same test, with failures posted to an ops channel","One results ledger row per run with the criterion, the result and the date"],"closesLeak":["cross-cutting","slow-lead-response"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#read-only-audit-pass","https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back","https://artemisgtm.ai/resources/gtm-systems-patterns/#idempotent-event-ingestion"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#acceptance-criteria","https://artemisgtm.ai/resources/glossary/#results-ledger","https://artemisgtm.ai/resources/glossary/#gtm-engineer"],"sourcePages":["https://artemisgtm.ai/resources/how-artemis-builds/","https://artemisgtm.ai/resources/slack-sms-lead-alerts/","https://artemisgtm.ai/resources/speed-to-lead/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#four-timestamp-write-back","id":"four-timestamp-write-back","termCode":"PAT-13","name":"Four-Timestamp Write-Back","alsoKnownAs":["Response-time write-back","Alert latency stamps"],"context":"A team has a response target and an alerting layer, and wants response time to be a number it can report rather than an impression.","problem":"Most CRMs record when a lead was created and when it was last touched, which hides where the delay happened: in the alert, the claim or the first touch.","forces":["Automated touches make humans look faster than they are.","Off-hours leads distort any measure taken in business hours only.","Reps resist fields they have to fill in by hand.","Reassignment can overwrite the original timestamps."],"solution":"Stamp four fields on the record, lead_created_at, alert_sent_at, claimed_at and first_touch_at, so response time is first_touch_at minus lead_created_at and the alert and claim latencies show which link broke. Systems write the stamps, never reps: the alert sender writes alert_sent_at, the claim button writes claimed_at and the owner, and the first logged human call, email or text writes first_touch_at. Log automated touches separately, keep the original stamps through reassignment, and report one median across every hour of the week, split by routing path, channel and tier.","antiPattern":"Measuring response time from the create date to the last activity date, or to an autoresponder's send time. The autoresponder makes every lead look answered in seconds, and the human who took a day disappears from the report.","exampleStack":["Four datetime properties on the lead or contact record","The Slack claim button handler writes claimed_at and the owner in one update","Activity logging writes first_touch_at for human touches only; automated sends get their own field","A weekly dashboard per rep and source: share claimed inside the target, share escalated, median alert-to-claim and claim-to-touch"],"closesLeak":["slow-lead-response"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation","https://artemisgtm.ai/resources/gtm-systems-patterns/#owner-of-record-routing","https://artemisgtm.ai/resources/gtm-systems-patterns/#verify-loop"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#speed-to-lead","https://artemisgtm.ai/resources/glossary/#crm","https://artemisgtm.ai/resources/glossary/#lead-routing"],"sourcePages":["https://artemisgtm.ai/resources/slack-sms-lead-alerts/","https://artemisgtm.ai/resources/speed-to-lead/","https://artemisgtm.ai/resources/after-hours-lead-response/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
{"@id":"https://artemisgtm.ai/resources/gtm-systems-patterns/#shared-handoff-definition","id":"shared-handoff-definition","termCode":"PAT-14","name":"Shared Handoff Definition","alsoKnownAs":["Marketing-sales SLA","Lead acceptance contract"],"context":"Marketing passes leads it scores as ready to sales, and sales decides whether to work them.","problem":"The two teams score against different definitions, so leads reach reps who neither accept nor reject them and age out with no record. The silent rejection never shows up as a loss.","forces":["Marketing is measured on lead volume and sales on closed revenue.","A definition loose enough for marketing is too loose for sales.","Reps will not fill in long rejection forms.","Definitions drift unless someone owns the review."],"solution":"Write one definition both leaders sign: the fit bar, the intent bar, the fields that must be filled at handoff, and a short list of rejection reason codes as the exit criteria. Require an explicit accept or reject action inside the SLA window, logged as an event, with a fallback owner on every route. Track the share of handed-off leads with no disposition as handoff leakage, govern it toward zero, feed rejection reasons back to marketing weekly and review the definition quarterly.","antiPattern":"A slide that says sales follows up on every MQL quickly. There is no exit criterion, no acceptance step and no reason code, so rejected leads vanish and both teams keep arguing from different numbers.","exampleStack":["CRM lead status values for accepted and rejected, with a required reason-code picklist on reject","Required-field validation before a lead can move to the handoff stage","A report of handed-off leads with no disposition, reviewed weekly by both teams","The score breakdown travels with the lead, so the rep sees fit and intent separately"],"closesLeak":["leaky-mql-to-sql-handoff"],"relatedPatterns":["https://artemisgtm.ai/resources/gtm-systems-patterns/#capacity-bound-threshold-bands","https://artemisgtm.ai/resources/gtm-systems-patterns/#sla-timer-with-escalation","https://artemisgtm.ai/resources/gtm-systems-patterns/#owner-of-record-routing","https://artemisgtm.ai/resources/gtm-systems-patterns/#score-decay"],"glossaryAnchors":["https://artemisgtm.ai/resources/glossary/#mql","https://artemisgtm.ai/resources/glossary/#sql","https://artemisgtm.ai/resources/glossary/#bant","https://artemisgtm.ai/resources/glossary/#meddic"],"sourcePages":["https://artemisgtm.ai/resources/mql-to-sql-handoff/","https://artemisgtm.ai/resources/lead-score-thresholds/","https://artemisgtm.ai/resources/pain-first-icp-scoring/"],"contributor":null,"publisher":"Artemis GTM","author":"Tom Regan","license":"https://creativecommons.org/licenses/by/4.0/","version":"2026.10","since":"2026.10","lastReviewed":"2026-10-18"}
