Email Automation Without the SaaS Tax
Mailchimp, ConvertKit, ActiveCampaign—they solve email automation but come with baggage:
- $50/month for 500 subscribers, $300 for 10,000
- Your subscribers locked in their database
- Limited webhook integrations
- Black box delivery—you never know why emails fail
Own your email automation with a self-hosted solution that scales.
Pre-Built Workflow Examples
Everything You Need for Automated Email Sequences
Production-ready drip campaigns with intelligent scheduling and full control
JSON-Based Workflow Config
Define unlimited email steps in a single config file. No code changes needed to add steps or modify timing.
Time-Based Scheduling
Send emails X hours after signup. Day 1, Day 3, Day 7—or aggressive onboarding at 1hr, 4hrs, 12hrs intervals.
Multiple Email Providers
SendGrid, Mailgun, or Postmark. Switch providers with a single environment variable. No vendor lock-in.
Automatic Duplicate Prevention
Atomic database operations ensure each subscriber receives each email exactly once, even with concurrent jobs.
Smart Rate Limiting & Retries
Intelligent rate limiting prevents API throttling. Failed emails retry automatically with exponential backoff.
Complete Audit Trail
Track every send with full logging. Dry-run mode lets you test workflows without sending real emails.
How Drip Campaigns Work
Cron-based scheduling ensures reliable, paced email delivery
Subscriber
Signs up
Cron Job
Every 15 min
Queue
Rate limited
Email Sent
Via provider
Automated flow: Subscriber added → Cron checks eligibility → Email queued with rate limiting → Delivered via SendGrid/Mailgun/Postmark
Simple JSON Configuration
Define your entire email sequence in one config file. Add steps, adjust timing, customize templates—all without touching code.
- Unlimited workflow steps
- Template placeholders: {{name}}, {{email}}
- Custom subject, heading, body, button
- Redeploy to apply changes instantly
stepsconfig.json:
{ "workflowSteps": [ { "step": 1, "hoursAfterSignup": 24, "template": { "subject": "Welcome to Our Community!", "heading": "Hello {{name}}!", "body": "Thanks for joining...", "buttonText": "Get Started", "buttonUrl": "https://example.com" } }, { "step": 2, "hoursAfterSignup": 72, "template": { "subject": "Quick tip for you", "heading": "Did you know?", "body": "Here's a pro tip..." } } ]}Choose Your Email Provider
Switch providers with a single environment variable
SendGrid
Industry standard for transactional email. Great deliverability and analytics.
SENDGRID_API_KEYMailgun
Developer-friendly with powerful APIs. Pay-as-you-go pricing.
MAILGUN_API_KEYPostmark
Best-in-class deliverability. Perfect for transactional sequences.
POSTMARK_API_KEYBuilt for Any Drip Campaign
From onboarding to courses to nurture sequences
User Onboarding
Welcome new users with a guided email sequence. Day 1 welcome, Day 3 tips, Day 7 feature highlight.
welcome • tips • features • success-storiesEmail Courses
Deliver educational content over 7+ days. Each email builds on the last with a clear progression.
lesson-1 • lesson-2 • lesson-3 • graduationTrial Conversion
Aggressive sequences to convert trial users. 1hr, 4hrs, 12hrs, Day 2, Day 4 touchpoints.
quick-start • value-prop • case-study • offerWebhook-First Email Automation
Connect your drip campaigns to any webhook source—Stripe payments, signup forms, or custom events from your app.
Why webhook-driven? Traditional email platforms have limited integrations. With Codehooks, your drip campaign endpoint can receive webhooks from Stripe (new customer → onboarding sequence), signup forms (lead → nurture sequence), or any custom event from your application.
Ready to Automate Your Email Sequences?
Deploy a self-hosted drip email system in 5 minutes. Full control, no vendor lock-in, scales with your list.
Drip Email Campaign FAQ
Common questions about automated email sequences
What is a drip email campaign?
How do I set up automated email sequences?
hoursAfterSignup (when to send) and template (subject, body, button). Deploy with coho deploy and the system handles scheduling, sending, and tracking automatically.Which email providers are supported?
How does the scheduling work?
Can I prevent duplicate emails?
How do I handle large subscriber lists?
What if an email fails to send?
Can I test without sending real emails?
DRY_RUN=true in your environment. The entire workflow runs normally—subscribers are marked, logs are created—but no actual emails are sent. Perfect for validating configuration before going live.How do I customize email templates?
{{name}} and {{email}}. The HTML template is in a separate file (email-template.js) where you can customize CSS, layout, and branding. Each workflow step has its own subject, heading, body, and button.Is this compliant with GDPR and CAN-SPAM?
POST /subscribers/:id/unsubscribe. You own the subscriber data in your own database, making it easy to honor deletion requests and maintain compliance.