Customer.io excels at behavior-driven messaging — you define the trigger, it handles delivery. But most Customer.io setups are blind to GitHub: they capture signups, product events, and email opens, but miss the moment a developer stars your repo, opens an issue mentioning your pricing, or commits code referencing your SDK. GitLeads closes that gap by pushing enriched developer profiles into Customer.io the instant a GitHub signal fires.
Why GitHub Signals Belong in Customer.io
- A star on your repo is stronger intent than a marketing email open — trigger a dedicated onboarding campaign immediately
- A keyword mention in a GitHub issue ("evaluating alternatives") signals active comparison — enter a competitive nurture sequence
- A competitor repo star exposes developers in your space before they make a decision
- GitHub profiles include company, location, and top languages — segment Customer.io audiences without extra enrichment
How the Integration Works
GitLeads monitors your tracked repos and keywords 24/7. When a signal fires, it pushes the developer profile to Customer.io via the Track API, creating or updating a Person record and firing a custom event. Customer.io then triggers any campaign, broadcast, or transactional message based on that event.
Webhook → Customer.io Track API
import { createHmac } from 'crypto';
interface GitLeadsPayload {
signal: 'stargazer' | 'keyword';
github_username: string;
name: string | null;
email: string | null;
company: string | null;
location: string | null;
bio: string | null;
followers: number;
top_languages: string[];
repo?: string;
keyword?: string;
context?: string;
matched_at: string;
}
function verifySignature(body: string, signature: string, secret: string): boolean {
const expected = createHmac('sha256', secret).update(body).digest('hex');
return `sha256=${expected}` === signature;
}
export async function POST(req: Request) {
const body = await req.text();
const sig = req.headers.get('x-gitleads-signature') ?? '';
if (!verifySignature(body, sig, process.env.GITLEADS_WEBHOOK_SECRET!)) {
return new Response('Unauthorized', { status: 401 });
}
const lead: GitLeadsPayload = JSON.parse(body);
const personId = lead.email ?? `github:${lead.github_username}`;
const authHeader = 'Basic ' + Buffer.from(
`${process.env.CIO_SITE_ID}:${process.env.CIO_TRACK_API_KEY}`
).toString('base64');
// Upsert person in Customer.io
await fetch(
`https://track.customer.io/api/v1/customers/${encodeURIComponent(personId)}`,
{
method: 'PUT',
headers: { Authorization: authHeader, 'Content-Type': 'application/json' },
body: JSON.stringify({
github_username: lead.github_username,
name: lead.name,
company: lead.company,
location: lead.location,
top_languages: lead.top_languages.join(', '),
followers: lead.followers,
created_at: Math.floor(Date.now() / 1000),
}),
}
);
// Fire intent event for campaign trigger
const eventName =
lead.signal === 'stargazer' ? 'github_repo_starred' : 'github_keyword_mention';
await fetch(
`https://track.customer.io/api/v1/customers/${encodeURIComponent(personId)}/events`,
{
method: 'POST',
headers: { Authorization: authHeader, 'Content-Type': 'application/json' },
body: JSON.stringify({
name: eventName,
data: { repo: lead.repo, keyword: lead.keyword, context: lead.context },
}),
}
);
return new Response('OK');
}Campaign Architecture
- Trigger: github_repo_starred (your repo) → Campaign: "Starred repo — onboarding nudge" → Goal: signup
- Trigger: github_repo_starred (competitor repo) → Campaign: "Competitor awareness sequence" → Goal: demo booked
- Trigger: github_keyword_mention + keyword contains "pricing" → Campaign: "High-intent pricing nurture" → Goal: upgrade
- Trigger: github_keyword_mention + followers > 500 → Campaign: "Influencer outreach" → Goal: partnership call
Segmenting by GitHub Attributes
GitLeads pushes top_languages, followers, and company to Customer.io. Use these as segment conditions:
- top_languages contains "Python" → ML/data science campaign variant
- followers > 1000 → high-influence developer; route to DevRel or partnership workflow
- company is set → B2B CRM enrichment pipeline
- company is not set → PLG self-serve sequence
Via Zapier or n8n (No-Code)
If you prefer no-code: GitLeads → Zapier → Customer.io. The Customer.io Zapier app supports "Create or Update Person" and "Track Event" actions. Map GitLeads fields to Customer.io attributes in the Zap editor — no code required. For self-hosted workflows, n8n has a Customer.io node with the same capabilities.