Push GitHub Leads to Customer.io — Trigger Behavioral Campaigns from Developer Intent

Connect GitLeads to Customer.io and trigger automated campaigns the moment a developer stars your repo or mentions your product on GitHub. Step-by-step integration guide with code.

Published: May 5, 2026Updated: May 5, 20267 min read

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

  1. Trigger: github_repo_starred (your repo) → Campaign: "Starred repo — onboarding nudge" → Goal: signup
  2. Trigger: github_repo_starred (competitor repo) → Campaign: "Competitor awareness sequence" → Goal: demo booked
  3. Trigger: github_keyword_mention + keyword contains "pricing" → Campaign: "High-intent pricing nurture" → Goal: upgrade
  4. 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.

GitLeads captures developer intent signals from GitHub and pushes enriched profiles into Customer.io so you can trigger campaigns the moment a developer engages. Start free with 50 leads/month. Related: push GitHub leads to HubSpot, push GitHub leads to Zapier, push GitHub leads to Slack.

Want more like this? Get the weekly developer lead playbook.

No spam. 5 emails over 2 weeks. Unsubscribe anytime.

Related Articles

How to Find Leads on GitHub: The Complete Guide (2026)
10 min read
GitHub Leads vs LinkedIn Leads: When to Use Which (2026)
9 min read
GDPR Compliance for GitHub Lead Scraping: What You Must Know
8 min read