Why Route GitHub Signals into Freshdesk
Freshdesk is primarily a support platform, but many developer-focused companies use it for both support and sales outreach — especially when the same team handles trial inquiries, onboarding questions, and proactive outreach. Routing GitHub signals into Freshdesk lets your support/success team see enriched developer profiles before they ever open a ticket. When a developer stars your repo on Tuesday and opens a support ticket on Thursday, your agent already knows who they are.
How GitLeads Connects to Freshdesk
GitLeads does not have a native Freshdesk integration, but its webhook output is structured JSON that maps cleanly to the Freshdesk Contacts API. You can pipe leads through Zapier, n8n, Make, or a simple edge function. The flow: GitHub signal fires → GitLeads captures and enriches → webhook hits your endpoint → you POST to Freshdesk.
Freshdesk Contact API — Key Fields
// Create or upsert a Freshdesk contact from a GitLeads webhook payload
async function pushToFreshdesk(lead: GitLeadsLead) {
const FRESHDESK_DOMAIN = process.env.FRESHDESK_DOMAIN; // yourcompany.freshdesk.com
const FRESHDESK_API_KEY = process.env.FRESHDESK_API_KEY;
const contact = {
name: lead.name || lead.login,
email: lead.email,
twitter_id: null,
company_name: lead.company,
description: `GitHub: ${lead.profileUrl}\nBio: ${lead.bio}\nSignal: ${lead.signalType} on ${lead.repoName}\nLanguages: ${lead.topLanguages.join(', ')}`,
tags: ['github-signal', lead.signalType, lead.repoName],
other_emails: [],
custom_fields: {
github_username: lead.login,
github_followers: lead.followers,
signal_type: lead.signalType,
signal_repo: lead.repoName,
},
};
// Check if contact exists by email
if (lead.email) {
const searchRes = await fetch(
`https://${FRESHDESK_DOMAIN}/api/v2/contacts/autocomplete?term=${encodeURIComponent(lead.email)}`,
{ headers: { Authorization: `Basic ${btoa(FRESHDESK_API_KEY + ':X')}` } }
);
const existing = await searchRes.json();
if (existing?.length > 0) {
// Update existing contact
await fetch(`https://${FRESHDESK_DOMAIN}/api/v2/contacts/${existing[0].id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
Authorization: `Basic ${btoa(FRESHDESK_API_KEY + ':X')}`,
},
body: JSON.stringify(contact),
});
return;
}
}
// Create new contact
await fetch(`https://${FRESHDESK_DOMAIN}/api/v2/contacts`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Basic ${btoa(FRESHDESK_API_KEY + ':X')}`,
},
body: JSON.stringify(contact),
});
}Routing via n8n or Zapier (No-Code Option)
- In GitLeads, go to Integrations → Webhooks and copy your webhook URL format
- In n8n: create a Webhook node → HTTP Request node pointing to Freshdesk Contacts API
- Map GitLeads fields: lead.name → name, lead.email → email, lead.company → company_name
- Add a filter node to only push leads with a public email (optional but recommended)
- In Zapier: use "Catch Hook" trigger → "Create Contact in Freshdesk" action with field mapping
Custom Fields in Freshdesk
Freshdesk supports custom contact fields. Create these in Admin → Contact Fields for maximum signal visibility: `github_username` (text), `signal_type` (dropdown: stargazer/keyword), `signal_repo` (text), `github_followers` (number). These fields surface in the contact sidebar when your agents view a ticket, giving them instant context on the developer's GitHub activity before responding.
Filtering Which Leads Get Pushed
- Only push leads with a public email to keep your Freshdesk contact list actionable
- Filter by follower count (>50) to prioritize influential developers
- Use repo-based tags to segment stargazers from your repo vs competitor repos
- Add a "do not contact" tag for leads from countries with strict outreach regulations