Why Combine GitHub Signals with Expandi LinkedIn Automation
Expandi is a LinkedIn automation platform that runs safe, personalized outreach sequences — connection requests, follow-ups, InMails, and profile visits. Most teams using Expandi import leads from a CSV or CRM without intent context. When you combine Expandi with GitLeads, every prospect entering your LinkedIn sequence has already demonstrated buying intent on GitHub: they starred your competitor's repo, mentioned your target keyword in a GitHub Issue, or forked a tool adjacent to your product. Intent-first LinkedIn outreach converts at significantly higher rates than cold list imports.
Architecture: GitLeads → Webhook → Expandi
GitLeads supports real-time webhooks and native integrations. The simplest pipeline to Expandi uses a webhook → middleware → Expandi API flow:
// GitLeads webhook payload (sent on each new lead)
interface GitLeadsWebhookPayload {
leadId: string;
signalType: 'stargazer' | 'keyword';
repo?: string;
keyword?: string;
developer: {
githubUsername: string;
name: string | null;
email: string | null;
bio: string | null;
company: string | null;
location: string | null;
followers: number;
topLanguages: string[];
profileUrl: string;
};
}
// Middleware: enrich with LinkedIn URL + add to Expandi campaign
async function handleGitLeadsWebhook(payload: GitLeadsWebhookPayload) {
const { developer } = payload;
// Resolve LinkedIn URL from GitHub username (e.g. via Clay or Hunter.io)
const linkedinUrl = await resolveLinkedIn(developer.githubUsername, developer.name);
if (!linkedinUrl) return; // skip if no LinkedIn found
// Add prospect to Expandi campaign via API
await fetch('https://api.expandi.io/api/campaigns/{campaignId}/add-prospect', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EXPANDI_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
linkedin_url: linkedinUrl,
first_name: developer.name?.split(' ')[0] ?? developer.githubUsername,
company: developer.company ?? '',
custom_field_1: payload.signalType === 'stargazer'
? `Starred ${payload.repo}`
: `Mentioned "${payload.keyword}" on GitHub`,
tags: [payload.signalType, ...developer.topLanguages.slice(0, 3)],
}),
});
}Setting Up the GitLeads → Expandi Pipeline
- **Configure GitLeads signals** — In GitLeads, add the GitHub repositories to monitor for stargazers, or add keywords to scan in Issues/PRs/Discussions. These are your intent triggers.
- **Enable the GitLeads webhook** — In GitLeads Settings → Integrations → Webhook, add your middleware endpoint URL. GitLeads will POST each new lead to this URL as a JSON payload.
- **Build or deploy the middleware** — Use the TypeScript example above (deploy as a Vercel Edge Function, AWS Lambda, or any Node.js server) to parse the payload, resolve LinkedIn URLs, and call the Expandi API.
- **Create a campaign in Expandi** — Build a LinkedIn sequence in Expandi: connection request with a personalized note referencing their GitHub activity, followed by a value-add message. Use the `custom_field_1` populated by GitLeads (e.g., "Starred grafana/grafana") in your message templates.
- **Set Expandi safety limits** — Configure Expandi's daily connection limit (max 20–30/day), working hours, and blacklist to stay within LinkedIn's terms. GitLeads signals are high-quality, so prioritize quality over volume.
- **Monitor conversion metrics** — Track acceptance rate and reply rate per campaign. Segment by signal type: stargazer signals typically have higher LinkedIn acceptance rates than cold keyword signals.
Personalization Using GitHub Signal Context
The signal context from GitLeads enables hyper-personalized LinkedIn messages that reference the developer's actual GitHub behavior:
- Stargazer signals: "I noticed you starred [repo] on GitHub — we help companies like yours that are evaluating [use case]..."
- Keyword signals: "I saw your comment in a GitHub Issue about [keyword] — thought you'd find our approach to [problem] relevant..."
- Language signals: "I noticed you primarily work in [language] — we're built specifically for [language] teams..."
- Company signals: "I see you're at [company] — we work with several [industry] teams on [problem]..."
Alternative: Use Clay as the Middleware
If you use Clay for enrichment, you can route GitLeads webhook data into a Clay table, enrich with LinkedIn URL and company data using Clay's built-in data providers, then push to Expandi via the Clay → Expandi native integration or via Zapier. This avoids writing custom middleware and gives you a no-code pipeline with richer enrichment.