Outbound Sales

This guide walks through the complete workflow of using HumanConnection for outbound sales. Start by researching leads with search_humans, then orchestrate real meetings using the full tool suite.

Why human meetings beat cold emails

MetricCold emailHumanConnection
Response rate1-3%60-80% meeting show rate
Time to engagementDays/weeksSame day possible
Quality of signalLow (opened/clicked)High (bio, profiles, transcript)
Cost per qualified lead$50-200 (at scale)Pay-per-result

The math is simple: one real conversation produces more signal than 1,000 cold emails.

Step 1: Research the lead

Extract the company domain from the lead’s email, then use search_humans to gather intelligence. Your agent should know who they are, where they are, and how to reach them.

1import { search_humans } from '@humanconnection/toolkit';
2
3// Extract domain from lead email (e.g. "marcus@techflow.com" → "techflow.com")
4const leadEmail = "marcus@techflow.com";
5const companyDomain = leadEmail.split("@")[1];
6
7// Find the lead's profiles and bio
8const results = await search_humans({
9 name: "Marcus Johnson",
10 company_domain: companyDomain
11});
12
13const lead = results[0];
14console.log(`Found: ${lead.name}`);
15console.log(`Bio: ${lead.bio}`);
16console.log(`Location: ${lead.location}`);
17console.log(`Email: ${lead.email}`);
18console.log(`Company: ${lead.company_domain}`);
19console.log(`LinkedIn: ${lead.profiles.linkedin_profile_url}`);
20console.log(`X: ${lead.profiles.x_profile_url}`);
21console.log(`Confidence: ${lead.confidence}`);

What to look for in search results

FieldWhat it tells you
bioTheir role, expertise, and current company. Use this to personalize your outreach.
locationWhere they are based. Use this to find nearby events, places, and sales reps.
emailTheir email address (when provide_email is set). Use for meeting invites.
company_domainTheir company domain. Use to verify the right person.
profiles.linkedin_profile_urlTheir professional identity. Pass to search_interests for personalization.
profiles.x_profile_urlTheir public voice. Pass to search_interests to find interests and pain points.
profiles.instagram_profile_urlTheir personal brand. Pass to search_interests for hobby signals.
confidenceHow reliable the match is. Above 0.6 is good. Below 0.4, consider verifying manually.

Step 2: Discover interests

Use search_interests to find personal signals that help your agent pick the right event or venue and personalize the meeting.

1import { search_interests } from '@humanconnection/toolkit';
2
3const interests = await search_interests({
4 name: "Marcus Johnson",
5 linkedin_url: lead.profiles.linkedin_profile_url,
6 x_url: lead.profiles.x_profile_url
7});
8
9console.log("Signals:");
10for (const signal of interests.signals) {
11 console.log(` [${signal.source}] ${signal.signal}`);
12}
13// Example output:
14// [linkedin] Active in DevOps and observability communities
15// [x] Frequently posts about Kubernetes and cloud-native tooling
16// [web] Speaker at KubeCon 2025

Step 3: Find meeting opportunities

Map the lead’s interests to event categories and place types. Use search_events to find conferences and meetups, and search_places to find venues.

1import { search_events, search_places } from '@humanconnection/toolkit';
2
3// Find events near the lead matching their interests
4const events = await search_events({
5 location: { city: "Austin" },
6 radius_km: 50,
7 category: "conference",
8 date_after: "2026-04-01T00:00:00Z",
9 date_before: "2026-06-30T23:59:59Z"
10});
11
12// Also find places as a backup
13const places = await search_places({
14 location: { city: "Austin" },
15 type: "cafe",
16 radius_km: 10
17});

Step 4: Find a sales rep nearby

Use search_humans in people search mode to find a sales representative near the lead.

1import { search_humans } from '@humanconnection/toolkit';
2
3// Find sales reps in the lead's area
4const reps = await search_humans({
5 location: "Austin",
6 title_filters: "sales AND SaaS",
7 provide_email: true
8});
9
10const rep = reps[0];
11console.log(`Rep: ${rep.name} (${rep.email})`);
12console.log(`Location: ${rep.location}`);

Step 5: Book and invite

Use book_ticket to register for the event if needed, then send a Google Calendar invite to both participants.

1import { book_ticket, send_meeting_invite } from '@humanconnection/toolkit';
2
3// Register for the event
4await book_ticket({
5 event_url: events.data[0].url,
6 email: rep.email,
7 name: rep.name
8});
9
10// Send Google Calendar invite — the invite is the booking
11await send_meeting_invite({
12 title: "Coffee with Marcus Johnson — " + events.data[0]?.name,
13 attendee_emails: [rep.email, "marcus@techflow.com"],
14 scheduled_at: events.data[0]?.starts_at,
15 duration_minutes: 30,
16 location: events.data[0]?.location?.name ?? "Austin",
17 description: "Meeting with Marcus Johnson from TechFlow Inc. Marcus is interested in Kubernetes and observability. Discuss our platform and 30-day pilot.",
18});

Step 6: Process the report

After the meeting, use the report to decide next steps:

1import { send_meeting_report, send_meeting_payment } from '@humanconnection/toolkit';
2
3// Submit the report
4const report = await send_meeting_report({
5 meeting_id: "mtg_x7y8z9w0a1b2c3d4",
6 summary: "Productive conversation. Marcus confirmed they are evaluating observability solutions.",
7 outcome: "follow_up_needed",
8 deal_value: { amount: 48000, currency: "USD" },
9 next_steps: "Schedule technical demo with Marcus's team next week."
10});
11
12// Reward based on outcome
13if (report.outcome === "deal_closed") {
14 await send_meeting_payment({
15 meeting_id: report.meeting_id,
16 amount: 2400,
17 currency: "USD",
18 type: "commission",
19 note: "5% commission on $48,000 deal"
20 });
21} else {
22 await send_meeting_payment({
23 meeting_id: report.meeting_id,
24 amount: 150,
25 currency: "USD",
26 type: "flat_fee"
27 });
28}

End-to-end flow summary

  1. Extract domain from lead email
  2. search_humans(name, company_domain) — find lead location + profiles
  3. search_interests(name, linkedin_url, x_url) — find personal signals
  4. Map interests to event categories / place types
  5. search_events(location, category) — find matching events
  6. search_places(location, type) — find matching venues
  7. search_humans(location, title_filters) — find sales reps nearby
  8. provide_email — get rep’s email
  9. book_ticket + send_meeting_invite — set up the meeting

Batch research workflow

Here is a complete script for researching a batch of leads using search_humans and search_interests:

1import { search_humans, search_interests } from '@humanconnection/toolkit';
2
3interface Lead {
4 name: string;
5 company_name: string;
6 company_domain?: string;
7}
8
9interface LeadReport {
10 name: string;
11 found: boolean;
12 confidence: number;
13 location?: string;
14 email?: string;
15 linkedin?: string;
16 twitter?: string;
17 bio?: string;
18 interests?: string[];
19}
20
21async function researchLeads(leads: Lead[]): Promise<LeadReport[]> {
22 const reports: LeadReport[] = [];
23
24 for (const lead of leads) {
25 const results = await search_humans({
26 name: lead.name,
27 company_name: lead.company_name,
28 company_domain: lead.company_domain,
29 provide_email: true
30 });
31
32 if (results.length > 0 && results[0].confidence > 0.3) {
33 const human = results[0];
34
35 // Discover interests
36 const interests = await search_interests({
37 name: lead.name,
38 linkedin_url: human.profiles.linkedin_profile_url,
39 x_url: human.profiles.x_profile_url
40 });
41
42 reports.push({
43 name: human.name,
44 found: true,
45 confidence: human.confidence,
46 location: human.location,
47 email: human.email,
48 linkedin: human.profiles.linkedin_profile_url,
49 twitter: human.profiles.x_profile_url,
50 bio: human.bio,
51 interests: interests.signals.map(s => s.signal),
52 });
53 } else {
54 reports.push({
55 name: lead.name,
56 found: false,
57 confidence: results.length > 0 ? results[0].confidence : 0,
58 });
59 }
60 }
61
62 return reports;
63}
64
65const leads: Lead[] = [
66 { name: "Sara Blakely", company_name: "Spanx", company_domain: "spanx.com" },
67 { name: "Brian Chesky", company_name: "Airbnb", company_domain: "airbnb.com" },
68 { name: "Melanie Perkins", company_name: "Canva", company_domain: "canva.com" },
69];
70
71const reports = await researchLeads(leads);
72
73for (const report of reports) {
74 if (report.found) {
75 console.log(`[FOUND] ${report.name} (${report.confidence}) - ${report.location}`);
76 if (report.email) console.log(` Email: ${report.email}`);
77 if (report.linkedin) console.log(` LinkedIn: ${report.linkedin}`);
78 if (report.interests?.length) console.log(` Interests: ${report.interests.join(", ")}`);
79 } else {
80 console.log(`[NOT FOUND] ${report.name}`);
81 }
82}

Next steps