GetMax · Sales Machine

271,062 leads. Zero emails sent.

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.

271,062
leads in the database
149,200
send events logged
0
actually sent
0
replies, ever
01 · THE AUDIT

What the engine actually did

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.

CollectionRowsWhat it means
leads271,06258,770 graded A · 53,069 still raw · 12,529 new · 146,694 with no status at all
companies44,648Deduped org records
contacts46,284Every single one has a null status — nothing was ever worked
enrollments1,313All "active". None ever advanced a step
send_events149,200147,195 dry-run · 2,005 skipped (missing-email) · 0 sent
signals11,877All null type — the signal collector writes rows with no signal in them
call_events29All from 23 June, all outcome "new". Nobody dialed
sequences1"Behavioral Health — Insurance Billing (cold)". sent [0,0,0] · opened [0,0,0] · replied [0,0,0]

The one sending account

FieldValue
Addresshello@getmaxrcmhq.com
Providerbrevo
Daily cap / warmup50 / 10
Statuswarming since 21 June 2026
Sent today0 — and the counter's date field still says 2026-06-21

Brevo, last 30 days (real API numbers)

The Brevo key is alive, not dead as previously recorded. But what it sent is not outreach:

RequestsDeliveredUnique opensClicksHard bouncesUnsubsErrors
36934818845314

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.

What's running on this laptop right now

ProcessStateRelevant to sales?
wapp-gatewayonlineYes — WhatsApp rail is the only live outbound channel
max-mind / max-evolveonlineBrain, not sales
omnirouteonlineLLM gateway on :20128
oci-hunter, maya-watchdog, wapp-profiler, wapp-monitor-proxyonlineNo
wapp-followupstoppedYes — the follow-up engine is off
wapp-supervisor, siva-nudge, wapp-daily-greetingsstoppedYes — all nudge rails off
n8nstopped (917 restarts)Yes — the automation glue is dead
ai-routerstopped (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.

Direct answer to "are we tracking?"

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.

02 · ROOT CAUSE

Six reasons it produced nothing

Ranked by how much each one alone would have been fatal.

#CauseEvidence
1The 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
2getmaxrcmhq.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
3Brevo 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
4AWS 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
5Contacts 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
6Nobody 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"
The honest summary

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.

03 · THE FULL PIPELINE

Every stage, no gaps

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.

#StageFree / OSS toolAI agent jobOur state
0Define the ICP
Who, what size, what pain, what trigger
A markdown file. Genuinely.Read closed-won and closed-lost, propose the ICP that actually convertspartial written for RCM, not for the IT division
1Source
Turn the ICP into raw rows
NPPES bulk file, Crawl4AI, Katana, SearXNG, Overpass API, Common CrawlTurn "solo behavioral health, Texas, 1–5 providers" into the right queries and registries automaticallyworks 271K rows prove it
2Enrich
Website, size, tech, EHR, decision maker
Crawl4AI on their site, Wappalyzer OSS, OSM, gowitness for screenshotsRead the practice website and extract owner name, specialties, payers, EHR, staffing signalsrunning enrich-website, 300/cycle
3Verify
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 heremissing this is why 2,005 sends failed
4Score
Who's worth a human minute
Postgres/Mongo + rules, then a small local modelScore on pain signals: claim volume, payer mix, job postings for billers, bad reviews about billingcrude A/raw/new grades only
5Route
Which channel, which sender, which sequence
n8n or a Python schedulerPick email vs call vs WhatsApp per lead based on what's verified and what converted beforemissing
6aSend — emailListmonk or useSend (already forked) on top of a real SMTP railWrite the first line per lead from their website. Nothing else personalised — the rest is a template0 sent
6bSend — callFreeSWITCH or Asterisk + a SIP trunk; Whisper/Sarvam STT, Piper/Kokoro TTSVoice agent handles the first 30 seconds and books, or hands a warm line to a humanno SIP creds
6cSend — WhatsAppOur wapp gateway (Baileys), already liveDraft in Sriram's voice, send, follow up on silencelive but follow-up engine stopped
7Capture
Opens, clicks, replies, call outcomes
Listmonk's built-in tracking + an IMAP poller on the reply mailboxClassify each reply: interested / not now / wrong person / unsubscribe / angrymissing entirely no MX = no replies possible
8Qualify
Is this a real opportunity
Local Qwen3 on our own GPU, no per-token costRead the thread, pull out practice size, current biller, pain, and either book or park itmissing
9BookCal.com self-hosted, or Lisa (ours, live)Offer times, confirm, remind, reschedule on no-showLisa exists not wired to outreach
10Run the callLisa meeting brain (ours)Live notes, objection prompts, auto-MoM, next-step extractionbuilt known bug: invents attendee names
11ProposeDocs generated from a template; Stirling-PDF for assemblyDraft the SOW/pricing from the call transcript, in our voicemanual done by hand each time
12Close & invoiceInvoiceNinja or Midday (already forked); Razorpay/PayPal for collectionChase unsigned contracts and unpaid invoices on a schedulepartial PayPal live, chasing is manual
13Feed it back
What closed → what to score higher
A weekly job over the outcome tableRe-rank the ICP and the scoring model from actual winsmissing
Where the pipeline actually breaks

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.

04 · REPLACEMENTS

10 alternatives to the lead app

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.

#ToolWhat it replacesHonest verdictSetup
1Listmonk
Go, AGPL, single binary
The whole sending + tracking engineThe 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
2useSend
already forked
Resend / SendGridSelf-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
3Twenty
TypeScript, AGPL
The lead app's UI, SalesforceThe 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
4EspoCRM
PHP, GPLv3
CRM + basic campaignsBoring 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
5Mautic
PHP, GPLv3
Sequences, scoring, landing pagesThe 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
6Baserow + n8n
already installed, stopped
The database and the glueFastest 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
7Postal
Ruby, MIT
Brevo / SES entirelyA 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
8Odoo Community
Python, LGPL
CRM + quotes + invoices + VoIPCRM, 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
9YetiForceCRM
already forked
Full enterprise CRMExtremely complete and extremely heavy. Already on the account. Would take longer to configure than to rebuild what we need.~2 days
10Keep Mongo, throw away the appNothing — a decision, not a toolThe 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
What I'd actually build

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.

05 · SOURCING

Free replacements for Apify

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.

ToolLicenseWhat it doesUse it for
Crawl4AIApache-2.0Crawler built for LLM consumption — returns clean markdown, handles JS, has extraction schemasThe default. Reading practice websites for enrichment
FirecrawlAGPL (self-host)Crawl + scrape to markdown with an API surfaceWhen you want an API rather than a library
Scrapy + scrapy-playwrightBSDThe industrial option — pipelines, retries, throttling, proxy rotationLarge recurring crawls where reliability matters
KatanaMITFast Go crawler that maps every URL on a domainDiscovering contact and about pages before deep-scraping
SearXNGAGPLSelf-hosted meta search engine with a JSON APIFree SERP results — replaces paid search APIs
Overpass API / OSMODbLQuery every business on OpenStreetMap by type and geographyFree replacement for Google Maps scraping
Common CrawlOpenPetabytes of already-crawled web, queryable by domain indexFinding sites matching a pattern without crawling anything yourself
NPPES bulk downloadPublic domainEvery US healthcare provider, monthly full file, freeAlready the backbone of our 271K rows. Keep it
Reacher (check-if-email-exists)AGPLReal SMTP-level email verification, self-hosted, unlimitedThe missing piece. Replaces ZeroBounce/NeverBounce at $0
gowitness already forkedApache-2.0Headless screenshots of thousands of sitesVisual triage — a 2005-era practice site is a buying signal
theHarvester / MaigretGPL / MITOSINT: find emails and profiles tied to a domain or personFilling in the decision-maker when the site doesn't say
Wappalyzer OSSMIT (pre-2023 fork)Detect the tech stack a site runsDetecting their EHR/portal — a strong qualifier
The legal line, stated plainly

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.

06 · REEVOL

How they probably do it

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.

  • They didn't build the data. Almost certainly a licensed B2B database underneath (Apollo, ZoomInfo, or a data co-op), so their "coverage" is bought, not crawled. That's the single biggest difference from us — and the part that costs money.
  • They own their sending infrastructure. Dozens of secondary domains, each with its own mailbox, each warmed for weeks, rotating so no single domain carries volume. This is the part that looks like magic and is actually just patience plus DNS.
  • Personalisation is one sentence, not one email. An LLM reads the prospect's site and writes the opening line. The other 90% is a fixed template. Cheap, fast, and it's the only part a reader checks for authenticity.
  • Reply handling is the real product. Classifying replies, auto-booking, and pulling anyone who says "no" out of every sequence instantly. That's what makes it feel like a system rather than a blast.
  • Their metrics are honest and small. Real cold outbound converts around 1–3% to a reply and a fraction of that to a meeting. Anyone quoting 30% is measuring opens.
What we can copy for free, today

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.

07 · DELIVERABILITY

The mail rail, checked against live DNS

Every row below is a live DNS lookup done today, not a config file.

DomainMXSPFDMARCVerdict
getmaxrcmhq.comnonebrevop=noneBroken. The designated cold-email domain cannot receive a reply
getmaxrcm.comMicrosoft 365outlook, -allp=noneHealthy. This is the primary business mailbox — never send cold from it
getmaxglobal.comZohozoho + hostingerp=none, rua→brevoWorks. DMARC reports point at Brevo's aggregate address, so we see nothing
getmaxsolutions.comGooglegooglenoneNo DMARC at all. SES identity for this domain is FAILED
getmaxhealthcare.comnonenonenoneNot configured for mail in any way

AWS SES, actual state

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.

The rules that decide whether mail lands

  • Never send cold from the domain your business runs on. One spam-trap hit on getmaxrcm.com and Outlook stops delivering our client mail. Cold traffic goes on separate, disposable domains.
  • Every sending domain needs MX, SPF, DKIM and DMARC before the first send. Missing MX is the fastest way to be classified as throwaway. This is the specific thing that's wrong today.
  • Warmup is arithmetic, not vibes. A fresh domain starts at 10–20 a day and roughly doubles weekly. Two domains reach ~1,000/day in about 6 weeks. Nothing skips this.
  • Verify before you send. A 5% bounce rate suspends an SES account. Reacher, self-hosted, drops that below 2% for free.
  • Volume comes from domain count, not from one domain sending more. Five warmed domains at 200/day is 1,000/day safely; one domain at 1,000/day is a blacklist.
  • Provider terms matter. Brevo and SES both forbid cold lists. At real cold volume the only durable answers are our own mail server (Postal) or a provider that explicitly permits cold outreach.
The 3-domain plan

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.

08 · CALLING

The voice half, and why it's dead

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.

LayerFree / OSS optionPaid where unavoidableOur state
PBX / call controlFreeSWITCH, Asterisk, or LiveKit for WebRTCnothing
SIP trunk (the actual phone line)none — carriers charge per minuteThis is the one unavoidable cost. Indian and US DID + minutesno trunk
Speech to textWhisper / faster-whisper on our own GPUSarvam for Indic (key exists)key present, unused
Text to speechPiper, Kokoro, edge-tts (all $0)ElevenLabs (key exists, invoice blocked)edge-tts already works
Turn-taking / barge-inten-turn-detection, Pipecat — both already forkedforked, unwired
Conversation brainQwen3-Coder-30B on our own g6elive 100 tok/s
Blunt view

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.

09 · INFRA

What runs where, and which brain

LayerWhatWhereCostSales role
Reasoning — oursQwen3-Coder-30B-A3B FP8, 100 tok/s measuredAWS g6e.xlarge, us-east-2~₹159/hr while onReply classification, personalisation, scoring — unlimited tokens at zero marginal cost
VisionGemma vision variantAWS g6e.xlarge, ap-south-1~₹159/hr while onReading screenshots of prospect sites
RoutingOmniRoute on :20128, plus CCR to our own boxThis laptopfreeOne endpoint for every model
Long-term memorygmem + brain-kb, 649 chunks RAGLocalfreeAgents know our history, pricing, past deals
Lead databaseMongoDB, 271K leadsAtlasfree tierThe only real asset in the old app
Product databasesSupabase (OS, Crew, Lisa)Supabasefree tierWhere a won deal becomes a client
Email — transactionalBrevo, key live, 369 sent in 30 daysSaaSfree tierProduct mail only. Not for cold
Email — bulkAWS SES, sandbox, 200/day, identity FAILEDAWSfree tierUnusable until it leaves sandbox
WhatsAppwapp gateway (Baileys) on :8790This laptop, pm2freeThe only outbound channel that actually works today
Automation gluen8nThis laptop, pm2freeStopped after 917 restarts
IdentityZitadel at id.getmaxglobal.comOracle free tierfreeSingle login across products
Always-on hostOracle ARM boxes (SV01, SV01b)Oraclefree foreverWhere Listmonk and the verifier should live — not this laptop
The structural problem

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.

10 · BLOCKERS

What's genuinely stuck, and on whom

BlockerOwnerCostUnblocks
SES sandbox exit — a support request describing our sending practice; usually approved in 24hSriram (AWS console)₹0Bulk email at 50K/day instead of 200
MX + DKIM on the cold domainsMe — Hostinger API key is in the vault, I can do this without you₹0Replies can exist at all
2–3 cold-outreach domainsSriram~₹800/yr eachVolume without risking getmaxrcm.com
Real mailboxes on those domainsSriramZoho free tier, ₹0Somewhere for replies to land and be read
SIP trunk with creditSriramper-minute, unavoidableAny calling at all. Everything else in voice is free
GPU is billing by the hour while nothing uses itMe — I can stop it nowsaves ~₹3,886/dayMoney back
n8n has been dead through 917 restartsMe — needs a real fix, not a restart₹0The glue between every stage
11 · THE PLAN

14 days to a first real reply

Ordered so that nothing gets built on top of something broken. Only three items need you; the rest I can do.

DayDoProof it workedWho
1Export 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 sidesme
1Stop the idle GPU instancesBilling stopsme
2Register 2 cold domains; I set MX, SPF, DKIM, DMARC via the Hostinger APIAll four records resolveyou buy, me configure
2File the SES sandbox exit requestAWS approvesyou
3–4Stand up Listmonk + Postgres + Reacher on an Oracle ARM boxTest send lands in a real inbox, verifier returns a verdictme
4Start domain warmup: 10/day, doubling weekly, to real mailboxesWarmup logme
5–6Run all 46,284 contacts through Reacher. Expect 30–50% to be dead.A verified count, and the bounce risk goneme
7IMAP reply reader + a local-model classifier: interested / not now / wrong person / unsubscribeA test reply gets classified correctlyme
8–9Personalisation agent: Crawl4AI reads each site, local Qwen writes one opening line50 sample lines you read and approveme, you approve
10First real send: 50 verified contacts, one domain, one sequenceThe first non-zero number in send_events since Juneme
11–13Scale to the warmup ceiling, watch bounce and spam rates daily, pull anything above 2% bounceDaily deliverability reportme
14Twenty CRM on top of the Postgres data, so replies land somewhere you'd want to openYou log in and see actual conversationsme
What success looks like on day 14, stated honestly

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.