prospect studio
https://ayaz-prospect-studio.ayazwork2026.workers.dev/
Project overview
A separate Cloudflare Workers + D1 project for Fozayel Ibn Ayaz. No Google Sheet is required for the new app’s normal operation. This does not modify MealKhata.
Prospect Studio — integrated web-app pilot
Deployed and running (v0.5.0 confirmed; v0.8.0 source delivered) at the owner’s Cloudflare account. Gmail sending is live-verified end-to-end; Tavily, Gmail, Gemini and Telegram are all connected. The local preview remains explicitly fictional demo data: it cannot make discovery, AI or Gmail calls. Never put private data in that preview.
Start here
- One-time owner deployment
- QA evidence and remaining acceptance
- Architecture and limits
- Source on GitHub + automatic deploy
Included
- Fourteen web-app sections: overview, prospects, review/send, email activity, pipeline, customers, marketing, growth & goals, finance, work/follow-ups, reports/learning, business map, automation, settings.
- Automatic approval & sending are ON by default and can be switched off (v0.8): three visible switches (auto-approve, auto-send, check addresses) on Overview, Automation, Review and Settings. Auto-approval still requires a recorded basis, an approved source, no suppression, no hold, no reply and room inside the daily cap — turning a switch off always wins, and every decision is logged.
- Address quality with honest words (v0.8): a free Cloudflare DoH MX check plus a second free pass that reads the prospect's public site and contact page for missing addresses. "Mail server found" means the domain accepts mail — it is not a delivery proof, and the UI says so. An address already proven unusable is never sent to.
- Select-all + bulk actions on every list (v0.8): select-all header, per-row selection, "Select all N shown", sorting (newest / best fit / name / has-email / city), and bulk approve · hold · unreview · draft · verify · suppress · un-suppress — approval requires the basis you typed and is stamped on every selected record. The review queue has select-all bulk approval for messages.
- Global market (v0.8): 124 countries and 683 real cities; each search names a city inside the country, so results are businesses rather than blogs. Focus still decides where today's credits go; the rest rotates 24×7.
- Professional, research-grounded drafts (v0.8): letters open with something actually seen on the prospect's public page (or they say less — never a fake compliment), with different openings for a brand-new business, an agency overflow partner and a freelancer, and a plain statement that no audit was done.
- Per-case Telegram alerts (v0.8): one switch per case (new prospect, every send, every reply, urgent, bounces, money, tasks, content, digest, errors) plus a master switch; every alert prints the matched words and the reason it fired, and alerts never act on your behalf.
- Reply handling from the owner's own design (v0.8): a follow-up task and revisit date are created at the moment of send; delivery is checked against the provider's own bounce notices before the next send; out-of-office is detected from the Auto-Submitted header (RFC 3834) first; only CONTACTED/REPLIED/CONVERSATION move automatically while PROPOSAL/NURTURE/WON/LOST stay yours; "not interested / don'
- Real business names (v0.8): directory halves ("… | CommissionCrowd"), social tails and known directory hosts are stripped or rejected, so research rows show the business, not the listing site.
- Urgent reply alerts (v0.6): a free 1-minute Cloudflare cron tick watches the newest inbox mail, matches replies to your own threads, and flags "call now / urgent / ASAP / deadline / phone number" matches instantly — Telegram + owner email + URGENT flag + call-back task + Overview banner. Rules always run; the optional AI second opinion reads only the single matched reply and needs its own switch.
Important limits
This is not exhaustive global research, a guaranteed 50 buyers/day, unrestricted cold-mail automation or a finished enterprise lifecycle suite . Read the explicit partial/unimplemented list in docs/ARCHITECTURE.md.
The Workers clock is configured every 15 minutes, around the clock. Scheduled search slots are spread about every 3 hours; at most eight basic searches/day. Enrichment is queued between them within its own cap. A global rotation over the full market list therefore takes months to touch every city once, before considering different sectors/types — which is why the focused list exists and why coverage claims are never made. English queries are used; this is not multilingual exhaustive coverage.
Discovery aims for 50 non-held research candidates/day; quotas, source availability, holds, duplicates and two-page enrichment often mean fewer. A shortfall is not filled with existing/imported rows or invented contacts.
Source at repository root
Unzip the source package into a new repository root so package.json, wrangler.jsonc, src/, public/, migrations/ and tests/ are visible directly. Do not create a ZIP-only repository. No API keys, OAuth secrets, private CV, real prospect database or production session is included.
The default configuration is DEMO. Production is a separate Wrangler environment with DEMO MODE=false and deployment validation.
Tests send no real email and use no live provider key. The integration tests run genuine local D1/Workers adapters with mocked external providers.