Case study
Outreach and Relationship Manager (CRM/Email Campaign Platform)
A robust integrated marketing platform: multi-provider campaign sending and automation on one side, a full CRM with deal pipeline, lead scoring, and lifecycle automation on the other, supporting 500K+ contacts and scaling.
The problem
Multiple clients were using disjointed emailing systems with no real actionable measures of success. What they actually needed was a system that understood relationships and could run marketing at scale: who's a prospect versus an active client, who's gone cold, which deals are live, when it's appropriate to follow up, and how to drive campaigns, sequences, and deliverability across all of it.
Across multiple clients, the contact database has grown past 500,000 records imported from disparate sources. Outreach was manual, status was unclear, and the past sending tools had no memory and no judgment. The job was to evolve a one-way email sender into a single platform that runs the marketing motion and reasons about each contact's lifecycle, without losing the deliverability and webhook plumbing the send tool already had.
My role
I architected and led the build end to end: the data model, the FastAPI service (26 routers and counting), the React workspace, the email-sending pipeline, and the automation engine. The defining design problem was status: a contact's business lifecycle and their engagement are two different things, and collapsing them into one field is what makes most CRMs lie to you.
Architecture
A React single-page workspace and a dedicated asynchronous webhook service both feed a FastAPI core that owns the data. The webhook service exists on its own so high-throughput delivery events from the email providers can be ingested without competing with the workspace API. Database connectivity can be pointed to a Supabase or standard PostgreSQL hosted environment. An automation engine sits beside the core, deriving status, scores, and follow-ups from the same source of truth, with APScheduler driving batch sending, follow-up sequences, and reporting.
An additional set of CLI tools support initial system setup, maintenance scripts, log audits, add-on system toggles for functionalities, and backup management.
The marketing platform
The send tool became a real marketing platform, not just a CRM with an outbox:
- Campaigns send in batches with adaptive pacing, hourly and daily ceilings, company specific anti-collision pacing, and business-hours windows, with pause and resume on long-running sends.
- Templates are versioned and support multi-subject A/B testing with weighted distribution, plus one-click sync of templates to the providers with a full analytic tracking system to prove results.
- Multi-provider delivery runs over Mailgun and SendGrid with per-campaign override and encrypted credentials, so the user isn't locked to one sender. A comprehensive framework was built to allow for additional providers to be added with no refactoring of core models.
- Event ingestion runs through the dedicated webhook service: signature-verified webhooks, dedup and idempotency, and tracking for delivered, opened, clicked, bounced, complained, and unsubscribed, feeding automatic suppression-list management. A polling fallback reconciles anything a webhook drops.
- Follow-up sequences act as a nurture engine: multi-step sends that respect configurable business-hours windows, with an approval, skip, and retry workflow.
The CRM
On the same data the marketing platform generates, the CRM handles all relationship aspects:
- Two-axis status model. A contact carries a client status (prospect to lead to active client to former client) and an independent, system-managed engagement status (warm, cold, inactive). Keeping them orthogonal means "an active client who has gone quiet" is representable and actionable, instead of flattened away.
- Deal pipeline that derives status. When a deal moves (quoted, won, lost), a status service recalculates the contact's client status atomically with the deal write, with an override lock so a human's deliberate exception can't be stomped by the automation.
- Lead scoring ranks contacts from interaction history and feeds the engagement axis, so the warm/cold signal is earned, not guessed.
- Companies, custom fields, and a unified activity timeline tie notes, deals, and sends to each contact, with @mentions for the team funneling right into the internal notification system.
- Segmentation, import, and search. A segment query-builder targets campaigns; CSV import does drift detection with a preview-and-confirm workflow; Meilisearch gives full-text search across contacts, companies, and campaigns.
Outcomes
- One integrated platform: multi-provider campaign sending, A/B testing, and follow-up automation alongside a genuine CRM, built on top of the existing email infrastructure rather than replacing it.
- 500K+ contacts migrated and searchable, with import that validates and previews instead of trusting raw uploads.
- Status that stays honest because the pipeline derives it atomically with each deal change, and human overrides are protected by design.
- 26 API routers and growing spanning contacts, companies, campaigns, templates, segments, deals, follow-ups, events, and imports: one coherent service rather than a pile of scripts, and a cleaner signal foundation for AI-assisted outreach.