Airtable combines the flexibility of a spreadsheet with relational database power. For developer-focused GTM teams, it's a natural fit: you can model leads, signals, and outreach stages in a single base while using Airtable automations and views to manage the workflow.
GitLeads captures GitHub buying signals — new stars on repos you track and keyword mentions in issues/PRs/discussions — then enriches each developer profile and delivers the data via webhook. With a small integration, every new signal lands as a record in your Airtable base.
Airtable Base Schema for GitHub Leads
- Name (Single line text) — developer name
- GitHub Username (Single line text) — unique identifier for dedup
- Email (Email) — for outreach
- Company (Single line text)
- Location (Single line text)
- Followers (Number)
- Signal Type (Single select) — "stargazer" or "keyword"
- Signal Context (Long text) — repo name or matched keyword + snippet
- Profile URL (URL)
- Detected At (Date)
- Status (Single select) — New / Contacted / Qualified / Passed
- Notes (Long text)
Webhook Handler: GitLeads → Airtable
const AIRTABLE_API_URL = 'https://api.airtable.com/v0';
const BASE_ID = process.env.AIRTABLE_BASE_ID!;
const TABLE_NAME = 'GitHub Leads';
interface GitLeadsPayload {
username: string;
name?: string;
email?: string;
company?: string;
location?: string;
followers: number;
signal_type: 'stargazer' | 'keyword';
signal_context: string;
profile_url: string;
detected_at: string;
}
async function pushToAirtable(payload: GitLeadsPayload) {
const searchRes = await fetch(
`${AIRTABLE_API_URL}/${BASE_ID}/${encodeURIComponent(TABLE_NAME)}?filterByFormula=${encodeURIComponent(`{GitHub Username}="${payload.username}"`)}`,
{ headers: { Authorization: `Bearer ${process.env.AIRTABLE_TOKEN}` } }
);
const existing = await searchRes.json();
if (existing.records?.length > 0) return;
await fetch(
`${AIRTABLE_API_URL}/${BASE_ID}/${encodeURIComponent(TABLE_NAME)}`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.AIRTABLE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
fields: {
Name: payload.name ?? payload.username,
'GitHub Username': payload.username,
Email: payload.email ?? '',
Company: payload.company ?? '',
Location: payload.location ?? '',
Followers: payload.followers,
'Signal Type': payload.signal_type,
'Signal Context': payload.signal_context,
'Profile URL': payload.profile_url,
'Detected At': payload.detected_at,
Status: 'New',
},
}),
}
);
}Deploying the Handler
Deploy this handler as a Vercel Edge Function, Cloudflare Worker, or AWS Lambda. The URL becomes your GitLeads webhook destination. GitLeads will POST the enriched lead payload to it on every new signal event.
# Vercel one-liner
vercel deploy --prod
# Set env vars
vercel env add AIRTABLE_TOKEN
vercel env add AIRTABLE_BASE_IDAirtable Views for Signal-Based GTM
- New Signals (today) — filter Detected At = today, grouped by Signal Type
- High-Value Prospects — filter Followers > 500 AND Status = New
- Competitor Stargazers — filter Signal Context contains your competitor repo name
- Keyword Mentions — filter Signal Type = keyword, sorted by Detected At desc
- Outreach Pipeline — Kanban grouped by Status
Airtable Automations
Airtable's built-in automations can trigger downstream actions when a new lead lands. Examples:
- Send a Slack message when a high-follower developer stars your repo
- Create a HubSpot contact via Airtable → HubSpot automation when Status changes to Qualified
- Assign a team member to a new lead based on company location
- Post a daily digest email summarizing new signals captured in the last 24 hours
Using Make or Zapier Instead
GitLeads also integrates natively with Make (formerly Integromat) and Zapier. In Make, create a scenario: "Watch GitLeads webhook" → "Create Airtable Record". Map the payload fields to your base columns. Zapier works identically with a Webhooks by Zapier trigger and an Airtable "Create Record" action.