Multi-tenant SaaS for automated, AI-personalised cold email outreach with intelligent follow-ups, Resend email delivery, and document-grounded personalisation.
Users sign in with Google, upload product documents to a shared library, and launch personalised cold-email campaigns. The backend generates each email using an LLM grounded in the product brief and per-lead context, sends through Resend, threads follow-ups into the original conversation, and detects replies via Resend inbound webhooks (real-time, no polling).
- Create, edit (draft/paused only), duplicate, and delete campaigns
- Scheduled start: set a datetime, the scheduler auto-activates when time arrives
- Per-campaign rate limiting (50 emails / hour by default)
- Analytics per campaign: reply rate, average emails before reply, status breakdowns
- Manual add, bulk CSV import with client-side validation + preview
- Bulk delete with checkboxes and a floating action bar
- Edit all lead fields; edit is hidden on terminal statuses (replied / completed / failed)
- Email activity timeline per lead with smooth accordion expansion
- LLM-powered personalisation using DeepSeek v3.2 (or any OpenAI-compatible provider via
moonlight-aiabstraction) - Post-generation critic pass: a second LLM call scores the draft against a banned-pattern checklist (inference-from-fact openers, filler phrases, em-dashes, capability menu-dumps) and regenerates with feedback if violations are found
- Email preview endpoint: generate a draft for any lead without sending
- Threading: follow-ups go out with
Re: {original subject}so email clients bundle them into the same conversation
- Upload PDF, DOCX, PPTX, TXT, or MD
- LlamaParse (agentic tier) extracts to markdown
- LLM distils to a 300-500 word product brief
- Brief is injected into every email generation for campaigns that attach the document
- Account-wide library: upload once, attach to multiple campaigns (cap: 2 documents per campaign to bound LLM input)
- Resend inbound webhooks — replies are detected in real-time, no IMAP polling
- Tracking email format
{lead_id}@{EMAIL_DOMAIN}embedded inreply_toheader - Webhook verifies Svix signatures, fetches full email content, strips quoted/forwarded text, stores clean reply
- Works regardless of campaign status — completes monitoring even after campaign finishes
- Go to resend.com/domains and add your domain
- Enable Sending and Receiving for the domain
- Add the DNS records Resend provides (MX, DKIM, SPF, Return-Path)
- Go to Webhooks in the Resend dashboard
- Click Add Webhook
- Target URL:
https://your-domain.com/webhooks/resend/inbound - Events: select
email.received - Copy the Signing Secret to
RESEND_WEBHOOK_SECRETin your.env
RESEND_API_KEY=re_...
RESEND_WEBHOOK_SECRET=whsec_...
EMAIL_DOMAIN=yourdomain.com- Navigate to the
backenddirectory. - Create and activate a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
- Install dependencies:
pip install -r requirements.txt
- Set up environment variables by copying
.env.exampleto.envand filling in the values. - Run the backend:
fastapi dev app.py
- Navigate to the
frontenddirectory. - Install dependencies:
npm install
- Start the development server:
npm run dev
