Why GitHub Signals Belong in Totango
Totango is a customer success platform — it tracks account health, product usage, and customer touchpoints. But it has a blind spot: what your customers and prospects are doing on GitHub. When a developer at an existing account stars a competitor repo, that is a churn signal. When a prospect keywords your product name in a GitHub issue, that is a buying signal. GitLeads captures both and pushes them into Totango as touchpoints, account properties, or SuccessBLOC triggers — giving your CS team GitHub context without any manual work.
Integration Architecture: GitLeads → Totango
Totango does not have a native GitHub webhook receiver, but it exposes a REST API for creating touchpoints and updating account/user attributes. GitLeads sends enriched lead payloads via webhook; you route them to Totango using n8n, Zapier, or a lightweight serverless function.
Option 1: GitLeads Webhook → n8n → Totango API
// n8n Function node: transform GitLeads payload → Totango touchpoint
const lead = $input.item.json;
// Map lead to Totango touchpoint
const touchpoint = {
account_id: lead.company?.toLowerCase().replace(/\s+/g, '-') || 'unknown',
touchpoint_type: 'GitHub Signal',
subject: `GitHub signal: ${lead.signal.type} on ${lead.signal.repo}`,
content: lead.signal.context || `New ${lead.signal.type} signal detected`,
timestamp: new Date().toISOString(),
source: 'GitLeads',
attributes: {
github_username: lead.github_username,
github_followers: lead.followers,
github_company: lead.company,
signal_repo: lead.signal.repo,
signal_keyword: lead.signal.keyword || null,
top_languages: lead.top_languages?.join(', '),
},
};
// POST to Totango Touchpoints API
return {
method: 'POST',
url: 'https://api.totango.com/api/v3/touchpoints',
headers: {
'app-token': `${$credentials.totangoApiKey}`,
'Content-Type': 'application/json',
},
body: touchpoint,
};Option 2: GitLeads Webhook → Zapier → Totango
- In GitLeads: create a webhook destination and copy the signing secret
- In Zapier: create a new Zap — trigger: Webhooks by Zapier (Catch Hook)
- Add a Formatter step to map lead fields (github_username, company, signal.repo, signal.type)
- Add a Totango action: "Create Touchpoint" or "Update Account Attribute"
- Map: Account ID → company name or domain, Touchpoint Subject → signal description, Content → signal context text
- Test with a live GitLeads signal, then activate the Zap
Totango Account Attribute Updates via GitLeads
// Direct Totango Attribute Update API call
// Run this in your serverless function receiving GitLeads webhooks
async function syncLeadToTotango(lead: GitLeadsPayload) {
const accountId = extractDomain(lead.email) || lead.company;
const payload = {
account: {
id: accountId,
attributes: {
last_github_signal_date: new Date().toISOString(),
last_github_signal_type: lead.signal.type,
last_github_signal_repo: lead.signal.repo,
github_buyer_intent_score: calculateIntentScore(lead),
},
},
user: {
id: lead.github_username,
account_id: accountId,
attributes: {
github_username: lead.github_username,
github_followers: lead.followers,
github_languages: lead.top_languages?.join(','),
github_bio: lead.bio,
},
},
};
await fetch('https://api.totango.com/api/v1/attributes/update', {
method: 'POST',
headers: {
'app-token': process.env.TOTANGO_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
}
function calculateIntentScore(lead: GitLeadsPayload): number {
let score = 0;
if (lead.signal.type === 'keyword') score += 30;
if (lead.signal.type === 'stargazer') score += 20;
if (lead.followers > 500) score += 20;
if (lead.email) score += 30;
return Math.min(score, 100);
}Totango SuccessBLOC Triggers from GitHub Signals
Once GitHub signal attributes are flowing into Totango, you can create SuccessBLOC playbooks that trigger on them. For example: when last_github_signal_type equals "stargazer" on a competitor repo, trigger a CS check-in playbook. When github_buyer_intent_score exceeds 70 for a free-tier user, trigger an expansion outreach. When a prospect company shows a keyword signal, create a new touchpoint and alert the AE.