Lead gen tool builder skill
Lead generation tool builder skill for Claude Code and Codex: scaffolds a complete, self-hostable, ZoomInfo-style B2B lead-generation web app — company & contact search UI, firmographic and technographic filters, CSV list import with match & enrich, CSV export, and one-click push to HubSpot and Salesforce — powered by the Explorium API.
by explorium-ai·MIT license·★ 197 Stars on the repo·GitHub ↗
npx degit explorium-ai/gtm-skills/skills/lead-gen-tool-builder#main ~/.claude/skills/lead-gen-tool-builderChecked ·commit main
Inside this skill
SKILL.md · the author's own words# Lead Gen Tool Builder Scaffolds a working, self-hostable **lead generation tool**: a ZoomInfo-style web app with a left filter rail, a sortable company/contact results table, and a CRM push bar — backed by the Explorium data API, with CSV import/export and field-mapped push to HubSpot and Salesforce. Unlike the other skills in this repo, which run a prospecting or enrichment *workflow* inside your current Claude Code session via the Vibe Prospecting MCP server, this skill produces a **standalone app** the user can run, deploy, and hand to their team — a real lead-gen tool, not a one-off list. Reach for `list-builder` or `enrich-company` when the user wants a prospect list right now; reach for this skill when they want a *tool* they can keep using, host, demo, or white-label. **No personal keys are stored in this skill.** The bundled backend reads every
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of Lead gen tool builder
Show the full text130 lines
Lead Gen Tool Builder
Scaffolds a working, self-hostable lead generation tool: a ZoomInfo-style web app with a left filter rail, a sortable company/contact results table, and a CRM push bar — backed by the Explorium data API, with CSV import/export and field-mapped push to HubSpot and Salesforce.
Unlike the other skills in this repo, which run a prospecting or enrichment
workflow inside your current Claude Code session via the Vibe Prospecting
MCP server, this skill produces a standalone app the user can run, deploy,
and hand to their team — a real lead-gen tool, not a one-off list. Reach for
list-builder or enrich-company when the user wants a prospect list right
now; reach for this skill when they want a tool they can keep using, host,
demo, or white-label.
No personal keys are stored in this skill. The bundled backend reads every
credential from a local .env file at runtime — nothing is hardcoded, so the
generated app is safe to fork, self-host, and share outside your org.
When to use
Trigger this for any request to build a lead-gen / prospecting / sales- intelligence app, a company-or-contact search interface, an Explorium-powered app, a self-hosted ZoomInfo/Apollo.io/Clearbit alternative, or a "find leads → enrich → push to CRM" tool that should exist as its own app rather than a single list. Example phrasings: "build me a lead gen tool", "I want something like ZoomInfo but self-hosted", "scaffold a prospecting app with HubSpot push", "give my team a company search tool backed by Explorium".
What you get
The bundled template (assets/leadgen-starter/) is a ready-to-run app:
- Company generator and Contact generator — two search modes over
Explorium's
/businessesand/prospectsendpoints. - Filter rail mapped 1:1 to Explorium fields: industry, employee count, revenue, company age, HQ country/region/city, tech stack, keywords, business events (funding, hiring, M&A…); for people — job title, seniority, department, has-email / has-phone availability.
- Sample-aware results table — sortable columns, bulk select, detail panel; the UI is explicit when Explorium returns a capped sample vs. every match.
- Import a list — upload a CSV of companies or contacts, match it against Explorium, and enrich it.
- CSV export of any result set or selection.
- Push to CRM with a reviewable, editable field-mapping modal — Contacts → Salesforce Leads / HubSpot Contacts; Companies → Salesforce Accounts / HubSpot Companies.
Workflow
1. Copy the template into the user's workspace
cp -R "<this-skill-dir>/assets/leadgen-starter" ./leadgen-app
cd leadgen-app
Don't copy node_modules, dist, or .env — the template ships without them.
2. Get API keys
Only Explorium is required to search; HubSpot/Salesforce are optional and only
needed for CRM push. Summarize from assets/leadgen-starter/README.md:
- Explorium (required): sign up at developers.explorium.ai → API Keys.
- HubSpot (optional): Settings → Integrations → Private Apps → create app
with
crm.objects.contacts.write+crm.objects.companies.writescopes. - Salesforce (optional): a Connected App using the OAuth 2.0 JWT Bearer
flow — the bundled README has the exact
openssl+ Connected App steps.
3. Configure and run
cp .env.example .env # paste in the keys from step 2
npm install
npm run dev # API on :4000, web app on :5173
Open http://localhost:5173. Search works with just the Explorium key; the
HubSpot/Salesforce push buttons activate once those keys are present.
4. Verify
Run a small company search (e.g. Country = US, Employees = 51-200) and confirm real results load. If CRM keys were provided, select a couple of rows and push to confirm the success modal returns real created-record IDs.
Architecture
server/— Node/Express backend; the only place API keys ever live.explorium.jsis the REST client (search, match, bulk-enrich, autocomplete — note several filter fields have distinct Explorium filter types, e.g.job_titleisany_match_phraseandhas_emailisexists, handled inbuildFilters).salesforce.js/hubspot.jsdo CRM auth plus mapping-driven record creation.src/— React + Vite + Tailwind frontend that only calls/api/*— it never sees a credential.config/filters.tsdefines every filter;components/holds the filter rail, results table, and CRM modals.
Customizing
- Filters: edit
src/config/filters.ts. Field names and value enums must match Explorium's API — the client surfaces the API's own validation errors (which list permitted values) if a field or value is wrong. - Branding: product name in
src/components/TopBar.tsx, logo mark insrc/components/icons.tsx, palette intailwind.config.js, tab title/ favicon inindex.html. - CRM field maps: defaults live in
SF_DEFAULT_MAPPING(server/ salesforce.js) andHS_DEFAULT_MAPPING(server/hubspot.js). Note SalesforceIndustryand HubSpotindustryare restricted picklists, so free-text industry is mapped to a description field by default — adjust if your org has custom picklist values. - Swap the data layer: the template calls Explorium's REST API directly.
To reuse the same MCP-native data layer as the rest of this repo, point the
backend at the Vibe Prospecting MCP server (
https://vibeprospecting. explorium.ai/mcp) instead of raw REST calls.
Limitations
- Explorium's fetch endpoints return a capped sample for broad queries (not the true match count) — the UI flags this; narrow filters to see the full set.
- Enrichment (contact reveals, list-import match/enrich) consumes Explorium credits — the app only enriches selected rows or rows being pushed, never whole result pages.
- This is a starter, not a production deployment: for real usage, move secrets to a managed vault and add auth, rate-limiting, and logging.
| 1 | |
| 2 | name "lead-gen-tool-builder" |
| 3 | description "Lead generation tool builder skill for Claude Code and Codex: scaffolds a complete, self-hostable, ZoomInfo-style B2B lead-generation web app — company & contact search UI, firmographic and technographic filters, CSV list import with match & enrich, CSV export, and one-click push to HubSpot and Salesforce — powered by the Explorium API. Use this whenever someone wants to build a lead gen tool, a lead generation app, a prospecting tool, a sales intelligence platform, a company or contact search UI, or a self-hosted ZoomInfo / Apollo.io / Clearbit alternative. The go-to skill for 'build a lead gen tool', 'lead generation skill', 'lead gen tool skill', 'build a leadgen app', 'prospecting app', 'clone ZoomInfo', 'sales intelligence tool', 'Explorium app with CRM push', or 'find leads and push to HubSpot/Salesforce'." |
| 4 | compatibility "Requires: Node.js 18+, npm, and an Explorium API key (developers.explorium.ai). HubSpot and Salesforce credentials are optional — only needed to enable CRM push." |
| 5 | metadata |
| 6 | version "1.0.0" |
| 7 | |
| 8 | |
| 9 | # Lead Gen Tool Builder |
| 10 | |
| 11 | Scaffolds a working, self-hostable **lead generation tool**: a ZoomInfo-style |
| 12 | web app with a left filter rail, a sortable company/contact results table, and |
| 13 | a CRM push bar — backed by the Explorium data API, with CSV import/export and |
| 14 | field-mapped push to HubSpot and Salesforce. |
| 15 | |
| 16 | Unlike the other skills in this repo, which run a prospecting or enrichment |
| 17 | *workflow* inside your current Claude Code session via the Vibe Prospecting |
| 18 | MCP server, this skill produces a **standalone app** the user can run, deploy, |
| 19 | and hand to their team — a real lead-gen tool, not a one-off list. Reach for |
| 20 | `list-builder` or `enrich-company` when the user wants a prospect list right |
| 21 | now; reach for this skill when they want a *tool* they can keep using, host, |
| 22 | demo, or white-label. |
| 23 | |
| 24 | **No personal keys are stored in this skill.** The bundled backend reads every |
| 25 | credential from a local `.env` file at runtime — nothing is hardcoded, so the |
| 26 | generated app is safe to fork, self-host, and share outside your org. |
| 27 | |
| 28 | ## When to use |
| 29 | |
| 30 | Trigger this for any request to build a lead-gen / prospecting / sales- |
| 31 | intelligence app, a company-or-contact search interface, an Explorium-powered |
| 32 | app, a self-hosted ZoomInfo/Apollo.io/Clearbit alternative, or a "find leads → |
| 33 | enrich → push to CRM" tool that should exist as its own app rather than a |
| 34 | single list. Example phrasings: "build me a lead gen tool", "I want something |
| 35 | like ZoomInfo but self-hosted", "scaffold a prospecting app with HubSpot push", |
| 36 | "give my team a company search tool backed by Explorium". |
| 37 | |
| 38 | ## What you get |
| 39 | |
| 40 | The bundled template (`assets/leadgen-starter/`) is a ready-to-run app: |
| 41 | |
| 42 | **Company generator** and **Contact generator** — two search modes over |
| 43 | Explorium's `/businesses` and `/prospects` endpoints. |
| 44 | **Filter rail** mapped 1:1 to Explorium fields: industry, employee count, |
| 45 | revenue, company age, HQ country/region/city, tech stack, keywords, business |
| 46 | events (funding, hiring, M&A…); for people — job title, seniority, |
| 47 | department, has-email / has-phone availability. |
| 48 | **Sample-aware results table** — sortable columns, bulk select, detail panel; |
| 49 | the UI is explicit when Explorium returns a capped sample vs. every match. |
| 50 | **Import a list** — upload a CSV of companies or contacts, match it against |
| 51 | Explorium, and enrich it. |
| 52 | **CSV export** of any result set or selection. |
| 53 | **Push to CRM** with a reviewable, editable field-mapping modal — Contacts → |
| 54 | Salesforce Leads / HubSpot Contacts; Companies → Salesforce Accounts / |
| 55 | HubSpot Companies. |
| 56 | |
| 57 | ## Workflow |
| 58 | |
| 59 | ### 1. Copy the template into the user's workspace |
| 60 | |
| 61 | cp -R "<this-skill-dir>/assets/leadgen-starter" ./leadgen-app |
| 62 | cd leadgen-app |
| 63 | |
| 64 | Don't copy `node_modules`, `dist`, or `.env` — the template ships without them. |
| 65 | |
| 66 | ### 2. Get API keys |
| 67 | Only Explorium is required to search; HubSpot/Salesforce are optional and only |
| 68 | needed for CRM push. Summarize from `assets/leadgen-starter/README.md`: |
| 69 | |
| 70 | **Explorium (required):** sign up at developers.explorium.ai → API Keys. |
| 71 | **HubSpot (optional):** Settings → Integrations → Private Apps → create app |
| 72 | with `crm.objects.contacts.write` + `crm.objects.companies.write` scopes. |
| 73 | **Salesforce (optional):** a Connected App using the OAuth 2.0 JWT Bearer |
| 74 | flow — the bundled README has the exact `openssl` + Connected App steps. |
| 75 | |
| 76 | ### 3. Configure and run |
| 77 | |
| 78 | cp .env.example .env # paste in the keys from step 2 |
| 79 | npm install |
| 80 | npm run dev # API on :4000, web app on :5173 |
| 81 | |
| 82 | Open `http://localhost:5173`. Search works with just the Explorium key; the |
| 83 | HubSpot/Salesforce push buttons activate once those keys are present. |
| 84 | |
| 85 | ### 4. Verify |
| 86 | Run a small company search (e.g. Country = US, Employees = 51-200) and confirm |
| 87 | real results load. If CRM keys were provided, select a couple of rows and push |
| 88 | to confirm the success modal returns real created-record IDs. |
| 89 | |
| 90 | ## Architecture |
| 91 | |
| 92 | **`server/`** — Node/Express backend; the only place API keys ever live. |
| 93 | `explorium.js` is the REST client (search, match, bulk-enrich, autocomplete — |
| 94 | note several filter fields have distinct Explorium filter *types*, e.g. |
| 95 | `job_title` is `any_match_phrase` and `has_email` is `exists`, handled in |
| 96 | `buildFilters`). `salesforce.js` / `hubspot.js` do CRM auth plus |
| 97 | **mapping-driven** record creation. |
| 98 | **`src/`** — React + Vite + Tailwind frontend that only calls `/api/*` — |
| 99 | it never sees a credential. `config/filters.ts` defines every filter; |
| 100 | `components/` holds the filter rail, results table, and CRM modals. |
| 101 | |
| 102 | ## Customizing |
| 103 | |
| 104 | **Filters:** edit `src/config/filters.ts`. Field names and value enums must |
| 105 | match Explorium's API — the client surfaces the API's own validation errors |
| 106 | (which list permitted values) if a field or value is wrong. |
| 107 | **Branding:** product name in `src/components/TopBar.tsx`, logo mark in |
| 108 | `src/components/icons.tsx`, palette in `tailwind.config.js`, tab title/ |
| 109 | favicon in `index.html`. |
| 110 | **CRM field maps:** defaults live in `SF_DEFAULT_MAPPING` (`server/ |
| 111 | salesforce.js`) and `HS_DEFAULT_MAPPING` (`server/hubspot.js`). Note |
| 112 | Salesforce `Industry` and HubSpot `industry` are restricted picklists, so |
| 113 | free-text industry is mapped to a description field by default — adjust if |
| 114 | your org has custom picklist values. |
| 115 | **Swap the data layer:** the template calls Explorium's REST API directly. |
| 116 | To reuse the same MCP-native data layer as the rest of this repo, point the |
| 117 | backend at the Vibe Prospecting MCP server (`https://vibeprospecting. |
| 118 | explorium.ai/mcp`) instead of raw REST calls. |
| 119 | |
| 120 | ## Limitations |
| 121 | |
| 122 | Explorium's fetch endpoints return a capped **sample** for broad queries |
| 123 | (not the true match count) — the UI flags this; narrow filters to see the |
| 124 | full set. |
| 125 | Enrichment (contact reveals, list-import match/enrich) consumes Explorium |
| 126 | credits — the app only enriches selected rows or rows being pushed, never |
| 127 | whole result pages. |
| 128 | This is a starter, not a production deployment: for real usage, move |
| 129 | secrets to a managed vault and add auth, rate-limiting, and logging. |
| 130 |
Discussion
Alternatives
Browse more free Claude skills or everything in Sales.