WizCodes
WorkAbout
WizCodes

Production-ready web platforms, mobile apps, and AI systems. Based in Ahmedabad, India.

Serving clients in US · UK · Canada · Europe

hello@wizcodes.site
Ahmedabad, India · Est. 2025

Services

ServicesWeb DevelopmentMobile AppsAI AutomationMVP DevelopmentUI/UX DesignHire DevelopersIndustries we servePricingWhat drives the cost

Company

WorkAboutDivya Patel, founderWorking across bordersContact

Resources

BlogComparisonsOpen SourceFAQTestimonials
Listed on
ClutchGoodFirmsThe Manifest
MSME CertifiedDUNS RegisteredGDPR & DPDP256-bit TLS100% code ownership
© 2026 WizCodes. All rights reserved.Ahmedabad, India — Global Clients
Privacy·Terms
Work/AI Lead Generation Agent

AI·Sales & Marketing·GB

AI Lead Generation Agent

An agent that finds a prospect, reads their site, writes them a specific proposal, and sends it — with nobody in the loop.

Our role
Product · Backend · AI orchestration · Deployment
Platforms
Web
  • Python
  • LangGraph
  • Playwright
  • FastAPI
  • SMTP
Run #48216 nodes · dedupe: no prior contact
  1. Discover1.2snorthwind-example.com
  2. Classify0.8sB2B logistics · 20–50 staff
  3. Enrich2.4sContact + role resolved
  4. Qualify0.6sScore 82 · proceed
  5. Compose—Proposal drafted from site context
  6. Send—Queued for SMTP
Statepersisted · resumable
  • Zerohuman touchDiscovery through delivery, unattended
  • Personalisedat scaleEach proposal written from that prospect’s site
  • End-to-endautomationScrape, qualify, write, send, log
  • Resumablegraph stateA failed node retries without restarting the run

At a glance

Business problem
Finding prospects, researching each one, and writing a proposal that is actually about them is slow, repetitive work that scales only by hiring. The AI Lead Generation Agent was built to run that entire sequence without a person in it.
Technical challenges
The AI Lead Generation Agent has to read sites that only exist after JavaScript runs, survive anti-bot measures across wildly different domains, decide whether a prospect is worth contacting, and write outreach specific enough to be worth reading — all without per-domain maintenance.
Engineering solution
The AI Lead Generation Agent runs as a LangGraph state machine where a classifier node identifies the site type first and routes it to the right extraction strategy, then an LLM writes a proposal from the extracted context and SMTP delivers it, with every step logged and deduplicated.
Core features
Autonomous scraping of JavaScript-rendered sites. Site classification that routes extraction strategy. Lead enrichment for contact, role and company context. LLM-written proposals grounded in the prospect’s own site. Automated email delivery. Deduplication against previously contacted prospects. Scheduled and on-demand runs with a monitoring dashboard.
Architecture
LangGraph Agent→Playwright→LLM→SMTP→Monitoring Dashboard
Technical highlights
A classifier node runs first, so per-domain engineering is close to zero. LangGraph holds run state, so a failed node retries instead of restarting the run. Deduplication is persistent, so no prospect is contacted twice across runs. Playwright with randomised fingerprinting handles JavaScript-heavy pages.
Business value
The AI Lead Generation Agent turns prospecting from a headcount problem into a scheduling one. The work that scaled by hiring now scales by running more often.

On this page

  1. At a glance
  2. The problem
  3. The constraints
  4. How we built it
  5. Pipeline in motion
  6. What shipped
  7. The decisions that mattered
  8. Questions buyers ask

The problem

Prospecting is three jobs that look like one. Find companies worth contacting. Work out enough about each to say something specific. Write to them.

The first is tedious, the second is slow, and the third is where most outreach quietly fails — because at volume it stops being specific. A message that could have been sent to a thousand companies gets treated like one that was.

The brief was to automate all three. Not to draft messages for a human to send. To run the whole sequence, unattended, and put an email in an inbox at the end of it.

The constraints

The input is the open web. Not an API, not a dataset. Real sites, many of which only exist after JavaScript has run, some of which actively resist being read.

No per-domain maintenance. The obvious way to scrape reliably is to write an extractor per site. That works for ten domains and collapses at a hundred. Whatever we built had to generalise, or it would become a full-time job.

Specific or nothing. Outreach that is not obviously about the recipient is worse than no outreach — it costs the sender's domain reputation and gets nothing back. The bar was not "personalised", it was "could only have been written to this company".

Any autonomous system that touches the open web will fail regularly. The design question is whether a failure costs one prospect or the whole run.

How we built it

A LangGraph state machine, one node per stage, with the run's state persisted between them.

How one prospect moves from a URL to a sent proposal. Architecture flow: LangGraph Agent then Playwright then LLM then SMTP then Monitoring Dashboard.
scroll →
How one prospect moves from a URL to a sent proposal

The decision that made the whole thing tractable: a classifier node runs first. Before any extraction is attempted, a node reads the page and decides what kind of site it is — agency, SaaS, e-commerce, local service — and routes to the extraction strategy for that shape.

That inverts the maintenance problem. Instead of an extractor per domain, there are a handful of extractors per site type, and a new domain that resembles one of them needs no work at all. Per-domain engineering goes to roughly zero, which was the constraint that mattered most.

Playwright with randomised fingerprinting handles the JavaScript-rendered pages. The LLM writes the proposal from what was actually extracted, so the specificity is grounded in something read rather than invented. Deduplication is persistent across runs, so a prospect contacted last month is not contacted again this month.

Pipeline in motion

Run #48216 nodes · dedupe: no prior contact
  1. Discover1.2snorthwind-example.com
  2. Classify0.8sB2B logistics · 20–50 staff
  3. Enrich2.4sContact + role resolved
  4. Qualify0.6sScore 82 · proceed
  5. Compose—Proposal drafted from site context
  6. Send—Queued for SMTP
Statepersisted · resumable
  • Classify before extractThe node that removed per-domain maintenance. Site type decides strategy, so a new domain usually needs no work.
  • Qualify is a gateA score below threshold ends this prospect here. Cheaper to stop than to write a proposal nobody should receive.
  • Compose from contextThe LLM writes from what was actually read on the site. Nothing is invented to fill a template slot.
  • State persistedA node that fails retries from its own step. One bad site costs one prospect, never the run.
One run, six nodes, and the four design decisions visible in the trace

The per-node timings matter more than they look. When a run slows down it is almost always extraction, not inference — and knowing that without guessing is the difference between tuning the right thing and rewriting the wrong one.

What shipped

  • Autonomous scraping of JavaScript-rendered sites via Playwright
  • A classifier node routing extraction by site type
  • Lead enrichment for contact, role and company context
  • LLM-written proposals grounded in the prospect's own site
  • Automated email delivery over SMTP
  • Persistent deduplication across runs
  • Scheduled and on-demand execution
  • A monitoring dashboard over run history

The decisions that mattered

Classify first. Covered above, and the single decision the project rests on. Without it this is a scraper with a maintenance burden that grows with every customer.

LangGraph over plain orchestration. The pipeline needs each node to inspect prior output and branch on it — qualify decides whether compose runs at all. A stateful graph makes that the normal case rather than a pile of conditionals, and it is what makes a failed node resumable.

Degrade per prospect, not per run. A run processes many prospects. Letting one unreadable site end the batch would make the agent least useful exactly when the input is most varied.

Ground the writing, do not template it. A template with variables substituted in is detectable and ignored. Writing from extracted context costs more per prospect and is the only version worth sending.

If you are weighing something similar, seven workflows worth automating first covers where to start, and adding an AI agent to your product covers the orchestration layer. Our AI automation work is where these usually begin.

In the client’s words

Working with WizCodes was a fantastic experience. They built our Jungle Jump game and AI Lead Generation Agent exactly as discussed, with excellent communication and fast delivery throughout the project. The quality, performance, and attention to detail exceeded our expectations. Highly recommended for anyone looking for reliable web, AI, or game development services.
Jodie WayattUnited Kingdom · via WhatsApp

Questions buyers ask

Is automated outreach legal?

It depends on your market and how you source contacts — GDPR and similar rules apply to the data, not to the automation. That is a scoping conversation before any build, not an afterthought.

Does AI-written outreach actually read as personal?

Only when it is grounded in something real. Proposals here are written from what the agent actually read on the prospect’s site, which is what separates specific outreach from a mail merge with a first name in it.

What happens when a site blocks the scraper?

That prospect fails and the run continues. The graph is built so one bad node degrades the run instead of ending it, which matters when the input is the open web.

Could we run this on our own prospect list?

Yes — a list you already own removes the discovery step entirely and leaves the research and writing, which is usually where the time actually goes.

wizcodes.site/get-startedAccepting projects

Start something similar

Every project is delivered end to end and handed over to your own accounts — you own all of it. We'll show you a free prototype before you commit.

Get a free prototype AI Automation

More work

  • CuePilot
  • Cyber Agent

Related reading

  • The automation audit: 7 workflows to start with
  • How to add an AI agent to your product