Outbound Sales Flow

End-to-end pattern: domain → signals → decision-maker → email → outreach.

The canonical agent flow for outbound prospecting using GTM Tools. This is the version you’d put in an agent’s system prompt or skill definition.

The flow

INPUT: target domain
1. detect_signal (qualify the account)
↓ (if any signal fires)
2. get_linkedin_company_url (resolve LinkedIn page)
3. list_linkedin_company_employees (find decision-makers, filtered by signal type)
4. get_email (verify email per top candidate)
5. send_linkedin_invitation (or hand off to outbound platform)
OUTPUT: contacted lead with provenance

Decision rules for the agent

When to skip the account

If detect_signal returns no fired signals, abort. The account isn’t actively in market. Note it for re-checking next month.

How to pick the title filter

Match the highest-confidence fired signal to a decision-maker title:

SignalTitle filter
signal_trustpilot_negative_support_reviews(VP OR Director OR Head) AND (CX OR Support OR "Customer Experience") NOT intern
signal_hiring_sales_rep_repost(VP OR Director OR Head) AND Sales NOT intern
signal_hiring_support(VP OR Director OR Head) AND (CX OR Support OR Operations)
signal_hiring_sales_leadership(CRO OR "Chief Revenue") OR ((VP OR Head) AND Sales)
signal_socials_spike(VP OR Director OR Head) AND (Marketing OR Brand OR Growth)
signal_technologies_identifiedUse the title most likely to evaluate the matched stack (e.g. RevOps for analytics tools)

When to skip the email step

If the candidate’s profile already exposes an email on LinkedIn, or your CRM already has it cached, skip get_email and save 5 tokens.

If status: "not_found" comes back with reason: "catch_all", there is no verified address to send to. Do not auto-send a guessed one: hand off to a human reviewer, or switch to a soft-touch channel (LinkedIn invite) where being wrong is cheap.

When to write back

After contact, log:

  • The signal evidence (URLs, snippets), which gives downstream reps something to reference.
  • The verified email + catch-all flag.
  • The LinkedIn profile URL.
  • The token spend (get_token_balance delta).

Personalization handles

Each tool surfaces a piece of personalization material. The richer the message, the higher the response rate.

FromUse as
signal_*.evidence[].snippetQuote in the cold message (“noticed your CX team mentioned…”)
signal_hiring_*.evidence[].title + .urlReference the specific job posting
list_linkedin_company_employees.results[].headlineMirror the recipient’s framing
list_linkedin_company_posts.results[].textReference recent company posts

Anti-patterns

  • Skipping the signal step. Going straight to list_linkedin_company_employees (30 tokens) on unqualified accounts is the single most common waste.
  • Hydrating before filtering. Don’t get_linkedin_profile (2 tokens) every employee; list_linkedin_company_employees already returns name/title/headline.
  • Re-checking the same domain daily. Signal data rarely shifts day-to-day. Weekly is enough; daily wastes tokens.
  • Auto-sending guessed addresses. False positives hurt sender reputation. Gate on status == "ok", and treat any not_found reason as “no address”.

Token budget per qualified prospect

StepTokens
detect_signal (median)15
get_linkedin_company_url2
list_linkedin_company_employees30
get_email × 315
send_linkedin_invitation5
Total67

Budget ~$0.67 per fully-researched and contacted prospect.