A live audit of what the lead engine actually did, why it produced nothing, and the full free-and-open-source pipeline that replaces it — from crawling a lead to signing a contract.
Queried directly against the production MongoDB and the Brevo API on 25 July 2026. Every number below came out of a live query, not a report.
| Collection | Rows | What it means |
|---|---|---|
| leads | 271,062 | 58,770 graded A · 53,069 still raw · 12,529 new · 146,694 with no status at all |
| companies | 44,648 | Deduped org records |
| contacts | 46,284 | Every single one has a null status — nothing was ever worked |
| enrollments | 1,313 | All "active". None ever advanced a step |
| send_events | 149,200 | 147,195 dry-run · 2,005 skipped (missing-email) · 0 sent |
| signals | 11,877 | All null type — the signal collector writes rows with no signal in them |
| call_events | 29 | All from 23 June, all outcome "new". Nobody dialed |
| sequences | 1 | "Behavioral Health — Insurance Billing (cold)". sent [0,0,0] · opened [0,0,0] · replied [0,0,0] |
| Field | Value |
|---|---|
| Address | hello@getmaxrcmhq.com |
| Provider | brevo |
| Daily cap / warmup | 50 / 10 |
| Status | warming since 21 June 2026 |
| Sent today | 0 — and the counter's date field still says 2026-06-21 |
The Brevo key is alive, not dead as previously recorded. But what it sent is not outreach:
| Requests | Delivered | Unique opens | Clicks | Hard bounces | Unsubs | Errors |
|---|---|---|---|---|---|---|
| 369 | 348 | 188 | 4 | 5 | 3 | 14 |
369 emails in a month, at a 54% unique open rate. That's product and internal mail — app notifications, our own team. It is not a cold campaign, and it never touched the 271,062 leads.
| Process | State | Relevant to sales? |
|---|---|---|
| wapp-gateway | online | Yes — WhatsApp rail is the only live outbound channel |
| max-mind / max-evolve | online | Brain, not sales |
| omniroute | online | LLM gateway on :20128 |
| oci-hunter, maya-watchdog, wapp-profiler, wapp-monitor-proxy | online | No |
| wapp-followup | stopped | Yes — the follow-up engine is off |
| wapp-supervisor, siva-nudge, wapp-daily-greetings | stopped | Yes — all nudge rails off |
| n8n | stopped (917 restarts) | Yes — the automation glue is dead |
| ai-router | stopped (133 restarts) | No |
No lead engine, no sequencer, no dialer is running. The last engine heartbeat was enrich-website on 24 July at 16:35 — 300 records processed, 290 boosted. That's enrichment, not outreach.
The tracking schema is there — send_events, per-step sent/opened/replied counters, a signals collection. The tracking data is empty, and has always been empty. There is no open pixel wired, no click redirect, no IMAP reader, no reply webhook. Even if a real email went out tomorrow, nothing would come back.
Ranked by how much each one alone would have been fatal.
| # | Cause | Evidence |
|---|---|---|
| 1 | The engine never left dry-run. It writes status:"dry-run" and moves on. There is no live send path being exercised at all. | 147,195 / 149,200 events |
| 2 | getmaxrcmhq.com has no MX record. Replies to hello@getmaxrcmhq.com have nowhere to land. Receiving mail servers also read a missing MX as a throwaway domain and score it down. | MX lookup returns empty |
| 3 | Brevo is the wrong rail for cold email. Brevo's terms require opt-in lists. Sending 45K cold through it gets the account suspended, which also kills the transactional mail the products depend on. | provider: brevo, cap 50/day |
| 4 | AWS SES is in sandbox and broken. 200/day cap, 1 email/sec, and it can only send to verified addresses. The getmaxsolutions.com domain identity is FAILED. | Max24HourSend: 200 |
| 5 | Contacts were enrolled before being verified. 2,005 events skipped with reason "missing-email" — the sequencer discovers the email is missing at send time instead of at enrichment time. | skipReason: missing-email |
| 6 | Nobody dialed. The call queue was built on 23 June with 29 rows and never touched again. There are no Twilio or SIP credentials anywhere in the Crew environment. | 29 events, all "new" |
This was never a sales system that underperformed. It was a data-collection system with a sales interface bolted on, and the send button was wired to a log line. The 271,062 leads are real work and worth keeping. The application on top of them delivered nothing.
Thirteen stages from "we don't know who to sell to" through to "money in the bank". For each: the free tool that does it, the AI that improves it, and honestly where we stand.
| # | Stage | Free / OSS tool | AI agent job | Our state |
|---|---|---|---|---|
| 0 | Define the ICP Who, what size, what pain, what trigger | A markdown file. Genuinely. | Read closed-won and closed-lost, propose the ICP that actually converts | partial written for RCM, not for the IT division |
| 1 | Source Turn the ICP into raw rows | NPPES bulk file, Crawl4AI, Katana, SearXNG, Overpass API, Common Crawl | Turn "solo behavioral health, Texas, 1–5 providers" into the right queries and registries automatically | works 271K rows prove it |
| 2 | Enrich Website, size, tech, EHR, decision maker | Crawl4AI on their site, Wappalyzer OSS, OSM, gowitness for screenshots | Read the practice website and extract owner name, specialties, payers, EHR, staffing signals | running enrich-website, 300/cycle |
| 3 | Verify Is this email real, is this phone real | Reacher (check-if-email-exists) self-hosted, MX+SMTP probe, libphonenumber | — deterministic, don't use an LLM here | missing this is why 2,005 sends failed |
| 4 | Score Who's worth a human minute | Postgres/Mongo + rules, then a small local model | Score on pain signals: claim volume, payer mix, job postings for billers, bad reviews about billing | crude A/raw/new grades only |
| 5 | Route Which channel, which sender, which sequence | n8n or a Python scheduler | Pick email vs call vs WhatsApp per lead based on what's verified and what converted before | missing |
| 6a | Send — email | Listmonk or useSend (already forked) on top of a real SMTP rail | Write the first line per lead from their website. Nothing else personalised — the rest is a template | 0 sent |
| 6b | Send — call | FreeSWITCH or Asterisk + a SIP trunk; Whisper/Sarvam STT, Piper/Kokoro TTS | Voice agent handles the first 30 seconds and books, or hands a warm line to a human | no SIP creds |
| 6c | Send — WhatsApp | Our wapp gateway (Baileys), already live | Draft in Sriram's voice, send, follow up on silence | live but follow-up engine stopped |
| 7 | Capture Opens, clicks, replies, call outcomes | Listmonk's built-in tracking + an IMAP poller on the reply mailbox | Classify each reply: interested / not now / wrong person / unsubscribe / angry | missing entirely no MX = no replies possible |
| 8 | Qualify Is this a real opportunity | Local Qwen3 on our own GPU, no per-token cost | Read the thread, pull out practice size, current biller, pain, and either book or park it | missing |
| 9 | Book | Cal.com self-hosted, or Lisa (ours, live) | Offer times, confirm, remind, reschedule on no-show | Lisa exists not wired to outreach |
| 10 | Run the call | Lisa meeting brain (ours) | Live notes, objection prompts, auto-MoM, next-step extraction | built known bug: invents attendee names |
| 11 | Propose | Docs generated from a template; Stirling-PDF for assembly | Draft the SOW/pricing from the call transcript, in our voice | manual done by hand each time |
| 12 | Close & invoice | InvoiceNinja or Midday (already forked); Razorpay/PayPal for collection | Chase unsigned contracts and unpaid invoices on a schedule | partial PayPal live, chasing is manual |
| 13 | Feed it back What closed → what to score higher | A weekly job over the outcome table | Re-rank the ICP and the scoring model from actual wins | missing |
Stages 1 and 2 work — that's why there are 271K rows. Stage 3 (verify) has never existed, and everything from 5 to 8 is missing. The gap is not lead generation. We have too many leads. The gap is the eight steps between having a lead and having a conversation.
All self-hostable, all free at our volume. Ranked by how fast they'd get a first real reply. Costs are what we'd actually pay, which is nothing except a small VPS we already have.
| # | Tool | What it replaces | Honest verdict | Setup |
|---|---|---|---|---|
| 1 | Listmonk Go, AGPL, single binary | The whole sending + tracking engine | The one I'd start with. One binary, Postgres, handles millions of subscribers, has opens/clicks/bounces/unsubs built in, and speaks to any SMTP rail. It is not a CRM and doesn't pretend to be — which is why it works. | ~1 hour |
| 2 | useSend already forked | Resend / SendGrid | Self-hosted sending API on top of SES with tracking, suppression and a dashboard. Pairs with Listmonk rather than competing. Ours already, sitting unused. | ~2 hours |
| 3 | Twenty TypeScript, AGPL | The lead app's UI, Salesforce | The best-looking open CRM there is. Real pipeline views, custom objects, GraphQL API. Heavier to run (Postgres + Redis + worker), but it's the one that won't make you hate opening it. | ~half a day |
| 4 | EspoCRM PHP, GPLv3 | CRM + basic campaigns | Boring and 14 years old, which is the point. Email integration, mass mail, workflows, and a REST API all in the box. Runs on any cheap host. | ~2 hours |
| 5 | Mautic PHP, GPLv3 | Sequences, scoring, landing pages | The only mature open marketing-automation platform. Drip campaigns, lead scoring, forms, dynamic content. Clunky UI, strong engine. Best if we want scoring and multi-step nurture without writing it. | ~half a day |
| 6 | Baserow + n8n already installed, stopped | The database and the glue | Fastest path to something working: a spreadsheet-shaped CRM plus visual automation. No code. Weakest at scale — fine for the first 500 leads, painful at 50,000. | ~2 hours |
| 7 | Postal Ruby, MIT | Brevo / SES entirely | A full mail server we own, on our own IP, with our own reputation. The only route to real cold-email volume without a provider suspending us. Also the highest-effort: needs a clean IP, rDNS, and weeks of warmup. | ~2 days + warmup |
| 8 | Odoo Community Python, LGPL | CRM + quotes + invoices + VoIP | CRM, email marketing, click-to-dial, quotations and invoicing in one system. Enormous. Worth it only if we want one system for the IT division's whole back office too. | ~1 day |
| 9 | YetiForceCRM already forked | Full enterprise CRM | Extremely complete and extremely heavy. Already on the account. Would take longer to configure than to rebuild what we need. | ~2 days |
| 10 | Keep Mongo, throw away the app | Nothing — a decision, not a tool | The 271K rows cost real crawling time. Export them to Postgres, point Listmonk and Twenty at them, and delete the Next.js app. Cheapest option on this list and loses nothing. | ~2 hours |
Listmonk for sending, Reacher for verification, Twenty for the pipeline view, n8n to glue them, Mongo exported to Postgres underneath. That's four services, all free, all self-hosted on hardware we already pay for. It replaces every function the old app claimed and adds the three it never had: verification, tracking, and reply capture.
Before any of it matters, the mail rail has to be real — see deliverability. A perfect pipeline into a domain with no MX record still sends zero.
Apify is a hosted runner for scrapers plus a marketplace of pre-built ones. Both halves have free equivalents. We already pay for none of it — there's an APIFY_API_KEY in the old app's env that should come out.
| Tool | License | What it does | Use it for |
|---|---|---|---|
| Crawl4AI | Apache-2.0 | Crawler built for LLM consumption — returns clean markdown, handles JS, has extraction schemas | The default. Reading practice websites for enrichment |
| Firecrawl | AGPL (self-host) | Crawl + scrape to markdown with an API surface | When you want an API rather than a library |
| Scrapy + scrapy-playwright | BSD | The industrial option — pipelines, retries, throttling, proxy rotation | Large recurring crawls where reliability matters |
| Katana | MIT | Fast Go crawler that maps every URL on a domain | Discovering contact and about pages before deep-scraping |
| SearXNG | AGPL | Self-hosted meta search engine with a JSON API | Free SERP results — replaces paid search APIs |
| Overpass API / OSM | ODbL | Query every business on OpenStreetMap by type and geography | Free replacement for Google Maps scraping |
| Common Crawl | Open | Petabytes of already-crawled web, queryable by domain index | Finding sites matching a pattern without crawling anything yourself |
| NPPES bulk download | Public domain | Every US healthcare provider, monthly full file, free | Already the backbone of our 271K rows. Keep it |
| Reacher (check-if-email-exists) | AGPL | Real SMTP-level email verification, self-hosted, unlimited | The missing piece. Replaces ZeroBounce/NeverBounce at $0 |
| gowitness already forked | Apache-2.0 | Headless screenshots of thousands of sites | Visual triage — a 2005-era practice site is a buying signal |
| theHarvester / Maigret | GPL / MIT | OSINT: find emails and profiles tied to a domain or person | Filling in the decision-maker when the site doesn't say |
| Wappalyzer OSS | MIT (pre-2023 fork) | Detect the tech stack a site runs | Detecting their EHR/portal — a strong qualifier |
Scraping public directories and public websites is normal commercial practice. Scraping LinkedIn is against their terms and gets accounts banned — use it for research by hand, not automated collection. For US healthcare, NPPES is public data published by CMS for exactly this purpose, so it's the safest and richest source we have.
This is inference from how companies in that category are built, not inside knowledge. Flagged as a guess so it doesn't get quoted back as fact later.
Everything except the bought database — and we don't need it, because for US healthcare NPPES is better than what they're buying. Domain rotation, one-line personalisation, and reply classification are all free. That's the whole gap.
Every row below is a live DNS lookup done today, not a config file.
| Domain | MX | SPF | DMARC | Verdict |
|---|---|---|---|---|
| getmaxrcmhq.com | none | brevo | p=none | Broken. The designated cold-email domain cannot receive a reply |
| getmaxrcm.com | Microsoft 365 | outlook, -all | p=none | Healthy. This is the primary business mailbox — never send cold from it |
| getmaxglobal.com | Zoho | zoho + hostinger | p=none, rua→brevo | Works. DMARC reports point at Brevo's aggregate address, so we see nothing |
| getmaxsolutions.com | none | No DMARC at all. SES identity for this domain is FAILED | ||
| getmaxhealthcare.com | none | none | none | Not configured for mail in any way |
Max24HourSend: 200 · MaxSendRate: 1/sec · SentLast24Hours: 0. That is the sandbox. In sandbox, SES will only deliver to addresses we have individually verified — so it cannot send to a prospect at all. The getmaxsolutions.com domain identity shows FAILED verification, and simran@getmaxrcm.com also failed.
Buy or repoint three cheap domains close to the brand — something like getmaxrcm-team.com, getmax-billing.com, rcm-getmax.com. Each gets full MX/SPF/DKIM/DMARC and one real mailbox that a human can open. Warm all three for six weeks in parallel while the rest of the pipeline gets built. At the end: ~600 verified sends a day, and getmaxrcm.com never at risk. Total cost: three domain registrations.
Checked the Crew environment directly. It holds ElevenLabs, Groq, Sarvam, Supabase and Microsoft keys. There is no Twilio credential and no SIP configuration anywhere. There is no trunk, so there is no calling — the "payment issue" that kills calls after three seconds is downstream of not having a carrier at all.
| Layer | Free / OSS option | Paid where unavoidable | Our state |
|---|---|---|---|
| PBX / call control | FreeSWITCH, Asterisk, or LiveKit for WebRTC | — | nothing |
| SIP trunk (the actual phone line) | none — carriers charge per minute | This is the one unavoidable cost. Indian and US DID + minutes | no trunk |
| Speech to text | Whisper / faster-whisper on our own GPU | Sarvam for Indic (key exists) | key present, unused |
| Text to speech | Piper, Kokoro, edge-tts (all $0) | ElevenLabs (key exists, invoice blocked) | edge-tts already works |
| Turn-taking / barge-in | ten-turn-detection, Pipecat — both already forked | — | forked, unwired |
| Conversation brain | Qwen3-Coder-30B on our own g6e | — | live 100 tok/s |
Every layer of a voice agent is free and mostly already forked, except the phone line. Until there's a SIP trunk with credit on it, building more voice code adds nothing. Email first — it's the only channel where the entire stack can be free.
| Layer | What | Where | Cost | Sales role |
|---|---|---|---|---|
| Reasoning — ours | Qwen3-Coder-30B-A3B FP8, 100 tok/s measured | AWS g6e.xlarge, us-east-2 | ~₹159/hr while on | Reply classification, personalisation, scoring — unlimited tokens at zero marginal cost |
| Vision | Gemma vision variant | AWS g6e.xlarge, ap-south-1 | ~₹159/hr while on | Reading screenshots of prospect sites |
| Routing | OmniRoute on :20128, plus CCR to our own box | This laptop | free | One endpoint for every model |
| Long-term memory | gmem + brain-kb, 649 chunks RAG | Local | free | Agents know our history, pricing, past deals |
| Lead database | MongoDB, 271K leads | Atlas | free tier | The only real asset in the old app |
| Product databases | Supabase (OS, Crew, Lisa) | Supabase | free tier | Where a won deal becomes a client |
| Email — transactional | Brevo, key live, 369 sent in 30 days | SaaS | free tier | Product mail only. Not for cold |
| Email — bulk | AWS SES, sandbox, 200/day, identity FAILED | AWS | free tier | Unusable until it leaves sandbox |
| wapp gateway (Baileys) on :8790 | This laptop, pm2 | free | The only outbound channel that actually works today | |
| Automation glue | n8n | This laptop, pm2 | free | Stopped after 917 restarts |
| Identity | Zitadel at id.getmaxglobal.com | Oracle free tier | free | Single login across products |
| Always-on host | Oracle ARM boxes (SV01, SV01b) | Oracle | free forever | Where Listmonk and the verifier should live — not this laptop |
Every piece of sales automation currently runs on a laptop that sleeps, thermal-throttles and gets rebooted. A pipeline that only runs when the lid is open is not a pipeline. The Oracle ARM boxes are free forever and idle. That's where this belongs.
| Blocker | Owner | Cost | Unblocks |
|---|---|---|---|
| SES sandbox exit — a support request describing our sending practice; usually approved in 24h | Sriram (AWS console) | ₹0 | Bulk email at 50K/day instead of 200 |
| MX + DKIM on the cold domains | Me — Hostinger API key is in the vault, I can do this without you | ₹0 | Replies can exist at all |
| 2–3 cold-outreach domains | Sriram | ~₹800/yr each | Volume without risking getmaxrcm.com |
| Real mailboxes on those domains | Sriram | Zoho free tier, ₹0 | Somewhere for replies to land and be read |
| SIP trunk with credit | Sriram | per-minute, unavoidable | Any calling at all. Everything else in voice is free |
| GPU is billing by the hour while nothing uses it | Me — I can stop it now | saves ~₹3,886/day | Money back |
| n8n has been dead through 917 restarts | Me — needs a real fix, not a restart | ₹0 | The glue between every stage |
Ordered so that nothing gets built on top of something broken. Only three items need you; the rest I can do.
| Day | Do | Proof it worked | Who |
|---|---|---|---|
| 1 | Export all 271,062 leads + 46,284 contacts out of Mongo to Postgres and to a compressed file on disk. Then the old app can be deleted with nothing lost. | Row counts match on both sides | me |
| 1 | Stop the idle GPU instances | Billing stops | me |
| 2 | Register 2 cold domains; I set MX, SPF, DKIM, DMARC via the Hostinger API | All four records resolve | you buy, me configure |
| 2 | File the SES sandbox exit request | AWS approves | you |
| 3–4 | Stand up Listmonk + Postgres + Reacher on an Oracle ARM box | Test send lands in a real inbox, verifier returns a verdict | me |
| 4 | Start domain warmup: 10/day, doubling weekly, to real mailboxes | Warmup log | me |
| 5–6 | Run all 46,284 contacts through Reacher. Expect 30–50% to be dead. | A verified count, and the bounce risk gone | me |
| 7 | IMAP reply reader + a local-model classifier: interested / not now / wrong person / unsubscribe | A test reply gets classified correctly | me |
| 8–9 | Personalisation agent: Crawl4AI reads each site, local Qwen writes one opening line | 50 sample lines you read and approve | me, you approve |
| 10 | First real send: 50 verified contacts, one domain, one sequence | The first non-zero number in send_events since June | me |
| 11–13 | Scale to the warmup ceiling, watch bounce and spam rates daily, pull anything above 2% bounce | Daily deliverability report | me |
| 14 | Twenty CRM on top of the Postgres data, so replies land somewhere you'd want to open | You log in and see actual conversations | me |
Roughly 500–800 verified emails sent across two warmed domains. At normal cold rates that's 5–25 replies and 1–3 booked calls. That is not a big number. It is infinitely more than 149,200 dry-run log lines, and every week after it compounds because the domains keep warming.