Why ChartMogul + GitHub Signals
ChartMogul is where developer-tool companies track their MRR, churn, and expansion revenue. But ChartMogul only knows about customers who have already subscribed. GitLeads fills the gap before that: it captures developer intent signals on GitHub — new stars on your repo, competitor repo activity, keyword mentions in issues and PRs — and enriches those developers as pre-customer leads.
By connecting GitLeads to ChartMogul via webhook, you can automatically create or update customer records with GitHub signal context the moment a developer shows buying intent. When they eventually convert, your ChartMogul record already has the full acquisition story.
Integration Architecture
GitLeads pushes enriched lead payloads via webhook. ChartMogul provides a REST API for customer creation and custom attribute management. The integration pattern is: GitLeads webhook → lightweight receiver → ChartMogul API.
// GitLeads → ChartMogul integration
// Receive GitLeads webhook, create/update ChartMogul customer
import express from 'express';
const app = express();
app.use(express.json());
const CHARTMOGUL_API_KEY = process.env.CHARTMOGUL_API_KEY!;
const CHARTMOGUL_DS_UUID = process.env.CHARTMOGUL_DS_UUID!; // Data source UUID
interface GitLeadsPayload {
event: 'lead.created';
lead: {
githubUsername: string;
name: string;
email?: string;
company?: string;
location?: string;
signal: {
type: 'stargazer' | 'keyword';
repo?: string;
keyword?: string;
context?: string;
};
};
}
app.post('/webhooks/gitleads', async (req, res) => {
const payload = req.body as GitLeadsPayload;
const { lead } = payload;
if (!lead.email) {
// ChartMogul requires email; skip or store for later
return res.json({ skipped: true, reason: 'no_email' });
}
// Create customer in ChartMogul
const customer = await fetch(
`https://api.chartmogul.com/v1/customers`,
{
method: 'POST',
headers: {
'Authorization': 'Bearer ' + CHARTMOGUL_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data_source_uuid: CHARTMOGUL_DS_UUID,
external_id: `github-${lead.githubUsername}`,
name: lead.name || lead.githubUsername,
email: lead.email,
company: lead.company,
country: lead.location,
custom: [
{ type: 'String', key: 'github_username', value: lead.githubUsername },
{ type: 'String', key: 'signal_type', value: lead.signal.type },
{ type: 'String', key: 'signal_repo', value: lead.signal.repo ?? '' },
{ type: 'String', key: 'signal_keyword', value: lead.signal.keyword ?? '' },
{ type: 'Timestamp', key: 'lead_captured_at', value: new Date().toISOString() },
],
}),
}
);
const data = await customer.json();
res.json({ chartmogul_uuid: data.uuid });
});Using ChartMogul Custom Attributes for GitHub Signals
ChartMogul custom attributes let you tag customers with any string, integer, timestamp, or boolean field. For GitHub leads, useful attributes include:
- `github_username` — string, used to link back to the source profile
- `signal_type` — "stargazer" or "keyword", segment by acquisition channel
- `signal_repo` — which repo they starred, useful for competitor tracking
- `signal_keyword` — the keyword that triggered capture, indicates use case
- `lead_captured_at` — timestamp, measure time-to-conversion from first signal
- `github_followers` — integer, proxy for developer influence / ICP fit
Handling Existing ChartMogul Customers
If the lead is already a paying ChartMogul customer, use the `/v1/customers?external_id=github-{username}` endpoint to look up the existing record and PATCH it with signal data rather than creating a duplicate. This closes the loop between pre-conversion intent and post-conversion revenue.
// Check if customer exists before creating
async function upsertChartMogulCustomer(lead: GitLeadsPayload['lead']) {
// Try lookup first
const lookup = await fetch(
`https://api.chartmogul.com/v1/customers?external_id=github-${lead.githubUsername}`,
{ headers: { 'Authorization': 'Bearer ' + CHARTMOGUL_API_KEY } }
);
const existing = await lookup.json();
if (existing.total_count > 0) {
const uuid = existing.entries[0].uuid;
// Update custom attributes on existing customer
await fetch(`https://api.chartmogul.com/v1/customers/${uuid}/attributes/custom`, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + CHARTMOGUL_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
custom: [
{ type: 'String', key: 'latest_signal_type', value: lead.signal.type },
{ type: 'Timestamp', key: 'latest_signal_at', value: new Date().toISOString() },
],
}),
});
return uuid;
}
// Create new customer
// ... (creation code above)
}No-Code Option: Zapier or Make
If you prefer no-code, GitLeads supports Zapier and Make (formerly Integromat) as native destinations. Configure a GitLeads → Zapier trigger, then use the ChartMogul Zapier app to create customers or add tags. For Make, use the HTTP module to call ChartMogul's API directly from a GitLeads webhook scenario.