Why Route GitHub Leads to Canny
Canny is the product feedback and roadmap tool used by developer-focused companies to collect feature requests, track votes, and prioritize what to build next. When GitLeads captures a developer who starred your competitor's repo or mentioned a keyword like "missing feature" or "would love if X supported Y," routing that signal into Canny creates a feedback loop that directly informs your product roadmap.
This is not about turning every lead into a Canny voter. It is about enriching your existing Canny posts with the GitHub identity of developers who are actively evaluating your category — so your product team knows which feature requests come from high-intent buyers versus casual browsers.
Integration Architecture: GitLeads → Canny
Canny does not have a native inbound lead API for creating users from external sources, but it does expose a user identification API and a REST API for creating posts programmatically. The recommended integration path is:
- GitLeads captures a GitHub signal (new star, keyword mention) and fires a webhook
- Your webhook receiver (n8n, Zapier, or custom service) receives the enriched lead payload
- Check if the developer has already engaged with your product (email lookup in your CRM/auth system)
- If known: use Canny user token API to associate their identity with existing posts they may have voted on
- If unknown: create a Canny post on their behalf in a private "GitHub signals" board, tagged with signal type and repo
- Notify your product team in Slack with the developer context — company, GitHub bio, signal trigger
Canny API: Creating Posts from GitHub Signals
// GitLeads webhook → Canny post creation
interface GitLeadsPayload {
username: string;
name: string;
email?: string;
company?: string;
bio?: string;
signal: { type: 'star' | 'keyword'; repo?: string; keyword?: string; context?: string };
}
async function routeLeadToCanny(lead: GitLeadsPayload) {
const CANNY_API_KEY = process.env.CANNY_API_KEY!;
const BOARD_ID = process.env.CANNY_BOARD_ID!;
const signalContext = lead.signal.type === 'star'
? `Starred ${lead.signal.repo}`
: `Mentioned "${lead.signal.keyword}" in GitHub`;
const postTitle = `[${lead.company ?? lead.username}] ${signalContext}`;
const postDetails = [
`GitHub: https://github.com/${lead.username}`,
`Bio: ${lead.bio ?? 'N/A'}`,
`Company: ${lead.company ?? 'N/A'}`,
`Signal: ${lead.signal.context ?? signalContext}`,
].join('\n');
const res = await fetch('https://canny.io/api/v1/posts/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
apiKey: CANNY_API_KEY,
boardID: BOARD_ID,
authorID: 'YOUR_ADMIN_USER_ID',
title: postTitle,
details: postDetails,
}),
});
return res.json();
}What Signals to Route to Canny
Not every GitHub signal warrants a Canny post. Focus on the highest-signal events:
- Keyword hits containing "feature request", "would be nice", "missing", "wish" — direct product feedback
- Issue mentions referencing your product or category — competitor comparison context for product team
- Stars on competitor repos from developers who already use your product — churn risk + feature gap signal
- High-follower developers (500+) starring adjacent tools — influencer-level feedback worth prioritizing
Alternative: Zapier No-Code Workflow
- Trigger: GitLeads webhook (new lead event)
- Filter: Zap filter on signal_type = "keyword" AND keyword contains "feature"
- Action: Canny "Create Post" Zapier action
- Action 2: Slack message to #product-feedback with developer context and GitHub profile link