Systems Lab

Agent skill

gtmos-leads-inbound-triage

Triage new inbound leads (demo requests, form fills, signups, referrals) by ICP fit and intent, give each a priority (P0, P1, P2 or DQ), route it to an owner and set the first touch and response SLA.

activeReaches the webInstructions only1,511 words

Filed under Prospecting and list building.

From ay-automate/gtmos-skills · 107 skill entries · 0 · pushed 2026-11-02

What it does when it runs

Triage new inbound leads (demo requests, form fills, signups, referrals) by ICP fit and intent, give each a priority (P0, P1, P2 or DQ), route it to an owner and set the first touch and response SLA. With GTM OS connected it scores through the Score engine (score.score_contact, score.explain_subject), reads the lead's signals, customer type and existing relationship, previews and makes the assignment with territory.match and routing.assign, and opens a follow-up task; it never sends anything itself. Use for "triage these leads", "new inbound leads", "who should take this lead", "is this lead any good", "prioritize the lead queue", "speed to lead", "route inbound", "MQL review". For the ownership audit across the whole book see gtmos-routing-lead-ownership.

Automated analysis of the skill and the 1 file bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
  • api.looot.ai
  • www.linkedin.com
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about gtmos-leads-inbound-triage

Opens your assistant with this page's recorded context. Check the linked sources before relying on it.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/ay-automate/gtmos-skills.git /tmp/gtmos-skills
git -C /tmp/gtmos-skills sparse-checkout set "skills/gtmos-leads-inbound-triage"
mkdir -p ~/.claude/skills/gtmos-leads-inbound-triage
cp -R "/tmp/gtmos-skills/skills/gtmos-leads-inbound-triage/." ~/.claude/skills/gtmos-leads-inbound-triage/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 107 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add ay-automate/gtmos-skills
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from ay-automate/gtmos-skills/blob/86780d2f545cdc0a1de971917aa04b41bb0b3ccd/skills/gtmos-leads-inbound-triage/SKILL.md, which is licensed APACHE-2.0 (skill frontmatter). 1,511 words, 17 headings.

Inbound lead triage

Part of GTM OS Skills. Adapted from lead-triage in salesforce/salesforce-skills (Apache-2.0, Copyright (c) 2026 Salesforce, Inc.). Merged with gtm-inbound-lead-enrichment from loootai/gtm-skills (MIT), kept in references/looot-gtm-inbound-lead-enrichment.md. Changed for GTM OS: the operating section below, rewritten cross-references and tool pointers. Notices: THIRD-PARTY-NOTICES.md (installed beside the skills as THIRD-PARTY-NOTICES.md).

With GTM OS connected

Rules (GTMOS-RULES.md). Read policy.get_dry_mode first; in dry mode every effect stops at a draft. E-class operations are proposed and a different person approves them; never approve your own proposal. Numbers come only from operation results, named with the operation. Claims about results, customers or metrics must be backed by active proof from proof.list.

Inbound triage in GTM OS is three engines working one record: Score decides fit and intent, Routing gives it an owner, Outreach drafts the first touch for a person to approve. You read, decide and write internal records; nothing customer-facing leaves without approval. Confirm each schema with gtm_describe before the first call.

1. Find the lead and what GTM OS already knows.

ReadWhy
records.search (email, name, domain), records.getThe contact and its current company. A lead from a form or signup is already a gtm.contact.
customer_type.classify {subjectType, subjectId}Which kind of customer this is, in the org's words, and the journeys it follows.
account.relationship {accountId}, contact.relationship"We know them": email and meeting history, next meeting. An existing relationship changes the routing.
signals.list {subjectKind, subjectId}The form submission, visits and outside triggers, each with its evidence.
journey.positionWhere the record already sits (new lead, open deal, customer).
Owner on the accountIf the company already has an owner, the lead goes to them (coordinate, do not reassign).

Enrich before you score, business email only. A sign-up gives an email and little else. Free-mail and disposable addresses are flagged, never enriched (the merged looot workflow in references/looot-gtm-inbound-lead-enrichment.md lists the free checks). For a lead with no current company, routing.match_account {contactId} Q finds the account by email domain (free-mail never matches; ties are ambiguous). Missing person or company fields: enrichment.enrich_contacts {ids, estimate: true} (spends inline: quote it first) (and enrichment.enrich_accounts for a new company), then a run on a yes; both spend inside their own call, so quote first and never run them for a personal address.

2. Score it with the engine, not by hand. score.score_contact {contactId} scores the lead against the org's signed model (fit inherited from its account, intent from its own signals). score.explain_subject {subjectType: "gtm.contact", subjectId} returns the band, the points per factor, the top signals and the greyed signals (sources not wired, never imputed). Use the band and reasons as the fit and intent tables below; a greyed signal is "no data", not "no intent". If the account is not scored yet, run score.score_account first.

3. Set the priority. Map the engine's band and the intent signals onto P0, P1, P2 or DQ with the rules below. A hard disqualifier from definition.scoring_model or a match on definition.suppression_rule is DQ, whatever the score.

4. Route it. Preview with territory.match {subjectType: "gtm.contact", subjectId}: the winning territory, its owner or rotation, and why. Then routing.assign {subjectType, subjectId, ownerId | strategy: "territory" | "round_robin", rule, reason} writes the owner and an auditable decision record. It is an internal write; say who got the lead and why. If the account is already owned, assign the lead to that owner and note "existing relationship" (the territory's stickiness does this by default). Round robin skips members who are out of office or at their cap (routing.member_settings.list Q); when nobody can take the lead it goes to the territory's overflow owner or is queued, and the result says so. An exact email-domain match attaches a lead with no company to that account.

5. Set the first touch. task.create {title, subject, dueAt, assigneePrincipalId} with the SLA as the due date (P0 same day, P1 within 48 hours, P2 this week). For the first message, hand off to gtmos-outreach-cold-email: it drafts through the Outreach engine and proposes the send for a person to approve. In dry mode (policy.get_dry_mode) the draft is where it stops.

6. CRM of record. Lead status or owner changes in HubSpot or Salesforce go through crm.update_record (E): it proposes, a different person approves. Never claim the CRM was updated before the approval executes.

7. The inbound responder. The inbound-responder agent in stdlib/pack.crm-agents runs this triage on every form submission (a form_submitted signal): it qualifies the lead, drafts a grounded first reply and proposes the send, or opens a task when the lead needs a person first. packages.agents Q shows whether it is installed; its proposals land in runtime.list_approvals.

Report numbers only from these results. If score.kpis shows too few scored leads to compare against, say so instead of quoting a calibration.

Without GTM OS

Run the method below by hand. Ask for the lead (name, email, company, source, message) and the ICP once. Look the company up on its website and public sources, keep a source for every fit claim, and mark unknown dimensions as unknown. On Salesforce, read the Lead and the matching Account (by name or website) with the tools you have; on HubSpot, the contact and its company. Recommend the owner and the CRM field changes; let the user apply them.


The triage method

Read the lead and its account, add what is public, score fit and intent, assign a priority, route, set the first touch. Work from the data you read; do not invent a size, a budget or an intent.

1. Read the lead and its account

  • The lead: name, company, title, email, source, status, created date, the message or form answers, current owner.
  • The matching account (by company name or domain): type, owner, segment, size, industry.
  • If the account exists and has an owner, this is an existing relationship: routing is "coordinate with [owner]".
  • Public context when tools allow it: company size, industry, funding, recent news. Prior email threads from the same domain when an inbox is connected.

2. Score ICP fit

Against the ICP (ask once if it is not in the org's definitions or context):

DimensionFitEvidence
Industry✅ / ⚠️ / ❌[from the account or a public source]
Size✅ / ⚠️ / ❌[from the account or a public source]
Persona (title)✅ / ⚠️ / ❌[from the lead's title]
Disqualifiers✅ none / ❌ [which][checked against the ICP]

3. Score intent

SignalStrength
Source qualityHigh (demo request, referral) / Med (content, event) / Low (list, cold)
Message specificitySpecific use case / Generic interest / None
Prior engagementEmail thread / CRM history / None
Timing triggerRecent funding, hiring, exec change / None

4. Assign priority

Calibration: P0 about the top 20%, P1 the next 25%, P2 the rest.

  • P0: strong ICP fit and high intent (specific ask, demo request, or a hot trigger)
  • P1: strong fit with medium intent, or moderate fit with high intent
  • P2: moderate fit with low intent, or fit unclear
  • DQ: a hard disqualifier hit

Override: if the account exists with an owner, routing is "coordinate with [owner]".

5. Queue view (several leads)

When triaging a batch, add a short summary before the per-lead cards: leads by tier (hot, warm, nurture) with counts and shares, leads by source, and a table of the hot leads (lead, company, fit score, source, next step). One sentence on the single most important read of the queue. Quote blank fields as blank, and drop leads you have no data for.

6. Output (per lead)

# Lead triage: [Name] @ [Company]

**Priority: P[0/1/2/DQ]**
[One-sentence rationale]

## CRM status
[Net new | Account exists, owned by [Name]: coordinate first]

## ICP fit: [Strong / Moderate / Poor]
[fit table]

## Intent: [High / Medium / Low]
[intent table]

## Recommended action
- **Route to:** [self / named owner / DQ queue]
- **Response SLA:** [P0: same day / P1: 48h / P2: this week]
- **First touch:** [e.g. a drafted email with [hook], qualification questions, or a polite no]

## Suggested CRM updates
- Lead status -> [value]
- Lead owner -> [name]
- [Notes field] -> "[triage summary]"

If the lead goes to a teammate, offer to draft a handoff note for the team's lead channel (ask for the channel if it is not known).

Upstream note

This method comes from Salesforce's lead-triage skill, which runs the same steps against Salesforce through the Headless 360 MCP server (GraphQL reads of Lead and Account) and renders a widget. On Salesforce without GTM OS, use that skill's documented queries for the reads; the scoring, priority and output above are unchanged.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what gtmos-leads-inbound-triage does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.

Build my GTM engine

Tell us what you want to improve. Fedor reviews the workflow and replies by email when there is a useful fit.

Fedor reviews every request personally. If there is a useful fit, he will reply by email.