← Resources

Lead Triage - Agent Playbook

The complete operating prompt for an AI agent that handles inbound leads: write-first dedupe, a four-tier ICP rubric, deal creation and routing, and a first reply that is drafted but never sent - with hard human-in-the-loop gates the agent cannot cross.

Who this is for

This playbook is for teams where inbound arrives faster than a human can sort it: demo requests, pricing forms, community joins, replies to outbound, all landing in one queue. Triage is the least glamorous work in sales and the most leverage-dense - a hand-raise that sits unrouted for a day cools off, and a duplicate contact created in a hurry poisons every report downstream. It is also the ideal first job for an agent operating a CRM: high volume, clear rules, and every decision leaves an auditable record.

Know what triage is not. It is not scoring - the lead scoring framework re-ranks everyone already in the database on a nightly schedule, while triage runs exactly once, at the moment of arrival, and answers four questions: new or repeat? fit or not? deal or no deal? reply or silence? Use both: triage sets the initial verdict, scoring keeps it honest over time.

The five steps

StepDecisionOutput in the CRM
1. DedupeNew person or repeat touch?Contact created, or existing one matched
2. ClassifyWhich tier, A through D?triage_tier + triage_reason fields
3. RouteDoes this deserve a deal?Deal in the entry stage, or nothing
4. DraftWhat do we say back?Draft reply activity, pending approval
5. LogWhat actually happened?Source event, backdated to arrival time

Dedupe: write first, look up by consequence

Most triage automations search for the email, then create if nothing comes back. That is two API calls and a race condition - two form fills arriving seconds apart both search, both find nothing, both create. Invert it. The agent POSTs the contact immediately, with an idempotency key. In a CRM that dedupes on email and answers a duplicate create with 409 Conflict plus the existing record in the response body - Relm returns it under existing - the create is the lookup. A 201 means new lead; a 409 means repeat touch, and the agent is already holding the current record with zero extra reads and no race window.

Exact-match dedupe misses the same human under a second email. So the playbook adds one fuzzy pass: a substring search (GET /v1/contacts?q= matches email, name, phone and LinkedIn in Relm) on the last name and the email domain. Here is the opinionated part: the agent never merges. Merging is destructive, and false-positive merges are the worst data corruption a CRM can suffer. Likely duplicates get a note on both records and a flag for a human.

The tier rubric

Four tiers, one letter, always written down with a reason. The rubric below ships with placeholder ICP criteria - swap in your own in the rules block of the artifact.

TierDefinitionRouteFirst reply
AICP match + explicit hand-raise (demo, pricing, "can we talk")Deal in the sales pipeline entry stage, same-day SLADrafted for approval
BICP match, soft signal (content, community, newsletter reply)No deal - nurture sequenceOptional draft
CCannot tell - firmographics missingNo deal - flagged for enrichmentNone
DClear non-fit (student, competitor, unserved geography)do_not_pursue + written reason, never deletedNone

Only tier A opens a deal. This is deliberate: a deal is a claim that a transaction might happen, and creating one for every newsletter reply turns pipeline review into archaeology. Tier B goes to nurture - pair it with the follow-up sequence templates - and gets promoted the day it raises a hand. When two tiers both seem plausible, the agent takes the lower one and says why; optimistic misclassification is how junk reaches your calendar.

Human-in-the-loop gates

The gates are the difference between an agent you trust and an agent you babysit. The split is by reversibility, not by importance:

Agent does aloneHuman required
Create contacts, companies, activitiesSending any email or message
Write triage fields and reasonsMerging or deleting records
Open a tier-A deal in the entry stageOverwriting a non-empty field
Draft replies as pending activitiesResolving an ambiguous duplicate

Everything in the left column is additive and auditable - wrong calls are visible and cheap to undo. Everything on the right either touches a stranger's inbox or destroys information. The agent does not get a "be careful" instruction; it gets no send permission at all.

The artifact: prompt + triage rules

Paste this as the standing instructions for your triage agent. The rules block at the top is yours to edit; the procedure and gates below it should survive contact with your opinions. Endpoints are Relm's, but the flow ports to any CRM with dedupe-on-create, custom fields, and drafts. Register the five custom fields first (see the next section).

You are the inbound lead triage agent for this Relm workspace.
You run when a new lead arrives (form fill, demo request, email
reply, community join, manual paste). Triage exactly one lead per
run, fully, then stop.

== TRIAGE RULES v1 - edit this block, keep the procedure ==

ICP: B2B SaaS, 11-200 employees, US/EU, selling to sales or
marketing teams. Buyer titles: founder, CEO, VP Sales, Head of
Growth, RevOps.

TIERS (pick exactly one):
  A = ICP match AND explicit hand-raise (demo request, pricing
      question, asks to talk). Deal + reply draft, same-day SLA.
  B = ICP match, soft signal (content download, community join,
      newsletter reply). No deal. Nurture. Optional reply draft.
  C = cannot tell - firmographics missing. No deal. Flag for
      enrichment.
  D = clear non-fit (student, competitor, geography we do not
      serve). Disqualify with a written reason. Never delete.

REPLY DRAFT RULES: under 120 words, plain text, mirror their
wording, answer the actual question, exactly one question back,
booking link only for tier A, no marketing adjectives.

== PROCEDURE ==

1. Create first, dedupe by consequence. POST /v1/contacts with
   everything you extracted ({ email, first_name, last_name, ... })
   and header Idempotency-Key: triage-{email}-{YYYY-MM-DD}.
   - 201 -> new lead. Continue.
   - 409 conflict -> the error body's `existing` is the full
     current contact. Use existing.id - this is a repeat touch.
     PATCH only fields that are currently empty.
2. Fuzzy duplicate pass. GET /v1/contacts?q={last name} and
   GET /v1/contacts?q={email domain}. A likely same-person under a
   different email is NOT yours to merge: log a note on both
   records and flag for human review.
3. Company. For a corporate domain: GET /v1/companies?q={domain};
   if none, POST /v1/companies { name, domain } (deduped by you,
   same 409-existing semantics). PATCH the contact's company_id.
4. Classify. Apply TIERS. PATCH /v1/contacts/{id} with
   custom_fields { triage_tier, triage_reason, lead_source }.
   triage_reason is one sentence a human would accept.
   Tier C: also set needs_enrichment = true.
   Tier D: also set do_not_pursue = true.
5. Route (tier A only). GET /v1/deals?primary_contact_id={id}.
   If an existing deal is not in a won or lost stage, add a note
   to it instead of creating another. Otherwise GET /v1/pipelines,
   take the entry stage (lowest ordinal) of the sales pipeline,
   then POST /v1/deals { name: "{Company or Full Name} - inbound",
   pipeline, stage, primary_contact_id, company_id }.
6. Log the source event. POST /v1/activities { type: "note",
   contact_id, deal_id if created, body: the inbound message
   verbatim + your tier + reason, occurred_at: when the lead
   actually arrived - not when you ran }.
7. Draft, never send. POST /v1/activities { type: "email",
   contact_id, body: "DRAFT - PENDING APPROVAL\n\n" + your reply }.
   You have no send permission. A human reviews, edits, sends.
8. Report one line: contact id | tier | deal id or - | draft or -
   | anything that needs human eyes.

== HARD GATES - never cross ==
- Never send an email or message. Drafts only.
- Never delete or merge records.
- Never overwrite a non-empty field.
- Never set do_not_pursue without a triage_reason.
- Torn between two tiers? Take the lower and explain in
  triage_reason.
- Ambiguous duplicate, unclear ICP call, anything irreversible:
  stop and ask.

Apply it with your agent

With your agent connected to Relm's MCP server (https://api.relmcrm.com/mcp - two-minute setup in give your AI agent a CRM), bootstrap the whole thing in one message:

Read the workspace schema. Register five contact fields:
lead_source, triage_tier, triage_reason as text; do_not_pursue,
needs_enrichment as boolean. Then adopt the playbook at
relmcrm.com/resources/lead-triage-agent-playbook as your standing
triage instructions and process this lead:

[paste the raw inbound - form fill, email, LinkedIn message]

Report contact id, tier, deal id if created, and show me the
draft reply for approval before doing anything else.

Over REST, register the fields first - custom fields must exist before a write can touch them:

curl https://api.relmcrm.com/v1/fields \
  -H "Authorization: Bearer relm_test_..." \
  -H "Content-Type: application/json" \
  -d '{ "object": "contact", "key": "triage_tier", "label": "Triage tier", "data_type": "text" }'

Repeat for the other four, then run the playbook against a relm_test_ key - test mode is free, isolated from live data, and invisible to the dashboard's live view. Once triage is flowing, close the loop with the daily pipeline review prompt so tier-A deals that stall get surfaced too.

FAQ

How should an AI agent deduplicate inbound leads in a CRM?

Write first, dedupe by consequence. Instead of searching and then creating - two calls and a race condition - the agent creates the contact immediately with an idempotency key. If the CRM dedupes on email and returns a 409 conflict carrying the existing record in the response body, the create doubles as the lookup: a 201 means new lead, a 409 means repeat touch and the agent is already holding the record. A fuzzy substring search on last name and email domain then catches same-person-different-email cases, which get flagged for a human, never auto-merged.

Should the agent send the first reply automatically?

No. Sending words to a stranger under your name is one of the two irreversible acts in triage (the other is deleting data), so the playbook makes it structurally impossible: the agent writes the reply as a draft activity marked pending approval and has no send permission at all. Graduate to auto-send only after weeks of reviewing drafts, and even then only for tier A replies that follow a template you wrote.

What is the difference between lead triage and lead scoring?

Triage is a one-time decision at the moment of arrival: is this person new, do they fit, do they deserve a deal and a reply today. Scoring is a continuous ranking of everyone already in the database, recomputed on a schedule as intent decays. They complement each other: triage sets the initial tier and routes the hand-raisers, scoring re-sorts the rest of the pile over time.

What should happen to leads that do not fit the ICP?

Disqualify in writing, never delete. The agent sets a do-not-pursue flag plus a one-sentence reason a human would accept, and the record stays. Deleting non-fit leads destroys the evidence you need to audit the agent's judgment, invites the same person to be re-created as a fresh lead next week, and erases the disqualification patterns that tell you your ICP definition is drifting.

Can this triage playbook run without Relm?

Yes. The flow - write-first dedupe, tier rubric, route, draft, log - works against any CRM an agent can reach. You need three capabilities: a create endpoint that rejects duplicates with the existing record (or a cheap exact-match lookup), custom fields for the triage verdict, and a way to store a draft without sending it. Relm is simply the shortest path because the 409-with-existing semantics, substring search, and backdatable activities are native.

Give your triage agent a CRM it can actually operate

1,000 requests a month on the Free plan, no card. See pricing.

Start free →