Salesloft is built around cadences — structured outreach sequences that sales reps run to engage prospects. The problem for developer-tool companies is that traditional lead sources (form fills, website visitors) miss the bulk of developer buying signals. Developers signal intent on GitHub: starring repos, opening issues, comparing tools in pull request comments. GitLeads captures those signals and delivers them straight into Salesloft so your cadences fire at the right moment.
The Developer Buying Signal Gap in Salesloft
If you sell to developers, your Salesloft pipeline is probably thin at the top of funnel because developers do not fill out web forms. They evaluate tools by reading READMEs, starring repos, and asking questions in GitHub Discussions. None of that activity reaches your CRM unless you explicitly capture it. GitLeads is the bridge: it monitors GitHub for signals matching your tracked repos and keywords, enriches each signal with professional profile data, and delivers it to Salesloft as a new Person ready to be enrolled in a cadence.
Integration Architecture
GitLeads sends enriched lead data to a webhook endpoint you control. From there, you call the Salesloft REST API to create a Person and optionally enroll them in a cadence. Salesloft requires an API key (Settings > API > Create API Key) with `write:people` and `write:cadence_memberships` scopes.
// Route: POST /api/webhooks/gitleads-salesloft
import type { NextRequest } from 'next/server';
const SL_BASE = 'https://api.salesloft.com/v2';
const SL_KEY = process.env.SALESLOFT_API_KEY!;
const CADENCE_ID = process.env.SALESLOFT_CADENCE_ID!; // from Salesloft UI
interface GitLeadsLead {
github_username: string;
name: string | null;
email: string | null;
company: string | null;
bio: string | null;
location: string | null;
followers: number;
top_languages: string[];
signal_type: 'stargazer' | 'keyword';
signal_context: string;
repo: string;
}
async function salesloftPost(path: string, body: object) {
const res = await fetch(`${SL_BASE}${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${SL_KEY}`,
},
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`Salesloft ${path} failed: ${res.status}`);
return res.json();
}
export async function POST(req: NextRequest) {
const lead: GitLeadsLead = await req.json();
if (!lead.email) {
// Salesloft requires an email; skip if not available
return Response.json({ skipped: true, reason: 'no_email' });
}
// 1. Create the Person in Salesloft
const { data: person } = await salesloftPost('/people', {
email_address: lead.email,
first_name: lead.name?.split(' ')[0] ?? lead.github_username,
last_name: lead.name?.split(' ').slice(1).join(' ') ?? '',
company_name: lead.company ?? '',
title: lead.bio?.slice(0, 80) ?? '',
city: lead.location ?? '',
custom_fields: {
github_username: lead.github_username,
signal_type: lead.signal_type,
signal_context: lead.signal_context.slice(0, 255),
tracked_repo: lead.repo,
top_languages: lead.top_languages.join(', '),
followers: lead.followers,
},
});
// 2. Enroll in cadence
await salesloftPost('/cadence_memberships', {
person_id: person.id,
cadence_id: parseInt(CADENCE_ID),
});
return Response.json({ ok: true, salesloft_person_id: person.id });
}Custom Fields in Salesloft
Before deploying, add custom fields in Salesloft Admin > Field Configuration > People: `github_username`, `signal_type`, `signal_context`, `tracked_repo`, `top_languages`, `followers`. These fields appear in the Person record and can be used as cadence filters — for example, enroll only into the "Competitor Stargazer" cadence when `signal_type = stargazer` and `tracked_repo` contains a competitor repo name.
Cadence Strategy for GitHub Signals
- Stargazer cadence (3 steps, 7 days): Step 1 — personalized LinkedIn connection referencing the starred repo. Step 2 — email referencing their top language and use case. Step 3 — breakup email with direct trial link.
- Keyword cadence (high-intent, 2 steps, 3 days): Step 1 — email that quotes the exact GitHub signal context ("Saw you mentioned X in the issue on Y repo"). Step 2 — direct meeting booking link.
- Competitor stargazer cadence (4 steps, 14 days): Longer nurture that positions GitLeads against the competitor product the developer was evaluating.
No-Code Option via Zapier
GitLeads integrates with Zapier natively. Set your GitLeads destination to Zapier, then build a Zap: Trigger = Webhooks → Action 1 = Salesloft: Create Person → Action 2 = Salesloft: Add to Cadence. Map signal_context to a custom field and use a Zapier Filter step to skip leads without email addresses.